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 \epsfbox
in der epsf.tex
in 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, \leavevmode
wenn 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 \vcenter
Box 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.tex
mit 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 \hbox
es hinzufür diejenigen von uns mit einem „aktualisierten“ epsf.tex
.