之前一直用 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}
编译后即可正常显示
后来再写beamer文档时,发现一些模板中使用了minted宏包,也很不错,但是编译时需要开启 shell-escape,这其实是需要在编辑器中开启的,下面说一下怎么办。
先说一下 WinEdt编辑器,由于我安装的是 Texlive 2015,不是CTeX,所以不自带WinEdt,所以我安装的是官网上的WinEdt 9.1(此处提一点,居然可以自动补全了,记得以前好像不行)。点击 Options,选择 Execution Modes,然后在 Console Applications 的 Accessories 里面选择 XeLaTeX(因为我主要使用 XeLaTeX 编译,所以要改它,使用其它编译方式的可以相应修改),然后在里面的 Switches 加入如下语句即可
--shell-escape
如下图
然后就可以使用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}
结果如下图
我现在一直使用的是 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