Cygwin で 日本語 TeX (ptetexwin) に戻る

日韓混在文書の組版 --- ptexenc と otf パッケージを用いた方法

ptexenc + otf による日韓混在文書の組版

本節では,日韓混在文書の組版として,ptexenc と otf パッケージを用いた方法を提案します.内容は Tsuchimura–Kuroki (2008) を基にしています. otf パッケージの出現によって,ハングル文字やいわゆる異体字であっても,Unicode ポイントや CID コードさえ分かれば,pTeX を用いて,日本語と韓国語の混在というのは可能であることは知られていました.ただ,ある程度の量のハングルをすべて CID コードで開くことは現実的ではありません. 最近になって pTeX の文字コード処理を整理する仮定で ptexenc という,pTeX の UTF-8 対応ライブラリが土村氏によってまとめられました.ptexenc ライブラリと otf パッケージを併せることによって,UTF-8 文字コードで書いた TeX ソースファイルから手間をかけずに日韓混在文書がタイプセットできるようになりました. Cho–Okumura (2004) による文例に対して,以下のような仕上がりを得られます.

 横書き縦書き
出力見本
(キャプチャ画像)
Catured image of horizontal writing Catured image of vertical writing
入力, ソース example.tex
出力見本 (PDF) example.pdf

ここから先では,必要なファイルやタイプセットのためのコマンドについて解説します.

必要なファイル (otf-hangul.dfu)

ptexenc + otf パッケージの方法で日韓混在文書をタイプセットするには,まず以下の Unicode 定義ファイル (dfu ファイル) を用意します.

otf-hangul.dfu は機械的にどなたでも簡単に作れるものです.黒木の著作権は主張しません.ライセンスが明確なほうがいいと思いますので,LPPL v1.3 以降で配布します.

TeX ソースファイルの骨格

次に,以下のような骨格を持つソースファイル (ここでは example.tex とする) を書きます.

% -*- filename: example.tex; coding: utf-8 -*-
\documentclass{jsarticle}
\usepackage[utf8]{inputenc}
\usepackage[multi]{otf}
\input{otf-hangul.dfu}% Unicode 定義ファイル
\DeclareUnicodeCharacter{<Unicode スカラ値>}{\UTF{<Unicode スカラ値>}}
  % 最近の日本では使わない漢字の異体字 (いわゆる旧字) など

\begin{document}
% <ここに中身を書く>
\end{document}

中身についてですが,韓国語の組版においては,ハングル–ASCII文字間に,pTeX における漢字仮名–ASCII文字間の \xkanjiskip ほどの大きなスペースは入れないようです (ko.TeX においては少しアキを入れるようです).よって,韓国語の範囲はグルーピングして,グループの開始箇所に \noautoxspacing もしくは \setlength{\xkanjiskip}{0.11435em} を記すとよいでしょう (入力例参照).

タイプセットのコマンド

platex コマンドは -kanji=utf8 オプションつきで実行すれば,無事タイプセットできるはずです.
$ platex -kanji=utf8 example.tex
$ dvipdfmx example.dvi

統合環境でソースファイルを編集・タイプセットしている方もあるかもしれませんが,TeX Shop のように JIS X 0208 外の文字を \UTF{} に展開する機能もあるかもしれないので,統合環境のオプションには気をつけましょう (cf. TeX フォーラムでの議論).

(参考) otf-hangul.dfu (ハングル用 Unicode 定義ファイル) の作り方

上の otf-hangul.dfu は,Unicode Character Code Charts などを参考に,Ruby スクリプトにより自動生成したものです.以下は,ライセンス表示を除き,本質的なところだけ取り出したものです:

#!/bin/ruby -w

def printline(i)
  ihex = sprintf("%#0X", i).sub("0X", "")
  print "\\DeclareUnicodeCharacter{", ihex, \
  "}{\\UTFK{", ihex, "}}%\n"
end

print "  \\ProvidesFile{otf-hangul.dfu}
   [2010/06/20 v0.02 Hangul symbol, UTF-8 support for inputenc \& UTF/OTF packages]\n"

