我在使用 algorithm2e 包时遇到了一些问题。以下是代码:
\begin{algorithm}
\caption{Tree merge algorithm\label{alg:merge}}
\SetKwData{H}{H}\SetKwData{M}{M}\SetKwData{C}{C}\SetKwData{R}{R}
\SetKwData{SH}{SH}\SetKwData{SM}{SM}\SetKwData{SC}{SC}\SetKwData{SR}{SR}
\SetKwData{N}{N}\SetKwData{E}{E}\SetKwData{X}{X}
\SetKwInput{KOutput}{output}
\SetKwInput{KInput}{input}
\KInput{local tree object (\H) and remote tree object (\M)}
\KInput{common ancestor object (\C)}
\KOutput{resulting tree object (\R)}
...
这段代码运行正常,正如预期的那样。但是,如果我将 \SetKwInput 替换为 \SetKwInOut(这是我想要使用的格式),则会收到以下错误:
! Missing number, treated as zero.
<to be read again>
\protect
l.163 \SetKwInOut{KOutput}{output}
?
我在同一个文件中有其他算法可以正常工作,并且不会出现此错误。这里的问题是什么?该包的用途如下:
\usepackage[dotocloa,boxed,algochapter]{algorithm2e}
更新
以下是完整的 MWE:
\documentclass[11pt]{book}
\usepackage[printonlyused,nohyperlinks]{acronym}
\usepackage[dotocloa,boxed,algochapter]{algorithm2e} % describe algorithms
\title{Book Title}
\author{Jonatan Schroeder}
\begin{document}
\maketitle
\chapter{Implementation Details}
\label{ch:implementation}
\begin{algorithm}
\caption{Tree merge algorithm\label{alg:merge}}
\SetKwData{H}{H}\SetKwData{M}{M}\SetKwData{C}{C}\SetKwData{R}{R}
\SetKwInOut{KOutput}{output}
\SetKwInOut{KInput}{input}
\KInput{local tree object (\H)}
\KInput{remote tree object (\M)}
\KInput{common ancestor object (\C)}
\KOutput{resulting tree object (\R)}
\Return \H\;
\end{algorithm}
\end{document}
答案1
当你这样做
\SetKwData{M}{M}
包algorithm2e
定义了一个名为 的内部宏\@M
,但未检查它是否已定义。碰巧的\@M
是非常LaTeX 的重要内部命令,代表数字 10000。
我认为这种方法algorithm2e
是有争议的。不仅可以在没有任何警告的情况下覆盖内部宏,还可以覆盖用户的宏。
使用不同的命名方案。\H
例如,也采用;如果您在算法中使用名称“Erdős”(假设您使用 UTF-8),您会收到令人费解的错误消息,因为这将被翻译成Erd\H{o}s
。
你得到的错误
! Missing number, treated as zero.
正是因为正在扩展的宏使用\@M
10000 的别名,但它已被重新定义为完全不同的含义。