我试图将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}