ifmtarg тестирует пустой макрос?

ifmtarg тестирует пустой макрос?

Следующий код работает так, как и ожидалось:

\NewDocumentCommand{\checker}{m}{\@ifmtarg{#1}{empty}{not empty}}
\checker{}  % Prints "empty"
\checker{x} % Prints "not empty"

Однако как заставить это работать, когда в качестве аргумента указан потенциально пустой макрос:

\newcommand{\emptymacro}{}
\NewDocumentCommand{\checker}{m}{\@ifmtarg{#1}{empty}{not empty}}
\checker{\emptymacro}  % Prints "not empty"

Как заставить его печатать, emptyобрабатывая пустой макрос как пустой аргумент?

решение1

Вы хотите использовать expl3рекурсивное расширение.

\ExplSyntaxOn

\NewExpandableDocumentCommand{\checker}{mmm}
 {
  \tl_if_empty:eTF { #1 } { #2 } { #3 }
 }

\ExplSyntaxOff

Полный пример:

\documentclass{article}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\checker}{mmm}
 {
  \tl_if_empty:eTF { #1 } { #2 } { #3 }
 }

\ExplSyntaxOff

\newcommand{\aaa}{\bbb}
\newcommand{\bbb}{\ccc}
\newcommand{\ccc}{}

\newcommand{\ddd}{\eee}
\newcommand{\eee}{e}

\begin{document}

\checker{}{empty}{not empty}

\checker{e}{empty}{not empty}

\checker{\aaa}{empty}{not empty}

\checker{\bbb}{empty}{not empty}

\checker{\ccc}{empty}{not empty}

\checker{\ddd}{empty}{not empty}

\checker{\eee}{empty}{not empty}

\end{document}

введите описание изображения здесь

Если вы хотите считать «пустой» также последовательность пробелов, замените на

\NewExpandableDocumentCommand{\checker}{mmm}
 {
  \tl_if_blank:eTF { #1 } { #2 } { #3 }
 }

Полный пример:

\documentclass{article}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\checker}{mmm}
 {
  \tl_if_blank:eTF { #1 } { #2 } { #3 }
 }

\ExplSyntaxOff

\newcommand{\aaa}{\bbb}
\newcommand{\bbb}{\ccc}
\newcommand{\ccc}{}

\newcommand{\ddd}{\eee}
\newcommand{\eee}{e}

\newcommand{\fff}{\space\space}

\begin{document}

\checker{}{empty}{not empty}

\checker{e}{empty}{not empty}

\checker{\aaa}{empty}{not empty}

\checker{\bbb}{empty}{not empty}

\checker{\ccc}{empty}{not empty}

\checker{\ddd}{empty}{not empty}

\checker{\eee}{empty}{not empty}

\checker{\fff}{empty}{not empty}

\end{document}

введите описание изображения здесь

Связанный контент