マクロツイーター

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

bxcjkjatype も新しくなった(v0.3)

…ようである。

以下で変更点について解説する。

PDF 文字列中の四分空き(~)は無視する

周知の通り、CJK パッケージで欧文混じりの日本語の文章を書く場合、\CJKtilde という命令を実行した上で、〈~〉(チルダ)で和欧文間空白(四分空き)を入れる。bxcjkjatype パッケージの autotilde オプションはこの \CJKtilde を自動的に有効にするものである。

% pdfLaTeX 文書, UTF-8
\documentclass[a4paper]{article}% 都合により欧文クラス使用
\usepackage[whole,autotilde]{bxcjkjatype}
\usepackage[unicode,bookmarks]{hyperref}% しおりを生成
\begin{document}% 'whole' なので本体全体が CJK* 扱い
% 'autotilde' なので \CJKtilde が実行される
\section{{\TeX}~はアレ}% '~' は四分空き
アレ。
\section{☃はいいぞ}
いいぞ。
\end{document}

ところで、上掲の例のように、「四分空きの〈~〉」を含むテキストについて、hyperref パッケージを用いて PDF 情報の文字列として使用すると、四分空きは空白文字に変換される。((これは bxcjkjatype に限らない CJK パッケージの一般的な挙動である。実際には \standardtilde の場合(つまり〈^〉は非分割欧文空白を表す)がそのまま適用されているのである。))

しかし、四分空きは組版上の現象であり文字情報としての空白ではないので、本来なら文字列化した場合には削除されるべきである。((仮に先例と同等の文書を pLaTeX で書いたとすると、見出しは(〈~〉も空白も入れずに)「{\TeX}はアレ」であるはずだから、PDF 文字列への変換結果は「TeXはアレ」とならないといけない。))従って、新しい bxcjkjatype では、「四分空きの〈~〉」は PDF 文字列に変換した場合には削除される。

substmingoth オプションで min/goth できる

bxcjkjatype では「標準の和文(CJK)ファミリ」の名前を mc(明朝)/gt(ゴシック)と定めている。そして、\mcfamily\gtfamily といった“高レベル”の和文ファミリ選択命令は実際にはこれら(mc/gt)のファミリへの切替を行っている。bxcjkjatype では「標準の和文フォント」をプリセット指定や \setminchofont 命令などの方法で変更することができるが、その場合でも、「標準の和文ファミリは mc/gt」という設定は変わらない。((\setminchofont 等の命令は“mc/gt の設定の中身”を変更している。))

一方で、CJK パッケージ自体は“標準の日本語用フォントファミリ”として提供しているのは min/goth というファミリである。ところが、これらのファミリは「ユーザが各自でフォントマップの設定を行って“使える”日本語フォントを割り当てる」ことが前提となっているため、CJK パッケージをインストールしただけでは“使えない”のである。例えば、TeX Live の場合だと、一応文字は出力されるもののフォントが“例のアレ”(和田研フォント)になってしまう。それゆえ、私自身は min/goth ファミリは普通のユーザにとっては“使えない”ものと見なしている。*1

とはいっても、min/goth が“標準の”ファミリであることは事実であるため、例えば、CJK パッケージでの日本語出力を前提としたテンプレートなどにおいて「日本語用のファミリとして min/goth が予め指定されている」という事態は十分に考えられる。そのような場合、bxcjkjatype は min/goth を触らないため、これを読みこんだとしてもそれらのファミリが“使える”状態にはならない。

% pdfLaTeX 文書, UTF-8
\documentclass[a4paper]{article}
% bxcjkjatype を導入しても...
\usepackage[autotilde]{bxcjkjatype}
\begin{document}
\begin{itemize}
% 'min'/'goth' が“使える”状態にはならない
\item min:
  \begin{CJK*}{UTF8}{min}
  疎ましい朝が来た、絶望の朝だ。
  \end{CJK*}
\item goth:
  \begin{CJK*}{UTF8}{goth}
  疎ましい朝が来た、絶望の朝だ。
  \end{CJK*}
\end{itemize}
\end{document}

TeX Live の場合、フォントが“例のアレ”になってしまう(うわぁ)。

この問題の解決策として、“substmingoth”というオプションを新設した。このオプションを指定すると、min/goth ファミリが自動的に mc/gt ファミリで代替されるようになる。つまり“bxcjkjatype の標準”(\mcfamily\gtfamily)と同じフォントが割り当てられるわけである。先の例で bxcjkjatype の読込(4 行目)を

\usepackage[autotilde,substmingoth]{bxcjkjatype}% 'substmingoth'を指定

に変更すると、min/goth に対しても ipaex-type1 のフォントが用いられるようになる。

ttfname オプションで TTC 代替指定できる

bxcjkjatype では pxchfon パッケージと同等のフォントプリセット指定をサポートしている。例えば、パッケージオプションに moga-mobo を指定すると、標準フォントが Moga/Mobo フォントにマップされる。

% LaTeX 文書, UTF-8; latex + dvipdfmx でコンパイル
\documentclass[dvipdfmx,a4paper]{article}
% Moga/Mobo フォントをプリセット指定
\usepackage[whole,autotilde,moga-mobo]{bxcjkjatype}
\begin{document}
\begin{itemize}
\item {\LaTeX} is great!
\item {\TeX} is アレ!
\item \textbf{{\TeX} Language is 超絶アレ!!}
\end{itemize}
\end{document}

