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