etoolbox:ifdefvoid 检查空行

etoolbox:ifdefvoid 检查空行

我设计了一个系统,它可以读取多个变量,并根据定义创建一个文本(文本“a”和变量中包含的文本(宏),或者当变量为空时创建一个替代文本“b”。)这可以正常工作,除非宏包含空行。检查(当前\ifdefvoid)应该检测到一个空宏并写入文本“b”我尝试了许多变体,例如\ifthenelse\equal...\ifblank,但似乎都没有用。

\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}

结果:
文件:
文件 1
文件 2
没有文件
现在的问题是:这也应该创建输出“没有文件”
文件:

编辑:由 100 多个 & 符号引起的错误的最小文档:

    \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

\foo相反,你可以在一个框中设置内容\ignorespaces,然后测试框的宽度:

在此处输入图片描述

\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}

答案2

空行会被翻译成\partoken。所以我们可以定义一个宏来删除\partoken,并检查剩下的是否只包含空格。

\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}

在此处输入图片描述

相关内容