Drawing Feynman Diagram in LaTex

两种LaTex费曼图绘制方案

有必要根据自己的摸索介绍一下LaTex关于费曼图的绘制方法。Tex排版环境上关于费曼图的绘制有着成熟的解决方案,比如古老的FeynMF/FeynMP或者Axodraw,尤其对于后者,还有可视化绘制工具JaxoDraw。但是二者因为复杂的交互和语法,存在各种痛点。另外,如果去检索类似的话题,初学者极容易陷入群魔乱舞的海洋,网上莫衷一是的方案缺少对比性。而本文是笔者亲身实践多方尝试凝练的结果,有了横向对比,综合得出TiKz-Feynhand模块是LaTex上表现最好的费曼图绘制方案。

本文旨在引入TiKz-Feynhand费曼图绘制,讲一讲在LaTex中费曼图绘制的内在逻辑,以方便有需要者更为便捷的选择,省去探索试错的学习成本。作为对比,这里介绍2016年更新的AxoDraw2绘制费曼图的方式(FeynMF/FeynMPF过于老旧,这里不做推荐)。

两种方式Bubble圈图的语法:

AxoDraw2

1
2
3
4
5
6
7
8
9
\begin{axopicture}(400,60)%设置画布大小
\AxoGrid(0,0)(10,10)(20,10){LightGray}{0.5}%网格绘制,给画布绘制坐标,方便绘图定位。其中两边的括号定义起始位置,是画布定义之后之于画布的绝对位置,中间括号定义网格单元,花括号分别定义颜色样式和网格线条粗细。
\SetWidth{1.0}
\SetColor{Black}
\Line[arrow](0,0)(200,100)
\Arc[arrow,arrowpos=0.5,arrowlength=5,arrowwidth=2,arrowinset=0.2](85,-20)(40,30,150) \Arc[arrow,arrowpos=0.5,arrowlength=5,arrowwidth=2,arrowinset=0.2](85,20)(40,210,330)%圆弧,中括号设置相应格式获得不同传播子的样式,最后两个括号设置的是圆心在画布上的位置、半径和起始弧度
\Vertex(50,0){2}%顶点,括号和花括号分别代表在画布上的位置和顶点大小的设置
\Vertex(120,0){2}
\end{axopicture}

代码对应的AxoDraw2圈图和基本结构示意

Feynhand

1
2
3
4
5
6
7
8
\begin{tikzpicture}[baseline=(a.base)]%TiKz的绘制环境
\begin{feynhand}%Feynhand的绘制环境
\vertex [dot] (a) at (0,0){};%定义顶点。其中中括号定义的是顶点的类型,(a)是给顶点标记,(0,0)是顶点的坐标位置,是相对位置。注意这里花括号的有无决定顶点的有无
\vertex [dot] (b) at (2,0) {};
\propag [fer] (a) to [half left,edge label = $k$] (b);%定义传播子。由于绘图的专一性,图形命令是高度定制的,中括号中可以定义传播子的类型以及各种属性,包括箭头方向以及矢量文字描述
\propag [anti fermion] (a) to [half right] (b);
\end{feynhand}
\end{tikzpicture}

代码对应的Feynhand圈图

很明显后者的语法更简洁,下面要介绍本文的重点即相应绘图的逻辑。

AxoDraw2简介

AxoDraw2绘制费曼图的逻辑非常容易理解,它的定义环境类似于PythonGUI画布的概念,\begin{axopicture}\end{axopicture}定义的是一个绘制区域(画布),对应的绘制结构就是点和线,\Vertex\Line,曲线的语法是\Arc,都为大写字母开头。因为是引用画布的概念,我们一般在画布环境下定义网格\AxoGrid,然后依据网格的位置进行作图。这里点和线指令只需要给定两点在网格上的坐标就能在画布上绘制对应的图,Arc的绘制同理,只不过条件上需要坐标和弧度的限制,具体格式可以参看手册。因为是画图制图的逻辑,所以AxoDraw2可以方便地使用可视化工具JaxoDraw。不过AxoDraw的痛点在于不能自适应的调节在数学环境中的位置(AxoDraw2 2016的手册给了一种自定义绘制单元的方法可以图像单元实现数学环境中的自适应对齐,但是步骤非常繁琐),虽然上手非常容易,但是对于复杂的费曼图绘制仍然是非常麻烦。

另外一点是,AxoDraw2要是想直接在PDFLaTex或者XeLaTex上实现图的渲染,还需要在调用axphelp这个脚本实现对.dvi到.ps文件的转换,因为AxoDraw就是基于对.dvi文件编译过程。这额外增加了编译的步骤。

TiKz-Feynhand简介

到目前为止,个人觉得TiKz-Feynhand是绘制费曼图的最佳解决方案。它的绘制指令基于TiKz绘制模块。而TiKz在LaTex上的绘图支持是十分完备的,也非常容易上手。实际上TiKz-Feynhand只是在TiKz-Feynman的基础上小小改进,后者由于受限于渲染引擎的使用,只能在LuaLaTex编译环境下才能实现,或者在其他编译环境中调用Lua的编译指令。所以TiKz-Feynman即便语法简单功能丰富,但使用场景不够友好,对于大多数期刊PDFLaTex的编译要求很难进行推广。Feynhand正是为了解决这一问题而诞生,虽然语法简洁程度上有所退让,但是依然非常容易入手,而且可以很方便地与Tex的数学环境相结合,个人以为真正解决了LaTex绘制费曼图的一些列问题。

Feynhand的语法环境可以直接在TiKz的绘制环境\begin{tikzpicture}\end{tikzpicture}中使用,这种兼容性决定了TiKz绘制命令基本上都可以在Feynhand的绘制环境\begin{feynhand}\end{feynhand}下实现。由于是定制的格式,Feymhand的绘制逻辑不依赖于画布,而是存粹的根据个人需要给定坐标。设置的坐标是相对位置,而非AxoDraw设置画布的绝对位置。如此我们可以在设定坐标原点的基础上根据正交坐标系任意确定费曼图绘制的区域。对于定制的费曼图顶点、费米线、玻色线等格式可以参看Feynhand手册。该项目是Max Dohse个人开发,目前基本上的费曼图都能实现,风格定制的选择目前还在开发中,但是现有的功能可以完全满足复杂费曼图的绘制。