マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

Babel な話: hyphsubst パッケージ (1)

この記事では、「分綴パターンの選択」に関する多くの問題の解決に有用な hyphsubst パッケージを紹介する。ただ、このパッケージを使って実際に「問題を解決する」には、TeX/Babel での分綴パターンの取扱についての知識が必要であるので、まずその解説から始める。(以下、Babel のコアを組み込んだ TeX ((Babel を組み込んだ TeX は起動時に「Babel <v...> and hyphenation patterns ...」のメッセージが出る。無論、Babel を「完全に」読み込んで使用するには babel パッケージの読込が必要である。))を前提にする。)

TeX での分綴パターンの扱い

TeX では複数の「分綴パターン(hyphenation pattern)」*1を登録して、それを文書中で切り替えられるようにしている。*2また分綴パターンには名前が付けられている。そして、どのような分綴パターンをどの名前で登録するかを決めているのが language.dat という設定ファイルであり、これは次のような書式になっている。

ukenglish loadhyph-en-gb.tex
=british
=UKenglish
usenglishmax loadhyph-en-us.tex

loadhyph-en-gb.tex や loadhyph-en-us.tex が「分綴パターンのソースファイル」*3であり、この場合、loadhyph-en-gb.tex に記された(英国英語用の)分綴パターンが「ukenglish」という名前で、loadhyph-en-us.tex に記された(米国英語用の*4)分綴パターンが「usenglishmax」という名前で登録される。先頭に「=」がある行は、「前の行のパターンについて別名を登録」することを意味し、この場合「british」と「UKenglish」が「ukenglish」の別名として登録される。

Babel で「(入力)言語」を切り替えた場合は、自動的に同じ名前の分綴パターンが選択される。すなわち、(\selectlanguage{ngerman} 等で)言語が ngerman に切り替わると、分綴パターンも ngerman に切り替わる。*5なので、多くの場合は「分綴パターン」を意識する必要はないだろう。

言語に対応しない分綴パターンの利用

Babel では「分綴パターンだけを切り替える」機能も用意されていて、これにより「対応する Babel の言語設定が存在しない」ような分綴パターンを利用することができる。

  • \begin{hyphenrules}{〈分綴パターン名〉}〈内容〉\end{hyphenrules} : [LaTeX 環境] 中身のテキストについて指定の分綴パターンを適用する。

例えば、TeX Live の language.dat には「nohyphenation」というパターンが登録されているが、これは「全く分綴をしない」というパターンである。従って、「文書の一部だけ分綴を抑止したい」という場合に次のようにして実現できる。

\begin{hyphenrules}{nohyphenation}
The text in this environment will never be hyphenated.
\end{hyphenrules}

このように、「(Babel の)言語」と対応しない分綴パターンも一応利用する術はあるのであるが、ある「言語」で用いる分綴パターンを既定の(つまり「同名の」)ものから変更したいという場合には対応できない。例えば、「english 言語で用いる分綴パターンを usenglishmax にしたい」といっても、Babel の機能では、「english 言語に切り替える度に hyphenrules 環境を記述する」しか実現方法がない。

hyphsubst パッケージの利用

この問題を解決する方法として、hyphsubst パッケージを利用することが考えられる。このパッケージが提供する機能自体は次のような非常に単純なものである。

  • \HyphSubstLet{〈分綴パターン名1〉}{〈分綴パターン名2〉} : 〈分綴パターン名1〉を〈分綴パターン名2〉の別名として登録する。

例えば、先に挙げたように「english 言語に切り替えた時に分綴パターンを usenglishmax に切り替えたい」という場合は、次のようにすればよい。

\usepackage{hyphsubst}
\HyphSubstLet{english}{usenglishmax}
\usepackage[english]{babel}

あるいは、\HyphSubstLet による分綴パターンの別名登録は、パッケージ読込時に「〈分綴パターン名1〉=〈分綴パターン名2〉」のオプションを付けることでも指定できるので、次のようにもできる。

\usepackage[english=usenglishmax]{hyphsubst}
\usepackage[english]{babel}

なお、\HyphSubstLet{〈分綴パターン名1〉}{〈分綴パターン名2〉} を実行した時は、既に〈分綴パターン名1〉が登録されていたとしても〈分綴パターン名2〉の別名として上書きされる。(元々〈分綴パターン名1〉で参照していたパターンは、別名が存在していない限りは参照不可能になってしまうことに注意。)さらに、このケースで「現在有効な分綴パターンが〈分綴パターン名1〉である」*6場合は、「現在有効な分綴パターン」も〈分綴パターン名2〉のものに切り替わる。つまり、現在の言語が english である(だからパターンも english である)時*7に、\HyphSubstLet{english}{usenglishmax} を実行すると、english が usenglishmax の別名に変わり、その結果、「現在有効なパターン」も usenglishmax のものに切り替わる。

*1:TeX レベルでは「分綴パターン」のことを指して「言語(language)」と呼ぶが、Babel の概念の「言語」との混同を避けるためこの名称を用いる。

*2:すなわち、分綴は、「その箇所で有効であった分綴パターン」に基づいて行われる。段落内での分綴パターンの切替も可能である。

*3:分綴パターンのソースは TeX 言語で書かれている。

*4:Gerard Kuiken による拡張版のパターン。「english」や「usenglish」は Knuth のオリジナルの米国英語用のパターンを指す。

*5:分綴パターンの初期値は「english」(つまり Knuth の分綴パターン)である。従って、そもそも Babel を使わない場合は文書全体に渡って english のパターンが適用される。

*6:別名で参照された場合も含む。

*7:先述の通り、Babel を使っていない場合は分綴パターンは english なので、その場合も含む。