脆弱な \end{frame} の後のコメントにより、Beamer が壊れる

脆弱な \end{frame} の後のコメントにより、Beamer が壊れる

今日は、コード内のコメントに負けたことを認めるのに、望まないほど多くの時間を費やしました...

プレゼンテーションにそのまま挿入しようとしたところ、次のエラーが発生しました:

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

の内部を少し調べてみたところ、beameregreg が指摘したように、答えは verbatim プロセッサであることがわかりました。

[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}

現時点では、次の 2 つのことが起こる可能性があります。

まず、これは最後のフレームなので、プロセッサは一致するものを見つけることができず\end{frame}! File ended while scanning use of \next.エラーが表示され、コンパイルが停止します。

2 番目で、より厄介なのは、プロセッサが探していたドロイド を含む別のフレームがあることです。ただし、この場合、は になり、基本的に .vrb ファイルの内容をフレームに読み込みます。ただし、内容は次のようになります。\end{frame}\next\let\beamer@framewritten

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

それは物事をワイルドにするでしょう:)

要約

子どもたち、[fragile]フレームを使うときは、\end{frame} しなければならないであるのみ行の先頭のスペースやコメントは使用できません (末尾のスペースは TeX によって無視されます)。

samcarterさんがコメントで指摘したように、現在のバージョンのBeamerでは、そして末尾の空白とタブ。\beamer@strip@whitespaceマクロは、と比較する前にスペースとタブを削除します\beamer@stopframe

関連情報