Me ha llamado la atención el siguiente problema mediante comunicación privada: En el programa de ejemplo CWEBsesgo-ternario-calc.w(2015) de Don Knuth, hay múltiples apariciones de este constructo:
$$\vcenter{\epsfbox{...}}\qquad\qquad
\vcenter{\epsfbox{...}}$$
¿De dónde ...
son los nombres de los gráficos MetaPost?sesgo-ternario-calc.mp.
Correr
for i in skew-ternary-calc; do mpost $i; cweave $i; tex $i; dvipdfm $i; done
produce "cuadros demasiado llenos" y da como resultado un PDF con varias visualizaciones donde el gráfico de la derecha está fuera del marco de la página.
Agregar \hbox{...}
casi todos los \epsfbox{...}
es parece solucionar este problema.
Un simple $$\vcenter{\epsfbox{...}}$$
funciona bien, pero tan pronto como aparece algún otro material, \epsfbox{...}
se desata el infierno.
¿Alguna idea de lo que está pasando aquí?
Respuesta1
La definición de \epsfbox
en el epsf.tex
archivo incluido en TeX Live (en /usr/local/texlive/2017/texmf-dist/tex/generic/epsf/epsf.tex
, publicidad This is `epsf.tex' v2.7.4 <14 February 2011>
) es
\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}%
}%
Como lo llamas sin [
, miramos \epsfnormal
:
\def \epsfnormal #1{%
\epsfgetbb{#1}%
\epsfsetgraph{#1}%
}%
No, todavía no es el indicado; miremos a \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}
<...>
}%
Como puede ver, esta macro funciona \leavevmode
cuando se llama en modo vertical, como es el caso al comienzo de \vcenter
. Entonces la imagen tendrá una sangría con el parindent normal y se formará un párrafo de una línea, por lo que el \vcenter
cuadro tendrá \hsize
ancho.
El uso \vcenter{\hbox{\epsfbox{...}}}
está libre de este defecto; el cuadro tendrá el mismo ancho que la imagen.
Respuesta2
Parece que Don Knuth usael originalepsf.tex
con una definición completamente diferente de\epsfbox
sin \leavevmode
.
Entonces, en lugar de molestar a "El Gran Mago" con este problema y obligarlo a actualizar su local epsf.tex
, simplementeagrega los \hbox
es que faltanpara aquellos de nosotros con un “actualizado” epsf.tex
.