在 Sublime Text 3 下使用 LaTeX 代码高亮包 minted 及遇到的问题与解决

警告
本文最后更新于 2020-12-03,文中内容可能已过时。

搞了一个下午啊!

官网

专门用来代码高亮的, 比listing包好

minted 依赖于 Python 和一个 Python 的库 pygments. 所以首先确保安装了 Python 和 pygments.

Sublime Text 3 中编译$\LaTeX$, 需要安装包 LaTeXTools.

以c++代码块为例

首先引用包

1
\usepackage{minted}

在需要写代码的地方使用minted环境

1
2
3
4
5
6
7
8
\begin{minted}{c++}
#include <iostream>
using namespace std;
int main() {
	cout << "Hello Minted!" << endl;
	return 0;
}
\end{minted}

还用行间代码以及代码文件引用的方式, 暂时用不到, 没查

官方文档

我常用的有如下选项:

  • linenos=true 显示行号
  • mathescape 在注释中可以使用$\LaTeX$数学(即$$)
  • breaklines 自动换行
  • bgcolor=<colorstring> 背景颜色, 默认白
  • tabsize=4 tab宽度
  • texcl, texcomments 注视中使用$\LaTeX$ (文档说c/c++用这个会出事)

当我满怀期待地编译运行时, 报错啦!

Package minted Error: You must invoke LaTeX with the -shell-escape flag.

minted包需要使用$\LaTeX$以外的排版格式, 即 pygments. 所以需要在编译的时候加上一句 -shell-escape

在需要编译的 .tex 头上写 % !TEX options=--shell-escape, 如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
% !TEX options=--shell-escape
\documentclass{ctexart}
\usepackage{minted}
\begin{document}
\begin{minted}{c++}
#include <iostream>
using namespace std;
int main() {
	cout << "Hello Minted!" << endl;
	return 0;
}
\end{minted}
\end{document}

然后保证编译的时候使用的是 $\LaTeX$ Tools 的 traditionalbasic 编译选项.

打开 $\LaTeX$ Tools 的设置, 找到 build-setting, 加入 "options": "--shell-escape"options=["--shell-escape"]如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
	"builder_settings" : {

		// General settings:
		// See README or third-party documentation

		"options": ["--shell-escape"],

		// (built-ins): true shows the log of each command in the output panel
		"display_log" : false,

		// Platform-specific settings:
		"osx" : {
			// See README or third-party documentation
		},

		"windows" : {
			// See README or third-party documentation
		},

		"linux" : {
			// See README or third-party documentation
		}

或者在指定系统里加入.

这里的 options 就是可以手写的编译命令, 后面跟的是一个字符串或者字符串列表(如果有多个选项的话就要用列表).

当我再一次满怀期待地编译运行时, 又报错啦!

Package minted Error: You must have ‘pygmentize’ installed to use this package.

$\LaTeX$ Tools 没有找到 pygmentize.exe

先确保成功安装 pygmentize, 命令行输入 pygmentize -h查看是否安装成功.

$\LaTeX$ Tools 太笨啦, 环境变量里的东西他不会找, 我们需要手动给他指定.

打开 $\LaTeX$ Tools 的设置, 找到 windows (对于的操作系统), 在 texpath 中添加 pygmentize 所在目录( python 安装目录下的 Scripts), 如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
	"windows": {
		// Path used when invoking tex & friends; "" is fine for MiKTeX
		// For TeXlive 2011 (or other years) use
		// "texpath" : "C:\\texlive\\2011\\bin\\win32;$PATH",
		"texpath" : "D:\\Program\\MiKTeX\\miktex\\bin\\x64;C:\\Users\\Wings\\AppData\\Local\\Programs\\Python\\Python38\\Scripts",
		// TeX distro: "miktex" or "texlive"
		"distro" : "miktex",
		// Command to invoke Sumatra. If blank, "SumatraPDF.exe" is used (it has to be on your PATH)
		"sumatra": "C:\\Users\\Wings\\AppData\\Local\\SumatraPDF\\SumatraPDF.exe",
		// Command to invoke Sublime Text. Used if the keep_focus toggle is true.
		// If blank, "subl.exe" or "sublime_text.exe" will be used.
		"sublime_executable": "",
		// how long (in seconds) to wait after the jump_to_pdf command completes
		// before switching focus back to Sublime Text. This may need to be
		// adjusted depending on your machine and configuration.
		"keep_focus_delay": 0.5
	  },

上网搜的时候查到说还可以直接把 pygmentize 复制到 tex 所在目录下. 这个方法太暴力了, 没试.

使用minted包的时候, 有时候会出现奇奇怪怪的报错, 尤其是当我写C和Java程序设计报告的时候, 老出问题. 奇怪的是之前写板子的时候没有任何问题.

报错如下:

D:\Program\MiKTeX\tex\generic\ctex\zhmap\ctex-zhmap-windows.tex:2: Missing $ inserted. [%% This is file `ctex-zhmap-windows.tex']
D:\Program\MiKTeX\tex\generic\ctex\zhmap\ctex-zhmap-windows.tex:28: You can't use `macro parameter character #' in math mode. [  \catcode 35=6  % #]
D:\Program\MiKTeX\tex\generic\ctex\zhmap\ctex-zhmap-windows.tex:39: You can't use `macro parameter character #' in math mode. [  \x  35  6 % #]
D:\Program\MiKTeX\tex\generic\ctex\zhmap\ctex-zhmap-windows.tex:134: Undefined control sequence. [\ctex@zhmap@endinput]
D:\大学\java\第三次上机\report\_minted-report\762EB8EB8C4215A2FCC1A78E3499E2873876A35572848E573867E828E5D5C492.pygtex:5: Missing $ inserted. [\end{Verbatim}]

由于 pygmentize 对代码进行了各种转义, 在 pdfLatex 编译下, 会出现奇奇怪怪的问题, 这是一个 pygmentize 的 bug (issue里开发者说的).

换用 xelatex 编译就好了

字体的话默认也有粗体, 但是效果不是很明显, 不过黑白高亮还是看得出来的