タイ語をどうにかする実験

LaTeX において thailatex パッケージの機能を流用(改造) することで、UTF-8 でのタイ文字の入力および他言語と混在した文書の 組版を試みたもの。
重要: このページで配布している一部の zip ファイルについて、 サブディレクトリにあるべきファイルが欠落しているという 誤りがあったので、正しいものに置き換えました。 [2008/06/25]

準備

用意するもの

  • thailatex パッケージ (Surapant Meknavin 氏作) (CTAN からダウンロード)
    ただし、インストールには Unix 系のコマンドが必要で、 W32TeX の環境で行うのは非常に困難である。 そこで、W32TeX にインストールされた状態を再現したパッケージ (ただし容量の都合でフォント本体だけ除いた) を置いておく。
  • SWATH (Paisarn Charoenpornsawat 氏作) タイ語 LaTeX 文書の前処理に必要なフィルタ。
    リンク先にある Windows 用バイナリは不具合がある古い版で満足に使えない。 ソースからのビルドにはやはり Unix 系のコマンドが必要になる。 従って、MinGW でコンパイルしたものを置いておく。
    • swath_0.3.3-win.zip [2008/06/25]
    • swath_0.3.3.tar.gz ソースファイル。thailinux のオリジナルのアーカイブ。
      このパッケージのライセンスは GPL v2 である。
  • unicode パッケージ (CTAN からダウンロード)
  • Perl(5.8.0 版以降)
  • 最後に拙作の BXthai パッケージ

インストール

W32TeX でのインストールでの注意点を挙げておく。

  • thailatex-w32tex.zip は展開後の thailatex-w32tex/texmf の中身を TEXMF ツリーのいずれかにコピーする。 (残りのファイルは不要。) このパッケージには Type1 フォントファイルが含まれていないので、 本家の thailatex.zip アーカイブの中の thailatex/fonts にある *.pfb ファイルを先の TEXMF 以下の fonts/type1/public/thai にコピーする。 その後、updmap の項目に thai.map を追加する。
    mktexlsr
    updmap --add thai.map
    
  • swath_0.3.3-win.zip は展開後の swath_0.3.3-win の中の swath.exe と swathdata を実行パスの通ったフォルダにコピーする。 (残りのファイル、および swath_0.3.3.tar.gz は不要。)
  • BXthai パッケージに関しては、bxswath.pl を実行パスの通ったフォルダに、 残りは $TEXMF/tex/latex/BXthai に入れておく。

なお、以下の説明では Perl スクリプト bxswath.pl をコマンド bxswath として扱う。 W32TeX でこれを実現するには、 W32TeX の実行ファイルを収めたフォルダの中にある runscr.exe を bxswath.pl のあるフォルダに bxswath.exe という名でコピーすればよい。

使用法

UTF-8 で入力する場合

タイ語を含む LaTeX 文書を UTF-8 で記述した場合、 プレアンブルで inputenc にオプション utf8x を指定する。 そして babel を読み込んだ後に bxthai パッケージを読み込む。 (他の言語がないとエラーになるので、その場合は english 等を取り敢えず入れておく。)

\usepackage[utf8x]{inputenc}
\usepackage[〈他の言語〉,...]{babel}
\usepackage{bxthai}

これで、タイ語の言語オプション thaibxthai ではない)が用意され、 Babel のコマンドを適切に用いてタイ語 (を含む多言語)の文書が作成できる。 一応、thailatex にある次の命令も用意してあるが、 これは単に Babel の類似の働きの命令に展開されるだけなので thailatex と同じ動作にはならない。

  • \textthai\foreignlanguage{thai} に展開される。
  • \thaitext, \thai\selectlanguage{thai} に展開される。 thailatex の元の命令と異なり、これはキャプション文字列を タイ語に切り替える。

また、bxthai を babel の後に読む関係で、 このままだとメインの言語 (文書の先頭で有効になる言語)が必然的にタイ語になる。 この辺りの挙動、またキャプション文字列の処理を調整する為に bxbase パッケージ\bxcaptionlanguage\bxmainlanguage が有用かもしれない。

thailatex では、タイ語文書での行分割点の判定を 外部プログラム(SWATH 等)の前処理に頼っている。 bxthai もその仕様を引き継ぐが、 タイ語の文字コード TIS-620 を使う thailatex と異なり bxthai は UTF-8 を使うので、専用のフィルタ (といっても中で SWATH を呼んでいるのだが)である bxswath を用いる。 すなわち、元の LaTeX 文書を foo.org.tex とすると、 組版のコマンドは次のようになる。

bxswath < foo.org.tex > foo.tex
latex foo      # あとは通常の LaTeX 文書と同じように

TIS-620 で入力する場合

bxthai では UTF-8 の使用を推奨するが、TIS-620 での入力も可能である。 プレアンブルの設定を次のようにする。

\usepackage[bx-tis620]{inputenc}
\usepackage[〈他の言語〉,...]{babel}
\usepackage{bxthai}

