![在 etoolbox 的 \ifboolexpr 语句中使用 \notblank](https://linux22.com/image/254807/%E5%9C%A8%20etoolbox%20%E7%9A%84%20%5Cifboolexpr%20%E8%AF%AD%E5%8F%A5%E4%B8%AD%E4%BD%BF%E7%94%A8%20%5Cnotblank.png)
正如标题所述,我目前正在尝试使用 etoolbox 的条件\ifboolexpr
语句\notblank
,但遇到了问题。相关代码如下所示:
\ifboolexpr{%
test {\notblank{\Temp@Temp@Text@a}} or %
test {\notblank{\Temp@Temp@Text@b}} or %
test {\notblank{\Temp@Temp@Text@c}} %
}%
{}{}%
但是它会产生一堆错误。即使尝试这样的方法似乎也没有什么效果:
\ifboolexpr{%
test {\notblank{}} or %
test {\notblank{}} or %
test {\notblank{}} %
}%
{}{}%
我可以毫无问题地使用的最大值是(以 MWE 给出。要重现我的问题,只需替换语句\ifbookexpr
):
\documentclass[10pt,a4paper,titlepage,twoside,onecolumn]{report}
\RequirePackage{etoolbox}
\makeatletter
\def\Temp@Temp@Text@a{testa}
\def\Temp@Temp@Text@b{testb}
\def\Temp@Temp@Text@c{testc}
\makeatother
\begin{document}
\makeatletter
\ifboolexpr{%
test {} or %
test {} or %
test {} %
}%
{true}{false}%
\makeatother
\end{document}
所以我的问题是:
- 我究竟做错了什么 ?
- 如何解决?
答案1
的文献指出,和的etoolbox
论据是\ifblank
\notblank
不是展开。因此\notblank{\xyz}
无论 的定义是什么,都会返回“true” \xyz
。
如果你想要完全扩展,你必须明确要求,例如
\documentclass[10pt,a4paper,titlepage,twoside,onecolumn]{report}
\usepackage{etoolbox}
\begin{document}
\makeatletter
\def\Temp@Temp@Text@a{testa}
\def\Temp@Temp@Text@b{testb}
\def\Temp@Temp@Text@c{testc}
\begingroup\edef\x{\endgroup
\noexpand\ifboolexpr{%
test {\noexpand\notblank{\Temp@Temp@Text@a}} or
test {\noexpand\notblank{\Temp@Temp@Text@b}} or
test {\noexpand\notblank{\Temp@Temp@Text@c}}
}}\x{\typeout{true}}{\typeout{false}}%
\def\Temp@Temp@Text@a{}
\def\Temp@Temp@Text@b{}
\def\Temp@Temp@Text@c{}
\begingroup\edef\x{\endgroup
\noexpand\ifboolexpr{%
test {\noexpand\notblank{\Temp@Temp@Text@a}} or
test {\noexpand\notblank{\Temp@Temp@Text@b}} or
test {\noexpand\notblank{\Temp@Temp@Text@c}}
}}\x{\typeout{true}}{\typeout{false}}%
\makeatother
\end{document}
第一个实例返回true
,而第二个实例返回false
。
答案2
该catoptions
包中有您所需的一切,无需进一步的代码\xifblankFT
。完全展开不空白.还有\oifblankFT
,意思一步扩展不为空白。
\documentclass{report}
\usepackage{catoptions}
\def\vgap{\par\bigskip}
\begin{document}
\def\tempa{testa}
\def\tempb{testb}
\def\tempc{testc}
First test (true):
\ifexprTF{%
test {\xifblankFT{\tempa}} or
test {\xifblankFT{\tempb}} or
test {\xifblankFT{\tempc}}
}{
true
}{
false
}
\vgap
\def\tempa{}
\def\tempb{}
\def\tempc{}
Second test (false):
\ifexprTF{%
test {\xifblankFT{\tempa}} or
test {\xifblankFT{\tempb}} or
test {\xifblankFT{\tempc}}
}{
true
}{
false
}
\def\tempd{x}
\vgap
Third test (false):
\ifexprTF{%
( test {\xifblankTF{\tempa}} or test {\xifblankTF{\tempb}} )
and
( test {\xifblankFT{\tempc}} and test {\xifblankFT{\tempd}} )
}{
true
}{
false
}
\vgap
\def\tempe{00}
\newif\iftestbool
Fourth test (true):
\ifexprTF{%
( switch {tempe} or bool {testbool} )
and
( ( test {\xifblankTF{\tempc}} and not test {\xifblankTF{\tempd}} )
or
( test {\xifstrcmpTF\tempa\tempb} or not test {\ifxTF\tempc\tempd} )
)
}{
true
}{
false
}
\end{document}
这种类型的布尔运算很昂贵。您只需查看跟踪日志即可确认此断言。99% 的时间,您可以使用更简单的测试来完成。例如,由于\xifstrcmpFT
可扩展,我们有一个经济的测试:
\def\do#1{\ifx\do#1\relax\else+\xifstrcmpFT{#1}{}01\expandafter\do\fi}
\ifnum0=\numexpr0\do\tempa\tempb\tempc\tempd\do
true
\else
false
\fi