最近在用LaTeX写文件时,需要插入matlab代码,但是matlab代码编写时没有注意到注释为中文所带来的不便,导致在编写LaTeX文件时总是报错。经查阅网上有关这方面的资料和自己不断地尝试之后,总结其中的方法如下:使用matlab的mcode包和仅仅使用listings与xcolor包实现对matlab代码的插入。
如果插入的代码中不包含有任何中文的话,可以采用如下方法(安装方法可见:美赛如何在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}
效果图为:
这种方法不需要使用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
}