\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 인용) 하지만 Aftergroup 토큰이 안전한 곳에 도착한다는 보장은 없습니다(치명적인 오류를 실행해도 안전한 경우).

\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허용되는 경우에만 가드를 추가할 수도 있지만 본질적으로 이는 치명적인 오류를 발생시키는 '올바른' 위치가 아닙니다.

관련 정보