
如標題所示,我目前正在嘗試在條件\ifboolexpr
下使用 etoolbox 的聲明\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
的文檔指出, to和 to 的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