LaTeXで丸数字の連番リスト環境の基本
そもそもLaTeXで丸数字を使いたいときは、otfパッケージのajmacros.styの機能を使うのが一番お手軽です。
このスタイルでは、数値を指定してさまざまな囲み数字のグリフ(あれば)を呼び出すという便利な機能が提供されています。
たとえば、ふつうの丸数字であれば、
\ajMaru{数値}
として出力できます。
\ajMaru{1}、\ajMaru{100}、\ajMaru{101}
一方、enumerate環境でラベルのスタイルを変えたいときは、\theenumi
とか\theenumii
といったコマンドを再定義します。
\theenumi
と\theenumii
は、それぞれ「enumi」や「enumii」という名前のカウンタに対応した「アラビア数字」に展開されるコマンドです。
その結果がenumerate環境でラベルを表示するのに使われているので、これらのコマンドの挙動を変えることで別の種類の数字を出力できるというわけです。
たとえばこんなふうにすれば、ラベルが大文字のローマ数字であるような連番環境が作れます。
\renewcommand{\theenumi}{\Roman{enumi}} \begin{enumerate} \item 最初\label{A} \item 次\label{B} \end{enumerate} 最初は\ref{A}、次は\ref{B}。
以上の知見を組み合わせれば、こんなふうにして丸数字の連番環境が作れそうです。
\renewcommand{\theenumi}{\ajMaru{enumi}}
しかしこれはうまくいきません。\ajMaru
の引数は数値でなければならず、enumi
はあくまでもカウンタの名前だからです。
ではどうすればいいかというと、ajmacros.styに用意されている
\ajLabel
というコマンドを使います。
このコマンドは、後続の\ajMaru{enumi}
の中身を実際のカウンタ値として取り出してくれるように定義されています。
\renewcommand{\theenumi}{\ajLabel\ajMaru{enumi}} \begin{enumerate} \item 最初\label{A} \item 次\label{B} \end{enumerate} 最初は\ref{A}、次は\ref{B}。
hyperrefと一緒に使えなくなっているっぽい(2016年2月現在)
本当ならこれで話は終わりのはずなんですが、相互参照をクリッカブルにしてくれるhyperrefパッケージを同時に使うと話がややこしくなります。
hyperrefは、相互参照をクリッカブルにするためにカウンタ関連の機能をいろいろ勝手にオーバーライドするという鬼仕様なのですが、
ajmacros.sty
ではそれに振り回されないように、
hyperrefを読み込んだ場合には\begin{document}
の時点で\ajLabel
などをhyperref用にカスタマイズし直してくれます。
しかし、さらに厄介なことに、hyperrefはときどき内部の振る舞いをドラスティックに変更します。
そのため、せっかく再定義されている\ajLabel
がまた使えなくなるという事態が2016年2月現在では発生しているようです。
具体的には、以下のような例で、上記のような事情を理解していないとちょっと追跡しにくいエラーが起きます。
\documentclass[dvipdfmx]{jsarticle} \usepackage{otf} \renewcommand{\theenumi}{\ajLabel\ajMaru{enumi}} \usepackage{hyperref} % hyperrefを使う \begin{document} \begin{enumerate} \item 最初\label{A} \item 次\label{B} \end{enumerate} 最初は\ref{A}、次は\ref{B}。 \end{document}
実行例
... ! Undefined control sequence. \ajLabel ...abel \@arabic \else \Hy@ReturnAfterFi \hyperref@ajLabel #1\fi { l.17 \item 最 初\label{A} ?
エラーが起きている\Hy@ReturnAfterFi
は、かつてはhyperref.sty
内で定義されて使われていたようですが、現在のhyperrefでは使われていないため、このような事態になってしまうようです。hyperrefパッケージのSVNのログを見ると、どうやら2011年4月に消えたようですね。
[hyperref-svn] oberdiek: r1291 - trunk
http://mail.gnu.org.ua/mailman/listarchive/hyperref-svn/2011-04/msg00002.html
上記のログを見る限り、oberdiekバンドルのltxcmdsパッケージで定義されている\ltx@ReturnAfterFi
を使うようにしたので、\Hy@ReturnAfterFi
をディスコンにしたようです。
\ajLabel
の再定義では、この\Hy@ReturnAfterFi
を利用しているので、上記の例がうまく処理できない結果になっているようです。
そこで、\Hy@ReturnAfterFi
を\ltx@ReturnAfterFi
に変更するだけの以下のパッチをajmacros.sty
(1.7b6)に当てて試したところ、意図した挙動に戻りました。
(\Hy@ReturnAfterFi
と\ltx@ReturnAfterFi
の定義は同一なので当然といえば当然なのですが。。)
--- ajmacros.sty.org 2016-02-09 16:16:17.700785982 +0900 +++ ajmacros.sty 2016-02-09 16:15:57.548561902 +0900 @@ -685,7 +685,7 @@ % \def\check@UTF##1##2##3{\ifx\UTF##1\0x##2\else##3\fi}}{}} \gdef\ajRedefine@ajCommands{\@ifpackageloaded{hyperref}{% \let\hyperref@ajLabel\ajLabel - \def\ajLabel##1##{\ifHy@pdfstring\Hy@ReturnAfterElseFi\hyperref@ajLabel\@arabic\else\Hy@ReturnAfterFi\hyperref@ajLabel##1\fi}% + \def\ajLabel##1##{\ifHy@pdfstring\Hy@ReturnAfterElseFi\hyperref@ajLabel\@arabic\else\ltx@ReturnAfterFi\hyperref@ajLabel##1\fi}% \ajRedefine@ajCommand\"${Lig"$}\"&{Lig"&}\!*{Lig>.}\ajLig{Lig}\ajPICT{PICT}\"({PICT}\ajVar{Var}\@nil\@nil \aj@Redefine@ajCommand!{{Maru}!|{KuroMaru}""{Kaku}"#{KuroKaku}!~{MaruKaku}"!{KuroMaruKaku}\@nil\@nil \def\!J##1!K{\ifHy@pdfstring(##1)\else\expandafter\ifx\csname ajLig(##1)\endcsname\relax\@ajnumber{##1}{Kakko}%
hyperrefは、電子書籍をLaTeXで制作するうえでは唯一無二のパッケージなのですが、ときどきこういう面倒が起きるのがつらい。。
まとめ
またhyperrefか。
0 件のコメント:
コメントを投稿