LaTeX中插入matlab程式碼(可新增中文註釋)的幾種方法
阿新 • • 發佈:2019-02-11
最近在用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
}