組版処理の際、bxswath に -t オプションをつける。 (この場合は SWATH を直接用いてもいいのだが…。)

bxswath -t < foo.org.tex > foo.tex
latex foo

サンプル

最初はタイ語のみからなる文書である。 ここにラテン文字の他言語を混ぜることもできるが、その場合は、 タイ語のフォントの英字部分で印刷される。 またこの例ではわからないが、 キャプション文字列はタイ語のものに切り替わっている。

% This file is encoded in UTF-8.
% It needs to be preprocessed with 'bxswath'.
\documentclass[a4paper]{article}
\usepackage[utf8x]{inputenc}
\usepackage[english]{babel}   % 'english' is dummy
\usepackage{bxthai}
\begin{document}
\section*{ปฏิญญาสากลว่าด้วยสิทธิมนุษยชน}
\subsection*{คำปรารภ}

โดยที่การยอมรับนับถือเกียรติศักดิ์ประจำตัว และสิทธิเท่าเทียมกันและโอนมิได้ของบรรดา
สมาชิก ทั้ง หลายแห่งครอบครัว มนุษย์เป็นหลักมูลเหตุแห่งอิสรภาพ ความยุติธรรม
และสันติภาพในโลก

โดยที่การไม่นำพาและการเหยียดหยามต่อสิทธิมนุษยชน ยังผลให้มีการหระทำอันป่าเถื่อน
ซี่งเป็นการละเมิดมโนธรรมของมนุษยชาติอย่างร้ายแรง และใต้[ได้]มีการประกาศว่า
ปณิธานสูงสุดของสามัญชนได้แก่ความต้องการให้มนุษย์มีชีวิตอยู่ในโลกด้วยอิสรภาพในการพูด
และความเชื่อถือ และอิสรภาพพ้นจากความหวาดกลัวและความต้องการ

โดยที่เป็นการจำเป็นอย่างยิ่งที่สิทธิมนุษยชนควรได้รับความคุ้มครองโดยหลักบังคับของกฎหมาย
ถ้าไม่ประสงค์จะให้คนตกอยู่ในบังคับให้หันเข้าหาการขบถขัดขืนต่อทรราชและการกดขี่เป็นวิถีทางสุดท้าย

โดยที่ประชากรแห่งสหประชาชาติได้ยืนยันไว้ในกฎบัตรถึงความเชื่อมั่นในสิทธิมนุษยชนอันเป็นหลักมูล
ในเกียรติศักดิ์และคุณค่าของมนุษย์และในสิทธิเท่าเทียมกันของบรรดาชายและหญิง
และได้ตกลงใจที่จะส่งเสริมความก้าวหน้าทางสังคม และมาตรฐานแห่งชีวิตที่ดีขึ้นด้วยในอิสรภาพ
อันกว้างขวางยิ่งขึ้น

โดยที่รัฐสมาชิกต่างปฎิญาณจะให้บรรลุถึงซึ่งการส่งเสริมการเคารพและการปฎิบัติตามทั่วสากลต่อสิทธิมนุษยชนและอิสรภาพหลักมูล
โดยร่วมมือกับสหประชาชาติ

โดยที่ความเข้าใจร่วมกันในสิทธิ และอิสรภาพเหล่านี้เป็นสิ่งสำคัญอย่างยิ่ง
เพื่อให้ปฏิญาณนี้สำเร็จผลเต็มบริบูรณ์.

ฉะนั้น บัดนี้ สมัชชาจึงประกาศว่า

ปฏิญญาสากลว่าด้วยสิทธิมนุษยชนนี้
เป็นมาตรฐานร่วมกันแห่งความสำเร็จสำหรับบรรดาประชากรและประชาชาติทั้งหลาย
เพื่อจุดหมายปลายทางที่ว่า เอกชนทุกคนและองค์การชองสังคมทุกองค์การ
โดยการรำลึกถึงปฏิญญานี้เป็นเนืองนิจ จะบากบั่นพยายามด้วยการสอนและศึกษา
ในอันที่จะส่งเสริมการเคารพสิทธิและอิสรภาพเหล่านี้
และด้วยมาตรการอันก้าวหน้าทั้งในประเทศและระหว่างประเทศ
ในอันที่จะให้มีการยอมรับนับถือ และการปฏิบัติตามโดยสากลและอย่างเป็นผลจริงจัง
ทั้งในบรรดาประชาชนของรัฐสมาชิกด้วยกันเอง
และในบรรดาประชาชนของดินแดนที่อยู่ใตัอำนาจของรัฐนั้น ๆ

\end{document}
参考: この文章は 「世界人権宣言の前文」であるが、少し特異な構成 (文が段落をまたいでいる)になっている。 タイ語の特性とは無関係である。

TIS-620 を使う場合はプレアンブルを次のように変える。 また bxswath に -t をつける。

\documentclass[a4paper]{article}
\usepackage[bx-tis620]{inputenc}
\usepackage[english]{babel}
\usepackage{bxthai}

