下面的代码可以工作,尽管我感觉我\settowidth
丢弃输出的方法不是应该这样做的:
\documentclass{article}
\newlength{\trashlength}
\long\def\ignoreoutput#1{%
\settowidth{\trashlength}{#1}%
}
\long\def\command#1{
This \gdef\stuff{Stored: #1} shouldn't be here.
}
%% Should not raise Missing \begin{document} error here:
%\ignoreoutput{\command}
\begin{document}
% Should produce "nothing":
no\ignoreoutput{\command{Side %\par %%%%% this breaks everything.
effect!}}thing.
% Should output the text previously stored:
\ifx\stuff\undefined No side effect.
\else \stuff \fi
\end{document}
当取消注释时\par
,它会中断:段落在 \@settodim 完成之前结束。
那么我如何忽略允许长输入的命令?
答案1
\newsavebox{\trashbox}
\long\def\ignoreoutput#1{\setbox\trashbox\vbox{\everypar{}\globaldefs1 #1}}
似乎有效。
(编辑:根据 TH 的回答将作业全局化,并在本地禁用\everypar
基于 LaTeX 的机制来抱怨缺少 \begin{document}。)
答案2
我会使用类似于 Harald 的例子(在我发布这篇文章之前出现)。
\long\def\executeglobally#1{
\begingroup
\setbox0\vbox{
\globaldefs1
#1%
}%
\endgroup
}
\def\foo{foo}
\executeglobally{asdf\def\foo{bar}asdf}
\foo
\bye
这\globaldefs1
使得分配变得全球化。
答案3
刚刚尝试过这个,但看起来更可疑:
\documentclass{article}
\newlength{\trashlength}
\newsavebox{\trashbox}
\long\def\ignoreoutput#1{%
\sbox{\trashbox}{#1}%
\settowidth{\trashlength}{\usebox{\trashbox}}%
}
% etc like above
但它可以打破尺寸太大。