El siguiente código da resultados correctos con PDFLaTex pero si ejecuto XeLaTeX (lo cual necesito hacer para el documento completo), parte de la línea de gluón se corta.
\documentclass{article}
\usepackage{feynmp-auto}
\begin{document}
\begin{fmffile}{fgraph_qxq_z_gz_s}
\setlength{\unitlength}{0.5cm}
\begin{fmfgraph*}(8,5)
\fmfleft{i0,i1}
\fmfright{o0,o1}
\fmf{fermion , label=$\overline{q}$}{w0,i0}
\fmf{fermion , label=$q $}{i1,w0}
\fmf{boson , label=$Z^0 $}{w0,w1}
\fmf{gluon , label=$g $}{w1,o0}
\fmf{boson , label=$Z^0 $}{w1,o1}
\end{fmfgraph*}
\end{fmffile}
\end{document}
¿Cómo evito esto?
Editar: Se cambiaron \documentclass{minimal}
y \documentclass{article}
agregaron imágenes a continuación de la diferencia en el resultado (del usuario Dr. Manuel Kuehner):
pdflátex
xelatex
Respuesta1
Probablemente esto sea sólo el comienzo de una respuesta, porque no estoy muy seguro de cuál es la mejor manera de solucionar este problema.
El problema es que la parte inferior del gluón queda fuera del cuadro delimitador del gráfico generado por Metapost y xetex
es muy entusiasta al respecto y recorta la figura en el cuadro delimitador; pdftex
es más relajado e incluye todo, incluso la parte del gluón que se debe recortar. Por lo tanto, es difícil decir que xetex tiene la culpa; en todo caso, diría que pdftex debería "corregirse".
Pero, ¿cómo se dibuja el gluón fuera del cuadro delimitador?
Normalmente Metapost calculará y configurará el cuadro delimitador automáticamente para incluir todos los elementos de un dibujo. Pero el lenguaje también proporciona un setbounds
comando que le permite establecer arbitrariamente el cuadro delimitador en cualquier punto durante un dibujo. Un uso de esto es crear un margen de espacio en blanco alrededor de su dibujo, por ejemplo.
La \end{fmfgraph*}
línea en su código fuente hace que se finalice el dibujo y se escriban todos los comandos relevantes en el archivo Metapost, seguido finalmente por la macro Metapost endchar;
. De hecho, el archivo MP completo tiene este aspecto:
% fgraph_qxq_z_gz_s.mp -- do not edit, generated automatically by glue.tex
input feynmp
require_RCS_revision "1.30";
beginchar(1, 8*14.22636pt#, 5*14.22636pt#, 0);
"feynmf: 1";
LaTeX_unitlength:=14.22636pt;
subgraph (0, 0, w, h);
vinit;
pickup pencircle scaled thin;
vleft (__i0, __i1);
vright (__o0, __o1);
vconnect ("fermion , label=$\overline {q}$", __w0, __i0);
vconnect ("fermion , label=$q $", __i1, __w0);
vconnect ("boson , label=$Z^0 $", __w0, __w1);
vconnect ("gluon , label=$g $", __w1, __o0);
vconnect ("boson , label=$Z^0 $", __w1, __o1);
vfreeze;
vdraw;
endsubgraph;
endchar;
% the end.
end.
endinput;
Observa que en la parte superior estás incluyendo feynmp.mp
y que la última macro llamada, antes del comando primitivo end
, es endchar;
. Si observa feynmp.mp
su sistema, verá que endchar
está definido de la siguiente manera:
vardef endchar =
setbounds currentpicture to (0,0)--(w,0)--(w,h)--(0,h)--cycle;
if LaTeX_file <> "":
write EOF to LaTeX_file;
LaTeX_file := "";
fi
endfig
enddef;
En un arrebato de orden, el autor del paquete decidió recortar la imagen para que quepa en un cuadro definido por los parámetros w
y h
(que, por supuesto, están configurados en el ancho y alto que usted definió con \begin{fmfgraph*}(8,5)
). Este setbounds
comando en realidad no cambia ninguno de los comandos de dibujo, solo hace que MP escriba el cuadro delimitador especificado en el PostScript que produce. Entonces, cuando xetex obedece "correctamente" las dimensiones del cuadro delimitador, el gluón se corta, pero cuando pdftex ignora "útilmente" el cuadro delimitador, el pie del gluón aún se dibuja.
La solución obvia (en mi humilde opinión) es eliminar toda la línea:
setbounds currentpicture to (0,0)--(w,0)--(w,h)--(0,h)--cycle;
Si edita su copia local, encontrará que xetex
procesa su archivo correctamente, así:
excepto que, como verá inmediatamente, por alguna razón, ¡las etiquetas ahora están todas desplazadas hacia la derecha!
Mirando un poco más de cerca lo que está sucediendo, parece que las macros de dibujo de etiquetas hacen suposiciones sobre el tamaño de la figura, y es por eso que setbounds
se necesita el comando.
Mi solución de truco es arreglarlo beginchar
también para que dibuje un cuadro invisible antes de comenzar. Mi copia de feynmp.mp
ahora se ve así:
...
vardef beginchar (expr c, wd, ht, dp) =
LaTeX_file := "";
beginfig(c);
w:=wd;
h:=ht;
% new line added here to draw an "invisible" box
undraw (0,0)--(w,0)--(w,h)--(0,h)--cycle;
enddef;
string LaTeX_file;
vardef endchar =
% next line removed
% setbounds currentpicture to (0,0)--(w,0)--(w,h)--(0,h)--cycle;
if LaTeX_file <> "":
write EOF to LaTeX_file;
LaTeX_file := "";
fi
endfig
enddef;
...
y tu foto sale xetex
así:
(La línea gris visible en la parte inferior de esta imagen muestra dónde está la parte inferior del cuadro "invisible". Este es un artefacto producido por ImageMagick cuando convierto el pdf a png. No veo ese artefacto en el PDF versión).
La razón por la que tengo dudas sobre esta solución es que me parece incorrecto pedirle que parchee su copia de feynmp.mp
, ya que tendrá que volver a hacer los cambios cuando actualice. Pero podría ser la forma más sencilla de arreglar las cosas en el corto plazo.
En mi sistema macos con MacTeX 2016, el archivo está en
/usr/local/texlive/2016/texmf-dist/metapost/feynmf/feynmp.mp
pero puede que esté en algún otro lugar de su sistema. Existen varios mecanismos para parchear paquetes LaTeX, pero no sé cómo aplicarlos a los archivos fuente de Metapost. También podría considerar crear un árbol texmf local con una copia "fija" de feynmp.mp
. También podría considerar informar un error al autor del paquete.