……のであるが、実は上掲のソースは latex + dvipdfmx 専用である。このソース(からドライバオプション dvipdfmx を除いたもの)を pdflatex でコンパイルすると、以下のエラーが出る。

! Package bxcjkjatype Error: pdfTeX does not support TTC.

(プリセットが想定している)Moga/Mobo フォントは TrueType Colelction(TTC)形式のファイルであるが、見ての通りで pdfTeX エンジン(の PDF モード)は TTC 形式をサポートしていないのである。*2

TTC 形式が使えないのはエンジンの制約であるため、パッケージの側では対処のしようがない。従って、そういうフォントを使いたいのであれば、zrdecompttc などのツールを用いて「TTC を TTF に分解する」ことが必要になる。

zrdecompttc mogam.ttc

これで、mogam.ttc の 0〜5 番のフォントが mogam_1,ttf〜mogam_6.ttf として出力される。*3この作業により、\setminchofont 等で直接フォントを指定する場合には対応できるようになる。

%\setminchofont[3]{mogam.ttc}
%↑の代わりに↓を書く
\setminchofont{mogam_4.ttf}
ttfname オプション

ところが、プリセット(moga-mobo)で指定されるフォントファイル名は内部で決められているため、この方法では対応できない。これに対応するため ttfname というオプションを新設した。これを利用すると、TTC ファイルでの指定((プリセットの内部の指定に限らず、\setminchofont 等の指定にも適用される。))が一定の規則で TTF ファイルでの指定に自動変換されるようになる。先に挙げた例の場合、冒頭部を次のように書きかえれば pdfLaTeX で同じ結果が得られる。

% pdfLaTeX 文書, UTF-8
\documentclass[a4paper]{article}
% Moga/Mobo フォントをプリセット指定
\usepackage[whole,autotilde,moga-mobo,ttfname=*_1.ttf]{bxcjkjatype}
% あとは同じ
(出力結果は先のものと同じ)

ttfname= の後には、変換先のファイル名のパターン(例えば「*_1.ttf」)を書く。このパターンの文字列の‘*’を TTC ファイルのベース名に変えた文字列が“0 番のフォントの変換先のファイル名”(例えば、元が mogam.ttc だとすると mogam_1.ttf)となる。「1 番目」以降の変換先はこの名前の数字の部分をインクリメントしたもの(1 番目が mogam_2.ttf、2 番目が mogam_3.ttf、…)になる。((従って、パターンの文字列は‘*’と数字列を 1 ヶ所ずつ含むものでなければならない。もう一つ例を挙げておくと、例えば ttfname=*-sub000.ttf とした場合は、0 番目が mogam-sub000.ttf、1 番目が mogam-sub001.ttf、……となる。))

擬似太字がチョットマシになる

CJK パッケージには、「太字が用意されていないフォントについて重ね打ちにより擬似的に太字を実現する」機能(擬似太字)がある。新しい bxcjkjatype を読みこんだ場合、擬似太字の実現方法が“重ね打ち”から“合成太字(輪郭を太くする)”に切り替わって品質的にチョットマシになる。*4

実際に擬似太字してみよう

とは言っても、擬似太字は結局アレなので、bxcjkjatype の標準のファミリである mc/gt でも、また ipaex-type1 のファミリである ipxm/ipxg でも擬似太字は無効化している*5ので、普段は擬似太字を見ること自体がないであろう。ところが実は ipaex-type1 には“標準”の ipxm/ipxg ファミリとは別に、「擬似太字や斜体が効く」*6ようにした ipxma/ipxga ファミリが存在する。これを利用して効果をみてみよう。

% pdfLaTeX 文書, UTF=8
\documentclass[a4paper]{article}
\usepackage[whole,autotilde]{bxcjkjatype}
\begin{document}
% 擬似太字が有効な ipxma ファミリに切り替える
\centering\CJKfamily{ipxma}\LARGE
世界平和☃\\\textbf{世界平和☃}
\end{document}

旧来の版の bxcjkjatype では次のような出力になる。〈☃〉を見ると重ね打ちであることが一目でバレてしまう。

新しい版の bxcjkjatype では次のような出力になる。先のものよりかは随分マシであろう。

(no)boldbyempolden オプション

擬似太字の実現方法を変えたわけであるが、noboldembolden オプションで元の実装に戻すことができる。

  • boldbyembolden (既定): 擬似太字を合成太字で実現する。
  • noboldbyembolden: 擬似太字を重ね打ちで実現する。(CJK パッケージの既定動作。)

*1:bxcjkjatype で min/goth を“敢えて触らない”ことにして新たに mc/gt というファミリを用意しているのも、同じ理由による。

*2:\pdfTeX において CJK パッケージのフォントとして使えるのは TTC 形式でない単体の TrueType フォントファイル(拡張子 .ttf のもの)だけである。

*3:TTC 中のフォントの番号は 0 起点で数えるのが普通だが、zrdecompttc の出力ファイル名の番号は 1 起点になる。

*4:中国語の ctex のクラスにおいて同様の処理が取り入れられている。

*5:pTeX 系の標準の和文ファミリと同様に、「明朝を太字にするとゴシック体になり、また斜体は適用されない」ようになっている。

*6:CJK パッケージのフォントファミリの多くはこの設定が適用されている。