”No room for a new \dimen.” using Beamer, TikZ and booktabs in LyX

早速、この間作成した\tikzfancyarrowコマンド(実質はtikz)を使ってスライドを作っている時にエラーが起きた。その原因と対処法が分かったのでそれをメモ。
Beamerを使ったスライド文書でTikZとbooktabsパッケージを読み込むと以下のエラーが出る。
! No room for a new \dimen .
\ch@ck ...\else \errmessage {No room for a new #3}
                                                  \fi 
l.17 \newdimen\tikz@lastx
                         
This error message was generated by an \errmessage
command, so I can’t give any explicit help.
Pretend that you’re Hercule Poirot: Examine all clues,
and deduce the truth by order and method.

! No room for a new \dimen .のエラーの意味と対処法

この以下のエラー
! No room for a new \dimen .
はLaTeXで使えるレジスタの数が足りなくなったという意味を表している。TikZやhyperrefなどの最新のTeXのパッケージを読み込むと、LaTeXの変数を大量に使用するため、以下のようにTikZパッケージを読み込むとよく表示される。
\usepackage{tikz}
オリジナルのTeXでは使用できるレジスタ(count、dimen、skip、box、token)の数が256個までという制限がある。この制限を超過したためこうしたエラーが生じる。この問題を対処するにはe-TeXを使う必要がある。e-TeXは従来のTeXの不便なところを補うようにした拡張版となっている。e-TeXを使えば使用できるレジスタの数が従来の256個に対して32 768個と128倍=27倍に拡張されている。
そのため、e-TeXを使えば! No room for a new \dimen .というエラーは解消される。ところが、過去のTeXの形式を合わせるため標準ではこのe-TeXは使用されない。e-TeXを使うには以下のようにしてetexパッケージを読み込む必要がある。
\usepackage{etex}
e-TeXを使うことでTikZの他にもetoolboxという非常に便利なマクロ支援パッケージも使うことが可能となるため、理由がなければuplatexと同様にetexも使っていくべきだと考える。ただ、TikZやetoolboxといったレジスタを大量に使用するetexを前提とするパッケージを使うときは、パッケージを読み込む順番が非常に重要となる。tikzなどのetexが必要なパッケージの「前に」etexを読み込まないといけない。
例えば以下のURLは今回私が遭遇したエラーとほぼ同一のエラーに対する質疑が行われている。
上記URLでは、対処法としては以下のようにetexパッケージを最初に読み込んでから各種パッケージを読み込むことが提案されている。
\documentclass{beamer}
\usepackage{etex}
\usepackage{tikz}                 
\usepackage{booktabs}             
​
\begin{document}
\begin{frame}
​
\end{frame}
\end{document}
etexを読み込まなかったり、tikzやbooktabsの後にetexを読み込むと! No room for a new \dimen .という例のエラーが発生する。

LyX特有の問題

ここで私が遭遇したエラーの重要なポイントは、tikzの後だけでなく「booktabs」の後にetexを読み込んでもダメだということだ。
LyXでは本文中での操作に応じて、自動的にbooktabsやsubfigといった一部のパッケージの読み込み(\usepackage{booktabs}や\useapckage{subfig}の追記)を行う。具体的には、Insert ▷ Table…から表を挿入した後、表を右クリック ▷ More… ▷ Settings… ▷ Bordersタブ ▷ [Style: Formalに]した時点でbooktabsの読み込みが行われる。確認するには、File ▷ Export ▷ LaTeX (pLaTeX)により.lyxファイルから.texファイルに出力して.texファイルを開くと確認できる。
普通のLaTeX文書と同様にbooktabsパッケージの読み込み前にetexパッケージを読みこめばこの問題は解消する。しかし、LyXではユーザーがパッケージの読み込みやプリアンブルの記述は通常は、Document ▷ Settings… ▷ LaTeX Preambleのみとなっている。そして、ここで書いた内容は上記のbooktabsやその他のLyXで自動的に読み込むパッケージ(フォント関係やlistings、geometry、color、babelなど)の「後」となっている。
そのため、普通にやるとどうやってもbooktabsパッケージの読み込みの後にetexパッケージを読み込むことになる。つまり順番として以下のようになる。
\usepackage{booktabs}
\usepackage{etex}
\usepackage{tikz}
etexを最初に読み込むことが大事だということはわかっていたので、当然私もLyXではLaTeX Preambleの先頭行に\usepackage{etex}を記述していた。しかし、今回のエラーはLyXの仕様のためそれでは無理だということがわかりいろいろとLyXが読み込むパッケージの順番について調べた。その結果、以下の項目に記述をすれば、LyXが自動で設定する\usepackage{booktabs}よりも前に、\uespackage{etex}やユーザー独自のコマンドを記述できることがわかった。
Document ▷ Settings… ▷ Output ▷ Custom Macro:
ここは以前書いたLyX 2.1でforward searchとinverse search[順検索・逆順検索]を導入でも使ったが、本来は順/逆順検索(forward/backward search)に関する設定を行う場所だ。ここに以下のように従来の記述の後ろに追記する形でユーザー独自のコマンドを記述できる。
\synctex=1 \usepackage{etex}
ここ書いた内容はbooktabsよりも1行前!に読み込まれるので、etex ▷ booktabs ▷ tikzという順番でパッケージを読み込まれるので問題がぎりぎり回避できる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です