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 beamer
las entrañas descubrí que la respuesta es, como señaló egreg, el procesador textual.
Para [fragile]
los fotogramas beamer
utiliza 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@test
y se compara con \beamer@stopframe
el 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@test
y \beamer@stopframe
, si son diferentes, \beamer@test
se escribe el contenido \beamer@verbatimfileout
(el archivo .vrb) y la \next
macro será \let
el procesador, y se llama a sí mismo de forma recursiva para continuar leyendo. De lo contrario, si \beamer@test
es 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, \next
será \let
to \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@whitespace
macro consumirá espacios y tabulaciones antes de la comparación con \beamer@stopframe
.