我有一个命令\yesifone
,它应该接受1
或0
作为参数,并且根据这两种情况表现不同。我想将命令的输出传递给它\one
。但是,\one
依赖于不生成任何输出的其他命令\blah
(在我的具体情况下,它设置了一个变量)。我目前尝试使这项工作失败了,大概是因为在比较中ifnum
包含了\blah{}
,而不仅仅是数字1
。我该如何使它工作,例如通过忽略\blah{}
调用并仅检查输出文本?
换句话说,我希望输出以下内容yes
。
\documentclass{minimal}
\begin{document}
\newcommand{\blah}{}
\newcommand{\one}{
\blah{}
1
}
\newcommand{\yesifone}[1]{%
\ifnum1=#1\relax{yes}\else{no}\fi
}
\yesifone{\one} % error: Missing number, treated as zero.
\end{document}
答案1
使用您的代码\yesifone{\one}
生成代币
\yesifone{1\one}2
这扩展为。
\ifnum112=12\one\relax{1y11e11s11}2\else{1n11o11}2\fi
\ifnum在收集属于第二个 TeX-⟨的标记时数字⟩-数量,即后面的数字,token被扩大,因此你有类似的东西=12\one
\ifnum112=12␣10\blah{1}2␣10112␣10\relax{1y11e11s11}2\else{1n11o11}2\fi。
紧随其后的空格标记被移除并扩展,然后消失,因为其替换文本为空。因此,您有如下内容:␣10=12\blah
\ifnum112=12{1}2␣10112␣10\relax{1y11e11s11}2\else{1n11o11}2\fi。
\ifnum因此,在收集属于第二个 TeX-⟨ 的标记时数字⟩-数量,即 后面的数字,TeX 发现一个空的大括号组,即显式字符标记和,这肯定不是构成有效 TeX-⟨ 的标记序列的开头=12{1}2数字⟩-数量。
想一想 Knuth 的比喻:TeX 是一只长着眼睛和消化道的野兽。
- 可扩展标记的扩展在某种反流过程中在食道中进行,除非扩展受到抑制(例如,使用形成参数文本或 -assignment 的替换文本的标记)
\def
。(LaTeX\newcomand
和\NewDocumentCommand
等是用于调用的复杂包装器\def
。) - 任务在胃里进行。
因此,将诸如为“变量”赋值之类的任务(涉及胃进行非排版工作)与食道/可扩展标记的扩展就足够且食道后面的消化器官仅用于排版的任务分开:
\documentclass{minimal}
% Introduce/initialize things used as variable whose value is
% to be set via assignments that take place in the stomach:
\newcommand\VariableRelatedToBlah{}
% Define macros for tasks that involve digestive organs behind the gullet for
% for non-typesetting-tasks, e.g.,_setting_ values of variables via assignments:
\newcommand\SetValueOfVariableRelatedToBlah[1]{%
\def\VariableRelatedToBlah{#1}%
}
% Define macros for tasks that involve only the gullet, e.g.,
% _retrieving_ values of variables, or additionally to the gullet
% involve digestive organs behind the gullet only for typesetting:
\newcommand\RetrieveValueOfVariableRelatedToBlah{%
\VariableRelatedToBlah
}
\newcommand\firstofone[1]{#1}%
\newcommand{\yesifone}[1]{%
\ifnum1=\expandafter\firstofone\expandafter{\number#1} yes\else no\fi
}
\begin{document}
% Now you can keep work that involves the stomach for non-typesetting
% separated from work where the gullet is sufficient/where tokens
% delivered by the gullet can directly be used for typesetting:
\SetValueOfVariableRelatedToBlah{0}%
\yesifone{\RetrieveValueOfVariableRelatedToBlah}
\SetValueOfVariableRelatedToBlah{1}%
\yesifone{\RetrieveValueOfVariableRelatedToBlah}
\end{document}