我怎样才能让 TeX 在第一次错误时停止,但不在 \show (或 \tl_show:n)上停止?

我怎样才能让 TeX 在第一次错误时停止,但不在 \show (或 \tl_show:n)上停止?

我希望 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

相关内容