
Tengo un comando \yesifone
que debería tomar 1
o 0
como argumento y se comporta de manera diferente según estos dos casos. Quiero pasarle el resultado de un comando \one
. Sin embargo, \one
depende de algún otro comando \blah
que no genera ningún resultado (en mi caso concreto, establece una variable). Mi intento actual de hacer que esto funcione falla, presumiblemente porque ifnum
incluye el \blah{}
en la comparación, en lugar de solo el número 1
. ¿Cómo puedo hacer que esto funcione, por ejemplo, ignorando la \blah{}
invocación y comprobando únicamente el texto de salida?
En otras palabras, me gustaría que se generara lo siguiente 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}
Respuesta1
Con tu código \yesifone{\one}
cede los tokens.
\yesifone{1\one}2
Esto se expande a .
\ifnum112=12\one\relax{1y11e11s11}2\else{1n11o11}2\fi
Al momento de recolectar tokens que pertenecen al \ifnumsegundo TeX-⟨ denúmero⟩-cantidad, es decir, el número detrás , el token se expande, por lo que tienes algo. como=12\one
\ifnum112=12␣10\blah{1}2␣10112␣10\relax{1y11e11s11}2\else{1n11o11}2\fi.
Los tokens espaciales justo detrás se eliminan, se expanden y simplemente desaparecen porque su texto de reemplazo está vacío. Por lo tanto tienes algo. como:␣10=12\blah
\ifnum112=12{1}2␣10112␣10\relax{1y11e11s11}2\else{1n11o11}2\fi.
Entonces, al momento de recolectar tokens que pertenecen al \ifnumsegundo TeX-⟨ denúmero⟩-cantidad, es decir, el número detrás de , TeX encuentra un grupo de llaves vacío, es decir, tokens de caracteres explícitos y , que definitivamente no forma el comienzo de una secuencia de tokens que forman un TeX-⟨ válido=12{1}2número⟩-cantidad.
Piense en la analogía de Knuth de que TeX es una bestia con ojos y tracto digestivo.
- La expansión de los tokens expandibles tiene lugar en la garganta en una especie de proceso de regurgitación a menos que se suprima la expansión como es el caso, por ejemplo, con los tokens que forman el texto de parámetro o el texto de reemplazo de una
\def
tarea. (LaTeX\newcomand
, etc.\NewDocumentCommand
son envoltorios sofisticados para llamadas\def
). - Las asignaciones tienen lugar en el estómago.
Por lo tanto, separe las tareas como asignar valores a "variables" que involucran al estómago para realizar trabajos no tipográficos de tareas donde la garganta/expansión de fichas expandibles es suficiente y donde los órganos digestivos detrás de la garganta están involucrados solo para la composición tipográfica:
\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}