使用一个宏来设置另一个宏中的计数器值

使用一个宏来设置另一个宏中的计数器值

我试图将try之前定义的计数器的值设置为命令输出的值\foo。但是这不起作用。我猜问题出在宏中,\test\foo在编译时没有正确展开。由于我对宏及其展开了解甚少,所以我无法在这里找到解决方案。

\documentclass{book}

\usepackage{ifthen}

\newcounter{try}

\newcommand{\foo}[1]{\ifthenelse{#1=1}{1}{0}}

\newcommand\test[1]{\setcounter{try}{\foo{#1}}%
\arabic{try}}

\begin{document}

Result of foo\{3\}: \foo{3}
Result of test\{3\}: \test{3}

\end{document}

答案1

TeX 扩展了第二个参数\setcounter,希望看到那里<number>。因此,您需要一个可扩展的测试,但它\ifthenelse不是:它不是扩展为数字,而是扩展为生成数字的指令。

最简单的方法是使用原始条件\ifnum

\documentclass{book}

\newcounter{try}

\newcommand{\foo}[1]{\ifnum#1=1 1\else0\fi}

\newcommand\test[1]{\setcounter{try}{\foo{#1}}%
\arabic{try}}

\begin{document}

Result of \verb|\foo{3}|: \foo{3}
Result of \verb|test{3}|: \test{3}

Result of \verb|\foo{1}|: \foo{1}
Result of \verb|test{1}|: \test{1}

\end{document}

=1请注意,在所有出现“裸”常量的情况下,后面的空格都是必需的(TeX 会忽略该空格)。

或者,使用etoolbox

\documentclass{book}
\usepackage{etoolbox}

\newcounter{try}

\newcommand{\foo}[1]{\ifnumcomp{#1}{=}{1}{1}{0}}

\newcommand\test[1]{\setcounter{try}{\foo{#1}}%
\arabic{try}}

\begin{document}

Result of \verb|\foo{3}|: \foo{3}
Result of \verb|test{3}|: \test{3}

Result of \verb|\foo{1}|: \foo{1}
Result of \verb|test{1}|: \test{1}

\end{document}

以下是两种情况的输出

在此处输入图片描述

答案2

我不知道问题究竟出在哪里,但你最好使用etoolbox而不是ifthen;参见为什么 ifthen 包已经过时了?

\documentclass{book}

\usepackage{etoolbox}

\newcounter{try}

\newcommand{\foo}[1]{\ifnumequal{#1}{1}{1}{0}}

\newcommand\test[1]{\setcounter{try}{\foo{#1}}%
\arabic{try}}

\begin{document}

\noindent
Result of foo\{3\}: \foo{3}\\
Result of test\{3\}: \test{3}\\
Result of foo\{1\}: \foo{1}\\
Result of test\{1\}: \test{1}

\end{document}

在此处输入图片描述

相关内容