Следующий код работает так, как и ожидалось:
\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}