以下程式碼使用 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
原始命令之前調用的最後一個巨集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
,因為升級時您必須重新進行任何更改。但這可能是短期內解決問題最簡單的方法。
在我的 MacTeX 2016 系統上,該檔案位於
/usr/local/texlive/2016/texmf-dist/metapost/feynmf/feynmp.mp
但它可能在您系統的其他地方。有多種機制可以修補 LaTeX 包,但我不知道如何將它們套用到 Metapost 原始檔。您也可以考慮使用feynmp.mp
.您也可以考慮向包作者提出錯誤。