保留副作用但丢弃命令输出

保留副作用但丢弃命令输出

下面的代码可以工作,尽管我感觉我\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

但它可以打破尺寸太大

相关内容