1. 程式人生 > >LaTeX中插入matlab程式碼(可新增中文註釋)的幾種方法

LaTeX中插入matlab程式碼(可新增中文註釋)的幾種方法

最近在用LaTeX寫檔案時,需要插入matlab程式碼,但是matlab程式碼編寫時沒有注意到註釋為中文所帶來的不便,導致在編寫LaTeX檔案時總是報錯。經查閱網上有關這方面的資料和自己不斷地嘗試之後,總結其中的方法如下:使用matlab的mcode包和僅僅使用listings與xcolor包實現對matlab程式碼的插入。

使用matlab的mcode插入程式碼的方法

程式碼中不包含中文

如果插入的程式碼中不包含有任何中文的話,可以採用如下方法(安裝方法可見:美賽如何在Latex中插入Matlab程式碼):

\usepackage{listings}
\usepackage[framed,numbered,autolinebreaks,useliterate]
{mcode} %文章開頭呼叫巨集包 \begin{lstlisting} %正文插入程式碼 function data_generate() Sigma = [1, 0; 0, 1]; mu1 = [1, -1]; x1 = mvnrnd(mu1, Sigma, 200); mu2 = [5, -4]; x2 = mvnrnd(mu2, Sigma, 200); mu3 = [1, 4]; x3 = mvnrnd(mu3, Sigma, 200); mu4 = [6, 4.5]; x4 = mvnrnd(mu4, Sigma, 200
); mu5 = [7.5, 0.0]; x5 = mvnrnd(mu5, Sigma, 200); X = [x1; x2; x3; x4; x5]; % Show the data points plot(x1(:,1), x1(:,2), 'ro'); hold on; plot(x2(:,1), x2(:,2), 'b+'); plot(x3(:,1), x3(:,2), 'k*'); plot(x4(:,1), x4(:,2), 'g^'); plot(x5(:,1
), x5(:,2), 'ms'); save Softmax_regression_data X xlabel('x_1') ylabel('x_2') title('nnkcn' ) end \end{lstlisting}

效果圖如下:


這裡寫圖片描述

如果出現報錯LaTeX Error: Command \textquotesingle unavailable in encoding OT1可以參考Ctex插入matlab程式碼編譯出現! LaTeX Error: Command \textquotesingle unavailable in encoding OT1

程式碼中包含中文

插入的程式碼中包含中文時,會出現各種各樣的錯誤,這是軟體本身為英文決定的。經過反覆的試驗,在使用mcode的基礎上,找到了兩種比較可行的辦法:

\documentclass{ctexart}
\usepackage{listings}
  \usepackage{textcomp} % 必須加上,否則報錯
  \usepackage[framed,numbered,autolinebreaks,useliterate]{mcode}    % 新增matlab程式碼巨集
  \usepackage{xcolor}
  \lstset{
  language=Matlab,  %程式碼語言使用的是matlab
  rulesepcolor=\color{red!20!green!20!blue!20},%程式碼塊邊框為淡青色
  keywordstyle=\color{blue!90}\bfseries, %程式碼關鍵字的顏色為藍色,粗體
    numbers=left, % 顯示行號
    numberstyle=\tiny,    % 行號字型
   commentstyle=\color{red!10!green!70},    % 設定程式碼註釋的顏色
  showstringspaces=false,%不顯示程式碼字串中間的空格標記
  stringstyle=\ttfamily, % 程式碼字串的特殊格式
  breaklines=true, %對過長的程式碼自動換行
  extendedchars=false,  %解決程式碼跨頁時,章節標題,頁首等漢字不顯示的問題
  escapebegin=\begin{CJK*}{GBK}{hei},escapeend=\end{CJK*},      % 程式碼中出現中文必須加上,否則報錯
  texcl=true,}
\begin{document}
 \begin{lstlisting}
       %讀入視訊函式
[filename,pathname,fileindex]=uigetfile('*.avi','請選擇一個Avi檔案');
video_info=aviinfo([pathname filename]);
LEN=video_info.NumFrames; %獲得視訊長度
for k=1:LEN
    video_videotape(k)=aviread(video_info.Filename,k);
    video_image=video_videotape(k).cdata;
    if k<10
        imwrite(video_image,strcat('0000',int2str(k),'.bmp'),'bmp');% 把每幀影象存入硬碟
    elseif k>=10 & k<100
        imwrite(video_image,strcat('000',int2str(k),'.bmp'),'bmp');%把每幀影象存入硬碟
    elseif k>=100 & k<1000
        imwrite(video_image,strcat('00',int2str(k),'.bmp'),'bmp');%把每幀影象存入硬碟
    elseif k>=1000 & k<1000
        imwrite(video_image,strcat('0',int2str(k),'.bmp'),'bmp');%把每幀影象存入硬碟
    else
        imwrite(video_image,strcat(int2str(k),'.bmp'),'bmp');%把每幀影象存入硬碟
    end
end
    \end{lstlisting}
\end{document}

效果圖為:


這裡寫圖片描述

另一種方法為,如果程式碼中出現中文,則用特殊字元【】引號括起來(英文輸入法下,數字1鍵的左側一個鍵,不需要按下shift鍵,直接按下即可)。具體的模板為【顏色標註的部分是必須要加上的,否則會報錯】:
\documentclass{ctexart}
  \usepackage{geometry} %使用 geometry 巨集包可以方便地調整頁邊距
  \usepackage{listings}
  \usepackage{textcomp} % 必須加上,否則報錯
  \usepackage[framed,numbered,autolinebreaks,useliterate]{mcode}    % 新增matlab程式碼巨集
