テーブルのタイトルに"(Continued)"と出す.

テーブルを出力するのとページまたがりになる場合があります.テーブルがそれほど大きくなくとも、本文の量によってあるものは1ページに収まり、あるものはページにまたがります.一般にページまたがりはいやがられるのですけれど、テーブルによってはもともと1ページに収まらないものがあります.HTMLならスクロールしさえすればいいのですが、PDFだとそうはいきません.そこでよくお客様から出る要望に、最初のページ以降にもテーブルのタイトルを出して末尾に「続き」(Continued)と加えて欲しいというものがあります.
 
XSL-FOではそのようなことに対応できるのでしょうか?はい!できます.それはfo:retrieve-table-markerとfo:markerを組み合わせて使えば実現できるはずなのです.
 
 
と言ってみたのですが実は会社のWEBにはこういう例は載っていません.そもそもfo:retrieve-table-markerでWEBをあたってみてもあまりサンプルはないのです.分割されたテーブルの下に"Continued"と出す例はあるのですけど、次のページの分割されたテーブルの表題に例えば"Table 2-12-2. Formatting options (Contined)"などと出す例は、カナダのCrane SoftwrightsのG. Ken HollmanさんのW3Cメーリングリストへのポストくらいです.(Hollmanさんは、XSL-FOの本も出しているとても紳士的で有名な方です.)
 
RE: Adding continued to table header if goes more than one page
http://lists.w3.org/Archives/Public/www-xsl-fo/2011Feb/0000.html
 
やり方は、ここにHollmanさんが言われているように、fo:table-headerにfo:retrieve-table-markerを書き、最初のfo:table-bodyのfo:row/fo:table-cellに空のfo:markerを、次の行のfo:row/fo:table-cellに"(Continued)"というインラインを含むfo:markerを書いてやります.そうすると最初のテーブルの表題は普通どおりに出て、次のページのテーブルの表題には"(Continued)"と出てくれます.
 
これをPDFにしたイメージは次のとおりです.確かに2ページ目には"(Continued)"と出ています.
 
イメージ 1
 
このFOとPDFは以下からダウンロードできます.
 
TableContinued_03.fo
http://yahoo.jp/Mah7lT
 
TableContinued_03.pdf
http://yahoo.jp/8ZlpJx
 
「なんだ、できるじゃん」と思われましたか?それとも「できているみたいだけど、ちょっとこのテーブルは罫線が抜けてない?」と思われましたか?後者に気がつかれた方はサスガです.
 
実はこのテーブルのオーサリング元はDITAです.DITAはCALSのテーブル使ってます.で、そのまま結果を加工するとこのようにならざるを得ないのです.原因は、テーブルのタイトルを分割されても繰り返し表の上に現われるように、fo:table-captionに入れるのではなく、fo:table-header/fo:table-row/fo:table-cellに入れているからなのです.
 
CALSのテーブルモデルでは、table/@frameにテーブルの一番外側の罫線を指定します.frame="all"だったら外側は全部罫線で囲まれます.これをだんだん下の階層まで落としてゆくと、entry/@colsep="1"は「セルの右側」に罫線を引きます.entry/@rowsep="1"は「セルの下側」に罫線を引きます.
 
ですので、@frame="all"をそのまま適用すると、このテーブル実は次のようになってしまいます.なんとタイトルの上に罫線が引かれてしまうのです.
 
イメージ 2
 
これではたぶんお客様はOKとは言ってくれないでしょう.
 
ではどうするかです?ちょっと考え込んでしまいました.fo:table-headerでfo:retrieve-table-markerが書けるのは、XSL-FOの仕様からすると素直です.fo:table-headerやfo:table-footerはページまたがりで必ず繰り返し表示されるからです.しかしCALSの仕様からXSL-FOのテーブルに展開してゆく立場からすると、どうにも使えないのです.
 
いえ、やろうとすれば(頑張れば)出来るのでしょうけれども、DITA→XSL-FOのスタイルシートではただ"(Continued)"と出すためだけに、すごいスタイルシートの発想を転換して泥臭いことをやらねばなりません.table/@frameが指定されたときに、テーブルの上外側に引く罫線は、fo:table/fo:table-header/fo:table-row[1]の下罫線に反映させねばなりません.テーブルの左と右に引く罫線は、fo:table/fo:table-header/fo:table-row[1]の左右の罫線を除外して反映させねばなりません.
 
たぶん、このようにCALSのテーブルを100%インプリメントして更に"(Continued)"と出すスタイルシートというのは、ちゃんとやっている方は少ないのではないかと思います.
 
WEBにあまり例が載っていない理由もわかります.XSL-FOで例は示せても、スタイルシートを作れといわれるとなかなか大変だからです.世の中簡単なようでいざ実現するとなると大変である一例ですね.