for i in 0x1100 .. 0x11FF; printline(i); end
for i in 0x3130 .. 0x318F; printline(i); end
for i in 0xAC00 .. 0xD7AF; printline(i); end

実績

以下の書籍の組版に,このページの技法が使われました.

ソースをそのまま表示させるには

verb(atim) 中での問題点

ptexenc では,JIS X 0208 文字集合に含まれない文字は内部で ASCII 転写 (UTF-8のビットパターンをバイトごと 2 桁ずつ区切って ^^ab 形式に変換) します.このため,verbatim 環境や verb コマンド中で,JIS X 0208 外の文字を書くと,予想外に ^^ab といった文字列が現れて戸惑うことになります (右図).

verb コマンドを用いるくらい短い文字列のときや,短いソースコードなどを verbatim 環境にいれようとしているときは,typewriter フォントを指定して記述するなどして,ad hoc に回避することが可能です (以下の解決方法 1).しかし,verbatim 環境を多用するような原稿では,不便です.仮定はあるものの,そのまま記述できる方法もあります (以下の解決方法 2).以下で 2 通りの方法を提示します.

解決方法 1 (手作業で回避)

一つ目の方法は,表示したいソースのすべてを verbatim 環境でくくるのではなく,各行ごとに ASCII および JIS X 0208 内の文字は verb で囲み,それ以外の文字は \normalfont\ttfamily を指定してフォントを verb に合わせる (正確には \verbatim@font と同等にする) という方法です.全体を verbatim 環境でくくるわけではないので手間はかかるものの,コメントをローマンの斜体にするなど,他の効果を盛り込む元気があれば,ソースをより見やすく提示することができます.

以下にソースと出来上がり見本を,右に出来上がり見本のキャプチャ画像を載せます.

Captured image of example-src1.pdf

解決方法 2 (仮定は置くけれどほとんどの場合うまくゆく自動化)

二つ目の方法は,verbatim 中にそのまま表示させたい ^ がないという仮定の下で,プリアンブルに
\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&\do\#\do\_\do\%\do\~}
を書くという方法です (1 行に改行無しで書いてください) .仮定を満たす限り簡単に ASCII・JIS X 0208 外の文字を含むソースファイルを表示できます.

以下にソースと出来上がり見本を,右に出来上がり見本のキャプチャ画像を載せます.

[付記] LaTeX の仕組みをもう少し分かれば,verbatim 中にそのまま表示させたい ^^ がないという仮定までは緩和できると思いますが,まだ実力が足りず残念ながら提案できません.

Captured image of example-src2.pdf

(参考) pdfLaTeX ではできること

Unicode 文字を UTF-8 コードで書いても,ASCII 転写して書いても,本文中ではそれらのコードが指す Unicode 文字集合の文字が出力され,verbatim 中では区別されて表示されるというのが理想です.pdfLaTeX ではすでに実現できているようです.日本語はうまく処理できませんが.

以下にソースと出来上がり見本を,右に出来上がり見本のキャプチャ画像を載せます.

Captured image of en-ideal.pdf

応用としての Unicode 文字を多用する言語の組版

最近の言語の中には,言語表現として Unicode 文字を直接利用するものが増えています.たとえば,AgdaFortress といったものがあります.

解説記事などが TeX で組版できるかが気になりますが,Ulf Norell による Agda の Lecture Notes は pdfLaTeX では問題なくタイプセットできます.pLaTeX では,上記の解決方法 2 によって,Adga 言語のサンプルは問題なく表示できるようになることは確認できました*1).

Adga の日本語解説をサンプルとともに TeX によって執筆することは容易になったと言えます.Norell の解説には Agda コード中に ^ がなかったことが幸いしましたが,たとえば木下 (2008) などを参照すると,^ を Agda 言語中で用いることは制限されていないので,上記の解決方法 2 よりも賢い方法が望まれます.


*1) ただし,Norell の原稿中では,数式環境 ($$ など) 中のギリシャ文字が不正だとして,オリジナルのソースコードのままでは pLaTeX で正常に処理できません.

日本語の組版と韓国語の組版

