
Я использовал ответ Герберта вПроверьте наличие пустого аргумента макросадля проверки, является ли аргумент пустым. Мне было интересно, можно ли расширить решение Герберта, чтобы также определить, является ли аргумент макроса \empty
. Если это не удалось, я надеялся узнать способ установки макроса, чтобы он \ifempty
вел себя так, как мне нужно. Следующий код показывает, что \ifempty
правильно определяет пустой аргумент макроса, но не считает \empty
его пустым аргументом. Затем я делаю несколько безуспешных попыток определить пустой макрос.
\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}
решение1
Detokenized \empty
конечно не пуст. Короткий комментарий к четырем примерам.
Как и ожидалось.
Непусто, как было сказано в начале.
Вы определяете
\z
, после которого должна быть строка% \ifempty
. Определение ошибочное, но никогда не использовалось. Затем есть{3. empty}{3. nonempty}
и оно написано как обычный текст.Сейчас
\z
определено правильно, ноz
, конечно, не пусто.
Если вы просто хотите сравнить эквивалентность макросов, \ifx
возможно, это вам больше подойдет.