Hatena::ブログ(Diary)

アセトアミノフェンの気ままな日常

2016-09-17

LaTeX パッケージの読込時オプションには空白を含めないほうがよい話

昨日までのアレな話とは別件で:LaTeX team からいただいた情報をひとつ。

「パッケージ読込時に “,” 区切り周囲にスペースを入れると Option clash する例」が最近発覚したらしい。以下の例示ソースで再現可能*1

\documentclass{article}
\usepackage[a, b, c]{foo}
\usepackage[a ]{foo}
\stop
! LaTeX Error: Option clash for package foo.

同じパッケージが 2 回以上使われそうになった場合、本来ならば「2回目のオプションたちが1回目のオプションたちの部分集合であればスルー、もし増えていたら Option clash エラー」となるべきところ、上記ソースでは空白がおかしな作用をして、部分集合になっているのに clash している。これも次回リリースで直すつもりらしい。

\def\@if@pti@ns#1#2{%
  \let\reserved@a\@firstoftwo
  \edef\reserved@b{\zap@space#2 \@empty}%       <- new
 \@for\reserved@b:=\reserved@b\do{%             <- changed
   \ifx\reserved@b\@empty
   \else
     \expandafter\in@\expandafter{\expandafter,\reserved@b,}{,#1,}%
     \ifin@
     \else
       \let\reserved@a\@secondoftwo
     \fi
   \fi
 }%
 \reserved@a}

ついついやってしまいがちな「空白」。特にオプションを多数指定する場合、コード上は改行して書くことも多いだろう:

\usepackage[dvipdfmx,%
 bookmarks=true,%
 bookmarksnumbered=true,%
 colorlinks=true,%
 setpagesize=false,%
 pdftitle={LaTeX研修課程},%
 pdfauthor={ななしのごんべぇ},%
 pdfsubject={hyperref入門・演習},%
 pdfkeywords={TeX; dvipdfmx; hyperref; color;}]{hyperref}

最後の % を書く習慣は付けておくと無難、ということかもしれない。オプション周りにいろいろ潜んでいたことがわかって怖い 3 日間だった。 → もうひとつ…

*1:これは一般化した記述であるが、たとえば foo → graphicx、a → dvipdfmx、b → dvips、c → dvipsone 等と置き換えてみるとよいだろう。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証