日本語と韓国語は漢字圏 CJKV の文字文化としてひとくくりにされています.ただしそれぞれに音を表す独自の“仮名”があります.日本語には,漢字を崩したり漢字の一部を抜き出したりして作られたひらがな・カタカナがあり,韓国語には15世紀に人工的に作られたハングルがあります.日本語では漢字と仮名を混ぜ書きにすることがほとんどですが,韓国語ではほとんどハングル文字だけで構成し,漢字は同音異義語を区別するときだけに用いるということが多いようです.

組版ルールもそれに伴ってか多少異なり,日本語では漢字や仮名は詰めて組み,漢字や仮名と ASCII 単語との間には小さな空白を入れて組みます; 韓国語では文節ごとに空白を入れて (「分かち書き」という) 組みます*1) *2).どちらの言語も,(英単語や句読点記号など一部の例外を除いて) どの字の間でもハイフネーション無しで改行してよいというのは共通です.横組みの組版における句読点は,日本語では人や組織によって,多バイトの (いわゆる全角の) 句読点をつかったり ASCII の句読点を使ったりしますが,韓国語では ASCII の句読点を標準的に用います.ASCII の句読点は通常の英語の組版と同様に組めばよいですが,日本語の句読点は二つ以上の句読点が連続したときのルールはとくによく理解して組む必要があります.韓国語では最近はほとんど縦書きしないようですが,縦書きをするときには日本語も韓国語も `、' と `。' といった記号を用います.(韓国語については字形が少々異なるかもしれません.)

日本語の組版ルールに関しては, JIS X 4051「日本語文書の組版方法」, W3C Working Group による Requirements for Japanese Text Layout や日本エディタスクール他編の“教科書”類 *3) *4) *5) *6) など日本語が読めるからという理由が大きいですが,何とか手に入ります.一方で,韓国語の組版に関してはなかなかルールが書かれた,筆者に読めるものがなく,さらにどんな組版が良いかという見本も特定できていません.ただ,手元にはAsiaTeX08 の excursion で訪れた清州古印刷博物館において手に入れた書籍 *7) *8) があり,それなりの品質を持っているのではないかと期待しています.ほかに参考になるものと言えば,韓国の初等教育における国語教科書くらいでしょうか (こちらは持っていません).


*1) 日本でも,日本語 (国語) を教える際に,小学生低学年のうちはひらがなを分かち書きにする教科書を用いるといった例外はあります.

*2) 原稿用紙を用いる文化があるかどうかが影響しているのかと思っていましたが,韓国でも初等教育では原稿用紙のようなマスの切られた用紙で学習し,分かち書きを身に着けるそうです.

*3) 日本エディタスクール (編): 文字の組み方ルールブック――ヨコ組編, 2001, 日本エディタスクール.

*4) 日本エディタスクール (編): 文字の組み方ルールブック――タテ組編, 2001, 日本エディタスクール.

*5) モリサワ・日本エディタスクール (編): 文字組版入門, 2005, 日本エディタスクール.

*6) 日本エディタスクール (編): 日本語表記ルールブック, 2005, 日本エディタスクール.

*7) 천혜봉: 한국 목활자본, 범우 문화문고 7, 범우사, 2001, isbn: 89-08-08107-0.

*8) 윤형두: 옛책의 한글판본, 범우 문화문고 10, 범우사, 2003, isbn: 89-08-08110-0.

(他例紹介) Utf82TeX プリプロセッサを用いる方法

pTeX 処理の直前にプリプロセッサを通すことで,pTeX では扱えなかった文字集合を OTF パッケージのコマンドや ASCII 転写で変換してから pTeX にかけるということもできます.細かな条件分岐などが必要となる処理を,(使い慣れた) スクリプト言語に任せるというのは現実的な方法で,LuaTeX などでも取り入れられている (らしい) 手法です.verbatim のような環境の中で「入力したままの」文字列を表示できるかというところに難点が残るものと予想されます. 以下,サンプルを作って掲載することを計画中です.(工事中)

参考文献

Cygwin で 日本語 TeX (ptetexwin) に戻る