Ignorar invocação de comando no argumento `ifnum`

Ignorar invocação de comando no argumento `ifnum`

Eu tenho um comando \yesifoneque deve receber 1ou 0como argumento e se comporta de maneira diferente dependendo desses dois casos. Quero passar para ele a saída de um comando \one. No entanto, \onedepende de algum outro comando \blahque não gera saída (no meu caso concreto, ele define uma variável). Minha tentativa atual de fazer isso funcionar falha, provavelmente porque ifnuminclui the \blah{}na comparação, em vez de apenas o number 1. Como posso fazer isso funcionar, por exemplo, ignorando a \blah{}invocação e verificando apenas o texto de saída?

Em outras palavras, gostaria que o seguinte fosse gerado 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}

Responder1

Com seu código \yesifone{\one}produz os tokens
\yesifone{1\one}2

Isso se expande para .
\ifnum112=12\one\relax{1y11e11s11}2\else{1n11o11}2\fi

No momento de coletar tokens que pertencem ao \ifnumsegundo TeX-⟨número⟩-quantidade, ou seja, o número atrás de , o token é expandido, portanto você tem s.th. como=12\one

\ifnum112=1210\blah{1}21011210\relax{1y11e11s11}2\else{1n11o11}2\fi.

Os tokens de espaço logo atrás são removidos e expandidos e simplesmente desaparecem quando seu texto de substituição fica vazio. Assim você tem s.th. como:10=12\blah

\ifnum112=12{1}21011210\relax{1y11e11s11}2\else{1n11o11}2\fi.

Então, no momento de coletar tokens que pertencem ao \ifnumsegundo TeX-⟨número⟩-quantidade, ou seja, o número atrás , o TeX encontra um grupo de chaves vazio, ou seja, tokens de caracteres explícitos e , que definitivamente não forma o início de uma sequência de tokens que formam um TeX-⟨ válido=12{1}2número⟩-quantidade.


Pense na analogia de Knuth de que o TeX é uma fera com olhos e trato digestivo.

  • A expansão de tokens expansíveis ocorre na garganta em algum tipo de processo de regurgitação, a menos que a expansão seja suprimida como é o caso, por exemplo, com os tokens que formam o texto do parâmetro ou o texto de substituição de uma \defatribuição. (LaTeX \newcomande \NewDocumentCommandetc são wrappers sofisticados para chamadas \def.)
  • As atribuições acontecem no estômago.

Portanto, separe tarefas como atribuir valores a "variáveis" que envolvem o estômago para realizar trabalhos de não composição tipográfica de tarefas em que a garganta/expansão de tokens expansíveis é suficiente e onde os órgãos digestivos atrás da garganta estão envolvidos apenas na composição 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}

insira a descrição da imagem aqui

informação relacionada