Warum zeigt \msg_fatal: einen scheinbar nicht damit zusammenhängenden Fehler an?

Warum zeigt \msg_fatal: einen scheinbar nicht damit zusammenhängenden Fehler an?
\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}

Ich bin ziemlich überrascht, dass ich ein Minimalbeispiel dafür erstellen konnte, aber das Obige erzeugt (viele Kopien davon):

++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++

Was ist mit diesem Geschäft?

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

Ich habe versucht, beides einzuführen \leavevmode\tex_end:D, aber \clearpage\tex_end:Dohne Erfolg.

Antwort1

Da kann man nicht sterben.

Der von Ihnen verwendete Hook wird vermutlich innerhalb der Ausgaberoutine ausgeführt, die sich immer im internen vertikalen Modus befindet (da Sie sich per Definition nicht auf der Hauptvertikalliste befinden). Sie können also nicht dort aufhören, sondern müssen zuerst die Ausgaberoutine beenden.


Es ist möglich, etwas zu tun, um zu versuchen, außerhalb der inneren Box zu sterben,Stirb an einem anderen Tag(Zitat von Paulo), aber es ist nicht garantiert, dass das Aftergroup-Token irgendwo sicher landet (falls es überhaupt sicher ist, einen schwerwiegenden Fehler auszuführen)

\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}

Antwort2

Die fatalFehlerklasse ist eigentlich für größere Probleme gedacht, mit ziemlicher Sicherheit während des Ladens. In Ihrem Beispiel ist es in einer Box gelandet: TeX erlaubt uns nicht, dort „auszusteigen“, daher der Fehler. Wir könnten vielleicht einen Schutz hinzufügen, um den aktuellen Modus zu überprüfen und es nur zu versuchen, \endwenn es erlaubt ist, aber im Grunde ist dies nicht der „richtige“ Ort, um einen schwerwiegenden Fehler auszugeben.

verwandte Informationen