취약한 \end{frame}이 비머를 깨뜨린 후의 주석

취약한 \end{frame}이 비머를 깨뜨린 후의 주석

오늘 나는 코드의 주석으로 인해 패배했다는 사실을 인정하고 싶은 것보다 더 많은 시간을 보냈습니다...

프레젠테이션에 일부 내용을 그대로 삽입하려고 했더니 다음 오류가 발생했습니다.

Runaway argument?
! File ended while scanning use of \next.

그런 다음 모든 것을 MWE로 축소하면 다음과 같은 결과를 얻을 수 있습니다.

\documentclass{beamer}

\begin{document}

\begin{frame}[fragile]
Hello :)
\end{frame}% NO :(

\end{document}

오류가 지속되었습니다.

그런 다음 모든 것이 작동한 후 주석을 제거했습니다 \end{frame}.

누군가 여기서 무슨 일이 일어나는지 설명해 줄 수 있나요?


면책 조항: 아니요, 거기에는 의견이 필요하지 않습니다. :P

답변1

의 내부 를 조금 파헤친 후 beameregreg가 지적한 대로 축어적 프로세서라는 답을 찾았습니다.

[fragile]프레임 의 경우 beamer에 있는 축어적 프로세서를 사용합니다 beamerbaseverbatim.sty. Beamer에는 깔끔한 축어적 프로세서가 있습니다.

\protected\long\gdef\beamer@processframeline#1^^M{%
  \edef\beamer@test{\beamer@strip@whitespace#1\beamer@strip@stop}%
  \ifx\beamer@test\beamer@stopframe%
    \let\next=\beamer@framewritten%
  \else%
    \immediate\write\beamer@verbatimfileout{#1}%
    \let\next=\beamer@processframeline%
  \fi%
  \next%
}%

프로세서는 캐리지 리턴 문자(새 줄)까지 모든 것을 읽는 구분된 매크로입니다. 읽은 내용은 대부분 다음과 같이 정의되어 저장 \beamer@test되고 비교됩니다 .\beamer@stopframe

\xdef\beamer@stopframe{\string\\end\string\{frame\string\}}

이는 정확한 문자열로 확장됩니다 \ e n d { f r a m e }.

프로세서는 내용을 비교하여 다르면 \beamer@test( \beamer@stopframe.vrb 파일) 매크로가 프로세서가 되도록 하고 읽기를 계속하기 위해 자신을 재귀적으로 호출합니다. 그렇지 않고 문자열 인 경우 프로세서가 정상적으로 종료됩니다.\beamer@test\beamer@verbatimfileout\next\let\beamer@test\end{frame}

이 오류는 프로세서가 주석을 무시하지 않기 때문에 발생하므로(문맥 상 필요할 수 있습니다!) 프로세서는 분명히 실패하는 와 \end{frame}비교하고 를 지나 계속 읽습니다 .\end{frame}% NO :(\end{frame}

이제 두 가지 일이 발생할 수 있습니다.

첫째, 이것이 마지막 프레임이므로 프로세서는 일치하는 프레임을 찾지 못하고 \end{frame}오류 ! File ended while scanning use of \next.가 나타나고 컴파일이 중지됩니다.

두 번째로 더 고통스러운 점은 프로세서가 찾고 있던 드로이드를 \end{frame} 포함하는 또 다른 프레임이 있다는 것입니다. 하지만 이 경우에는 .vrb 파일의 내용을 프레임으로 다시 읽는 to 가 \next됩니다 . 그러나 내용은 다음과 같습니다.\let\beamer@framewritten

Hello :)
\end{frame}% NO :(
\begin{frame}
Hello again!

그러면 일이 열광하게 될 것입니다 :)

TL;DR

[fragile]아이들이 액자를 사용할 때 기억해야 할 점 은\end{frame} ~ 해야 하다오직줄에있는 것. 선행 공백이나 주석은 허용되지 않습니다(후행 공백은 TeX에 의해 무시됩니다).

Samcarter가 자신의 의견에서 언급했듯이 현재 버전의 Beamer는 다음을 허용합니다.그리고후행 공백과 탭. 매크로 \beamer@strip@whitespace\beamer@stopframe.

관련 정보