\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
在允許的情況下嘗試,但本質上這不是給出致命錯誤的「正確」位置。