我需要在 latex 中排版几段代码的伪代码。我发现这个答案很好地概述了可用于渲染伪代码的三个主要包。在下文中,我将采用algpseudocode
看起来最方便和最完整的包(恕我直言)。但是,有很多细节和最佳实践我不知道,我找不到令人满意的答案。我的目标是实现最佳可读性伪代码(算法本身就很棘手,没有理由让它们变得更难)。
- 考虑一行伪代码。其所有内容(注释除外)通常都以数学模式呈现(即使在文档手册的示例中也是如此)。从印刷的角度来看,这是正确的选择吗?如果是这样,我对变量名有一个问题:如果我使用一个字母的变量(,,,
i
... ),一切都很好,但是当我需要呈现带有多个字母的变量名时,情况就变得很糟糕(只要有可能,我就会尝试使用只有一个字母的变量名,但有时为了清楚起见,需要更具描述性的名称)。我当前的解决方案如下:j
k
\algnewcommand{\Var}[1]{\mathit{#1}}
\begin{algorithmic}
\State $\Var{my\_var} \gets 1$
\end{algorithmic}
但是,它并不完美,我无法在数学模式之外使用它来呈现变量的名称(以便以与伪代码相同的样式打印它)。
选择
camelCase
或snake_case
作为变量名?在snake_case的情况下,如何正确呈现下划线?变量名使用罗马字母还是斜体?
当调用具有多个参数的函数时,逗号后插入的空格是否正确?
\begin{algorithmic}
\State $\Call{MyFunc}{arg1, arg2, arg3}$
\end{algorithmic}
- 由于每行代码都是以数学模式呈现的,人们可能会认为尽可能使用数学符号是首选……但我不太确定这是否总是最好的选择。我的伪代码中经常出现的一种情况是以下情况,您认为哪种情况更合适?为什么?
\algnewcommand{\In}{\mathbf{in}}
\begin{algorithmic}
\ForAll{$i \in \{1, \ldots, n\}$}
\State ...
\EndFor
\ForAll{$i \In 1, \ldots, n$}
\State ...
\EndFor
\end{algorithmic}
- 有没有方便的方法来引用代码块(即许多连续的行)?提供与以下内容相同结果的东西(可能需要更少的代码):
\begin{algorithmic}
\For{$i = 1,2$} \label{algblock-start:for-loop}
\State ...
\EndFor \label{algblock-end:for-loop}
\end{algorithmic}
At lines \ref{algblock-start:for-loop}--\ref{algblock-end:for-loop} ...
- 如何排版“特殊”值,如
null
、true
和false
?我目前的解决方案是使用mathbf
:
\algnewcommand{\Null}{\mathbf{null}}
\algnewcommand{\True}{\mathbf{true}}
\algnewcommand{\False}{\mathbf{false}}
- [更新] 如何排版常见数据结构(如数组、哈希图、队列等)的初始化?目前我执行以下操作:
\begin{algorithmic}
\State $\Var{my\_array} \gets \Call{Array}{\Null}$
\State $\Var{my\_map} \gets \Call{HashMap}{\Null}$
\State $\Var{my\_queue} \gets \Call{Queue}{\Null}$
\end{algorithmic}
答案1
有多种方法可以使命令
\Var
在数学模式内外工作。\algnewcommand\Var[1]{\mbox{\itshape#1}} \algnewcommand\Var[1]{\ensuremath{\mathit{#1}}}
驼峰式命名法与蛇形命名法取决于个人喜好、社区等。长变量名在算法上下文中通常不太易读。单个字母或单词通常就足够了。如果您确实需要长变量名,那么最好使用或其他软件包的语法突出显示
lstlisting
:用通用编程语言编写算法,但省略不必要的语法元素(这样它就不会编译)。例如,有些人使用类似 Python 的算法,并使用 Python 突出显示。如果要在变量名中使用下划线,可以使用类似
\algnewcommand\Var[1]{\mbox{\ttfamily\detokenize{#1}}} ... \Var{abc_def} ... $\Var{abc_def}$ ...
如果是接近数学的算法,变量名较短,则使用斜体。否则,如果更像程序,则可以考虑使用类似打字机字体(见上文)。
如果可以轻松地将参数分开,从视觉上看,那就没问题,否则请插入尽可能多的空间以使其可读。通常没有太多空间(例如在两列中排版时),因此即使在不需要时也到处插入空格可能不是最佳选择。
人们喜欢数学模式,因为它可以轻松添加下标和上标,并以二维形式(而不是线性形式)排版数学表达式。如果您不使用数学表达式,则可能不需要数学模式。
给定一个特定的伪代码包,可以实现对引用块的支持,但我不知道它是否已经完成。
同样,如何排版常量(如)取决于个人喜好或社区
null
。就我个人而言,我不喜欢粗体,因为它在视觉上太突出了。考虑使用打字机字体。或者,如果您非常熟悉某种编程语言,请考虑将该语言用作带高亮显示的伪语言。这看起来像 Java,那么为什么不使用等以伪 Java 形式编写它呢
lstlisting
?minting
顺便提一下,在介绍算法时,引用诸如 之类的特定实现并不常见
HashMap
。相反,人们会尝试抽象出实现细节,并坚持使用元组、列表和集合(因此更喜欢使用数学符号)。在讨论复杂性之类的问题时,您将假设这些抽象数据类型及其操作是用最佳数据结构实现的,例如假设散列键和访问元素的恒定时间。