“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 難しい……)