将计数器名称从一个宏输入到另一个宏时出错

将计数器名称从一个宏输入到另一个宏时出错

为了掌握 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。它不适用于此类示例。

相关内容