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中插入matlab代码(可添加中文注释)的几种方法_第1张图片

如果出现报错 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}

效果图为:


LaTeX中插入matlab代码(可添加中文注释)的几种方法_第2张图片

另一种方法为,如果代码中出现中文,则用特殊字符【 】引号括起来(英文输入法下,数字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}

效果图为:


LaTeX中插入matlab代码(可添加中文注释)的几种方法_第3张图片

使用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} 

效果为:


LaTeX中插入matlab代码(可添加中文注释)的几种方法_第4张图片

其中,关于 \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
}

你可能感兴趣的:(LaTeX学习)