縦書き環境における BibLaTeX の使用について

縦書き環境における BibLaTeX の使用について

- konn の投稿
返信数: 3
はじめまして。konnと申します。

upLaTeX + utarticle で縦書き文書を作成しているのですが、biblatex と組み合わせて文献処理をしようとすると、

 ./main.tex:18: Use `\tate' at top of list.
\@begindocumenthook ->\tate
\message {《縦組モード》}\adjustbaseline ...
l.18 \begin{document}

のようなエラーが発生し、組版が進みません。最小ケースとエラーログはこちらのGistにアップしてあります。
BibLaTeX ではなく BibTeX を使えば無事に処理が進むのですが、出来れば biblatex を使いたいなあと思っています。何処を直すべきか、何故こうしたことが起こるのか、どなたが教えて頂けますと幸いです。

環境は Mac OS X 10.10.2 + MacTeX 2014 です。
konn への返信

Re: 縦書き環境における BibLaTeX の使用について

- Z. R. の投稿

pLaTeX 系の縦組クラスと biblatex の内部処理が衝突しています。かなり“微妙な”問題なので詳しく説明するのは難しいですね…。

とりあえず、biblatex を読み込んだ後に

\AtEndPreamble{\par}

を実行すれば不具合を“回避”できる、ような気がします。(バッドノウハウですね…)

Z. R. への返信

Re: 縦書き環境における BibLaTeX の使用について

- konn の投稿
ありがとうございます。とりあえずうまくいきました!

# バッドノウハウこわい……。
Z. R. への返信

Re: 縦書き環境における BibLaTeX の使用について

- Z. R. の投稿

“TeX(エンジン)が解る”人向けに解説しておきます。

  • pLaTeX 系の縦組クラスは次のフックを登録する。(これが begin-document フックの先頭になる。)
    \AtBeginDocument{\tate\message{《縦組モード》}\adjustbaseline}
  • biblatex パッケージは(etoolbox が提供する)“end-preamble フック”に \addtocontents を登録する。
    \AtEndPreamble{\addtocontents{toc}{...}...}
    そして、\addtocontents 命令は遅延(非 \immediate\write を行う。
  • end-preamble フックは begin-document フックより前に実行されるので、結局 \begin{document} のところでは、
    \write1{...}\tate...
    というコードが実行される。
  • 遅延 \write は whatsit ノードになる。そのため、「現在ページに相当する“垂直ボックス”が空でない」と見做され、「ボックスの途中での書字方向の変更はできない」のと同じ理由でエラー(! Use `\tate' at top of list.)になる。
  • ところが、この「「現在ページに相当する“垂直ボックス”」(外部垂直リスト)はやや特殊で、“ページビルダー”を発動させると、その直後では“ボックスが空である”と見做されるようになる。(参照:pTeX における文章中での組方向の変更
  • 従って、
    \AtEndPreamble{\par}
    を実行すると、\par\write\tate の間に入り、この \par がページビルダーを発動させて“ボックスを空にする”ので、無事に \tate が実行できる。

……ということだと推測しています。ただ、外部垂直リストの話はあまりよく解っていないので、間違っているかも知れません。(TeX 難しい……)