天天看點

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

之前一直用 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(-, , )
Y =  / ( + np.exp(-X))

plt.figure()
plt.plot(X, Y, color="blue", linewidth=, 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',))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',))

# 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([, ], [r'$0.5$', r'$1$'])
plt.text(-, , r'$\sigma(z)=\frac{1}{1+e^{-z}}$', fontsize=)
\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 加入如下語句即可

如下圖

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

然後就可以使用minted 宏包了,設定如下

然後測試兩個例子

示例1
\begin{minted}{c++}
int main() {
    printf("hello, world");
    return 0;
}
\end{minted}

示例
\begin{minted}[mathescape,
               linenos,
               numbersep=pt,
               gobble=,
               frame=lines,
               framesep=mm]{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 = 
\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 /Packages/LaTeXTools/builders/traditionalBuilder.py
           

其中lxy444為我的使用者名.

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

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

然後儲存,重新開機 Sublime即可.

若還提示錯誤,那應該是Python的包Pygments的問題了,我是先用pip安裝了這個包,

pip install pygments
           

然後發現還有錯誤,後來找到了解決辦法,參考自 http://tex.stackexchange.com/questions/48018/minted-not-working-on-mac, 就是把

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

中的pygmentize檔案拷貝到如下目錄中即可.

/usr/local/bin
           

繼續閱讀