\begin{document}
    \lstset{numbers=left, numberstyle= \tiny, escapeinside=``}
    \begin{lstlisting}

A = input('Please Input A: ');
b = input('Please Input b: ');
format long;

[n,m] = size(A);
if n ~= m
    disp('`{錯誤!A矩陣不合法!}`');
    return;
end
n = length(b);
if n ~= m
    disp('`{錯誤!A矩陣與b矩陣不匹配!}`');
    return;
end

disp('------------------------');
fprintf('det(A) = %f\n', det(A));
fprintf('cond(A) = %f\n', cond(A));

x = gaussLinearEquation(A,b);
disp('------------------------');
disp('Ax = b `{的解為:}`')
x
disp('------------------------');
\end{lstlisting}
\end{document}

效果圖為:


這裡寫圖片描述

使用listings與xcolor包插入程式碼的方法

這種方法不需要使用mcode包,是一種比較通用的方法,不會因為對mcode包不熟悉或者另外再新增程式碼設定而報錯。模板為:

\documentclass{ctexart}
    % 程式碼段設定
  \usepackage{listings}
  \usepackage{xcolor}
  \lstset{
  language=Matlab,  %程式碼語言使用的是matlab
  frame=shadowbox, %把程式碼用帶有陰影的框圈起來
  rulesepcolor=\color{red!20!green!20!blue!20},%程式碼塊邊框為淡青色
  keywordstyle=\color{blue!90}\bfseries, %程式碼關鍵字的顏色為藍色,粗體
  commentstyle=\color{red!10!green!70}\textit,    % 設定程式碼註釋的顏色
  showstringspaces=false,%不顯示程式碼字串中間的空格標記
  numbers=left, % 顯示行號
  numberstyle=\tiny,    % 行號字型
  stringstyle=\ttfamily, % 程式碼字串的特殊格式
  breaklines=true, %對過長的程式碼自動換行
  extendedchars=false,  %解決程式碼跨頁時,章節標題,頁首等漢字不顯示的問題
  escapebegin=\begin{CJK*}{GBK}{hei},escapeend=\end{CJK*},      % 程式碼中出現中文必須加上,否則報錯
  texcl=true}
\begin{document}
    \lstset{language=Matlab}%程式碼語言使用的是matlab
    \lstset{breaklines}%自動將長的程式碼行換行排版
    \lstset{extendedchars=false}%解決程式碼跨頁時,章節標題,頁首等漢字不顯示的問題
    \begin{lstlisting}
    %讀入視訊函式
[filename,pathname,fileindex]=uigetfile('*.avi','請選擇一個Avi檔案');
video_info=aviinfo([pathname filename]);
LEN=video_info.NumFrames; %獲得視訊長度
for k=1:LEN
    video_videotape(k)=aviread(video_info.Filename,k);
    video_image=video_videotape(k).cdata;
    if k<10
        imwrite(video_image,strcat('0000',int2str(k),'.bmp'),'bmp');% 把每幀影象存入硬碟
    elseif k>=10 & k<100
        imwrite(video_image,strcat('000',int2str(k),'.bmp'),'bmp');%把每幀影象存入硬碟
    elseif k>=100 & k<1000
        imwrite(video_image,strcat('00',int2str(k),'.bmp'),'bmp');%把每幀影象存入硬碟
    elseif k>=1000 & k<1000
        imwrite(video_image,strcat('0',int2str(k),'.bmp'),'bmp');%把每幀影象存入硬碟
    else
        imwrite(video_image,strcat(int2str(k),'.bmp'),'bmp');%把每幀影象存入硬碟
    end
end
\end{lstlisting}
\end{document} 

效果為:


這裡寫圖片描述

其中,關於\lstset{},即插入程式碼的設定部分,可以從以下程式碼中按需進行設定:
\usepackage{listings}
  \usepackage{xcolor}
  \lstset{tabsize=4, %
  frame=shadowbox, %把程式碼用帶有陰影的框圈起來
  commentstyle=\color{red!50!green!50!blue!50},%淺灰色的註釋
  rulesepcolor=\color{red!20!green!20!blue!20},%程式碼塊邊框為淡青色
  keywordstyle=\color{blue!90}\bfseries, %程式碼關鍵字的顏色為藍色,粗體
  showstringspaces=false,%不顯示程式碼字串中間的空格標記
  stringstyle=\ttfamily, % 程式碼字串的特殊格式
  keepspaces=true, %
  breakindent=22pt, %
  numbers=left,%左側顯示行號
  stepnumber=1,%
  numberstyle=\tiny, %行號字型用小號
  basicstyle=\footnotesize, %
  showspaces=false, %
  flexiblecolumns=true, %
  breaklines=true, %對過長的程式碼自動換行
  breakautoindent=true,%
  breakindent=4em, %
  escapebegin=\begin{CJK*}{GBK}{hei},escapeend=\end{CJK*},
  aboveskip=1em, %程式碼塊邊框
  fontadjust,
  captionpos=t,
  framextopmargin=2pt,framexbottommargin=2pt,abovecaptionskip=-3pt,belowcaptionskip=3pt,
  xleftmargin=4em,xrightmargin=4em, % 設定listing左右的空白
  texcl=true,
  % 設定中文衝突,斷行,列模式,數學環境輸入,listing數字的樣式
  extendedchars=false,columns=flexible,mathescape=true
  % numbersep=-1em
}