マクロツイーター

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

新しい pxbabel についての話

この記事では、pxbabel パッケージ(PXbase バンドル)の新版(1.1 版)における新しい機能について解説する。

pxbabel って何

要するに、こういうことをするためのもの。

\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[schinese,japanese]{pxbabel}
\begin{document}
『骨』は簡体字では『%
\foreignlanguage{schinese}{}%
』と書く。
\end{document}

日本語と中国語では別のフォントを使う必要があるわけだが、そのフォントの切替を「Babel における言語の切替」というインタフェースで行えるようにしたのが pxbabel パッケージである。(pxbabel は内部で babel を読み込んでいる。)

詳しい解説は奥底のページにある。ただしここの説明は古い版に基づくものである。

新しいやつと古いやつは読込方法が違う

新版ではパッケージの読込の方法がより簡単なものに変更されている。

新しいやつの場合

要するに「babel の代わりに pxbabel を読み込む」という形になる。pxbabel を使うことにより 4 つの CJK 言語(japanese・korean・schinese・tchinese)が“指定できるようになる”ため、CJK 言語およびその他の Babel の言語のうち、自分が使いたいものを列挙すればよい。babel での規則と同じく、一番最後に書いたものが基底言語(その文書のメインの言語で文書開始時に有効になっている)になる。

  1. 例えば“韓国語の文書”を作る場合は:

    \usepackage[korean]{pxbabel}
    
  2. 例えば“繁体字中国語を含む日本語の文書”を作る場合は:

    \usepackage[tchinese,japanese]{pxbabel}
    
  3. 例えば“英語と日本語を含むフランス語の文書”を作る場合は:

    \usepackage[english,japanese,french]{pxbabel}
    
  4. 例えば“エスペラントと日本語を含む簡体字中国語の文書”を作る場合は:

    \usepackage[esperanto,japanese,schinese]{pxbabel}
    
古いやつの場合

これに対して、旧版は「babel の後で pxbabel を読む」という手順になっていた。

  • まずは非 CJK 言語のオプションを指定して babel を読み込む。(ここで最後に書いたものが基底言語になる。)
  • その後に pxbabel を読み込むと、4 つの CJK 言語が(常に)有効になる。ここで CJK 言語を基底言語に変えたい場合は、pxbabel のオプションに main=<言語名> を指定する。

先の節で例に挙げたパターンは、旧版では以下のようになる。

  1. “韓国語の文書”を作る場合は:

    \usepackage[english]{babel}
    \usepackage[main=korean]{pxbabel}
    
    ※CJK 言語は常に有効なので korean の指定は不要なことに注意。
    ※babel を言語オプション無しで読み込むことは許されないので、取りあえずダミーとして english を指定する。
  2. 繁体字中国語を含む日本語の文書”を作る場合は:

    \usepackage[english]{babel}
    \usepackage[main=japanese]{pxbabel}
    
    ※tchineseは“どこにも書かない”ことになる。
  3. “英語と日本語を含むフランス語の文書”を作る場合は:

    \usepackage[english,french]{babel}
    \usepackage{pxbabel}
    
    ※pxbabel に main がないので babel で決定した基底言語がそのまま保持される。
  4. エスペラントと日本語を含む簡体字中国語の文書”を作る場合は:

    \usepackage[esperanto]{babel}
    \usepackage[main=schinese]{pxbabel}
    
互換性の心配は無用

ただし、旧版の仕様に従った文書のコンパイル結果が変わってしまってはいけないので、以下のようにして後方互換性を保持している。

  • babel と pxbabel が別個に読み込まれた場合は旧版の仕様に従う。つまり、main キーが指定されない場合は、pxbabel は基底言語を変更しない。
  • 新版でも実際には 4 つの CJK 言語全てが有効になっている。(ただし pxbabel のオプションに明示指定することが推奨される。)
  • main キーで基底言語を明示指定する方法は新版でも有効である。main=french のように非 CJK 言語を指定することも可能。((ちなみに、これは偶然であるが、比較的最近の Babel には main キーで基底言語を明示指定する機能が追加されている。))

キャプション言語の扱い(caption オプション)

Babel で日本語(などの CJK 言語)を扱うときの顕著な問題点の一つが「キャプション言語の切替」の問題である。これは先に挙げた奥底の記事の別の箇所で詳しく論じられている。

新版では、キャプション言語の切替の挙動は caption というオプションキーで制御できる。

  • caption=switch: Babel の仕様を保持する。すなわち、\selectlanguage 命令や otherlanguage 環境((otherlanguage*-形はキャプション言語の切替を行わない。))ではキャプション言語を変更する。
  • caption=default: Babel のキャプション言語切替の機能を抑止し、文書クラスで定められたキャプション文字列を使う。((この“default”という名称は「昔の bxbase の \bxmainlanguage のデフォルトの動作」であることに由来する。))
  • caption=main: Babel のキャプション言語切替の機能を抑止し、キャプション文字列は基底言語の言語定義で定められたものを使う。

caption の既定値は基底言語により異なり以下のようになる。*1

  • 基底言語が非 CJK 言語になる場合は switch、つまり Babel の仕様が保持される。
  • 基底言語が CJK 言語になる場合は main となる。pxbabel が追加した CJK 言語はキャプション文字列の定義を含んでいないため、文書クラスでの定義を利用する必要があるからである。

従って、pxbabel を利用して CJK 言語が基底となる文書を作成する場合は、文書クラスは当該の言語のためのものを選ぶ必要がある。先の例でいうと、1 では韓国語用、2 では日本語用、4 では簡体字中国語用の文書クラスを用いる必要がある。*2

bxorigcapt パッケージ

ちなみに、「Babel は使いたいが、キャプション文字列は文書クラスで決めたものをそのまま使いたい」という場合、bxorigcapt パッケージを使うという手段もある。


補足的な何か。

  • 新版のpxbabelの読込の方法(補足)
    「実際の言語定義を伴う(*.ldf が存在する)CJK言語を指定する場合」の解説。あまり実用されないと思われるので詳細は省略して新旧の対照だけを記した。

*1:この仕様は古い版と新しい版の間で変更はない。

*2:通常、CJK 言語の各々と非 CJK 言語の間で「文書クラスをキャプションだけ書き換えて融通する」ということは、レイアウトが大きく異なるゆえ不可能である。従って、CJK 言語が基底の場合は「文書クラスの文字列を保持する」のが最適なのである。