BXbase/PXbase パッケージ

変更履歴
  • 2009/11/16: BXbase バンドルのページと統合して全面的に書き直し。

概要

これらのパッケージバンドルの役割

BXbase/PXbase パッケージバンドルの役割は以下のようである。

  • 拙作の他のパッケージによって使われる部品的な機能を提供している (ライブラリの役割)。 このため、他のパッケージ(およびその一部の機能)で BXbase/PXbase のインストールが求められることがある。
  • 非常に「基本的」と考えられる機能を提供するパッケージを BXbase/PXbase パッケージに入れることがある (例えば pxbabel パッケージ等)。
  • さらに一部の「基本的」な機能は bxbase/pxbase パッケージで 提供されることがある (\recordpapersize 等)。

BXbase と PXbase の関係

BXbase は欧文 LaTeX(XeLaTeX を含む)用、PXbase は pLaTeX(upLaTeX を含む) 用のパッケージを収めている。 勿論、欧文 LaTeX 用のパッケージは pLaTeX でも使えるので、 BXbase のパッケージを pLaTeX で使うことは可能であり、 またその必要が生じることもあるだろう。

bxbase パッケージと pxbase パッケージで共通の機能をもっていることがある (例えば \Ux 命令等)。 この場合、どちらのパッケージを用いても結果は変わらない。 また、一方にしか含まれない機能もあるので、場合によっては両方を読み込む 必要があるだろう。

参考: bxbase と pxbase の両方を読み込んだ場合、共通する機能については、 読込の順番に関わらず新しい版の方が有効になる。 後方互換性は保証されるので、pxbase と bxbase の各々について、 その時に必要な最新のものをインストールしておけば問題はない。

パッケージ一覧

PXbase バンドル

  • ifuptex パッケージ: upTeX 判定
  • pxbase パッケージ: 基礎ライブラリ
  • pxcjkcat パッケージ: 和文文字カテゴリ操作
  • pxbabel パッケージ: CJK 間のフォント切替
  • upkcat パッケージ: 文字指定の kcatcode 操作

BXbase バンドル

  • bxutf8 入力エンコーディング: UTF-8 入力
  • bxbase パッケージ: 基礎ライブラリ
  • bxucs パッケージ: 欧文 Unicode 文字出力
  • zxbase パッケージ: XeLaTeX 用基礎ライブラリ(予定)

対応環境

パッケージ付属の説明書を参照。

ダウンロード

インストール方法については、 パッケージ付属の説明書を参照。

bxbase/pxbase パッケージの機能紹介

Unicode/CID 符号値による文字入力 [bxbase/pxbase]

Unicode および Adobe-Japan1 の CID の符号値によって文字を 入力する命令。

  • \Ux{<コード値16進>,...}: Unicode、欧文扱い
  • \UI{<コード値16進>,...}: Unicode、和文扱い
  • \AJ{<コード値10進>,...}: Adobe-Japan1 CID

ただし、このパッケージ自身は入力の手段を与えているだけで、 実際の処理は「そこで利用可能な機能」を介して行われる。 例えば、\UI は「OTF パッケージ読込の pLaTeX」 では \UTF を使うが upLaTeX や XeLaTeX では TeX エンジンのもつ Unicode 符号値入力の機能を使う。

詳細については、 「Unicode による文字入力」のページを参照。

Safe caret 機能 [bxbase/pxbase]

pLaTeX で JIS X 0208 外の Unicode 文字を直接入力する機能を verbatim の中でも正常動作させるための機能。 詳細については、 「Unicode による文字入力」の「Safe caret 機能」小節を参照。

日本語の PDF しおりの作成 [pxbase]

(upLaTeX の場合は 「upLaTeX を使おう」 のページを参照。)

pLaTeX において hyperref パッケージと dvipdfmx を用いて和文文字を含むしおりや文書情報を含んだ PDF 文書を作る場合、 pdf:tounicode special を使う (つまりプレアンブルに

% (内部文字コードが sjis の場合)
\AtBeginDvi{\special{pdf:tounicode 90ms-RKSJ-UCS2}}
% (内部文字コードが euc の場合)
\AtBeginDvi{\special{pdf:tounicode EUC-UCS2}}

を書く)必要があった。 (注意:最近の hyperref ではこれは失敗する可能性がある。)

