我想创建一个输出“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 的解决方案。恕我直言,您应该摆脱这些@
,但是不存在争论。