LaTeX 专题:tikz-feynman绘制费曼图
%% 好早以前,我做过一点简短的 LaTeX 简明入门经验分享。
%% 现在正好也是在学习量子场论,对费曼图有了更多的理解,也想做一个 LaTeX 绘制费曼图的教程。
%% Tikz 是 LaTeX 中用于画图的宏包,功能强大。其中的 tikz-feynman 是可以用于绘制各种费曼图的强大工具。
%% 读者如果需要任何资料、源码,可以联系作者主页的邮箱或动态页置顶的Q群。

基础知识储备
在开始之前,我想可以不妨假设读者已经具有一定的粒子物理的基础知识,否则你应该用不着这篇专栏。
也就是说,读者已经熟悉费米子、胶子、矢量玻色子、标量粒子等在费曼图中对应的线型,熟悉顶点、外腿、传播子、树图、圈图等概念,熟悉用箭头表示电荷的流动方向和区分正反粒子的规则。
如果对这些不熟悉,可以考虑学习格里菲斯的粒子物理导论。

画图规则
然后,我们可以开始讲费曼图的具体画法了。
我们将以几个简单的案例来说明。
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^{-}\)],
};
成品图

规则解释:
我已经在生成的图上标记出了各个顶点在代码中对应的字母。
第一行的 horizongtal 设置了ab两节点以a左b右的形式固定为水平方向。这一设置同时标定了接下来所有外腿、传播子绘制的正方向。如果你需要一个竖起来的图,也可以指定为vertical。
(不过需要注意,这未必表示费曼图的时间流向。)
那么剩下的部分对照代码和图就比较好理解了,程序会自动按从上往下,从左到右的规则,围绕之前声明固定水平的节点ab绘制你所指定的线。
(同时也可以注意到绘制两边外腿时的正方向就是按代码各个节点顺序,比如正电子本应是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\)],
};
成品图

这个例子主要是展示更多线型,大家可以对照代码学习。
3 交换末态粒子形成的交叉线
代码
\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}
成品图

有的图,交换两个末态粒子和原来的图不是等价的,这种图需要用这种交叉线表示。不过正常语法画树图,程序默认画的是不交叉的,所以只能用这个案例的方式,将两个子图叠加,第一个图在a→f1和b→f2间不画任何线,但起到固定f1f2的作用,再通过第二个图画出交叉线。
需要强调的一点是,除了被声明为horizontal或vertical,用来固定整个图方向的两个节点,其他外腿节点叫什么名字是无关紧要的,程序只会根据周围的环境设置节点的位置。虽然上面几个案例都是左边i1i2右边f1f2,但是如果我想画一个时间由下往上的图,我想把下面叫i1i2(initial)上面叫f1f2(final)也是完全可以的,画出来的图也是一样的。所以,单纯将一个普通的图的代码交换f1f2的位置也是没法画出这交叉线的,程序会自动把f2调整到上面去。
那么以上已经通过一些案例介绍了tikz绘制费曼图的大部分基本规则。更多复杂图的画法,如单圈,多圈图等等,读者可以查阅tikz-feynman的官方文档,里面也有很多案例和教程。

一个bug
讲完画图规则,现在是否可以实操一下?
很可惜,还不行,笔者在自学这个宏包用法的时候,遇到了一些很棘手的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;
};
笔者在过去的很长一段时间里,断断续续地试图解决这个问题。
笔者曾在知乎提出相关问题:
为什么我使用 LaTeX 的 Tikz-feynman 绘制的费曼图左右和内外是反的? - 知乎
https://www.zhihu.com/question/540048369
经过知友提醒,也在 github 找到有相同问题的网友。笔者也前往 github 询问关于该 bug 是否有任何进展。
https://github.com/JP-Ellis/tikz-feynman/issues/73#issuecomment-1170055409
Tikz-feynman 包的作者 JP-Ellis 在2022年7月也亲自回复了笔者等人的问题:

简单来说,tikz-feynman 是依赖 LuaLaTeX 的,而自从 texlive2019 开始,似乎由于 Lua 的一些更新,导致了整个图反掉了。要解决这个问题很可能要自己手动调整一些 Lua 的源码。目前来看短时间内官方并没有修复它的意思。
笔者才疏学浅,Lua 一点不懂,所以很遗憾,以笔者的检索能力,目前为止未能找到简明有效的解决方案。
然而不要忘记使用 LaTeX 的理念是方便自己,为了解决一个bug浪费太多时间事实上违背了我们的初衷。
所以对付这个bug的方法,笔者决定采纳的是知乎网友慕子的一个建议:
还有一个办法,如果需要画的费曼图不太多,可以在 overleaf 上的 texlive 2018 画,配合 standalone 文档类自动裁剪页面大小,然后在本地 texlive 2022 的项目里以图片形式插入。

编译方法
为了绕开上面提到的这个bug,建议的方法是使用 Overleaf 上的旧版本,即 texlive 2018.

图中画圈部分的设置不能搞错,使用的编译器是LuaLateX,texlive 版本用 2018。在编辑界面点左上角的menu就可以调出这些设置。
笔者不建议将自己的本地环境倒退回2018版,因为各种各样新的模板对以前版本的 LaTeX 未必能兼容。我们将使用 standalone 格式将绘制的费曼图裁剪为单独的pdf格式矢量图,然后下载下来在本地环境以图片形式插入。

standalone的用法非常简单,我把代码给你你就知道什么意思了。这样画出的费曼图就是单独地裁出的一个图片,下载下来就可以作为图片插入文章了。
\documentclass{standalone}
\usepackage{tikz}
\usepackage[compat=1.1.0]{tikz-feynman}
\begin{document}
\feynmandiagram [费曼图的一些参数] {
你的费曼图
};
\end{document}
这就是我学习用LaTeX作费曼图的一点点经验。