
Tenho usado a resposta de Herbert emVerifique se há argumento de macro vaziopara verificar se um argumento está vazio. Fiquei me perguntando se é possível expandir a solução de Herbert para detectar também se um argumento macro é \empty
. Se isso falhar, eu esperava aprender uma maneira de definir uma macro para que ela \ifempty
se comportasse como eu quero. O código a seguir mostra que \ifempty
detecta corretamente um argumento de macro vazio, mas não o considera \empty
um argumento vazio. Em seguida, faço algumas tentativas malsucedidas de definir uma macro vazia.
\documentclass{article}
\makeatletter
\def\ifempty#1{%
\if\relax\detokenize{#1}\relax%
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
\makeatother
\begin{document}
\ifempty{}{1. empty}{1. nonempty}
\ifempty{\empty}{2. empty}{2. nonempty}
\def\z%
\ifempty{\z}{3. empty}{3. nonempty}
\def\z{}%
\ifempty{\z}{4. empty}{4. nonempty}
\end{document}
Responder1
É claro que destokenizado \empty
não está vazio. Breve comentário aos quatro exemplos.
Está como esperado.
Não é vazio como foi dito no início.
Você está definindo
\z
, após o qual deve ser string% \ifempty
. A definição é errônea, mas nunca usada. Depois existe{3. empty}{3. nonempty}
e está escrito como um texto comum.Agora
\z
está devidamente definido, masz
é claro que não está vazio.
Se você quiser simplesmente comparar equivalência de macros, \ifx
pode ser mais adequado para você.