この作業を自動で行うのが \usejapanesepdfstring 命令である。 使っている ptex の内部文字コードに応じて適切な special 命令を DVI に挿入する。

\documentclass{jarticle}
\usepackage[dvipdfm,
  bookmarks=true,bookmarksnumbered=true,bookmarkstype=toc,
  pdftitle={pLaTeX2e怪文書作成入門},pdfauthor={絶対匿名希望},
  pdfkeywords={pTeX,pLaTeX,怪文書,日本語}]{hyperref}
\usepackage{pxbase}
\usejapanesepdfstring
\begin{document}
\title{p\LaTeXe\ 怪文書作成入門}
\author{絶対匿名希望}
\maketitle
\section{美しい怪文書組版のために}
  (スタブ)
\section{以下省略}
\end{document}

勿論、pdf:tounicode special 命令を解釈できるのは dvipdfmx のみなので、 この方法は dvipdfmx 専用であり、 他の DVI ウェアを用いて PDF を作る場合には使えないことに注意。 (一般に、special 命令をそれに対応していない DVI ウェアで用いても期待通りの結果にはならず、 場合によってはエラーになる。)

注意: 最近の hyperref で行われた修正に伴い、 冒頭に示した \special を直接書く方法は上手くいかなくなっている。 \usejapanesepdfstring はこの修正に対応しているので大丈夫である。

紙面のサイズを記録する(papersize special) [bxbase/pxbase]

TeX の出力である DVI ファイルには紙面(版面) の大きさは記録されないので、 DVI ファイルを処理するソフトウェア(DVI ウェア)は、 一般に、紙面の正しい大きさ(LaTeX で指定した大きさ) を改めて使用者から入力して貰う (例えば dvipdfmx の -p オプション)必要がある。 これでは不便なので、紙面の大きさを記録する special 命令 (拡張命令)が一部の DVI ウェアでサポートされた。 それが papersize special 命令であり、 LaTeX においてはプレアンブルに次を記述すると実行される。

\AtBeginDvi{\special{papersize=\the\paperwidth,\the\paperheight}}

この作業を行う命令(要するに上述の命令に展開されるマクロ) が \recordpapersize である。 これを実行すると、papersize special 命令をサポートする DVI ウェア、 例えば dviout、dvips、dvipdfm(x) 等で、 改めて紙面サイズを指定する必要がなくなる。

\documentclass[a5paper]{jarticle} % 紙面サイズは A5
\usepackage{pxbase} % または bxbase
\recordpapersize
\begin{document}
お久しぶり、\TeX !
\end{document}

papersize special 命令対応の DVI ウェアはかなり多いが、 無論そうでないのもあるので、 やはり他の special 命令と同様の注意が必要である。

Babel 使用時にキャプションを日本語のままにする [bxbase/pxbase]

pLaTeX 上で Babel を使って日本語がメインの多言語文書を 作成するときに困る点の一つが、キャプションの文字列 (「参考文献」や「図」等)の言語の問題である。 例えば下の例では、表のキャプションの番号が “Table1” となってしまっている。

\documentclass{jsarticle}
\usepackage[OT2,T1]{fontenc}
\usepackage[russian,english]{babel}
\begin{document}
\begin{table}[tbp]\centering
\caption{省略される前の単語をみる}\label{tbl:kolkhoz}
\begin{tabular}{cccc}\hline
日本語(?) & ロシア語 & 省略前の形 & 英字表記 \\\hline
コルホーズ &\Rus{kolhoz}&\Rus{kollektivnoe hozya\U{i}stvo}
&kollektivnoje khozjajstvo\\
ソフホーズ &\Rus{sovhoz}&\Rus{sovet{}skoe hozya\U{i}stvo}
&sovjetskoje khozjajstvo\\\hline
\end{tabular}
\end{table}
表~\ref{tbl:kolkhoz} をみてみよう。
コルホーズの省略前の形の前の単語は kollektivnoje、そう、
英語で collective、つまり「集団的」である。
一方、ソフホーズは sovjetskoje でここには sovjet (\Rus{sovet})
「ソビエト、国家」が見えてくる。
「コルホーズは colletive、ソフホーズは Sovjet」
と覚えておけばもう間違えないであろう。
\end{document}

