LaTeX 專題:tikz-feynman繪制費曼圖
%% 好早以前,我做過一點簡短的 LaTeX?簡明入門經(jīng)驗分享。
%% 現(xiàn)在正好也是在學(xué)習量子場論,對費曼圖有了更多的理解,也想做一個 LaTeX 繪制費曼圖的教程。
%% Tikz 是 LaTeX 中用于畫圖的宏包,功能強大。其中的 tikz-feynman 是可以用于繪制各種費曼圖的強大工具。
%% 讀者如果需要任何資料、源碼,可以聯(lián)系作者主頁的郵箱或動態(tài)頁置頂?shù)腝群。

基礎(chǔ)知識儲備
在開始之前,我想可以不妨假設(shè)讀者已經(jīng)具有一定的粒子物理的基礎(chǔ)知識,否則你應(yīng)該用不著這篇專欄。
也就是說,讀者已經(jīng)熟悉費米子、膠子、矢量玻色子、標量粒子等在費曼圖中對應(yīng)的線型,熟悉頂點、外腿、傳播子、樹圖、圈圖等概念,熟悉用箭頭表示電荷的流動方向和區(qū)分正反粒子的規(guī)則。
如果對這些不熟悉,可以考慮學(xué)習格里菲斯的粒子物理導(dǎo)論。

