私下交流引起我注意以下問題:在CWEB範例程式中偏斜三元計算.wDon Knuth (2015) 中多次出現此構造:
$$\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
。