通常、キャプション文字列の言語は、Babel で一番最後に読み込まれたもの (それが本文開始時に有効な「メインの言語」になる; この場合は english)になる。 Babel の標準の言語オプションに「日本語」はないので、 キャプション文字列を日本語のままにしておくことができないのである。

キャプション文字列の変更の解除

これに対する解決策の一つに、「日本語の言語オプションを用意する」 ことが考えられる。 例えば、 japanese パッケージ(稲垣徹氏作)を利用して babel の読み込みを次のように変えればよい。

\usepackage[russian,english,japanese]{babel}

しかし、この方法で起こっていることは、「キャプション文字列を japanese オプションで用意したものに書き換える」 ということであるので、文書クラスが用意していた文字列がこれと異なる場合、 結局は「元の通り」にはなっていない。 それに、日本語の文書クラスではキャプション文字列の扱いが Babel がサポートしている言語(多くは西欧語)と異なることが多い (また扱いも文書クラス毎に異なる)ので、 この方法では上手くいかない可能性も残っている。

Babel の機能が日本語に関しては邪魔になる原因は次のようである。 日本語がメインの文書を作る場合は、 ほぼ必ず日本語用の文書クラスが用いられる (日本語文書のレイアウトが西欧語と大きく異なるから)。 当然、そこではキャプション文字列は既に日本語になっている。 このことを考えると、一番望ましいのは 「文書クラスの設定を何も変えない」ことということになる。

そこで pxbase パッケージ(または bxbase パッケージ) ではその為の機能を用意している。 次のように、プレアンブルで \bxcaptionlanguage{default} を指定すればよい。 これで表のキャプション中の番号は「表 1」となる。

\documentclass{jsarticle}
\usepackage[OT2,T1]{fontenc}
\usepackage[russian,english]{babel}
\usepackage{pxbase}                   %+  (または bxbase)
\bxcaptionlanguage{default}           %+ これを追加
\begin{document}
\begin{table}[tbp]\centering
\caption{省略される前の単語をみる}\label{tbl:kolkhoz}
\begin{tabular}{cccc}\hline
日本語(?) & ロシア語 & 省略前の形 & 英字表記 \\\hline
コルホーズ &\Rus{kolhoz}&\Rus{kollektivnoe hozya\U{i}stvo}
&kollektivnoje khozjajstvo\\
ソフホーズ &\Rus{sovhoz}&\Rus{sovet{}skoe hozya\U{i}stvo}
&sovjetskoje khozjajstvo\\\hline
\end{tabular}
\end{table}
\end{document}

\bxcaptionlanguage の引数は以下のものが可能である。

  • default: キャプション文字列を文書クラス設定のものから変更しない。
  • main : メインの言語(最後に呼ばれたオプション)のものに変更する。
  • 有効な言語オプションの名 : その言語に変更する。

main は本来の Babel の動作と同じようにみえるが、 実は \bxcaptionlanguage にはもう一つの作用があるので同じにはならない。 以下ではその作用について説明する。

キャプション文字列の本文開始時の固定

Babel において \selectlanguage で言語を切り替えると次の例のように、 キャプション文字列の言語も追随して変わる。 (注意:これは故意に変な例を作っている。)

