Следующая проблема была доведена до моего сведения в частном порядке: в примере программы CWEBкосо-троичный-calc.w(2015) Дона Кнута существует несколько случаев использования этой конструкции:
$$\vcenter{\epsfbox{...}}\qquad\qquad
\vcenter{\epsfbox{...}}$$
откуда ...
берутся названия графики MetaPostskew-троичный-calc.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
Определение \epsfbox
в epsf.tex
файле, включенном в TeX Live (по адресу /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
Похоже, что Дон Кнут используеторигиналepsf.tex
с совершенно другим определением\epsfbox
без \leavevmode
.
Поэтому, вместо того, чтобы беспокоить «Великого Волшебника» этой проблемой и заставлять его обновлять свой локальный epsf.tex
, я простодобавьте недостающие \hbox
esдля тех из нас, у кого «обновленный» epsf.tex
.