Latex3:如何测试宏是否为空?

Latex3:如何测试宏是否为空?

如何测试宏是否为空?正如您在 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}

相关内容