Kommentar nach fragilem \end{frame} bricht Beamer

Kommentar nach fragilem \end{frame} bricht Beamer

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 beamerInnenleben herumgegraben hatte, kam ich zu dem Schluss, dass die Antwort, wie egreg bemerkte, der Verbatim-Prozessor ist.

Für [fragile]Frames beamerverwendet 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@testund mit verglichen . \beamer@stopframeMeistens 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@testmit \beamer@stopframeund wenn sie unterschiedlich sind, \beamer@testwird der Inhalt von in (die .vrb-Datei) geschrieben \beamer@verbatimfileoutund das \nextMakro soll \letder Prozessor sein und ruft sich selbst rekursiv auf, um mit dem Lesen fortzufahren. Andernfalls, wenn \beamer@testdie 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 \nextwird jedoch \letto 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@whitespaceMakro wird Leerzeichen und Tabulatoren vor dem Vergleich mit verbrauchen \beamer@stopframe.

verwandte Informationen