Verwenden von \notblank in der \ifboolexpr-Anweisung von etoolbox

Verwenden von \notblank in der \ifboolexpr-Anweisung von etoolbox

Wie der Titel schon sagt, versuche ich derzeit, \ifboolexprdie Anweisung von etoolbox zu \notblankBedingungen 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 \ifbookexprAnweisung):

\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 etoolboxbesagt, dass das Argument zu \ifblankund zu \notblankistnichterweitert. 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 catoptionsPaket hat genau das, was Sie brauchen, ohne weiteren Code. \xifblankFTbedeutetvollstä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 \xifstrcmpFTerweiterbar 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

verwandte Informationen