오늘 나는 코드의 주석으로 인해 패배했다는 사실을 인정하고 싶은 것보다 더 많은 시간을 보냈습니다...
프레젠테이션에 일부 내용을 그대로 삽입하려고 했더니 다음 오류가 발생했습니다.
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
의 내부 를 조금 파헤친 후 beamer
egreg가 지적한 대로 축어적 프로세서라는 답을 찾았습니다.
[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
.