我目前正在使用该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
排版源代码。请使用listings
或minted
包,或(编辑) 这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
& 朋友以符合某些语言的语法在一定程度上是可能的(并且要付出巨大的努力和乏味的代价),但这些包实际上并不用于伪代码(即“用简单的英语解释的算法”)以外的任何其他用途。
其他软件包如listings
或minted
更适合排版源代码(即,在您的情况下,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 (for
或while
) 循环,而应使用冒号运算符和矢量化命令 (例如sum
) 的组合。以下是我推荐的替代方案:
与你的版本相比,我的版本在计算时间上的减少随着计算量的p
增加而变得显著。