将两个 \epsfboxes 垂直居中放置并排放置

将两个 \epsfboxes 垂直居中放置并排放置

私下交流中,我注意到了以下问题:在CWEB示例程序中倾斜三元计算.w(2015)Don Knuth 多次提到了这一结构:

$$\vcenter{\epsfbox{...}}\qquad\qquad
  \vcenter{\epsfbox{...}}$$

...MetaPost 图形的名称来自哪里倾斜三元计算.mp

跑步

for i in skew-ternary-calc; do mpost $i; cweave $i; tex $i; dvipdfm $i; done

产生极其“溢出的盒子”,并导致 PDF 中有多个显示,其中右侧图形超出了页面框架。

添加\hbox{...}几乎所有的\epsfbox{...}es 似乎可以解决这个问题。

简单的$$\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。因此,图片将按正常缩进方式缩进,并形成一行段落,因此\vcenter框将具有\hsize宽度。

使用时\vcenter{\hbox{\epsfbox{...}}}不会出现该缺陷;盒子的宽度将与图像的宽度相同。

答案2

看起来 Don Knuth 使用原本的epsf.tex完全不同的定义\epsfbox 没有 \leavevmode

因此,我没有去打扰“大巫师”并强迫他更新本地epsf.tex,而是简单地添加缺失的\hboxes对于我们这些“更新”的人来说epsf.tex

相关内容