為什麼 \msg_fatal: 顯示看似不相關的錯誤?

為什麼 \msg_fatal: 顯示看似不相關的錯誤?
\documentclass{article}
\usepackage{expl3}
\usepackage{everypage}

\ExplSyntaxOn
\AddEverypageHook { \sean_test: }

\msg_new:nnnn { test } { message }
  { this ~ is ~ a ~ rubbish ~ message }
  { it's ~ a ~ minimal ~ example }

\cs_new_protected:Npn \sean_test:
  {
    \typeout{++before++}
    \msg_fatal:nn { test } { message }
    \typeout{++after++}
  }

\ExplSyntaxOff

\usepackage{mwe}
\begin{document}
\lipsum[1-1000]
\end{document}

我很驚訝我能夠製作一個最小的例子,但上面會產生(許多副本)

++after++
[26]
++before++

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! Fatal test error: "message"
! 
! this is a rubbish message
! 
! See the test documentation for further information.
! 
! For immediate help type H <return>.
!...............................................  

l.23 \lipsum[1-1000]

! You can't use `\end' in internal vertical mode.
\__msg_fatal_code:nnnnnn ...l_text_tl }\tex_end:D 

l.23 \lipsum[1-1000]

++after++
[27]
++before++

這生意怎麼了?

! You can't use `\end' in internal vertical mode.
\__msg_fatal_code:nnnnnn ...l_text_tl }\tex_end:D 

我嘗試同時介紹兩者\leavevmode\tex_end:D,但\clearpage\tex_end:D沒有效果。

答案1

你不能死在那裡。

您使用的掛鉤可能在輸出例程內部運行,該例程始終處於內部垂直模式(因為根據定義,您不在主垂直列表上),因此您不能停在那裡,您需要先退出輸出例程。


可以做點什麼嘗試死在盒子外面,改天再死(引用 Paulo)但不能保證後組令牌到達安全的地方(如果執行致命錯誤是安全的)

\documentclass{article}
\usepackage{expl3}
\usepackage{everypage}

\ExplSyntaxOn

\AddEverypageHook { \sean_do_test: }
\cs_new:Nn \sean_do_test:
 {
  \bool_if:nTF { \mode_if_inner_p: || \mode_if_horizontal_p: }
   {
    \group_insert_after:N \sean_do_test:
   }
   {
    \sean_test:
   }
 }


\msg_new:nnnn { test } { message }
  { this ~ is ~ a ~ rubbish ~ message }
  { it's ~ a ~ minimal ~ example }

\cs_new_protected:Npn \sean_test:
  {
    \typeout{++before++}
    \msg_fatal:nn { test } { message }
    \typeout{++after++}
  }

\ExplSyntaxOff

\usepackage{mwe}
\begin{document}
\lipsum[1-1000]
\end{document}

答案2

此類fatal錯誤實際上是針對主要問題的,幾乎可以肯定是在加載時出現的。在你的例子中,你最終把它放在一個盒子裡:TeX 不允許我們在那裡“保釋”,因此會出現錯誤。我們也許可以添加一個警衛來檢查當前模式,並且僅\end在允許的情況下嘗試,但本質上這不是給出致命錯誤的「正確」位置。

相關內容