3

I designed a system that reads a number of variables and, depending on the definition creates a text (either text "a" and the text contained in the variable (macro), or an alternate text "b" when the variable is empty.) This works fine, except when the macro contains empty lines. The check (currently \ifdefvoid) should detect an empty macro and write text "b" I tried a number of variants like \ifthenelse, \equal...; \ifblank, but none seem to work.

\documentclass{paper}
\usepackage{etoolbox}
\begin{document}
\def\foo{Document 1\\Document 2}
\ifdefvoid{\foo}{no documents}{Documents:\\ \ \\ \foo}
\\
\\

\def\foo{}
\ifdefvoid{\foo}{no documents}{Documents:\\ \ \\ \foo}
\\
\\Now the problem: this should also create the output "No documents"\\
\\
\def\foo{     %
%some text commented out ...

}
\ifdefvoid{\foo}{no documents}{Documents:\\ \ \\ \foo}
\end{document}

Result:
Documents:
Document 1
Document 2
no documents
Now the problem: this should also create the output ”No documents”
Documents:

edit: minimal document for error causd by 100+ ampersands:

    \documentclass{paper}
\newcommand{\ifdefvoid}[3]{%
  \savebox{\tempbox}{\ignorespaces #1}% Store contents in a box
  \ifdim\wd\tempbox=0pt
    #2% Width of box is zero
  \else
    #3% Width of box is non-zero
  \fi
}

\usepackage{ltablex} % tabularx
\begin{document}
\def\foo{
a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\
}
\ifdefvoid{\foo}{no documents}
{\begin{tabularx}{\textwidth}{ccc}
\foo
\end{tabularx}}
\end{document}
1

Instead, you could set the contents of \foo in a box with \ignorespaces and then test the width of the box:

enter image description here

\documentclass{paper}

\newsavebox{\tempbox}
\newcommand{\ifdefvoid}[3]{%
  \savebox{\tempbox}{\ignorespaces #1}% Store contents in a box
  \ifdim\wd\tempbox=0pt
    #2% Width of box is zero
  \else
    #3% Width of box is non-zero
  \fi
}

\begin{document}

\def\foo{Document 1\\Document 2}
\ifdefvoid{\foo}{no documents}{Documents:\\ \ \\ \foo}

\bigskip

\def\foo{}
\ifdefvoid{\foo}{no documents}{Documents:\\ \ \\ \foo}

\bigskip

Now the problem: this should also create the output ``No documents''

\def\foo{     %
%some text commented out ...
}
\ifdefvoid{\foo}{no documents}{Documents:\\ \ \\ \foo}

\end{document}
|improve this answer|||||
  • thanks Werner! Yet if the macro contains >100 & alignment tabs (which it sometimes does, because I have to handle larger amounts of tabular data) it does not work :-( (100 errors, giving up). – Joachim Finzel Jan 31 at 12:48
  • @JoachimFinzel: Consider creating a minimal document that replicates this issue. Maybe we can work something out to fix your situation... – Werner Jan 31 at 16:49
1

Blank lines are translated to \par tokens. So we can define a macro that strips off \par tokens and check whether what remains only contains blanks.

\documentclass{article}
\usepackage{xparse}
\usepackage{ltablex}

\ExplSyntaxOn

\NewDocumentCommand{\definedorblankorparTF}{mmm}
 {
  \cs_if_exist:NTF #1
   {
    \__finzel_cs_if_blankorpar:NTF #1 { #2 } { #3 }
   }
   { #3 }
 }
\prg_new_conditional:Nnn \__finzel_cs_if_blankorpar:N { T, F, TF }
 {
  \tl_set_eq:NN \l__finzel_blankorpar_tl #1
  \tl_replace_all:Nnn \l__finzel_blankorpar_tl { \par } { }
  \tl_if_blank:VTF \l__finzel_blankorpar_tl
   {
    \prg_return_true:
   }
   {
    \prg_return_false:
   }
 }
\tl_new:N \l__finzel_blankorpar_tl

\ExplSyntaxOff

\begin{document}

\def\foo{Document 1, Document 2}

\definedorblankorparTF{\foo}{no documents}{Documents: \foo}

\bigskip

\def\foo{}
\definedorblankorparTF{\foo}{no documents}{Documents: \foo}

\bigskip

\def\foo{     %
%some text commented out ...

}
\definedorblankorparTF{\foo}{no documents}{Documents: \foo}

\bigskip

\def\foo{
a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\a&bla&(17.01.2019)\\
}
\definedorblankorparTF{\foo}{no documents}
{\noindent\begin{tabularx}{\textwidth}{ccc}
\foo
\end{tabularx}}

\end{document}

enter image description here

|improve this answer|||||
  • thanks egreg! actually I was hoping for some less complicated method, but this one works fine, thanks! – Joachim Finzel Feb 4 at 15:58

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.