Разместите два \epsfboxes вертикально по центру рядом друг с другом

Разместите два \epsfboxes вертикально по центру рядом друг с другом

Следующая проблема была доведена до моего сведения в частном порядке: в примере программы 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, я простодобавьте недостающие \hboxesдля тех из нас, у кого «обновленный» epsf.tex.

Связанный контент