我可以用什么来在我的文档中排版 MATLAB 代码?

我可以用什么来在我的文档中排版 MATLAB 代码?

这个问题导致了一个新的方案的出现: matlab-prettifier

有人能快速轻松地排版附录中一些相对较长的 MATLAB 代码吗?我查了几种方法,发现这个mcode包是可行的,但似乎无人维护……

我的代码中有很多方程式,因此我更喜欢一种避免使用$表示方程式的解决方案。

此外,如果可能的话,如果有一种方法可以保留 MATLAB 的所有“自然”编码颜色(例如绿色表示注释),那就太好了……

任何想法?

答案1

这是我用于 matlab 代码的模板:

\documentclass{article}

\usepackage{listings}
\usepackage{color} %red, green, blue, yellow, cyan, magenta, black, white
\definecolor{mygreen}{RGB}{28,172,0} % color values Red, Green, Blue
\definecolor{mylilas}{RGB}{170,55,241}


\begin{document}


\lstset{language=Matlab,%
    %basicstyle=\color{red},
    breaklines=true,%
    morekeywords={matlab2tikz},
    keywordstyle=\color{blue},%
    morekeywords=[2]{1}, keywordstyle=[2]{\color{black}},
    identifierstyle=\color{black},%
    stringstyle=\color{mylilas},
    commentstyle=\color{mygreen},%
    showstringspaces=false,%without this there will be a symbol in the places where there is a space
    numbers=left,%
    numberstyle={\tiny \color{black}},% size of the numbers
    numbersep=9pt, % this defines how far the numbers are from the text
    emph=[1]{for,end,break},emphstyle=[1]\color{red}, %some words to emphasise
    %emph=[2]{word1,word2}, emphstyle=[2]{style},    
}


\section*{Matlab Code}

\lstinputlisting{myfun.m}


\end{document}

这产生了以下输出(我没有把我的 matlab 文件放在这里,但从输出中应该可以清楚地看出):

在此处输入图片描述

答案2

对于在 LaTeX 中排版 Matlab 代码,请考虑使用matlab-prettifier包裹。

它搭载在listings软件包上,不需要太多配置,并且会跟踪上下文(在后台),以便在 Matlab 编辑器中突出显示代码。在这方面,可以说它比其他可用选项(、、minted等)做得更好。listingsmcode

该包当前执行的语法突出显示matlab-prettifier包括:

  1. 上下文不敏感的关键字(例如,,for),whilebreak
  2. 上下文相关的关键字(例如end,,propertiesevents
  3. (引用)字符串,
  4. 单行注释和块注释,
  5. 行继续符 ( ...),
  6. 代码部分标题。
  7. 系统命令。

其他功能包括

  • 三种预定义样式:标准、黑白和MatlabLexer模仿 Pygments ( minted) 输出的 -like 样式,
  • listings与环境和宏的无缝兼容性,
  • 手动突出显示具有共享范围的变量,
  • 手动突出显示未加引号的字符串,
  • 用于轻松排版代码片段中的占位符的宏,
  • 根据周围环境自动缩放内联代码,
  • 仅打印 Matlab 函数头的选项(参见)。

matlab-prettifier在 CTAN 以及 TeX Live 和 MiKTeX 上均可用。如果您愿意,可以从GitHub 存储库

一些例子

为了进行比较,这里有一些由 Matlab 编辑器排版matlab-prettifier并显示在 Matlab 编辑器中的代码示例。

person.m (matlab-prettifier) 代码 person.m(Matlab 编辑器)

sample.m (matlab-prettifier) 代码 sample.m(Matlab 编辑器)

带占位符的代码片段(matlab-prettifier)

代码

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage{bigfoot} % to allow verbatim in footnote
\usepackage[numbered,framed]{matlab-prettifier}

\usepackage{filecontents}
\begin{filecontents*}{person.m}
classdef person
   properties %(here, properties is a keyword)
       mass=80;
       height=1.80;
   end
   methods
       function BMI = getBMI(height,weight)
           BMI = person.mass/person.mass^2;
       end
   end
end
\end{filecontents*}

\begin{filecontents*}{sample.m}
%% Code sections are highlighted.
% System command are supported...
!gzip sample.m
% ... as is line continuation.
A = [1, 2, 3,... % (mimicking the ouput is good)
     4, 5, 6]
fid = fopen('testFile.text', 'w')
for i=1:10
  fprintf(fid,'%6.2f \n', i);
end
x=1; %% this is just a comment, though
% Context-sensitive keywords get highlighted correctly...
p = properties(mydate); %(here, properties is a function)
x = linspace(0,1,101);
y = x(end:-1:1)
% ... even in nonsensical code.
]end()()(((end end)end ))))end (function end
%{
    block comments are supported
%} even
runaway block comments
are
\end{filecontents*}

\let\ph\mlplaceholder % shorter macro
\lstMakeShortInline"

\lstset{
  style              = Matlab-editor,
  basicstyle         = \mlttfamily,
  escapechar         = ",
  mlshowsectionrules = true,
}

\begin{document}

\lstlistoflistings

\lstinputlisting[caption = {Some class definition}]{person.m}

Before you use any "for"~loop, refresh your memory on Matlab blocks.%
\footnote{Any occurence of "for" must have a matching "end".} 

\lstinputlisting[caption = {Sample code from Matlab}]{sample.m}
\pagebreak

\begin{lstlisting}[caption = {For educational purposes}]
% example of while loop using placeholders
while "\ph{condition}"
  if "\ph{something-bad-happens}"
    break
  else
    % do something useful
  end
  % do more things
end
\end{lstlisting}

\end{document}

答案3

mcode包裹仍然支持 Matlab 代码格式,设置默认lstlisting环境(从listings) 格式与 Matlab 格式相同。它还提供\mcode{<code>}内联 Matlab 代码。

在此处输入图片描述

\documentclass{article}
% http://www.mathworks.com/matlabcentral/fileexchange/8015-m-code-latex-package
\usepackage[framed,numbered,autolinebreaks,useliterate]{mcode}
\begin{document}
\begin{lstlisting}
function y = myfun(aa, sigma, options)

  sigma

  y = aa .* pdf('logn', aa, -0.5*sigma^2, sigma)

  %y = 1/(sigma.*sqrt(2.*pi)) .* exp((-((log(aa)+0.5*sigma.^2)).^2) ./ (2.*sigma.^2));
\end{lstlisting}
\end{document}

类似参考:内联 MATLAB 代码

答案4

你试过了吗

\begin{verbatim}    
Matlab code 
\end{verbatim}

相关内容