两个宏之间的选择 -- \doifemptyelse -- ConTeXT

两个宏之间的选择 -- \doifemptyelse -- ConTeXT

我想创建一个输出“A”的宏,如果“A”为空,则输出“B”。这类似于 Latex 的:\ifdefempty{\@author}{\@authora}{\oorientador}

\unprotect


\def\author#1{\gdef\@author{#1}}
\def\authora#1{\gdef\@authora{#1}}


\def\mything{
\doifemptyelse{\@author}{\@authora}{\@author}\par
}

\protect


%\author{John Doe}
\authora{Johnny Olsten}

\starttext

\mything

\stoptext

答案1

\@author如果要按\doifemptyelse原样使用,则必须进行扩展。此外,您需要初始化\@author

\unprotect


\def\@author{}
\def\author#1{\gdef\@author{#1}}
\def\authora#1{\gdef\@authora{#1}}

\def\mything{%
\expandafter\doifemptyelse\expandafter{\@author}{\@authora}{\@author}\par
}

\protect


%\author{John Doe}
\authora{Johnny Olsten}

\starttext

\mything

\stoptext

答案2

这是另一种方法。

ConTeXt 提供\getparameters[<prefix>][<key>=<value>]此功能,因此您可以自动创建\@author\@authora。因此,只有在未定义时\mything才会打印。如果您不需要使用先前定义的,这将有效。\@authora\@author\@author

\unprotect
\def\mything{\doifdefinedelse{@author}{\@author}{\@authora}}
\protect
\starttext

%This defines \@authora
\getparameters[@][authora=Mammals]
%\@author is still undefined
\mything %Mammals

%This defines \@author
\getparameters[@][author=Birds and reptiles]
\mything %Birds and reptiles

%This redefines \@author and \@authora
\getparameters[@][author=A. U. Thor, authora=A. U. Thora]
\mything %A. U. Thor

%You can also use \@author and \@authora 

\getvalue{@author} %A. U. Thor

\getvalue{@authora}%A. U. Thora

%What if I want to clear an author field?
\letvalue{@author}=\undefined

\mything %A. U. Thora

\stoptext

如果您想坚持使用 LaTeX 语法,包装器(例如\def\author#1{\getparameters[@][author=#1]})并不难编写,但它肯定更冗长且无用。在这种情况下,您可以使用 Skillmon 的解决方案。恕我直言,您应该摆脱这些@,但是不存在争论

相关内容