Tuesday 5 February 2013

beamer : \end{frame} in verbatim environment

beamer では,\verb|| などを含む frame では
\begin{frame}[fragile]{title}{subtitle}
    texts here
\end{frame}
[fragile] オプションを与えねばならず,それでだいたいうまくいくのだが,
verbatim 環境 \verb|| のなかに \end{frame} が入っている場合にエラーが出る.
7 Feb 2013 0200JST :こんな深夜にどうかと思いますが, 今やったら
\verb|| の方は普通に通ったので一回取り下げます.
これを書いた時の僕か今の僕かどちらかがぼけてるということ,と思われます.
ただつい10時間ほど前に texlive2012 入れたのでその辺のアレも一応疑っておきましょう.
(なおこれはたとえば article とかでは普通に通ります.)
ソース:
\documentclass[pdflatex]{beamer}
\begin{document}
\begin{frame}[fragile]{title}{subtitle}
    \begin{verbatim}
        \end{frame}
    \end{verbatim}
\end{fragile}
\end{document}
verbatim の場合
Runaway argument?
^^M
! File ended while scanning use of \@xverbatim.
<inserted text>
                \par
l.5         \end{frame}

verbatim 環境の代わりに verb|\end{frame}| の場合
Runaway argument?
! File ended while scanning use of \next.
<inserted text>
                \par
<*> bem.tex
 なお,この \end{frame} が他のもの, \end{document} とか \begin{frame} とか,
 なら普通に通って予期された結果が得られる.

さて,この大変奇妙な事態.
\verb とか verbatim 全体が駄目ならまだ話はわかるけれども,
\end{frame} が駄目というのはどういうわけか.
  これを書きながら思いついたけど,そういえば \end{verbatim} を出そうとして
\begin{verbatim}
       \end{verbatim}
\end{verbatim}
ってやっても通りませんね.その辺に類似した事象なんだろうか.
ちなみに
\begin{verbatim}
      \begin{verbatim}
      \end{verbatim}
\end{verbatim}
も駄目.

 さて,TeX とか  LaTeX とか beamer でなにが起こってるのかを調べるには僕のスキルは不足していて,
とりあえず検索かけるといくつか同様の話題は見つかる
  (http://latex-beamer-class.10966.n7.nabble.com/end-frame-in-verbatim-td1457.htmlとか
http://compgroups.net/comp.text.tex/beamer-bug-end-frame-inside-of-verbatim/1936178 )
ものの,ここで挙げられている対策は  
[fragile] ではなく [containsverbatim] をオプションとして指定する
というもの.
この [containsverbatim] オプションは今回初めて知ったものだが,
beamer のドキュメントでも触れられていない. ちょっと古いコマンドらしい.
実際これでコンパイルは通るのだが, containsverbatim 下では \pause が効かない.
(cf. http://tex.stackexchange.com/questions/55687/pause-wont-generate-extra-slides-in-a-containsverbatim-frame)
僕のやった限りでは当該 frame のはじめの \pause 以降が出力されず,
次の  frame は出力される,といった感じ.

…というわけでこれはできるだけ使いたくない.
と,なると,ですね.とりあえず今のところ僕の見つけた最善策は,
beamer に用意されている semiverbatim 環境を使うこと.
この環境では \, {, } は普通の環境と同じ意味を持ち, \ { } は \\ \{ \} で出力する:
\begin{semiverbatim}
       \\end\{frame\}
\end{semiverbatim}
 でこれはちゃんと通る(のだが今度は置換とかめんどくさいのとソースの可読性が下がる……).

というわけで珍しく真面目にエラー吐くケースの報告と
とりあえず欲しい出力を得る方法でした.
beamer か verb かその辺の何かが問題なんだと思うのですが詳しい人,どうなんでしょう.
そのうち TeX wiki とか tex.stackexchange.com に投げてみてもいい.
% 例によって mathjax との衝突と思われるレイアウト崩れが発生したので
% blog 全体への mathjax 適用を外しました.
% 別にここでは mathjax 呼んでないんやけどな……
%  なにか解決策ご存知の方があったら教えてください.

No comments:

Post a Comment