TeX 以外の組版・レイアウトシステム

TeX 以外の組版・レイアウトシステムについて紹介します。TeX との比較対象となる条件として、禁則処理は当然ながら、パラグラフ全体を考慮した改行位置の最適化、ハイフネーション、リガチャ・カーニング処理などが挙げられます。



Apache FOP

Apache FOPは、XSL-FOの処理系で、Apache XML Graphics プロジェクトにより開発されています。PDF を含む様々な出力フォーマットに対応しています。Java による実装です。

2015年6月5日の段階では Version 2.0 が最新のリリースとなっています。フロートのサポートや Mac OS X のヒラギノなど PostScript 系 OpenType フォントへの対応といった、重要な更新が含まれます。

活発な開発下にあります。

インストールと実行

まずは Java 実行環境が必要です。Java の準備が整ったら、ダウンロードページから辿れるミラーサイトより、最新のものをダウンロードします。

とりあえず試すには、ダウンロードしたバイナリのアーカイブを展開し、展開したディレクトリに移動します。そして例えば、

   ./fop examples/fo/basic/simple.fo simple.pdf

のようにします。simple.pdf が生成されれば成功です。MinGW で mintty などを使っている場合に、

   エラー: メイン・クラスorg.apache.fop.cli.Mainが見つからなかったかロードできませんでした

のようなエラーが出る場合は、シェルスクリプト fop の 119 行目あたりを

   if [ "$OS" = "Windows_NT" ] ; then
     if [ -z "$MSYSTEM" -o "$MSYSTEM" != "MINGW32" ] ; then
         pathSepChar=";"
     else
         pathSepChar=":"
     fi
   else
       pathSepChar=":"
   fi

のように変えます。

実行時に設定ファイルを -c オプションで読み込ませることができます。設定ファイルのサンプルが conf/fop.xconf にあります。フォントの自動検出などの設定が含まれるので参考にしましょう。

基本的に、インストールは好きなディレクトリに展開した内容を移すだけです。場合によっては FOP_HOME などの環境変数を設定する必要が出てくるかもしれません。

ハイフネーション用のパターンファイルはライセンスの関係上、別途入手する必要があります。FOP XML Hyphenation Patterns のページからコンパイル済みバイナリ入りの配布物を取得し、fop-hyph.jar を lib 以下に投入します。

文書の作成

Apache FOP の入力は XSL-FO と呼ばれる XML 文書の一種です。先ほどの

   examples/fo/basic/simple.fo

の中身が参考になるでしょう。

また、Apache FOP には XSLT プロセッサが同梱されているため、他の XML 文書から XSL-FO へ変換しながら PDF 生成を行うことができます。例えば、DocBook を処理するには、The DocBook Project から XSL スタイルシート群を取得し(最新の docbook-xsl-ns 配布物)、どこか(例えば docbook-xsl-ns)に展開します。そして、

   fop -xml input -xsl docbook-xsl-ns/fo/docbook.xsl -pdf output

のようにして処理します。

利点と欠点

利点は

欠点は

XSLT は TeX のマクロを代用するほどのプログラミング言語としての機能は備えていません。これを利点ととるか欠点ととるかは人によるかと思われます。複雑さと柔軟さのバランス的には微妙なところでしょうか。 実際の運用としては、AsciiDoc などで文書を作成し、バックエンドとして利用することになるでしょう。

TeX との比較

様々なところで TeX への言及があります。

ということのようです。

関連リンク

troff

UNIX で利用される文書の整形、清書を行うコマンド roff の一種です。その歴史はTeX よりも古く、マニュアルページの印刷などに用いられてきました。

GNU troff

Groff(GNU troff)は GNU 版の troff です。プレーンテキストに文書整形用コマンドを埋め込んだ形式の入力から、整形された出力を行う組版システムです。DVI、PostScript や PDF などのページ記述言語、HTML、あるいは端末での表示用に ASCII/UTF8 での出力が可能です。最初は James Clark によって書かれ、現在は Ted Harding と Werner Lemberg によりメンテナンスされています。

行分割処理は1行ごとに逐次行われます。

The Heirloom Documentation Tools

こちらも troff です。OpenSolaris 版の troff をもとにしています。Gunnar Ritter により開発されています。C 言語による実装です。

特徴として、

などがあります。PostScritp 出力が可能です。

