読者です 読者をやめる 読者になる 読者になる

Acetaminophen’s diary

化学に関すること、TeXに関すること、ゆきだるまに関すること。

役に立つかも?なパッケージたち

TeX

TeX & LaTeX Advent Calendar で実際に投稿した 化学構造式のための自作パッケージ ともう一つ、最後まで案として残っていた記事をポイッ!というわけで

「もしかしたら役に立つかも?」というパッケージたち

を紹介する。今回は「noconflict」「macroswap」「turnthepage」の三本立てであり、いずれも TeX Live に含まれているが、日本語での紹介記事がパッと見たところ見当たらなかったので、今回書くことにした。

すべてのサンプルは GitHub に置いている。

 

noconflict パッケージ:コマンド名の重複回避

利用するパッケージが増えてくると、別々のパッケージで同じコマンド名が定義されていて衝突するということがしばしば起こりうる。こうした場合に自分でマクロを組んで再定義するのもよいが、便利なパッケージが CTAN に提供されている。それが noconflict である*1

とりあえず、パッケージ同士でコマンドが衝突する例を挙げなければならないので、しょうもないコマンドを定義してみる。マクロを見たことがない人でも容易に理解できるレベルの定義である。

  • testingconflictA.sty
  • testingconflictB.sty
  • testingconflictC.sty

という3つのパッケージで、以下のように

  • \testingconflictX
  • \testingconflictY
  • \testingconflictZ

というコマンドが重複定義されているとする:

testingconflictA.sty の中身

\newcommand{\testingconflictX}[1]{(#1AX)}
\newcommand{\testingconflictY}[1]{(#1AY)}
\newcommand{\testingconflictZ}[1]{(#1AZ)}

testingconflictB.sty の中身

\newcommand{\testingconflictX}[1]{[#1BX]}
\newcommand{\testingconflictY}[1]{[#1BY]}
\newcommand{\testingconflictZ}[1]{[#1BZ]}

testingconflictC.sty の中身

\newcommand{\testingconflictX}[1]{\{#1CX\}}
\newcommand{\testingconflictY}[1]{\{#1CY\}}
\newcommand{\testingconflictZ}[1]{\{#1CZ\}}

つまり、3×3 = 9個のコマンドが定義されていて、それぞれ

  • A というパッケージでは「丸括弧にA」
  • B というパッケージでは「角括弧にB」
  • C というパッケージでは「波括弧にC」

という組み合わせが現れる。なお、コマンド名の末尾の X, Y, Z に合わせて X, Y, Z の文字も出力する。なお、引数をとるコマンドにしたかった*2ので、引数を1つとって括弧内にそのまま出力するようにしてある。

以下、サンプルファイルを作成したので、それを元に説明する。

noconflict-error.tex

普通にこれら3つのパッケージを同時に使おうとすると、コマンド名が重複しているためエラーが生じる。

! LaTeX Error: Command \testingconflictX already defined.
               Or name \end... illegal, see p.192 of the manual.

これを回避するために noconflict パッケージを用いる。

noconflict-ex1.tex

\prefix と \save* を使って複数のコマンドを使い分けられるようにする。接頭辞に好きな単語を指定するために \prefix を用い、それを適用したいコマンドを \save* で指定する。なお、すべて \save* したあとは元の重複していたコマンドは空になる。

noconflict-ex2.tex

同じことが \save でも可能である。この場合は \prefix と \save* の引数を一度に指定できて簡潔である。

noconflict-ex3.tex

もちろん重複するマクロ全てを \save する必要はないので、パッケージを読む順番を工夫し、最後のパッケージのマクロを元のコマンド名のまま利用することもできる。

noconflict-ex4.tex

新しいコマンド名を定義すると元のコマンド名は空になってしまうが、\restore を使えば元のコマンド名に復帰させることができる。この場合、新たに定義した接頭辞付コマンドも失われない。

noconflict-ex5.tex

もし、任意のパッケージの好きなコマンドを自由に組み合わせて利用したい場合は、マクロのリネームを行う。この場合、リネームされた接頭辞付コマンドは空になる。

 

macroswap:コマンド名の交換

2つのマクロ名を逆転させたい場合に利用できるパッケージがこの macroswapである。簡単な例として、以下のように定義する:

\newcommand{\myfirst}{First}
\newcommand{\myend}{End}

すなわち \myfirst で First が出力され、\myend で End が出力される。

macroswap パッケージの \macroswap や \gmacroswap は引数を2つとり、それぞれの引数にはマクロ名を指定する。これらを記述すると、以降で2つのマクロの名称が逆転する。つまり

\macroswap{myfirst}{myend}

と書くと、以降は \myfirst で End が出力され、\myend で First が出力されるのである。

\macroswap は \begingroup と \endgroup の間に書かれていれば、そのグループ外では無効になるのに対し、\gmacroswap は以降のマクロ名をグローバルに変更するという違いがある。

なお、macroswap パッケージは引数の数が一致していない2つのコマンド名でも問題なく交換することが可能である。

 

turnthepage:「ページをめくりなさい」の出力

この turnthepage パッケージの機能は、見開きで右にあたる奇数ページ下部(最後のページを除く)に Turn the page. というメッセージを表示するだけである。試験問題などで問題がページ上部にのみ印刷され、余白があるため次ページの問題に気づきにくいという経験は誰でもあるだろう。これを避けるために、次のページに問題があることを示唆するメッセージを出したいというときに使えそうだ。

ただし、英語・フランス語・オランダ語・ドイツ語しかサポートしていないため、例では日本語化のため

\renewcommand{\turnthepage}{ページをめくりなさい。}

という再定義を与えている。

なお、タイプセットは最低2回必要である。1回だけではページ数を取得できていないため、メッセージを出力すべきページを判断できていないためであろう。

 

以上、もしかしたら役に立つかもしれないパッケージ3選。

*1:TeX Q & A でも最近関係のある質問が寄せられたので回答しておいた

*2:というのは、コマンドが「空」になった場合に何も出力されないとわかりづらいためである。