畫圖規(guī)則
然后,我們可以開始講費曼圖的具體畫法了。
我們將以幾個簡單的案例來說明。
1 e+e- → μ+μ- 散射
代碼
\feynmandiagram [horizontal=a to b] {
i1 [particle=\(e^{-}\)] -- [fermion] a -- [fermion] i2 [particle=\(e^{+}\)],
a -- [photon, edge label=\(\gamma\), momentum'=\(k\)] b,
f1 [particle=\(\mu^{+}\)] -- [fermion] b -- [fermion] f2 [particle=\(\mu^{-}\)],
};
成品圖

規(guī)則解釋:
我已經(jīng)在生成的圖上標記出了各個頂點在代碼中對應(yīng)的字母。
第一行的 horizongtal 設(shè)置了ab兩節(jié)點以a左b右的形式固定為水平方向。這一設(shè)置同時標定了接下來所有外腿、傳播子繪制的正方向。如果你需要一個豎起來的圖,也可以指定為vertical。
(不過需要注意,這未必表示費曼圖的時間流向。)
那么剩下的部分對照代碼和圖就比較好理解了,程序會自動按從上往下,從左到右的規(guī)則,圍繞之前聲明固定水平的節(jié)點ab繪制你所指定的線。
(同時也可以注意到繪制兩邊外腿時的正方向就是按代碼各個節(jié)點順序,比如正電子本應(yīng)是anti-fermion,但此時的繪制方向是a→i2,是順著箭頭的方向,所以代碼中仍是fermion而非anti-fermion)
2 更多種類的粒子
代碼
\feynmandiagram [horizontal=a to b] {
i1 [particle=\(\tilde W\)] -- [plain, boson] a -- [anti fermion] i2 [particle=\(q\)],
a -- [charged scalar, edge label=\(\tilde q\)] b,
f1 [particle=\(\tilde g\)] -- [plain, gluon] b -- [fermion] [particle=\(q\)],
};
成品圖

這個例子主要是展示更多線型,大家可以對照代碼學(xué)習。
3 交換末態(tài)粒子形成的交叉線
代碼
\begin{tikzpicture}
\begin{feynman}
\diagram [vertical'=a to b] {
i1 [particle=\(e^{-}\)]
-- [fermion] a
-- [draw=none] f1 [particle=\(e^{+}\)],
a -- [photon, edge label'=\(p\)] b,
i2 [particle=\(e^{+}\)]
-- [anti fermion] b
-- [draw=none] f2 [particle=\(e^{-}\)],
};
\diagram* {
(a) -- [fermion] (f2),
(b) -- [anti fermion] (f1),
};
\end{feynman}
\end{tikzpicture}
成品圖

有的圖,交換兩個末態(tài)粒子和原來的圖不是等價的,這種圖需要用這種交叉線表示。不過正常語法畫樹圖,程序默認畫的是不交叉的,所以只能用這個案例的方式,將兩個子圖疊加,第一個圖在a→f1和b→f2間不畫任何線,但起到固定f1f2的作用,再通過第二個圖畫出交叉線。
需要強調(diào)的一點是,除了被聲明為horizontal或vertical,用來固定整個圖方向的兩個節(jié)點,其他外腿節(jié)點叫什么名字是無關(guān)緊要的,程序只會根據(jù)周圍的環(huán)境設(shè)置節(jié)點的位置。雖然上面幾個案例都是左邊i1i2右邊f(xié)1f2,但是如果我想畫一個時間由下往上的圖,我想把下面叫i1i2(initial)上面叫f1f2(final)也是完全可以的,畫出來的圖也是一樣的。所以,單純將一個普通的圖的代碼交換f1f2的位置也是沒法畫出這交叉線的,程序會自動把f2調(diào)整到上面去。
那么以上已經(jīng)通過一些案例介紹了tikz繪制費曼圖的大部分基本規(guī)則。更多復(fù)雜圖的畫法,如單圈,多圈圖等等,讀者可以查閱tikz-feynman的官方文檔,里面也有很多案例和教程。

一個bug
講完畫圖規(guī)則,現(xiàn)在是否可以實操一下?
很可惜,還不行,筆者在自學(xué)這個宏包用法的時候,遇到了一些很棘手的bug. 具體來說,
就是我照抄?tikz-feynman 的官方文檔給出的示例代碼,得到的費曼圖時間方向和一些其他標記(如傳播子的動量)的方向會全部反了。

該費曼圖的代碼
\feynmandiagram [large, vertical=e to f] {
a -- [fermion] b -- [photon, momentum=\(k\)] c -- [fermion] d,
b -- [fermion, momentum'=\(p_{1}\)] e -- [fermion, momentum'=\(p_{2}\)] c,
e -- [gluon] f,
h -- [fermion] f -- [fermion] i;
};
筆者在過去的很長一段時間里,斷斷續(xù)續(xù)地試圖解決這個問題。
筆者曾在知乎提出相關(guān)問題:
為什么我使用 LaTeX 的 Tikz-feynman 繪制的費曼圖左右和內(nèi)外是反的? - 知乎
https://www.zhihu.com/question/540048369
經(jīng)過知友提醒,也在 github 找到有相同問題的網(wǎng)友。筆者也前往 github 詢問關(guān)于該 bug 是否有任何進展。
https://github.com/JP-Ellis/tikz-feynman/issues/73#issuecomment-1170055409
Tikz-feynman 包的作者 JP-Ellis?在2022年7月也親自回復(fù)了筆者等人的問題:

簡單來說,tikz-feynman 是依賴 LuaLaTeX 的,而自從 texlive2019 開始,似乎由于 Lua 的一些更新,導(dǎo)致了整個圖反掉了。要解決這個問題很可能要自己手動調(diào)整一些 Lua 的源碼。目前來看短時間內(nèi)官方并沒有修復(fù)它的意思。
筆者才疏學(xué)淺,Lua 一點不懂,所以很遺憾,以筆者的檢索能力,目前為止未能找到簡明有效的解決方案。
然而不要忘記使用?LaTeX 的理念是方便自己,為了解決一個bug浪費太多時間事實上違背了我們的初衷。
所以對付這個bug的方法,筆者決定采納的是知乎網(wǎng)友慕子的一個建議:
還有一個辦法,如果需要畫的費曼圖不太多,可以在 overleaf 上的 texlive 2018 畫,配合 standalone 文檔類自動裁剪頁面大小,然后在本地 texlive 2022 的項目里以圖片形式插入。

編譯方法
為了繞開上面提到的這個bug,建議的方法是使用 Overleaf 上的舊版本,即 texlive 2018.

圖中畫圈部分的設(shè)置不能搞錯,使用的編譯器是LuaLateX,texlive 版本用 2018。在編輯界面點左上角的menu就可以調(diào)出這些設(shè)置。
筆者不建議將自己的本地環(huán)境倒退回2018版,因為各種各樣新的模板對以前版本的 LaTeX 未必能兼容。我們將使用 standalone 格式將繪制的費曼圖裁剪為單獨的pdf格式矢量圖,然后下載下來在本地環(huán)境以圖片形式插入。

standalone的用法非常簡單,我把代碼給你你就知道什么意思了。這樣畫出的費曼圖就是單獨地裁出的一個圖片,下載下來就可以作為圖片插入文章了。
\documentclass{standalone}
\usepackage{tikz}
\usepackage[compat=1.1.0]{tikz-feynman}
\begin{document}
\feynmandiagram [費曼圖的一些參數(shù)] {
你的費曼圖
};
\end{document}
這就是我學(xué)習用LaTeX作費曼圖的一點點經(jīng)驗。