次は英語が中心でタイ語を少し含む文書の例である。 bxbase パッケージの \bxmainglanguage 命令でメインの言語を設定している。 タイ語は英語よりも行間を広くとる必要があるので、 タイ語の段落の部分を spacing 環境に入れている。 なお、メインがタイ語の場合(上の例)では、 文書クラスの設定する行間が狭すぎる場合は拡げる措置が自動的にとられる。

% This file is encoded in UTF-8.
% It needs to be preprocessed with 'bxswath'.
\documentclass[a4paper]{article}
\usepackage[scale=.72]{geometry}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}        %+ as you like
\usepackage{lmodern}            %+
\usepackage{setspace}           %  for 'spacing' environment
\usepackage[english]{babel}
\usepackage{bxthai}
\usepackage{bxbase}
\bxcaptionlanguage{default}     % leave caption names unchanged
\bxmainlanguage{english}        % main language is english
\begin{document}
\title{Sample Document of bxthai Package}
\author{zrbabbler}
\maketitle

The capital of Thailand (\textthai{ราชอาณาจักรไทย}) is Bangkok.
This city is, however, called Krung Thep Maha Nakhon
(\textthai{กรุงเทพมหานคร}) as official name in Thai,
and in daily life it is shortened to \textit{Krung Thep (\textthai{กรุงเทพฯ})}.
The English name \textit{Bangkok} originates in the name of the region
in this city, and is believed to result from the wide prevalence
of the misuse by Westerners in old days.

When Bangkok was constructed at the current place in 1782,
King Rama I gave to the city the following very long name:
\begin{quote}
  \begin{spacing}{1.2}\thaitext
    กรุงเทพมหานคร อมรรัตนโกสินทร์ มหินทรายุธยามหาดิลก
    ภพนพรัตน์ ราชธานีบุรีรมย์ อุดมราชนิเวศน์ มหาสถาน อมรพิมาน
    อวตารสถิต สักกะทัตติยวิษณุกรรมประสิทธิ์
  \end{spacing}
  Krung Thep Mahanakhon Amon Rattanakosin Mahinthara Yuthaya
  Mahadilok Phop Noppharat Ratchathani Burirom Udomratchaniwet
  Mahasathan Amon Piman Awatan Sathit Sakkathattiya Witsanukam Prasit
\end{quote}
This ceremonial name is taught in school today.

\end{document}

次は pLaTeX を用いて日本語とタイ語を混在させる例である。 当然、入力は UTF-8 になるので、platex に -kanji=utf8 オプションが必要である。

% このファイルの文字コードは UTF-8
% bxswath による前処理が必要
% platex に -kanji=utf8 が必要
\documentclass[a4paper]{jsarticle}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[english]{babel}
\usepackage{bxthai}
\usepackage{bxbase}
\bxcaptionlanguage{default}
\bxmainlanguage{english}
\begin{document}
\title{bxthai サンプル文書}
\author{zrbabbler}
\maketitle

タイ王国(\textthai{ราชอาณาจักรไทย})の首都はバンコクであるが、
この都市の名前はタイ語の正式名称では
「クルンテープマハーナコーン(\textthai{กรุงเทพมหานคร})」であり、
通例これを略して\textsf{「クルンテープ(\textthai{กรุงเทพฯ})」}と呼ばれる。
日本語の「バンコク」はこの都市の一部を指す地名の
「バーンコーク(\textthai{บางกอก})」に由来し、西洋人が誤って
用いたものが広まったと考えられている。

ちなみに、現在のバンコクが建設された時に、国王のラーマ 1 世に
より与えられた名前は次のような非常に長いものである。
\begin{quote}
  \textthai{กรุงเทพมหานคร อมรรัตนโกสินทร์ มหินทรายุธยามหาดิลก
  ภพนพรัตน์ ราชธานีบุรีรมย์ อุดมราชนิเวศน์ มหาสถาน อมรพิมาน
  อวตารสถิต สักกะทัตติยวิษณุกรรมประสิทธิ์}\par
  クルンテープマハーナコーン アモーンラッタナコーシン %
  マヒンタラーユッタヤーマハーディロック ポップノッパラッタ %
  ラーチャターニーブリーロム ウドムラーチャニウェート %
  マハーサターン アモーンピマーン アワターンサティット %
  サッカタッティヤウィサヌカムプラシット
\end{quote}
この名前は現在の学校教育でも教えられている。

\end{document}

なお、upLaTeX を使う場合は、さらにタイ文字を「欧文扱い」 に変える必要がある。 pxcjkcat パッケージ(PXbase バンドル内) を用いるのが簡便で、プレアンブルに次を追加すればよい。 (詳細は 「upLaTeX を使おう」 を参照。) タイ語は「欧文」として扱われるので、upTeX のもつ和文(CJK) Unicode 処理能力はここでは役に立たない。

\usepackage[prefercjk]{pxcjkcat} % 'forcecjk' 以外なら可