今日は、コード内のコメントに負けたことを認めるのに、望まないほど多くの時間を費やしました...
プレゼンテーションにそのまま挿入しようとしたところ、次のエラーが発生しました:
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
の内部を少し調べてみたところ、beamer
egreg が指摘したように、答えは 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
。