为了掌握 TeX/LetTeX 的技术方面,我一直在尝试编写自己的类文件。在编写这样的一个文件时,我发现需要一个宏来接受两个计数器并返回具有最大值的计数器。
对于这项任务,我相信我已经编写了一个合适的宏\getmaxoftwocounters
,定义如下,在我的测试中它似乎运行良好。但是,当我尝试将此宏的结果输入到其他宏中时(特别是当我想获取计数器的格式化表示以用于排版时),我得到了一个错误。
下面是我的问题的一个最小例子:
\documentclass{minimal}
\newcommand{\getmaxoftwocounters}[2]
{\ifnum\value{#1}<\value{#2}{#2}\else{#1}\fi}
\begin{document}
\newcounter{mycounterA}
\newcounter{mycounterB}
\setcounter{mycounterA}{1}
\setcounter{mycounterB}{2}
\null
\getmaxoftwocounters{mycounterA}{mycounterB}
\null\\
\arabic{mycounterB}
%\arabic{\getmaxoftwocounters{mycounterA}{mycounterB}}
\end{document}
当我取消注释注释行时,我收到错误! Missing number, treated as zero.
。有人知道如何解决这个问题吗?我能想到的唯一问题是宏扩展的顺序问题,但我尝试过在各个地方进行尝试\expandafter
,\edef
但无济于事,现在我不知道该怎么办。
答案1
您需要摘掉牙套。
\documentclass{article}
\newcommand{\getmaxoftwocounters}[2]{%
\ifnum\value{#1}<\value{#2}%
#2%
\else
#1%
\fi
}
\begin{document}
\newcounter{mycounterA}
\newcounter{mycounterB}
\setcounter{mycounterA}{1}
\setcounter{mycounterB}{2}
\getmaxoftwocounters{mycounterA}{mycounterB}
\arabic{mycounterB}
\arabic{\getmaxoftwocounters{mycounterA}{mycounterB}}
\end{document}
使用你的代码,你将获得
\arabic{{mycounterB}}
那是语法错误。
代码可以写成
\newcommand{\getmaxoftwocounters}[2]
{\ifnum\value{#1}<\value{#2}#2\else#1\fi}
但可读性会下降。
请不要使用该类minimal
。它不适用于此类示例。