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}\documentclass{article}並添加了下面的輸出差異圖像(來自用戶 Manuel Kuehner 博士):

pdf乳膠

在此輸入影像描述

賽拉泰克斯

在此輸入影像描述

答案1

這可能只是答案的開始,因為我不太確定哪個是解決這個問題的最佳方法。

問題是膠子的底部落在 Metapost 產生的圖形的邊界框之外,並且xetex對此非常熱衷並將圖形裁剪到邊界框;pdftex更輕鬆,包括所有內容,甚至是應該裁剪的膠子部分。所以很難說 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原始命令之前調用的最後一個巨集endendchar;。如果你查看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;

為了保持整潔,該套件的作者決定裁剪圖片,以便它適合由wh參數定義的框(當然設定為您使用 定義的寬度和高度\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,因為升級時您必須重新進行任何更改。但這可能是短期內解決問題最簡單的方法。

在我的 MacTeX 2016 系統上,該檔案位於

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

但它可能在您系統的其他地方。有多種機制可以修補 LaTeX 包,但我不知道如何將它們套用到 Metapost 原始檔。您也可以考慮使用feynmp.mp.您也可以考慮向包作者提出錯誤。

相關內容