LaTeX算法与伪代码怎么排版
讲清 latex中怎么写算法:用 algorithm 浮动体加 algorithmic 结构命令做带编号的伪代码,用 listings 排版真实源码,并给出编号、引用和报错的核对方法。
很多人写论文或技术报告时,需要在 LaTeX 里放一段算法描述。它既要有编号和标题,正文里还要能引用“算法 1”,同时内部需要缩进表示循环和分支。这和普通段落、普通等宽代码都不一样,直接粘贴文字很难排好。latex 中怎么写算法,本质上是用“浮动体加算法结构命令”两层来解决。
读完这篇,你可以选对宏包,照着步骤写出一段能编译的伪代码,并知道编号、引用、缩进和报错分别该怎么检查。文中也会区分“伪代码”和“源代码”两种需求,因为 latex 中如何排版代码 与写算法是两件事,用错工具会事倍功半。
在 LaTeX 中放算法,怎么选方法?一句话结论
伪代码用 algorithm 浮动体配合 algorithmic 或 algpseudocode 来写;需要展示真实源码时,用 listings 排版。下表按你的情况给出推荐做法。
| 你的情况 | 推荐做法 | 原因 |
|---|---|---|
| 论文中的伪代码,需要编号、标题和正文引用 | algorithm 浮动体 + algpseudocode | 浮动体自动编号,可用 \ref 引用,也能生成算法目录 |
| 习惯教材风格,希望用 \KwIn、\KwOut 之类的关键字 | algorithm2e | 语法贴近教材,语句以分号结束 |
| 需要展示真实的 Python 或 C++ 源码 | listings 的 lstlisting 环境 | 保留源码字符,支持语法高亮和行号 |
| 只有一两行符号说明,不需要编号 | 普通段落加行内公式 | 不必引入浮动体,写法简单 |
| 期刊或学校模板已指定宏包 | 以模板要求为准 | 模板通常已配置好格式,擅自更换容易冲突 |
开始之前:先确认这几点
先分清伪代码和源代码。 伪代码的目标是让读者看懂思路,语言不必能运行,关键字和数学符号可以混用。源代码要求逐字符保真,缩进、空格和注释都要原样保留。两者的排版工具不同,混用会让格式难以控制。
确认编译环境已经有所需宏包。 algorithm、algorithmic 和 algpseudocode 是常见 LaTeX 发行版里的常用包。如果编译时提示找不到文件,需要通过发行版自带的包管理器补装,不要急于改正文。
检查模板是否已经加载了相关宏包。 不少期刊模板已经定义了算法环境或关键字命令。重复加载不同的算法宏包,容易出现命令冲突,此时应以模板提供的写法为准。
提前规划编号和引用。 论文里通常要求“算法 1”这样的编号,并且正文要能引用它。每个算法的 label 不能重复,建议带前缀,例如 alg: 开头,方便后期查找。
如果要把含算法的源文件翻译成其他语言,要预留核对时间。 译文可能改动关键字、变量名或符号,需要对照原文逐段检查。机器翻译和 OCR 的结果都应人工复核重要内容。
在 LaTeX 中写一个带编号的伪代码块的步骤
- 在导言区加载宏包:写入 algorithm 与 algpseudocode 两个宏包。algpseudocode 会加载结构命令所需的底层支持,一般只需要这两行。
- 在正文中用 algorithm 环境包住整个算法,位置参数写 [htbp],让排版系统自行选择合适的摆放位置。
- 在 algorithm 环境内写 \caption 给算法起标题,紧接着写 \label 设置标签,标签名建议带 alg: 前缀。
- 在 caption 之后开启 algorithmic 环境,方括号中的数字表示每隔几行显示一次行号,常用 [1] 表示每行都编号。
- 用 \Require 写输入,用 \Ensure 写输出,用 \State 写普通语句。每条语句单独一行,不需要加分号。
- 用 \If{条件} 与 \EndIf、\For{范围} 与 \EndFor、\While{条件} 与 \EndWhile 写控制结构,中间的语句会自动缩进。用 \Return 写返回值。
- 依次关闭 algorithmic 和 algorithm 环境。正文中用 \ref{alg:标签名} 引用算法编号,然后连续编译两次,让交叉引用生效。
做完后逐项核对
拿到 PDF 后,不要只看它能不能编译成功,还要逐项检查下面这些地方。
| 检查项 | 怎么看 | 有问题怎么办 |
|---|---|---|
| 编号与标题 | 算法顶部是否显示“算法 1”和标题文字 | 检查 \caption 是否写在 algorithmic 环境之前,位置不对会导致标题缺失 |
| 交叉引用 | 正文中的引用是否显示为实际编号,而不是问号 | 连续编译两次;仍失败则核对 \label 与 \ref 的拼写是否完全一致 |
| 缩进与结束标记 | 每个 \If、\For 是否都有对应的 End 命令 | 缺少结束命令会让后续内容整体缩进或直接报错,逐个补齐 |
| 符号与公式 | 变量、下标、希腊字母是否处于数学模式 | 用 $...$ 包裹,避免字母与符号挤在一起 |
| 分页位置 | 算法块是否被拆到两页,或者离正文引用太远 | 调整 [htbp] 位置参数,或把过长的算法拆成两个小算法 |
| 翻译或导出后的内容 | 关键字、变量名与编号是否保留 | 对照原文逐段核对,重点检查 \Require、\Ensure 等关键字是否被改动 |
📊 核心对比
算法排版通常有三种主流写法,它们各有侧重,下表帮助你做选择。
| 方法 | 适合内容 | 语法风格 | 需要注意的地方 |
|---|---|---|---|
| algorithmic 与 algpseudocode | 论文中的伪代码,强调结构清晰 | 结构命令成对出现,如 \If 对应 \EndIf | 结束命令不能漏写,缩进由环境自动处理 |
| algorithm2e | 教材或讲义风格,需要标准的输入输出关键字 | 语句以分号结束,关键字如 \KwIn、\KwOut | 与部分期刊模板可能冲突,使用前先确认模板要求 |
| listings(lstlisting 环境) | 真实的 Python、C++ 等源码展示 | 逐字符保留源码,支持语法高亮和行号 | 它是源码显示工具,不负责伪代码的结构缩进 |
如果你手上的是一份完整的 LaTeX 源码包,需要把其中含算法的段落译成另一种语言,可以考虑 OmniDoc 的文档翻译功能。它支持 LaTeX 源码包,输出时公式与版式会尽量保留,但算法中的关键字与符号仍需逐项核对。另外,UniDoc 网页编辑器(app.unidoc.top)支持 Word 与 LaTeX 之间的互相转换,适合先在里面整理内容,再导回 LaTeX 源文件,编译和最终排版仍以你本地的 LaTeX 环境为准。
❓ 常见问题(FAQ)
1. latex 中怎么加入算法表,和算法块是一回事吗?
通常说的“算法表”指的就是 algorithm 浮动体,它是带编号和标题的算法块,并不是 tabular 表格。如果想在文末列出所有算法,可以使用 \listofalgorithms 生成算法目录,同样需要编译两次。
2. latex 中如何排版代码,为什么不直接用伪代码环境?
algorithmic 面向的是结构化的伪代码,不做语法高亮,也不一定能确保源码字符原样保留。真实源码建议用 listings,它不依赖外部程序,写法也直观。minted 效果更好,但需要系统中安装 Python 与 Pygments,并在编译时开启 shell-escape,配置失败时容易报错。
3. 编译后出现 Undefined control sequence 怎么办?
这通常说明某个命令没有被识别,多半是宏包没有加载,或命令拼写有误。逐个检查 \State、\EndIf 之类的命令拼写,确认 algpseudocode 已在导言区加载。如果与模板冲突,参照期刊或学校模板的写法即可。
4. 伪代码里能不能写中文?
可以,但需要先配置中文支持,并选择能处理中文的编译方式。关键字建议保留英文,中文只用于说明文字和变量注释,这样读者更容易对照其他文献中的写法。
📝 总结
latex 中怎么写算法,核心是用 algorithm 浮动体包住 algorithmic 结构命令,并通过 \caption 与 \label 实现编号和引用。真实源码则交给 listings 排版,二者分开处理,格式更容易控制。写完后按表格逐项检查编号、引用、结束命令和符号,就能得到规范的算法排版。


