Comentario después de que el frágil \end{frame} rompa el proyector

Comentario después de que el frágil \end{frame} rompa el proyector

Hoy pasé más tiempo del que me gustaría reconocer siendo golpeado por un comentario en el código...

Estaba intentando insertar algo palabra por palabra en una presentación y recibí este error:

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

Luego, reduciendo todo a un MWE obtuve esto:

\documentclass{beamer}

\begin{document}

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

\end{document}

y el error persistió.

Luego, cuando eliminé el comentario después de que \end{frame}todo funcionó.

¿Alguien puede explicar qué pasa aquí?


Descargo de responsabilidad: no, no necesito el comentario allí :P

Respuesta1

Después de indagar un poco en beamerlas entrañas descubrí que la respuesta es, como señaló egreg, el procesador textual.

Para [fragile]los fotogramas beamerutiliza su procesador textual, ubicado en formato beamerbaseverbatim.sty. Beamer tiene un procesador textual ordenado:

\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%
}%

El procesador es una macro delimitada que leerá todo hasta un carácter de retorno de carro (nueva línea). El contenido leído se almacena \beamer@testy se compara con \beamer@stopframeel cual, la mayoría de las veces, se define como:

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

que se expande a la cadena exacta \ e n d { f r a m e }.

El procesador se compara \beamer@testy \beamer@stopframe, si son diferentes, \beamer@testse escribe el contenido \beamer@verbatimfileout(el archivo .vrb) y la \nextmacro será \letel procesador, y se llama a sí mismo de forma recursiva para continuar leyendo. De lo contrario, si \beamer@testes la cadena \end{frame}, el procesador sale normalmente.

El error ocurre porque el procesador no ignora los comentarios (¡pueden ser necesarios en contextos textuales!), por lo que el procesador compara \end{frame}con \end{frame}% NO :(, lo que obviamente falla, y sigue leyendo más allá del \end{frame}.

Ahora pueden pasar dos cosas:

Primero, este es el último fotograma, por lo que el procesador nunca encontrará una coincidencia , aparecerá \end{frame}el error y se detendrá la compilación.! File ended while scanning use of \next.

En segundo lugar y más doloroso, hay otro cuadro que tendrá los droides \end{frame} que el procesador estaba buscando. Pero en este caso, \nextserá \letto \beamer@framewritten, que esencialmente lee el contenido del archivo .vrb en el marco. Pero el contenido será algo como:

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

lo que hará que las cosas se vuelvan locas :)

TL;DR

Recuerden niños, cuando usen [fragile]marcos, el\end{frame} debeser elsolocosa en la línea. No se permiten espacios iniciales ni comentarios (los espacios finales son devorados por TeX).

Como señaló Samcarter en su comentario, la versión actual de Beamer permite lideraryespacios en blanco y tabulaciones finales. La \beamer@strip@whitespacemacro consumirá espacios y tabulaciones antes de la comparación con \beamer@stopframe.

información relacionada