如何测试宏是否为空?正如您在 MWE 中看到的,creator1email
为空(或\relax
?),但我的测试通过\cs_if_exist
获取1
。
\documentclass{article}
\ExplSyntaxOn
\int_new:N \l_creator_int
\NewDocumentCommand\creator{ O{} m}
{
\int_incr:N \l_creator_int
\cs_new_protected:cpn {creator\int_use:N\l_creator_int}{#2}
\cs_new_protected:cpn {creator\int_use:N\l_creator_int email}{#1}
}
\ExplSyntaxOff
\begin{document}
\creator[]{Me}
\ExplSyntaxOn
\cs_if_exist:cTF {creator1email} {1} {0}
\use:c {creator1email}
\ExplSyntaxOff
\end{document}
答案1
请注意,它expl3
为您提供了不同的数据类型,并且还提供了针对这些数据类型的测试。其中之一是标记列表,它是存储您可能想要打印的内容的正确变量类型。
以下更改您的代码以遵循expl3
命名约定,并使用标记列表变量来存储电子邮件地址。因此,您可以使用它\tl_if_empty:cTF
来检查电子邮件是否确实为空。
\documentclass{article}
\ExplSyntaxOn
\int_new:N \l_sergiokapone_creator_int
\cs_new_protected:Npn \sergiokapone_new_creator:nn #1#2
{
\int_incr:N \l_sergiokapone_creator_int
\tl_new:c
{ l__sergiokapone_creator \int_use:N \l_sergiokapone_creator_int _tl }
\tl_new:c
{ l__sergiokapone_email \int_use:N \l_sergiokapone_creator_int _tl }
\tl_set:cn
{ l__sergiokapone_creator \int_use:N \l_sergiokapone_creator_int _tl }
{#2}
\tl_set:cn
{ l__sergiokapone_email \int_use:N \l_sergiokapone_creator_int _tl }
{#1}
}
\NewDocumentCommand \creator { O{} m }
{ \sergiokapone_new_creator:nn {#1} {#2} }
\NewDocumentCommand\usemail { m }
{
\tl_if_empty:cTF { l__sergiokapone_email #1 _tl }
{ \emph{empty} }
{ \tl_use:c { l__sergiokapone_email #1 _tl } }
}
\ExplSyntaxOff
\begin{document}
\creator[]{Me}
\creator{You}
\creator[[email protected]]{Him}
\usemail{1}
\usemail{2}
\usemail{3}
\end{document}