我希望 TeX 在出现任何错误时终止,因为我只关心第一个错误,这样它才能更快地完成。
不幸的是,如果我使用-interaction=errorstopmode
(并使用</dev/null
)或-halt-on-error
,任何\show
(或expl3的\tl_show:n
命令都会终止程序。
有没有办法在第一次出现错误时停止 TeX,但不会在调试打印命令时停止?
答案1
最好的方法是先本地转到,然后\nonstopmode
返回\errorstopmode
。手动操作总是在之前和之后插入,这样\show
实际上就完成了,并且它适用于每个标记:
\nonstopmode
\show{
\show}
\show\stop
\show\show
\errorstopmode
通过限制N
-type 参数,您还可以自动执行此操作:
\newcommand\shownonstop[1]
{%
\nonstopmode
\show#1%
\errorstopmode
}
如果你不想在当前不在的情况下意外更改模式,\errorstopmode
你可以看看如何获取当前的交互模式。
以上两种情况仍会导致 TeX 的返回值非零(因此被视为“失败”运行)。
另一种可能性是自己重新实现该功能。一个简单的实现是
\newcommand\shownonstop[1]{\typeout{\string#1: \meaning#1}}
如果要获得完全相同的格式,我们必须投入更多的工作:
\ExplSyntaxOn
\cs_new_protected:Npn \shownonstop #1
{
\iow_term:x
{
>~
\bool_lazy_or:nnTF
{ \token_if_cs_p:N #1 }
{ \token_if_macro_p:N #1 }
{
\token_to_str:N #1 =
\token_if_primitive:NTF #1
{ \token_to_meaning:N #1 }
{ \exp_after:wN \my_shownonstop_macro:w \cs_meaning:N #1 \s_stop }
}
{ \token_to_meaning:N #1 }
.
}
}
\exp_last_unbraced:NNNNo
\cs_new:Npn \my_shownonstop_macro:w #1 \c_colon_str #2 \s_stop { #1: ^^J #2 }
\ExplSyntaxOff