読者です 読者をやめる 読者になる 読者になる

Formatter Club 発足会に参加してきました

XML TeX Vine Linux

村上真雄さんから誘われて、Formatter Club 発足会のご案内 (CSS組版ブログ) に参加してきました。すでに、AH Formatter V6 の紹介 (CSS組版ブログ) から、Formatter Club 発足会のプレゼン資料などがリンクされています。個人的には、前田年昭さん(Line Lab.'s Web Page, East Asian Text Processing)、藤島雅宏さん(元電算写植機開発者)にお会いすることができたのも楽しかった。

奥村さん(奥村 晴彦 | Haruhiko Okumura)もいらっしゃったので、ついでに、実行委員としてしっかりと TeXユーザの集い 2011 も宣伝してきました(笑

簡単な XML 文書を TeX 形式へ変換してみる

Formatter Club 発足会のプレゼン中にでてきた簡単な XML 文書例を XSL-FO へ変換していたので、負けじと TeX 形式へ変換してみます。わざわざ TeX 形式へ変換する理由はとくにありません、ハイ。ここでは、xsltproc(XSLT プロセッサのひとつ)を使って、XML 文書を TeX 形式へ変換します。なお、ここでの XML 変換および TeX 組版環境は、Vine Linux 6 RC1(Vine Linux)です。

さっそく、Formatter Club 発足会のプレゼン中にでてきた簡単な XML 文書例を書きます。以下の内容を foclub-example.xml として保存しておきます。実は、村上さんがお出しになった XML 文書例と若干違います(笑 <タイトル> タグと <本文> タグを入れました。

<?xml version="1.0" encoding="UTF-8"?>
<!-- FormatterClub 発足会 2011-07-27 に出てきた XML 文書例 -->
<文書>
  <タイトル>
    <表題>簡単XML入門</表題>
    <著者>てふラボ</著者>
  </タイトル>
  <本文>
    <見出し>XMLを書いてみる</見出し>
    <段落>XMLはこんなふうに書きます。</段落>
    <段落>XMLはこんなふうにも書けます。</段落>
  </本文>
</文書>

foclub-example.xmlTeX 形式へ変換するために、XSL をゴリゴリと書きます。以下の内容を foclub2tex.xsl として保存します。極々簡単な XSL です。

<?xml version="1.0" encoding="UTF-8" ?>
<!--  FormatterClub 発足会 2011-07-27 に出てきた XML 文書例 -->
<!--  foclub-example.xml を TeX 形式に変換 -->

<xsl:stylesheet 
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
   version="1.0">

  <xsl:output method="text" indent="no" encoding="UTF-8" />
  <xsl:strip-space elements='*'/>

  <xsl:template match="文書">
\documentclass{jsarticle}
<xsl:apply-templates />
  </xsl:template>

  <xsl:template match="タイトル">
\title{<xsl:value-of select="表題" />}
\author{<xsl:value-of select="著者" />}
\date{<xsl:value-of select="日付" />}
  </xsl:template>

  <xsl:template match="本文">
\begin{document}
\maketitle
<xsl:apply-templates />
\end{document}
  </xsl:template>

  <xsl:template match="見出し">
\section{<xsl:apply-templates />}
  </xsl:template>

  <xsl:template match="段落">
    <xsl:text disable-output-escaping = "yes">&#10;</xsl:text>
    <xsl:apply-templates />
    <xsl:text disable-output-escaping = "yes">&#10;</xsl:text>
  </xsl:template>

</xsl:stylesheet>

以下のコマンドを実行して、XMLTeX へ変換します。

$ xsltproc -o foclub-example.tex foclub2tex.xsl foclub-example.xml

生成された foclub-example.tex は以下のようになります。

\documentclass{jsarticle}

\title{簡単XML入門}
\author{てふラボ}
\date{}
  
\begin{document}
\maketitle

\section{XMLを書いてみる}
  
XMLはこんなふうに書きます。

XMLはこんなふうにも書けます。

\end{document}
  

TeX → PDF へ変換します。ここでは、日本語組版エンジンとして pTeX を使います。

$ platex foclub-example
$ dvipdfmx -r 1200 foclub-example

Adobe Reader で foclub-example.pdf を閲覧してみます。


XSL-FO と TeX との違いを考察、そして、次世代 TeX 組版への期待

foclub2tex.xsl をみると、XSL-FO 仕様へ変換する XSL とくらべて、ずいぶんとすっきりとしているようにみえます。それもそのはず、XSL-FO のプロパティに対応する TeX のそれが一切記述されていないのです。

日本語 TeX 組版で利用できるおもな汎用スタイルファイルは、ASCII さんの jarticle, jbook と奥村晴彦さんの jsarticle, jsbook です。これらのスタイルファイルは、とりあえず日本語 TeX 組版ができるだけであると割り切るべきでしょう。実際に、デザインの変更や独自拡張など組版結果を変更しようとすると、以下の 3 通りの方法が考えられます。

  • 汎用スタイルを指定した上で、いくつかのマクロを上書きする
  • デザインされた別のスタイルファイルを使う
  • XSL による XML から TeX への変換に特化した、テンプレートとして使えるスタイルファイルを作る

AH Formatter による XSL-FO (+ AH 拡張) 組版 または CSS 組版TeX 組版の共通点は、どちらもスタイルファイルを用意しないといけません。それぞれ XML + XSL、plain TeX に関する知識、プログラミングが必要です。

AH Formatter による組版TeX 組版との大きく異なる点がいくつかあります。

ひとつめは、ユーザによる組版自由度の制限です。現時点で主流である日本語 TeX 組版エンジンである pTeX 自体には、もはや手がはいらない状況であると考えてよいでしょう。その上で、TeX はユーザによる TeX プログラミングにより、自由度が高い組版が可能です。しかしながら、その自由度が高すぎることにより、TeX プログラミングの知識を持っていないユーザにとって、分かりにくさ・とっつきにくさがあり、それゆえの TeX の難しさがあるように思います。同時に、TeX に関する Bad known how が多いのも事実です。

ふたつめは、ドキュメントの論理的な構造です。TeX ドキュメントは、通常、XML ドキュメントのような構造化ドキュメントと言えない*1。もちろん、TeX コーディングに慣れた TeX ユーザであれば、TeX コーディングは自明で、そのドキュメントは、十分に構造化されていると思える。

みっつめは、ドキュメントの構造解析です。「TeX/LaTeX の syntax は何なのか?そして、どのようにそれを構造解析するのか?」に対して、「TeX の文法は TeX しか分からない」という事実があります。とくに、グルーピングは、通常の {hoge} [fuga] だけでなく、 /foo/ |wara| などのグルーピングを設けることができます。ひとつめ、ふたつめにも関わることですが、TeX によるコーディング、プログラミングに然るべき制限を設けなければ、なんでもありです。

以上を踏まえると、XML から TeX 組版をする場合には、

  1. XSL による XML から TeX への変換に特化した、テンプレートとして使えるスタイルファイルの作成
  2. TeX ドキュメントのチェッカーの開発
  3. TeX プログラミングおよびコーディングの制限

が必要だと考えます。

一方、次世代 TeX として、LuaTeX が注目されています。LuaTeX は pdfTeX の後継となる予定で、将来、標準に TeX 組版エンジンになります。ZR さん(id:zrbabbler)の去年に発表されたプレゼン資料 日本人の知らないTeX ~TeXユーザの集い2010・招待講演~ [電脳世界の奥底にて] から表現をおかりしますと、LuaTeX の実装機能は以下のように表現できます。

LuaTeX = pdfTeX + Omega + Lua + MetaPost + OpenType

LuaTeX が様々なレベルで TeX 処理へ割込処理できるようで、「⼊⼒テキストのフィルタ」処理ができる点があります。Omega の思想を持っているので、この入力テキストのフィルタ処理を利用して、プラグインのフィルタから XML パーサや XSLT プロセッサを呼ぶことで、XML ドキュメントの入力へ対応できるでしょう。また、LuaTeX の出力についても、TeX/LaTeX -> dvi/pdf だけでなく、TeX/LaTeX -> XML (XML-FO, XHTML など) や XML -> XML (XML-FO, XHTML など) などの出力も可能になるでしょう。

このような LuaTeX の未来が待っているなか、日本の TeX ユーザに対して 日本語組版処理の要件(日本語版) に準じて、スタイルファイルやツールを整備されることが期待されていると思います。すでに LuaTeX-ja プロジェクト日本語トップページ - OSDN が立ち上がっています。「XML ドキュメントから LuaTeX 組版エンジンを使って、日本語組版をして、XHTML や PDF にできたら…」と妄想するだけでもわくわくしませんか?(笑 したがいまして、TeX に対して、まだまだやることがたくさんあるように思います。

*1:もちろん、TeX ソースを構造化されたドキュメントのように記述することもできる。