
Wie der Titel schon sagt, versuche ich derzeit, \ifboolexpr
die Anweisung von etoolbox zu \notblank
Bedingungen zu verwenden, habe aber Probleme damit. Der betreffende Code sieht folgendermaßen aus:
\ifboolexpr{%
test {\notblank{\Temp@Temp@Text@a}} or %
test {\notblank{\Temp@Temp@Text@b}} or %
test {\notblank{\Temp@Temp@Text@c}} %
}%
{}{}%
Es erzeugt jedoch eine Reihe von Fehlern. Selbst der Versuch mit so etwas scheint nicht wirklich besser zu funktionieren:
\ifboolexpr{%
test {\notblank{}} or %
test {\notblank{}} or %
test {\notblank{}} %
}%
{}{}%
Der Höchstwert, den ich ohne Probleme verwenden kann, ist (angegeben als MWE. Um meine Probleme zu reproduzieren, ersetzen Sie einfach die \ifbookexpr
Anweisung):
\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}
Meine Frage ist also:
- Was mache ich falsch ?
- Wie man es löst ?
Antwort1
Die Dokumentation von etoolbox
besagt, dass das Argument zu \ifblank
und zu \notblank
istnichterweitert. Daher \notblank{\xyz}
wird „true“ zurückgegeben, unabhängig von der Definition von \xyz
.
Wenn Sie eine vollständige Erweiterung wünschen, müssen Sie dies explizit anfordern, zum Beispiel
\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}
Die erste Instanz gibt zurück true
, während die zweite zurückgibt false
.
Antwort2
Das catoptions
Paket hat genau das, was Sie brauchen, ohne weiteren Code. \xifblankFT
bedeutetvollständig erweitert, nicht leerEs gibt auch \oifblankFT
, was bedeutetein Schritt erweitert nicht leer.
\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}
Diese Art von Boolescher Kalkulation ist teuer. Sie müssen sich nur das Tracelog ansehen, um diese Behauptung zu bestätigen. In 99 Prozent der Fälle reicht ein viel einfacherer Test aus. Da beispielsweise \xifstrcmpFT
erweiterbar ist, haben wir einen kostengünstigen Test:
\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