我想检查命令是否返回某些内容。我尝试了以下方法,但没有效果。为什么以下代码的输出是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
它来扩展参数o
nce,然后才能将其转发到\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。