LaTeX 使用 minted宏包--代码高亮

时间:2021-05-31 06:06:03

之前一直用 listings 宏包来设置代码高亮,需要手动设置一下参数,比如我的如下:

\usepackage{listings}
\newfontfamily\courier{Courier New}
\lstset{linewidth=1.1\textwidth,
        numbers=left, %设置行号位置 
        basicstyle=\small\courier,
        numberstyle=\tiny\courier, %设置行号大小 
        keywordstyle=\color{blue}\courier, %设置关键字颜色 
        %identifierstyle=\bf,
        commentstyle=\it\color[cmyk]{1,0,1,0}\courier, %设置注释颜色 
        stringstyle=\it\color[RGB]{128,0,0}\courier,
        %framexleftmargin=10mm,
        frame=single, %设置边框格式 
        backgroundcolor=\color[RGB]{245,245,244},
        %escapeinside=``, %逃逸字符(1左面的键),用于显示中文 
        breaklines, %自动折行 
        extendedchars=false, %解决代码跨页时,章节标题,页眉等汉字不显示的问题 
        xleftmargin=2em,xrightmargin=2em, aboveskip=1em, %设置边距 
        tabsize=4, %设置tab空格数 
        showspaces=false %不显示空格 
        basicstyle=\small\courier
       }  

这样直接使用lstlisting环境就可以了,比如

\begin{lstlisting}[language = python]
import numpy as np
import matplotlib.pyplot as plt

X = np.linspace(-6, 6, 200)
Y = 1 / (1 + np.exp(-X))

plt.figure()
plt.plot(X, Y, color="blue", linewidth=2.5, linestyle="-")

ax = plt.gca()   # 设置坐标轴属性
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

# plt.xlim(X.min()*1.1, X.max()*1.1)
# plt.ylim(Y.min()*1.1,Y.max()*1.1)
plt.grid(True)
plt.xlabel("$z$")    # 使用 LaTeX 注释
plt.yticks([0.5, 1], [r'$0.5$', r'$1$'])
plt.text(-4, 0.7, r'$\sigma(z)=\frac{1}{1+e^{-z}}$', fontsize=24)
\end{lstlisting}

编译后即可正常显示
LaTeX 使用 minted宏包--代码高亮

后来再写beamer文档时,发现一些模板中使用了minted宏包,也很不错,但是编译时需要开启 shell-escape,这其实是需要在编辑器中开启的,下面说一下怎么办。

先说一下 WinEdt编辑器,由于我安装的是 Texlive 2015,不是CTeX,所以不自带WinEdt,所以我安装的是官网上的WinEdt 9.1(此处提一点,居然可以自动补全了,记得以前好像不行)。点击 Options,选择 Execution Modes,然后在 Console Applications 的 Accessories 里面选择 XeLaTeX(因为我主要使用 XeLaTeX 编译,所以要改它,使用其它编译方式的可以相应修改),然后在里面的 Switches 加入如下语句即可

--shell-escape

如下图
LaTeX 使用 minted宏包--代码高亮

然后就可以使用minted 宏包了,设置如下

\usepackage[cache=false]{minted} % 代码高亮

然后测试两个例子

示例1
\begin{minted}{c++} int main() { printf("hello, world");
    return 0;
}
\end{minted} 示例2 \begin{minted}[mathescape, linenos, numbersep=5pt, gobble=2, frame=lines, framesep=2mm]{csharp} string title = "This is a Unicode π in the sky" /* Defined as $\pi=\lim_{n\to\infty}\frac{P_n}{d}$ where $P$ is the perimeter of an $n$-sided regular polygon circumscribing a circle of diameter $d$. */ const double pi = 3.1415926535 \end{minted}

结果如下图
LaTeX 使用 minted宏包--代码高亮

我现在一直使用的是 Sublime Text 3编辑器,那么该如何启用shell-escape 呢?可以参考这篇文章 http://zhuanlan.zhihu.com/LaTeX/19914463 ,不过很遗憾,我没有成功,还是出了问题,不知道为什么,仍是提示以下错误

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

所以暂时就先放弃了.

更新:之前可能是安装的 Sublime Text 的问题,现在在 windows 上也成功了,也是跟下面一样修改 traditionalBuilder.py 文件,在LaTeXTools文件夹中的builders文件夹中,将DEFAULT_COMMAND_LATEXMK 语句稍作修改,在 ”-%E”后面加上”-shell-escape”即可(由于我电脑上安装了 Anaconda, 所以相关的 python 包 pygments 都已经有了)。

2016-02-17 更新:
在 Mac 上的 Sublime Text 3 上测试成功了,方法如下:
更改LaTeXTools 文件夹中的traditionalBuilder.py文件, 位置在

/Users/lxy444/Library/Application Support/Sublime Text 3/Packages/LaTeXTools/builders/traditionalBuilder.py

其中lxy444为我的用户名.

将第20行的DEFAULT_COMMAND_LATEXMK 语句稍作修改, 本来语句如下:

DEFAULT_COMMAND_LATEXMK = ["latexmk", "-cd", "-e", "-f", "-%E", "-interaction=nonstopmode", "-synctex=1"]

在 ”-%E”后面加上”-shell-escape”,如下

DEFAULT_COMMAND_LATEXMK = ["latexmk", "-cd", "-e", "-f", "-%E","-shell-escape", "-interaction=nonstopmode", "-synctex=1"]

然后保存,重启 Sublime即可.

若还提示错误,那应该是Python的包Pygments的问题了,我是先用pip安装了这个包,

pip install pygments

然后发现还有错误,后来找到了解决办法,参考自 http://tex.stackexchange.com/questions/48018/minted-not-working-on-mac, 就是把

/Library/Frameworks/Python.framework/Versions/2.7/bin/

中的pygmentize文件拷贝到如下目录中即可.

/usr/local/bin