新しい dvips.def の setpagesize

新しい dvips.def の setpagesize

- aminophen の投稿
返信数: 5
(u)pLaTeX 縦組で以下のコードが TeX Live 2016 最新でエラーになることを見つけました。

\documentclass[dvips]{tarticle}
\usepackage{color}
\begin{document}

{\color{red}あいうえお}

\end{document}

./test.tex:7: Incompatible direction list can't be unboxed.
\@begindvi ->\unvbox \@begindvibox
\global \let \@begindvi \@empty
l.7 \end{document}

?

これは dvipdfmx 指定だと ok です。

2015 は「dvips.def 2015/12/30 v3.0k」
2016 は「dvips.def 2016/06/02 v3.0l」あるいは「dvips.def 2016/06/17 v3.0m」

なので調べてみると、dvips.def はごく最近「setpagesize を pdflatex と latex + dvips で
同じに機能するように」というパッチが入っていることがわかりました。
これが悪さをしていて(geometry.sty が縦組で使えないのと同根の)エラーになっています。

おそらく解決するには pLaTeX と dvips.def の両方の改変が必要そうなのですが、ひとまず。
今わかっていること:エラーを消し去るだけなら、pLaTeX で

\def \@begindvi{%
\iftbox\@begindvibox\tate\else\yoko\fi
\unvbox\@begindvibox
\global\let \@begindvi \@empty
}

と定義すればすみますが、それだけだと width と height が置き換わらないので変なことになります。
aminophen への返信

Re: 新しい dvips.def の setpagesize

- aminophen の投稿
もうひとつの解として

\def\@begindvi{%
\box\@begindvibox
\global\let\@begindvi\@empty
}

をいただきました。\unvbox せずに \box するという方法です。
ただ、この場合は副作用が心配になります。
aminophen への返信

Re: 新しい dvips.def の setpagesize

- aminophen の投稿
(連投すみません。)

Incompatible direction list can't be unboxed. エラーの出かたが

\documentclass{tarticle}
\usepackage{color}
\AtBeginDvi{}
\begin{document}

\end{document}

だと

\AtBeginDvi ...vibox \vbox {\unvbox \@begindvibox
                                                  #1}

で引っかかり

\documentclass{tarticle}
\usepackage{color}
\begin{document}

\end{document}

だと

\@begindvi ->\unvbox \@begindvibox
                                  \global \let \@begindvi \@empty

で出るので

\def \@begindvi{%
  \iftbox\@begindvibox\tate\else\yoko\fi
  \unvbox \@begindvibox
  \global\let \@begindvi \@empty
}
\def \AtBeginDvi #1{%
  \global \setbox \@begindvibox
  \vbox{\iftbox\@begindvibox\tate\else\yoko\fi
  \unvbox \@begindvibox #1}%
}

を pLaTeX に入れてみたところ、dvips.def など他を変えずに済む気がしてきました。
aminophen への返信

Re: 新しい dvips.def の setpagesize

- Z. R. の投稿

pLaTeX の出力ルーチンの「実際に \shipout するところ」は次のようになっています。

\shipout\vbox{\yoko
  ...
  \@begindvi
  ...

先の \@begindvi の再定義では、(場合により)組方向モードを \tate に変えてしまうので都合が悪いと思います。かといって、「ボックスの中で一部だけ組方向を変更する」こともできません。

私自身は、この「\shipout\yoko が指定されている」ことを根拠として、次のような前提を立てています。

\@begindvibox は(空でない限り)常に横組でなければならない。
(つまり \@begindvibox を縦ボックスにしてしまう操作は“不適切”。)

この考えに従うと、\AtBeginDvi を次のように修正することになります。

\def\AtBeginDvi#1{%
  \global\setbox\@begindvibox
    \vbox{\yoko\unvbox\@begindvibox #1}}

例えば、pxchfon パッケージの実装コードでは、(\AtBeginDvi には手をつけず、別の名前で)上記のコードを使用しています。

自分が書いたコード以外で、同様の考えをしているものとして、lltjp-geometry パッケージがあります。(pTeX エンジンの場合に、上記の再定義を行います。)

あと、LuaTeX-ja のカーネルも、上記と全く同じコードで \AtBeginDvi の再定義を行っています。もっとも、この場合 \yoko は“LuaTeX-ja の \yoko”なので厳密には同じではありませんが。

Z. R. への返信

Re: 新しい dvips.def の setpagesize

- aminophen の投稿
> 私自身は、この「\shipout で \yoko が指定されている」ことを根拠として、
> 次のような前提を立てています。
> \@begindvibox は(空でない限り)常に横組でなければならない。
> (つまり \@begindvibox を縦ボックスにしてしまう操作は“不適切”。)

Z.R. さんが仰る「根拠 → 前提」には一理ありますね。
pTeX の該当するドキュメントが無いので確証があるとはいえませんが、
lltjp-geometry の実績もありますし、これを pLaTeX カーネルで採用したいです。
aminophen への返信

Re: 新しい dvips.def の setpagesize

- aminophen の投稿
dvipdfmx.def の 2016/07/02 v4.10 で、dvips.def と同様の
\AtBeginDocument{\AtBeginDvi{}}
を使った papersize special 機能が追加されました。
したがって、2016/07/01 より古い pLaTeX / upLaTeX を使用している場合、
縦組で graphicx や color の dvipdfmx オプションが
Incompatible direction list can't be unboxed.
なるエラーになります。最新版の pLaTeX / upLaTeX (2016/07/01) なら大丈夫です。
ギリギリのタイミングで更新していた (forum:1967) ので命拾いしました…