私下交流中,我注意到了以下问题:在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.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
。因此,图片将按正常缩进方式缩进,并形成一行段落,因此\vcenter
框将具有\hsize
宽度。
使用时\vcenter{\hbox{\epsfbox{...}}}
不会出现该缺陷;盒子的宽度将与图像的宽度相同。
答案2
看起来 Don Knuth 使用原本的epsf.tex
完全不同的定义\epsfbox
没有 \leavevmode
。
因此,我没有去打扰“大巫师”并强迫他更新本地epsf.tex
,而是简单地添加缺失的\hbox
es对于我们这些“更新”的人来说epsf.tex
。