Использование \notblank в операторе \ifboolexpr etoolbox

Использование \notblank в операторе \ifboolexpr etoolbox

Как следует из заголовка, я сейчас пытаюсь использовать etoolbox's \ifboolexprstatment on \notblankconditions, но у меня с ним проблемы. Код выглядит так:

\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}вернет "истина" независимо от определения \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}

Этот тип булевого исчисления является дорогостоящим. Вам нужно только посмотреть на tracelog, чтобы подтвердить это утверждение. В 99 процентах случаев вы можете обойтись гораздо более простым тестом. Например, поскольку \xifstrcmpFTis расширяем, у нас есть экономичный тест:

\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

Связанный контент