Platzieren Sie zwei \epsfboxen vertikal zentriert nebeneinander

Platzieren Sie zwei \epsfboxen vertikal zentriert nebeneinander

Durch eine private Mitteilung wurde ich auf folgendes Problem aufmerksam gemacht: Im CWEB-BeispielprogrammSchiefe-Ternär-Berechnung.w(2015) von Don Knuth gibt es mehrere Vorkommen dieses Konstrukts:

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

woher ...stammen die Namen der MetaPost-Grafikenschräg-ternär-calc.mp.

Läuft

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

führt zu extrem „übervollen Kästen“ und resultiert in einem PDF mit mehreren Anzeigen, bei denen die rechte Grafik außerhalb des Seitenrahmens liegt.

Das Hinzufügen \hbox{...}fast aller „ \epsfbox{...}es“ scheint dieses Problem zu beheben.

Ein einfaches $$\vcenter{\epsfbox{...}}$$funktioniert gut, aber sobald anderes Material dazukommt, \epsfbox{...}bricht die Hölle los.

Irgendwelche Ideen, was hier los ist?

Antwort1

Die Definition von \epsfboxin der epsf.texin TeX Live enthaltenen Datei (unter /usr/local/texlive/2017/texmf-dist/tex/generic/epsf/epsf.tex, Werbung This is `epsf.tex' v2.7.4 <14 February 2011>) lautet

\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}%
}%

Da Sie es ohne aufrufen [, betrachten wir \epsfnormal:

\def \epsfnormal #1{%
    \epsfgetbb{#1}%
    \epsfsetgraph{#1}%
}%

Nein, das ist es noch immer nicht. Schauen wir uns Folgendes an \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}
   <...>
}%

Wie Sie sehen, funktioniert dieses Makro, \leavevmodewenn es im vertikalen Modus aufgerufen wird, was zu Beginn der Fall ist \vcenter. Das Bild wird also um den normalen Einzug eingerückt und ein einzeiliger Absatz wird gebildet, sodass die \vcenterBox Breite hat \hsize.

Bei der Verwendung \vcenter{\hbox{\epsfbox{...}}}tritt dieser Fehler nicht auf; die Box hat die gleiche Breite wie das Bild.

Antwort2

Es scheint, dass Don Knuth verwendetdas Originalepsf.texmit einer völlig anderen Definition von\epsfbox ohne \leavevmode.

Anstatt also „The Grand Wizard“ mit diesem Problem zu belästigen und ihn zu zwingen, seine lokale zu aktualisieren epsf.tex, habe ich einfachfüge die fehlenden \hboxes hinzufür diejenigen von uns mit einem „aktualisierten“ epsf.tex.

verwandte Informationen