我设计了一个系统,它可以读取多个变量,并根据定义创建一个文本(文本“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
空行会被翻译成\par
token。所以我们可以定义一个宏来删除\par
token,并检查剩下的是否只包含空格。
\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}