\documentclass{article}
\usepackage[OT2,T1]{fontenc}
\usepackage[russian,french,english,ngerman]{babel}
\begin{document}
\selectlanguage{french}
\begin{figure}[!h]\centering
\fbox{\LARGE Voici une figur!}
\caption{in Franz\"osisch}
\end{figure}
\selectlanguage{russian}
\begin{figure}[!h]\centering
\fbox{\LARGE Vot risunok!}
\caption{\Eng{in Russisch}}
\end{figure}
\selectlanguage{english}
\begin{figure}[!h]\centering
\fbox{\LARGE Here is a figure!}
\caption{in Englisch}
\end{figure}
\end{document}

一見して便利なように見えるが、よく考えてみると、 一つの言語の中でこのようにキャプション文字列の言語が変わることは、 実際の文書ではまず起こり得ない。 多言語の文書といっても、そこには「メインの言語」があって、 全てのキャプション文字列はその言語のものになっているはずである。 例えば、英語がメインで所々にロシア語とギリシャ語が出てくる文書では、 図の番号は Fig.1, Fig.2, …… であって途中でロシア語に変わったりしないのが自然であろう。

そこで、\bxcaptionlanguage が使われた場合は、 本文の先頭(\begin{document} の場所) で一旦キャプション言語を決めた後は自動的には変更されないようにしている。 例えば、直前の例で \bxcaptionlanguage{main} を指定すると、図番号は全て ngerman のものになる。

まとめ

  • 日本語用の文書クラスで、キャプション文字列を日本語から変更しない:
    \documentclass{jarticle}  % 日本語用のクラス
    \usepackage[french,english]{babel}
    \usepackage{pxbase} % または bxbase
    \bxcaptionlanguage{default}
    
  • キャプション文字列を「メインの言語」のものに固定する。
    \documentclass{article}
    \usepackage[norsk,swedish,ngerman]{babel} % メインは ngerman
    \usepackage{bxbase}
    \bxcaptionlanguage{main}
    

bxucs パッケージ、bxutf8 入力エンコーディング

欧文の場合、utf8 入力エンコーディング等を用いて BMP 内の Unicode 文字を 「入力」することができるが、その文字を「出力」する方法が 各種言語パッケージ等によって提供されていなければ、 結局その文字を使うことはできない。 bxucs は BMP 内の任意の Unicode 文字を「出力」する機能を提供する (色々と制限があるが)。 bxutf8 は utf8 に bxucs や OTF パッケージのサポートを加えたもの。

詳細については、 「Unicode による文字入力」の「欧文の場合」節 を参照してほしい。

pxcjkcat パッケージ

upLaTeX において、特定の文字群の「欧文扱い」「和文扱い」を変更するためのパッケージ。 例えば「ギリシャ文字は欧文として出力したい」という場合に有効である。

基本的な使用法については 「upLaTeX を使おう」 で説明している。

pxbabel パッケージ

pLaTeX/upLaTeX での CJK 言語(日本語・中国語・韓国語) の間の「和文」フォント切替を Babel のマークアップで 行えるようにするもの。 現在、「pLaTeX + multi オプション付の OTF パッケージ」 と「upLaTeX」に対応している。

パッケージの読込

基本的に、pxbabel は Babel の言語オプションとして、

  • japanese: 日本語
  • korean: 韓国語
  • schinese: 簡体字中国語
  • tchinese: 繁体字中国語

の 4 つを追加する。 ここで追加されるオプションは、和文フォントの切替のみを行い、 キャプションの変更は行わないという単純なものである。 もし、上で挙げた名前のオプションが既に存在する (babel のオプションとして指定されている) 場合は、その設定の中にフォント切替が追加される。 例えば、

\usepackage[esperanto,latin,english,japanese]{babel}
\usepackage{pxbabel}

とすると、既存の japanese には日本語へのフォント切替が追加され、 また koreanschinesetchinese の 3 つが新たに生成される。 この場合の基底の言語は、Babel の規則に従って、 japanese(最後に指定されたオプション)である。

もし、言語オプションの名前を変更したい場合 (典型的には、CJK 言語用の既存の言語オプションで上掲の名前と異なるものを用いている場合) は、pxbabel のオプションに「<元の名前>=<新しい名前>」を指定する。

  % simpchinese という簡体字中国語用オプションを用いている
\usepackage[simpchinese,japanese,english]{babel}
  % これで既存の simpchinese にフォント切替が入る
  % ついでに繁体字中国語も tradchinese の名前に変えた
\usepackage[schinese=simpchinese,tchinese=tradchinese]{pxbabel}

オプションに main=<言語オプション名> を指定することで基底言語を変更できる。 これを用いて、pxbabel で生成される言語オプションを基底言語に 設定することが可能になる。

  %「フォントの切替」だけを使いたい場合の設定
\usepackage[english]{babel}  % english はダミー
\usepackage[main=japanese]{pxbabel}
  % 4 つの言語オプションが生成され、japanese が基底になる
注意: 上の例で Babel の本来の機能は使わないので、babel のオプションには本来何も要らないはずである。 しかし、オプションを指定せずに babel を読み込もうと するとエラーになるので、ダミーとして english を入れている。 (アクティブ文字を一切定義しない english が安全である。)
注意: 上の例で 通常 Babel ではキャプションや日付の文字列を言語によって 切り替わるようになっている。 日本語を含む使用の場合、この機能は不便をもたらすことが多いので、 pxbabel の既定設定ではこの機能を無効化している。 (特に、自動生成された言語オプションはキャプション設定を 何も含まないことに注意。) すなわち、キャプションは文書クラスが設定したものが そのまま使われる。 オプションに switchcaption を指定すると本来の Babel の動作に戻る。 (他の設定も可能である。詳しくは pxbabel の説明書を参照。)

pLaTeX の場合

pLaTeX + OTF パッケージ(multi 付)の場合、 \UTF 命令を現在有効な言語によって \UTFK 等に渡すようにする。 bxutf8 入力エンコーディングと併用した場合、 JIS X 0208 外かつ Unicode BMP 内にある CJK 文字は \UTF に変換されるので、 ハングル等を直接入力できるようになる (この機構の詳細については 「Unicode による文字入力」を参照)。 JIS X 0208 内の文字は \UTF に処理が回らずに pTeX が直接出力してしまうので、これらに対してはフォント切り替えが効かない。

% このファイルの文字コードは UTF-8
% platex に -kanji=utf8 が必要
\documentclass[a4paper]{jsarticle}
\usepackage[bxutf8]{inputenc}  %+ UTF-8 直接入力
\usepackage{pxbase}            %+ を扱うための設定
\usepackage[multi]{otf}
\usepackage[english]{babel}
\usepackage[main=japanese]{pxbabel}
\begin{document}
% U+9AA8 = 骨
「\UTF{9AA8}」の簡体字は「\foreignlanguage{schinese}{\UTF{9AA8}}」。

% 「体中文」はフォントが切り替わらない
日本語、\foreignlanguage{korean}{한국어}、
\foreignlanguage{schinese}{简体中文}を含む文書。
\end{document}

JIS X 0208 の漢字にもフォント切替を有効にする方法として、 pxfltsrc パッケージの ukanji オプションを使うものがある。

% このファイルの文字コードは UTF-8
% platex に -kanji=utf8 が必要
\documentclass[a4paper]{jsarticle}
\usepackage[ukanji,useux,utf8]{pxfltsrc}
\usepackage[multi]{otf}
\usepackage[english]{babel}
\usepackage[main=japanese]{pxbabel}
\begin{document}
\filterstart
「骨」の簡体字は「\foreignlanguage{schinese}{骨}」。

% 「文」の初画に注目
日本語、\foreignlanguage{korean}{한국어}、
\foreignlanguage{schinese}{简体中文}を含む文書。
\end{document}

upLaTeX の場合

upLaTeX の場合は和文エンコーディングを変更することでフォントを切り替えている。 機構が単純なので JIS X 0208 の漢字で問題が起こることもない。

\documentclass[a4paper,uplatex]{jsarticle}
\usepackage[english]{babel}
\usepackage[main=japanese]{pxbabel}
  % 下のマクロは「\verb|\expandafter|」の代用 ;-)
\newcommand*{\csExpandafter}{\texttt{\symbol{`\\}expandafter}}
\begin{document}
\begin{itemize}
\item My package is full of {\csExpandafter}'s.
\item 私のパッケージは {\csExpandafter} でいっぱいです。
\item \foreignlanguage{korean}{내 패키지는 {\csExpandafter}\,로 가득합니다.}
\item \foreignlanguage{schinese}{我的宏包充满了 {\csExpandafter}。}
\end{itemize}
\end{document}