METAPOST: Diagrama de Feynman recortado con XeLaTeX

METAPOST: Diagrama de Feynman recortado con XeLaTeX

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

ingrese la descripción de la imagen aquí

xelatex

ingrese la descripción de la imagen aquí

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 xetexes muy entusiasta al respecto y recorta la figura en el cuadro delimitador; pdftexes 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 setboundscomando 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.mpy que la última macro llamada, antes del comando primitivo end, es endchar;. Si observa feynmp.mpsu sistema, verá que endcharestá 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 wy h(que, por supuesto, están configurados en el ancho y alto que usted definió con \begin{fmfgraph*}(8,5)). Este setboundscomando 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 xetexprocesa su archivo correctamente, así:

ingrese la descripción de la imagen aquí

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 setboundsse necesita el comando.

Mi solución de truco es arreglarlo beginchartambién para que dibuje un cuadro invisible antes de comenzar. Mi copia de feynmp.mpahora 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 xetexasí:

ingrese la descripción de la imagen aquí

(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.

información relacionada