\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ている場合にのみ実行するようにすることはできるかもしれませんが、基本的に、これは致命的なエラーを出す「適切な」場所ではありません。

関連情報