METAPOST: Feynman-Diagramm mit XeLaTeX zugeschnitten

METAPOST: Feynman-Diagramm mit XeLaTeX zugeschnitten

Der folgende Code liefert korrekte Ergebnisse mit PDFLaTex, aber wenn ich XeLaTeX ausführe (was ich für das vollständige Dokument tun muss), wird ein Teil der Gluonenlinie abgeschnitten.

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

Wie vermeide ich das?

Bearbeiten: Unten wurden Bilder der Ausgabeunterschiede geändert und hinzugefügt (von Benutzer Dr. Manuel Kuehner) \documentclass{minimal}:\documentclass{article}

pdflatex

Bildbeschreibung hier eingeben

xelatex

Bildbeschreibung hier eingeben

Antwort1

Dies ist wahrscheinlich nur der Anfang einer Antwort, da ich nicht ganz sicher bin, wie sich dieses Problem am besten beheben lässt.

Das Problem besteht darin, dass die Unterseite des Gluons außerhalb des Begrenzungsrahmens der von Metapost generierten Grafik liegt und xetexdies mit äußerster Sorgfalt tut und die Figur auf den Begrenzungsrahmen zuschneidet; pdftexist entspannter und schließt alles ein, sogar den Teil des Gluons, der zugeschnitten werden sollte. Es ist also schwer zu sagen, dass xetex schuld ist – wenn überhaupt, würde ich sagen, dass pdftex „korrigiert“ werden sollte.

Aber wie wird das Gluon außerhalb des Begrenzungsrahmens gezeichnet?

Normalerweise berechnet und setzt Metapost den Begrenzungsrahmen automatisch, um alle Elemente einer Zeichnung einzuschließen. Die Sprache bietet jedoch auch einen setboundsBefehl, mit dem Sie den Begrenzungsrahmen an jedem beliebigen Punkt während einer Zeichnung beliebig setzen können. Dies kann beispielsweise dazu verwendet werden, einen weißen Rand um Ihre Zeichnung zu erstellen.

Die \end{fmfgraph*}Zeile in Ihrem Quellcode bewirkt, dass die Zeichnung fertiggestellt und alle relevanten Befehle in die Metapost-Datei geschrieben werden, gefolgt vom Metapost-Makro endchar;. Tatsächlich sieht die fertige MP-Datei so aus:

% 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;

Beachten Sie, dass Sie oben einbinden feynmp.mpund dass das letzte vor dem Grundbefehl aufgerufene Makro endist endchar;. Wenn Sie sich feynmp.mpIhr System ansehen, werden Sie feststellen, dass es endcharwie folgt definiert ist:

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;

In einem Anfall von Ordnungsliebe hat der Autor des Pakets beschlossen, das Bild so zuzuschneiden, dass es in eine Box passt, die durch die Parameter wund definiert wird h(die natürlich auf die Breite und Höhe eingestellt sind, die Sie mit definiert haben \begin{fmfgraph*}(8,5)). Dieser setboundsBefehl ändert eigentlich keinen der Zeichenbefehle, er veranlasst MP nur, die angegebene Begrenzungsbox in das von ihm erstellte PostScript zu schreiben. Wenn also xetex die Begrenzungsbox-Abmessungen „korrekt“ einhält, wird das Gluon abgeschnitten, aber wenn pdftex die Begrenzungsbox „sinnvollerweise“ ignoriert, wird der Fuß des Gluons trotzdem gezeichnet.

Die offensichtliche Lösung (meiner bescheidenen Meinung nach) besteht darin, die gesamte Zeile zu entfernen:

setbounds currentpicture to (0,0)--(w,0)--(w,h)--(0,h)--cycle;

Wenn Sie Ihre lokale Kopie bearbeiten, werden Sie feststellen, dass xetexIhre Datei korrekt verarbeitet wird, und zwar wie folgt:

Bildbeschreibung hier eingeben

außer dass, wie Sie sofort sehen werden, die Beschriftungen jetzt aus irgendeinem Grund alle nach rechts versetzt sind!

Bei genauerem Hinsehen stellt man fest, dass die Makros zum Zeichnen der Beschriftung Annahmen über die Größe der Abbildung treffen und deshalb dieser setboundsBefehl erforderlich ist.

Meine Hack-Lösung besteht beginchardarin, es so zu reparieren, dass vor dem Start eine unsichtbare Box gezeichnet wird. Meine Kopie feynmp.mpsieht jetzt so aus:

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

xetexund Ihr Bild sieht so aus :

Bildbeschreibung hier eingeben

(Die graue Linie am unteren Rand des Bildes zeigt Ihnen, wo sich der untere Rand des „unsichtbaren“ Felds befindet. Dies ist ein Artefakt, das von ImageMagick erzeugt wird, wenn ich das PDF in ein PNG konvertiere. In der PDF-Version sehe ich dieses Artefakt nicht.)

Der Grund, warum ich dieser Lösung gegenüber zögerlich bin, ist, dass es sich völlig falsch anfühlt, Ihnen zu sagen, dass Sie Ihre Kopie von patchen sollen feynmp.mp, da Sie beim Upgrade alle Änderungen erneut vornehmen müssen. Aber es könnte die einfachste Möglichkeit sein, die Dinge kurzfristig zu beheben.

Auf meinem MacOS-System mit MacTeX 2016 befindet sich die Datei unter

/usr/local/texlive/2016/texmf-dist/metapost/feynmf/feynmp.mp

aber es kann auch woanders auf Ihrem System sein. Es gibt verschiedene Mechanismen, um LaTeX-Pakete zu patchen, aber ich weiß nicht, wie man sie auf Metapost-Quelldateien anwendet. Sie könnten auch erwägen, einen lokalen Texmf-Baum mit einer „korrigierten“ Kopie von zu erstellen feynmp.mp. Sie könnten auch erwägen, einen Fehler beim Paketautor zu melden.

verwandte Informationen