METAPOST: XeLaTeX で切り取ったファインマン図

METAPOST: XeLaTeX で切り取ったファインマン図

次のコードは PDFLaTex で正しい結果を生成しますが、XeLaTeX を実行すると (完全なドキュメントを実行するために実行する必要があります)、グルーオン ラインの一部が切り取られます。

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

これを避けるにはどうすればいいでしょうか?

編集:出力の違いを以下の\documentclass{minimal}ように変更し、画像を追加しました (ユーザー Dr. Manuel Kuehner 提供):\documentclass{article}

pdfラテックス

ここに画像の説明を入力してください

ゼラテックス

ここに画像の説明を入力してください

答え1

これはおそらく答えの始まりに過ぎません。なぜなら、この問題を解決する最善の方法がどれなのか、私にはよく分からないからです。

問題は、Metapost によって生成されたグラフィックの境界ボックスの外側にグルーオンの下部がはみ出してしまうことです。Metapost は、xetexこのことに非常にこだわり、境界ボックスに合わせて図を切り取ります。一方、pdftexMetapost はより緩やかで、切り取られるべきグルーオンの部分も含め、すべてを含めます。したがって、xetex に問題があるとは言い難いです。どちらかと言うと、pdftex は「修正」されるべきだと思います。

しかし、グルーオンはどのようにして境界ボックスの外側に描画されるのでしょうか?

通常、Metapost は、描画のすべての要素を含む境界ボックスを自動的に計算して設定します。ただし、この言語には、setbounds描画中の任意の時点で境界ボックスを任意に設定できるコマンドも用意されています。これを使用すると、たとえば、描画の周囲に余白を作成できます。

ソース コード内の行\end{fmfgraph*}により、描画が確定され、関連するすべてのコマンドが Metapost ファイルに書き込まれ、最後に Metapost マクロが続きますendchar;。実際、完成した MP ファイルは次のようになります。

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

先頭に が含まれfeynmp.mp、プリ​​ミティブ コマンド の前に呼び出される最後のマクロがendであることに注意してくださいendchar;。システムで を調べると、 が次のように定義されているfeynmp.mpことがわかります。endchar

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;

パッケージの作者は、整理整頓のために、wおよびhパラメータで定義されたボックスに収まるように画像を切り取ることにしました (もちろん、 で定義した幅と高さに設定されます\begin{fmfgraph*}(8,5))。このsetboundsコマンドは、実際には描画コマンドを変更するものではなく、MP が生成する PostScript に指定された境界ボックスを書き込むようにするだけです。したがって、xetex が境界ボックスの寸法に「正しく」従うと、グルーオンは切り取られますが、pdftex が境界ボックスを「有効に」無視すると、グルーオンの足は描画されます。

明らかな解決策は(私の控えめな意見では)、行全体を削除することです。

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

ローカル コピーを編集すると、xetex次のようにファイルが正しく処理されることがわかります。

ここに画像の説明を入力してください

ただし、すぐにわかるように、何らかの理由でラベルがすべて右にオフセットされています。

何が起こっているのかをもう少し詳しく調べてみると、ラベル描画マクロが図のサイズについて想定しているようで、そのためにコマンドがsetbounds必要なようです。

私のハックソリューションはbeginchar、開始する前に目に見えないボックスを描画するように修正することです。feynmp.mp現在の私のコピーは次のようになります。

...
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次のようになります:

ここに画像の説明を入力してください

(この画像の下部に見える灰色の線は、「見えない」ボックスの下部がどこにあるかを示しています。これは、PDF を PNG に変換するときに ImageMagick によって生成されるアーティファクトです。PDF バージョンではそのアーティファクトは表示されません)。

この解決策に躊躇する理由は、 のコピーにパッチを適用するように指示するのは間違っていると感じるからですfeynmp.mp。アップグレード時に変更をやり直す必要があるからです。しかし、短期的にはこれが問題を解決する最も簡単な方法かもしれません。

私のmacOSシステムではMacTeX 2016ではファイルは

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

しかし、それはシステム上のどこか他の場所にあるかもしれません。LaTeX パッケージにパッチを当てるメカニズムはいろいろありますが、Metapost ソース ファイルに適用する方法はわかりません。 の「修正された」コピーを使用してローカルの texmf ツリーを作成することも検討してくださいfeynmp.mp。パッケージの作成者にバグを報告することも検討してください。

関連情報