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
xelatex
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 xetex
dies mit äußerster Sorgfalt tut und die Figur auf den Begrenzungsrahmen zuschneidet; pdftex
ist 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 setbounds
Befehl, 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.mp
und dass das letzte vor dem Grundbefehl aufgerufene Makro end
ist endchar;
. Wenn Sie sich feynmp.mp
Ihr System ansehen, werden Sie feststellen, dass es endchar
wie 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 w
und definiert wird h
(die natürlich auf die Breite und Höhe eingestellt sind, die Sie mit definiert haben \begin{fmfgraph*}(8,5)
). Dieser setbounds
Befehl ä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 xetex
Ihre Datei korrekt verarbeitet wird, und zwar wie folgt:
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 setbounds
Befehl erforderlich ist.
Meine Hack-Lösung besteht beginchar
darin, es so zu reparieren, dass vor dem Start eine unsichtbare Box gezeichnet wird. Meine Kopie feynmp.mp
sieht 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;
...
xetex
und Ihr Bild sieht so aus :
(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.