Heute habe ich mehr Zeit damit verbracht, als mir lieb ist, einem Kommentar im Code zu widerstehen ...
Ich habe versucht, einen Text wörtlich in eine Präsentation einzufügen und habe folgende Fehlermeldung erhalten:
Runaway argument?
! File ended while scanning use of \next.
Als ich das Ganze dann auf ein MWE reduzierte, erhielt ich Folgendes:
\documentclass{beamer}
\begin{document}
\begin{frame}[fragile]
Hello :)
\end{frame}% NO :(
\end{document}
und der Fehler blieb bestehen.
Als ich den Kommentar anschließend entfernt habe, hat das \end{frame}
Ganze funktioniert.
Kann jemand erklären, was hier passiert?
Disclaimer: nein, den Kommentar brauche ich da nicht :P
Antwort1
Nachdem ich ein wenig im beamer
Innenleben herumgegraben hatte, kam ich zu dem Schluss, dass die Antwort, wie egreg bemerkte, der Verbatim-Prozessor ist.
Für [fragile]
Frames beamer
verwendet es seinen Verbatim-Prozessor, der sich in befindet beamerbaseverbatim.sty
. Beamer hat einen ordentlichen Verbatim-Prozessor:
\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%
}%
Der Prozessor ist ein abgegrenztes Makro, das alles bis zu einem Wagenrücklaufzeichen (neue Zeile) liest. Der gelesene Inhalt wird gespeichert \beamer@test
und mit verglichen . \beamer@stopframe
Meistens wird dies wie folgt definiert:
\xdef\beamer@stopframe{\string\\end\string\{frame\string\}}
die sich zur exakten Zeichenfolge erweitert \
e
n
d
{
f
r
a
m
e
}
.
Der Prozessor vergleicht \beamer@test
mit \beamer@stopframe
und wenn sie unterschiedlich sind, \beamer@test
wird der Inhalt von in (die .vrb-Datei) geschrieben \beamer@verbatimfileout
und das \next
Makro soll \let
der Prozessor sein und ruft sich selbst rekursiv auf, um mit dem Lesen fortzufahren. Andernfalls, wenn \beamer@test
die Zeichenfolge ist \end{frame}
, wird der Prozessor normal beendet.
Der Fehler tritt auf, weil der Prozessor Kommentare nicht ignoriert (in wörtlichen Kontexten können diese erforderlich sein!), sodass der Prozessor \end{frame}
mit vergleicht \end{frame}% NO :(
, was offensichtlich fehlschlägt, und über das hinaus weiterliest \end{frame}
.
Jetzt können zwei Dinge passieren:
Erstens ist dies der letzte Frame, sodass der Prozessor nie eine Übereinstimmung finden wird. \end{frame}
Der ! File ended while scanning use of \next.
Fehler tritt auf und die Kompilierung wird abgebrochen.
Zweitens und noch schmerzhafter: Es gibt einen weiteren Frame, der die Droiden enthält, \end{frame}
nach denen der Prozessor gesucht hat. In diesem Fall \next
wird jedoch \let
to sein \beamer@framewritten
, was im Wesentlichen den Inhalt der .vrb-Datei zurück in den Frame liest. Der Inhalt wird jedoch ungefähr so aussehen:
Hello :)
\end{frame}% NO :(
\begin{frame}
Hello again!
das wird für wilde Stimmung sorgen :)
Kurz zusammengefasst
Denken Sie daran, Kinder, wenn Sie [fragile]
Rahmen verwenden, die\end{frame}
musssei dernurSache in der Zeile. Keine führenden Leerzeichen oder Kommentare erlaubt (Leerzeichen am Ende werden von TeX verschlungen).
Wie samcarter in ihrem Kommentar bemerkte, ermöglicht die aktuelle Version von Beamer führendeUndnachstehende Leerzeichen und Tabulatoren. Das \beamer@strip@whitespace
Makro wird Leerzeichen und Tabulatoren vor dem Vergleich mit verbrauchen \beamer@stopframe
.