Unix 互換な環境でないと動かすのは難しいようです。FreeBSD 11.0 では GNU troff の代わりに Heirloom doctools の troff が同梱されるという話もあります。

活発な開発下にあります。

Patoline

主に OCaml で書かれた組版システムです。LaTeX 風の独自入力フォーマットで PDF など様々なフォーマットで出力します。

SILE

Simon Cozens による、Lua で書かれた組版システム。LaTeX 風の独自の入力フォーマットと XML による入力で、PDF 出力です。HarfBuzz? による OpenType レイアウト機能を備えており、日本語を含む様々な言語・用字系をサポートします。Lua により拡張可能です。

特徴として、

などがあります。作者の Simon Cozens はPerl で TeX の Kunth-Plass アルゴリズムを実装するなど、TeX に強い影響を受けているようです。マニュアルを読む限りでは、TeX のアルゴリズムを Lua へ移植したといった様相で、本格的なものです。また、Fontconfig を介したフォントアクセスで、TeX のようなフォント関連の煩わしさがあまりありません。

現在、かなり活発に開発が行われており、縦組みや JIS X 4051 への対応なども取り組まれるようです。開発者が国際化への取り組みに非常に熱心なようなので、積極的にフィードバックされると良いでしょう。

使い方については docmentation/sile.pdf日本語訳)を参照してください。

インストール(MinGW32)

Linux や Mac へのインストールはパッケージ管理システムを使って依存ライブラリを整えて行けば、それほど苦労はしないでしょう。

ここでは Windows、特に MinGW32 環境へのインストールの概要を解説します。

依存ライブラリ

SILE 自身は OpenType フォントサポートに HarfBuzz に依存しており、これはまた様々なライブラリに依存しています。また、フォント・アクセスに Fontconfig を用います。SILE は XML 形式の入力を処理するために Expat XML Parser を利用します。これらは GTK+の配布サイト からある程度そろえることができます。HarfBuzz や SILE をビルドするには Run-Time に加えて Dev パッケージも必要です。SILE の PDF 出力部は C言語で書かれており、libpng や zlib に依存するのでこれらも必要です。

必要な DLL がなくてプログラムがうまく起動しない場合は、

    objdump -p /usr/local/bin/libharfbuzz-0.dll | grep DLL

などで調べて、必要とされる DLL を探しましょう。

依存ライブラリの整備ができたら Lua の整備です。

Lua と LuaRocks

MinGW32 環境では、Lua を mingw-get で入れるのが簡単です。

   mingw-get install mingw32-lua

Lua のパッケージ・マネージャ LuaRocks を入れるには、まずWindows 向けのファイルをダウンロードし展開ます。その後、コマンド プロンプトを立ち上げ、展開したフォルダに移動し、インストールします。例えば、Lua 5.2 で C:\Lua\5.2\LuaRocks にインストールするには、

   install /P C:\Lua\5.2\LuaRocks /MW /LV 5.2 /TREE C:\Lua\5.2\LuaRocks

とします。インストール後に出る PATH の設定の指示に従って下さい。

Lua と LuaRocks がインストールできたら、いくつかの Lua パッケージを入れます。

   luarocks install lpeg
   luarocks install luaexpat EXPAT_DIR=C:\MinGW\msys\1.0\local
   luarocks install luafilesystem

コマンド プロンプトから(mintty などではなく)実行します。

ここまでできてようやく SILE に移ります。

SILE のインストール

SILE の最新版は 2015年6月3日現在、0.9.2 です。公式ページ から sile-0.9.2.zip を取ってきます。展開したのち、configure スクリプトを実行しましょう。環境変数 CFLAGS や LDFLAGS を設定する必要があるかもしれません。また、注意点として、C:\MinGW\msys\1.0 を /usr にマウントしており、/usr/local 以下にインストールする場合は、

   ./configure --prefix=/MinGW/msys/1.0/local

