2つの\epsfboxを垂直に中央揃えで並べます

2つの\epsfboxを垂直に中央揃えで並べます

以下の問題は、私的なコミュニケーションによって私に知らされました。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.texThis 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、私は単に不足している\hboxesを追加する「アップデートされた」 を持つ私たちにとってepsf.tex

関連情報