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

村上真雄さんから誘われて、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 ソースを構造化されたドキュメントのように記述することもできる。