のようにする必要があります。0.9.2 では、libtexpdf のソースに以下の修正を加える必要があります。

   --- libtexpdf.h.orig    2015-06-05 01:13:10 +0900
   +++ libtexpdf.h 2015-06-05 01:13:23 +0900
   @@ -100,10 +100,5 @@
    #include "type1.h"
    #include "type1c.h"
    #include "unicode.h"
   -#ifdef __MINGW32__
   -#define off_t off64_t
   -#define ftello ftello64
   -#define fseeko fseeko64
   -#endif
    #endif
   --- mfileio.h.orig      2015-06-05 01:15:49 +0900
   +++ mfileio.h   2015-06-05 01:13:38 +0900
   @@ -52,6 +52,11 @@
    extern long file_size (FILE *file);
   +#ifdef __MINGW32__
   +#define off_t off64_t
   +#define ftello ftello64
   +#define fseeko fseeko64
   +#endif
    #define xseek_absolute(file, pos, name) fseeko (file, (off_t)(pos), SEEK_SET)
    #define xseek_relative(file, pos, name) fseeko (file, (off_t)(pos), SEEK_CUR)
    #define xseek_end(file, name) fseeko (file, (off_t)0, SEEK_END)

後は、

   make && make install

です。

SILE の実行

とりあえず、配布物の examples 以下にあるファイルを処理してみましょう。

   sile examples/simple.sil

のようにすると、examples/simple.pdf ができます。

HTML+CSS

ここでは、単に入力形式として HTML+CSS を採用するものから、電子出版技術として Web 関連技術を応用しようという立場のものまで紹介します。

Prince

YesLogic Pty. Ltd. によって開発されている商品です。オープンソースではありません。非商用利用については無償で提供されています。(最初のページにロゴが入るなどの制限がありますが)

Vivliostyle

Vivliostyle プロジェクトは電子出版の時代にマッチする新しい組版システムを、Webブラウザ技術をベースに作ることを目指しています。

現在(2015年11月3日)、入手可能なのはベータ版のみです。

詳細はまだ分かりませんが、品質に関してはブラウザのレンダリング能力に大きく依存するようです。

活発な開発下にあります。

Weasy Print

WeasyPrint は HTML+CSS から PDF や PNG を出力するレンダリング・エンジンです。その目的は出版向けのWeb標準技術をサポートすることにあります。Python を中心とした実装で、BSDライセンスで提供されています。Pango によるレイアウト(とPyphenモジュールによるハイフネーション)と Cairo を用いた出力です。

Pango の高水準 API と Cairo を用いることによる制約はあるかと思われます。Pango のレイアウト機能は GUI におけるテキスト表示などには良いですが、比較的長い文章の組版に適しているわけではありません。また、Cairo の PDF 出力も、ハイパーリンクやしおりなどの機能はなく、WeasyPrint はポストプロセスとしてこれらを生成された PDF に付加しています。

Python 3.x/Windows で WeasyPrint 0.23 を動かすには

   lib/site-packages/weasyprint/urls.py

の 85-86 行目の

   if isinstance(path, unicode):
       path = path.encode(FILESYSTEM_ENCODING)

をコメントアウトする必要があるようです。

日本語の利用に関しては、表示等はできますが、禁則処理がうまくできていなかったり、CSS で和文フォントをきちんと指定しないと中国語フォントが選択されてしまったりと、色々と難しいところがあります。しかしながら、ブラウザからそのまま何も考えずに印刷する場合に比べて質はかなり高いようです。

CSS Paged Media Module Level 3 は比較的よくサポートされていますが、ヘッダなどの自動生成、脚注、相互参照に必要な CSS-GCPM のサポートはほぼありません。

使い方は簡単で、

   weasyprint input output

のようにするだけです。

   weasyprint -s stylesheet input output

のようにして、スタイルシートを指定します。 例えば、style.css に以下のような内容を書き込み、保存します。

  @page {
    size: A4 portrait;
    margin: 1.5cm 1.5cm 1.5cm 1.5cm;
    @top-right {
      width: 10%;
      content: counter(page);
      vertical-align: middle;
      font-size: 10pt;
      text-align: center;
    }
  }
  body {
    font-family: "Yu Mincho";
    font-size: 10pt;
    line-height: 1.9em;
    background-color: white;
    margin: 5%;
    text-align: justify;
  }
  pre {
    font-family: Consolas, "Yu Gothic";
    margin-left: 2em;
  }

そして、WeasyPrint で処理します:

  weasyprint -s style.css http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?TeX test.pdf

しばらく開発は停滞しているようです。

その他

TeX のアルゴリズムの実装

などがあります。

参考

電子出版に要求される CSS 機能のまとめ:


Last-modified: 2015-11-29 (日) 07:51:08 (1107d)