使用算法包排版 Matlab 源代码时如何获得正确的 Matlab 语法?

使用算法包排版 Matlab 源代码时如何获得正确的 Matlab 语法?

我目前正在使用该algorithm包在我的文档中排版 Matlab 源代码。但是,关键字的排版方式与 Matlab 语法不匹配。例如,\EndFor排版为“end for”而不是“end”,这是 Matlab 中 for 循环的终止关键字。我该如何解决这个问题?

我有以下代码:

\usepackage{algorithm} 
\usepackage{algpseudocode}

\floatname{algorithm}
\begin{algorithm}[H]
 \begin{algorithmic}\State
alpha=0;  rho=0;\State
\For {$r=1:p$}\State
    rho=rho+1/(r\^{}2);\State
    alpha=alpha+1/(r\^{}4);
\EndFor \State
\end{algorithmic}
 \end{algorithm}

答案1

简短回答:不要用于algorithm排版源代码。请使用listingsminted包,或(编辑) 这matlab-prettifier包;见下文。


详细解答

你可以改变方式algpseudocode的关键字(例如为了尽管algorithm等)通过使用重新定义来排版\algdef命令重新定义它们来排版。以下修改回答了您关于为了结束于

在此处输入图片描述

\documentclass{article}

\usepackage{algorithm} 
\usepackage{algpseudocode}
\algdef{SE}[FOR]{For}{EndFor}[1]{\algorithmicfor\ #1}{\algorithmicend}%

\floatname{algorithm}

\begin{document}
\begin{algorithm}[H]
 \begin{algorithmic}\State
alpha=0;  rho=0;\State
\For {$r=1:p$}\State
    rho=rho+1/(r\^{}2);\State
    alpha=alpha+1/(r\^{}4);
\EndFor \State
\end{algorithmic}
 \end{algorithm}
\end{document}

然而虽然重新配置algorithm& 朋友以符合某些语言的语法在一定程度上是可能的(并且要付出巨大的努力和乏味的代价),但这些包实际上并不用于伪代码(即“用简单的英语解释的算法”)以外的任何其他用途。

其他软件包如listingsminted更适合排版源代码(即,在您的情况下,m 文件的内容)。这些软件包附带了多种编程语言(C、Python、Matlab 等)的预定义设置,这些设置可以自定义。此外,这两个软件包都允许行编号和语法突出显示。

编辑:我最近编写了一个名为 的包,matlab-prettifier用于很好地排版 Matlab 代码。它建立在包之上listings,但我定义了一种模仿minted输出的样式,具有更好的语法突出显示功能;特别要注意的是,在我的示例中,end关键字的突出显示方式不同,具体取决于其使用的上下文。

在此处输入图片描述

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage[framed,numbered]{matlab-prettifier}

\usepackage{filecontents} % to generate an external file from this tex file
\begin{filecontents*}{mysourcefile.m}
function I = Simprule(f,a,b,m)
% Applies the composite Simpson's rule to function f
% (using 2m+1 points) between limits a and b.
% INPUTS:
%       - f  inline function
%       - a  lower limit of the integral
%       - b  upper limit of the integral
%       - m  positive integer    
%
% OUTPUT:
%       - I  approximate value of the integral

% --- Sanity checks ---
  % 1 - Check that a<=b.
  if a>b
    error('b must be smaller than a.');
  end
  % 2 - Check that m is a positive integer.
  if (floor(m)~=m) || (m<=0) 
    error('m must be a positive integer.');
  end

% --- Create subintervals of [a,b] ---
  x = linspace(a,b,2*m+1);
  h = (b-a)/(2*m);

% --- Apply the composite Simpson's rule ---
    int = (h/3)*(   f(x(1))...                       
                    + 2 * sum( f(x(3:2:end-2)) )...
                    + 4 * sum( f(x(2:2:end-1)) )...
                    + f(x(end))  );

\end{filecontents*}

\begin{document}
\lstinputlisting[style=Matlab-Pyglike,basicstyle=\mlttfamily]{mysourcefile.m}
\end{document}

我已经在我的文件中生成了m-file fromn tex,只是为了使我的示例完整。实际上,您可以将m-files 放在机器上的某个位置,然后只需在输入文件中链接到它们即可。


最后,这里有一条与主题无关的评论(TeX):Matlab 循环很慢!为了提高性能,您应尽可能避免使用 Matlab (forwhile) 循环,而应使用冒号运算符和矢量化命令 (例如sum) 的组合。以下是我推荐的替代方案:

在此处输入图片描述

与你的版本相比,我的版本在计算时间上的减少随着计算量的p增加而变得显著。

相关内容