为什么空命令不返回空字符串?

为什么空命令不返回空字符串?

我想检查命令是否返回某些内容。我尝试了以下方法,但没有效果。为什么以下代码的输出是false

\documentclass{article}

\usepackage{etoolbox}

\newcommand{\emptystring}{}

\begin{document}
  \ifstrempty{\emptystring}{true}{false}
\end{document}

答案1

手册etoolbox指出:

true如果 为string空,则扩展为,false否则扩展为 。string在测试中不会扩展 。

仍然string包含\emptystring但并非什么都没有。

您可能想要\ifdefempty\ifdefvoid对控制序列起作用而不是字符串,取决于您的使用情况。


我添加了一个 L3 测试,\str_if_empty:nTF其工作原理类似,\ifstrempty但我使用\exp_args:No它来扩展参数once,然后才能将其转发到\str_if_empty

是的,

\exp_args:No \ifstrempty {\emptystring}{true}{false}

也会做同样的事。

代码

\documentclass{article}

\usepackage{etoolbox}
\newcommand{\emptystring}{}

\ExplSyntaxOn
\NewDocumentCommand\IFSTREMPTY{m}{
  \exp_args:No \str_if_empty:nTF { #1 }
}
\ExplSyntaxOff
\begin{document}
  etoolbox \texttt{ifstrempty}: \ifstrempty{\emptystring}{true}{false}
  
  etoolbox \texttt{ifdefempty}: \ifdefempty{\emptystring}{true}{false}

  etoolbox \texttt{ifdefvoid}: \ifdefvoid{\emptystring}{true}{false}
      
  L3: \IFSTREMPTY{\emptystring}{true}{false}
\end{document}

输出

在此处输入图片描述

答案2

这取决于你想做什么。

您是否只想测试您传递的 token 的第一级扩展是否为空?那么

\ifstremptyonelevel{\emptystring}{true}{false}
\ifstremptyonelevel{\notemptystring}{true}{false}

分别返回 true 和 false,

\newcommand{\emptystring}{}
\newcommand{\notemptystring}{\empty}

或者你想进行递归扩展?有了这个选择,测试

\ifstremptyfull{\emptystring}{true}{false}
\ifstremptyfull{\notemptystring}{true}{false}

在两种情况下都会返回 true。

但第二项测试需要注意你打算通过哪种材料。对包含以下内容的内容进行完全扩展\textbf{x}将造成严重破坏。

我们将第二种测试放在一边,并限制为一个级别的扩展。

您可以使用expl3而不是etoolbox测试。

\documentclass{article}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\ifstremptyTF}{mmm}
 {
  \str_if_empty:oTF { #1 } { #2 } { #3 }
 }
\NewExpandableDocumentCommand{\ifstremptyT}{mm}
 {
  \str_if_empty:oT { #1 } { #2 }
 }
\NewExpandableDocumentCommand{\ifstremptyF}{mm}
 {
  \str_if_empty:oF { #1 } { #2 }
 }
\NewExpandableDocumentCommand{\ifstremptyp}{m}
 {
  \str_if_empty_p:o { #1 }
 }
\prg_generate_conditional_variant:Nnn \str_if_empty:n { o } { p,T,F,TF }

\ExplSyntaxOff

\newcommand{\emptystring}{}
\newcommand{\notemptystring}{\empty}

\begin{document}

\ifstremptyTF{}{true}{false}

\ifstremptyTF{a}{true}{false}

\ifstremptyTF{\emptystring}{true}{false}

\ifstremptyTF{\notemptystring}{true}{false}

\end{document}

我还定义了简写\ifstremptyT以及\ifstremptyF真或假文本为空的情况。

这将打印




最后一个命令是什么\ifstremptyp?它是谓词形式。您可以定义该函数的接口\bool_if:nTF

\documentclass{article}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\ifbooleanTF}{mmm}
 {
  \bool_if:nTF { #1 } { #2 } { #3 }
 }

\NewExpandableDocumentCommand{\ifstremptyTF}{mmm}
 {
  \str_if_empty:oTF { #1 } { #2 } { #3 }
 }
\NewExpandableDocumentCommand{\ifstremptyT}{mm}
 {
  \str_if_empty:oT { #1 } { #2 }
 }
\NewExpandableDocumentCommand{\ifstremptyF}{mm}
 {
  \str_if_empty:oF { #1 } { #2 }
 }
\NewExpandableDocumentCommand{\ifstremptyp}{m}
 {
  \str_if_empty_p:o { #1 }
 }
\prg_generate_conditional_variant:Nnn \str_if_empty:n { o } { p,T,F,TF }

\ExplSyntaxOff

\newcommand{\emptystring}{}
\newcommand{\notemptystring}{\empty}

\begin{document}

\ifbooleanTF{\ifstremptyp{\emptystring} && \ifstremptyp{\notemptystring}}{true}{false}

\ifbooleanTF{\ifstremptyp{\emptystring} || \ifstremptyp{\notemptystring}}{true}{false}

\end{document}

这分别使用了逻辑连接词“and”和“or”。第一个测试将返回 false,第二个测试将返回 true。

相关内容