以下の問題は、私的なコミュニケーションによって私に知らされました。CWEBサンプルプログラムではskew-ternary-calc.w(2015)ドン・クヌース著では、この構成が複数回登場しています。
$$\vcenter{\epsfbox{...}}\qquad\qquad
\vcenter{\epsfbox{...}}$$
...
MetaPostグラフィックの名前はどこから来たのかskew-ternary-calc.mp。
ランニング
for i in skew-ternary-calc; do mpost $i; cweave $i; tex $i; dvipdfm $i; done
非常に「過剰なボックス」が生成され、右側のグラフィックがページ フレームの外側に表示される複数のディスプレイを含む PDF が生成されます。
\hbox{...}
ほぼすべてのesを追加すると\epsfbox{...}
、この問題は解決するようです。
単純なもの$$\vcenter{\epsfbox{...}}$$
はうまく機能しますが、他の素材が加わるとすぐに、\epsfbox{...}
大混乱に陥ります。
ここで何が起こっているのか分かりますか?
答え1
TeX Live( 、広告)に含まれるファイル\epsfbox
内のの定義は、epsf.tex
/usr/local/texlive/2017/texmf-dist/tex/generic/epsf/epsf.tex
This is `epsf.tex' v2.7.4 <14 February 2011>
\def \epsfbox #1{%
\global \def \epsfllx {72}%
\global \def \epsflly {72}%
\global \def \epsfurx {540}%
\global \def \epsfury {720}%
\def \lbracket {[}%
\def \testit {#1}%
\ifx \testit \lbracket
\let \next = \epsfgetlitbb
\else
\let \next = \epsfnormal
\fi
\next{#1}%
}%
なしで呼び出しているので[
、 を見ます\epsfnormal
:
\def \epsfnormal #1{%
\epsfgetbb{#1}%
\epsfsetgraph{#1}%
}%
いいえ、まだそれではありません。次を見てみましょう\epsfsetgraph
:
\def \epsfsetgraph #1%
{%
%
% Make the vbox and stick in a \special that the DVI driver can
% parse. \vfil and \hfil are used to place the \special origin at
% the lower-left corner of the vbox. \epsfspecial can be redefined
% to produce alternate \special syntaxes.
%
\ifvmode \leavevmode \fi
\relax
\hbox{% so we can put this in \begin{center}...\end{center}
<...>
}%
ご覧のとおり、このマクロは\leavevmode
垂直モードで呼び出されると、つまり の開始時に実行されます\vcenter
。したがって、画像は通常の parindent でインデントされ、1 行の段落が形成されるため、\vcenter
ボックスに幅ができます\hsize
。
を使用すると\vcenter{\hbox{\epsfbox{...}}}
この欠陥はなくなり、ボックスの幅は画像と同じになります。
答え2
ドン・クヌースはオリジナルepsf.tex
全く異なる定義で\epsfbox
それなし \leavevmode
。
そこで、この問題で「グランドウィザード」を煩わせてローカルを更新させる代わりにepsf.tex
、私は単に不足している\hbox
esを追加する「アップデートされた」 を持つ私たちにとってepsf.tex
。