Ignorar la invocación de comando en el argumento `ifnum`

Ignorar la invocación de comando en el argumento `ifnum`

Tengo un comando \yesifoneque debería tomar 1o 0como argumento y se comporta de manera diferente según estos dos casos. Quiero pasarle el resultado de un comando \one. Sin embargo, \onedepende de algún otro comando \blahque no genera ningún resultado (en mi caso concreto, establece una variable). Mi intento actual de hacer que esto funcione falla, presumiblemente porque ifnumincluye 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=1210\blah{1}21011210\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}21011210\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 \deftarea. (LaTeX \newcomand, etc. \NewDocumentCommandson 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}

ingrese la descripción de la imagen aquí

información relacionada