如何在 feynmf 中创建双线费米子风格?

如何在 feynmf 中创建双线费米子风格?

我正在尝试在 feynmf 中定义一种新的线型,它应该用彩色流符号表示胶子。每条线应该由两条平行的费米子线组成,每条线都有一个箭头。箭头应该指向相反的方向。它应该看起来像这张图中的中间线:http://inspirehep.net/record/782277/files/W-exchange-cond-double2.png

feynmf 具有双线样式,但它有一个大箭头,而不是两个指向相反方向的箭头。原则上支持创建自定义样式,有关如何创建自定义样式的说明,请参见第 2.8.1 章(第 36 页)http://mirrors.ctan.org/macros/latex/contrib/feynmf/fmfman.pdf

我查看了 feynmf 的代码,以了解标准样式是如何定义的。以下是一些可能有用的代码片段:

style_def plain expr p = % single line without arrow
  cdraw p;
enddef;
style_def plain_arrow expr p = % single line with arrow
  cdraw p;
  cfill (arrow p);
enddef;
style_def dbl_plain expr p = % double line without arrow
  draw_double p;
enddef;
style_def dbl_plain_arrow expr p = % double line with one big arrow
  draw_double_arrow p;
enddef;

这些定义相当简单,我也能理解。但是,它们使用了一些命令,这些命令的定义如下:

%
% |draw_double p| draws a double line.
%    \begin{macrocode}
style_def double expr p =
  save oldpen;
  pen oldpen;
  oldpen := currentpen;
%    \end{macrocode}
% draw a thick linn
%    \begin{macrocode}
  pickup oldpen scaled 3;
  ccutdraw p;
%    \end{macrocode}
% and remove the stuffing
%    \begin{macrocode}
  pickup oldpen;
  cullit; undraw p; cullit;
enddef;
style_def double_arrow expr p =
  draw_double p;
  shrink (1.5);
    cfill (arrow p);
  endshrink;
enddef;
%    \end{macrocode}
%

不幸的是,这段代码我再也看不懂了。(这两个代码片段都复制自http://mirrors.ctan.org/macros/latex/contrib/feynmf/feynmf.dtx,第一个片段中的评论是我写的)。

我真的很感激有人能帮助我定义“带有相反箭头的双线”样式!

提前致谢,Photon

答案1

Feynmf 和 feynmp 实际上并不绘制双线。它们实际上绘制的是一条宽线,顶部有一条白线来提供两条线之间的间隙。

这会导致绘制两条独立的平行线出现问题,因为没有两条线需要修改。这也意味着这些线总是非常接近。为此,我建议生成一个框架,计算移位点,然后连接这些移位点。

我在下面包含了执行此操作的代码。它首先生成一个要构建的框架(以点显示,但在实际图中将以虚线绘制,并且实际上不需要,因为这两个点都是外部顶点)。然后我使用命令\fmfvoffset{distance}{point}{towards_point}和声明一个新点,该新点分别在 方向或 处与\fmfvoffsetangle{distance}{angle}{point}{towards_point}顶点偏移point的距离以及与朝向方向的角度。然后分别使用或访问这些新点的名称。内部指针以 45 度偏移 7.1 的距离,因为这相当于向下 5 个单位,然后向侧面偏移 5 个单位。distancetowards_pointangletowards_point\fmfoffsetpoint{point}{towards_point}\fmfoffsetpoint{point}{towards_point[angle]}

希望这可以帮助!

\begin{fmffile}{shiftedarrow}
\newcommand{\fmfvoffset}[3]{\fmfforce{vloc(__#2)+#1*unitvector(vloc(__#3)-vloc(__#2))}{#2.__#3}}
\newcommand{\fmfvoffsetangle}[4]{\fmfforce{vloc(__#3)+#1*unitvector(vloc(__#4)-vloc(__#3)) rotated #2}{#3.__#4[#2]}}
\newcommand{\fmfoffsetpoint}[2]{#1.__#2}
\begin{fmfgraph}(60,60)
\fmftop{t}
\fmfbottom{b}
\fmf{dots}{t,b}
\fmf{dots,left=1}{t,b}
\fmf{dots,right=1}{t,b}
\fmffreeze
\fmfvoffset{(-5)}{t}{b}
\fmfvoffset{(-5)}{b}{t}
\fmfvoffsetangle{7.1}{45}{t}{b}
\fmfvoffsetangle{7.1}{-45}{t}{b}
\fmfvoffsetangle{7.1}{45}{b}{t}
\fmfvoffsetangle{7.1}{-45}{b}{t}
\fmf{scalar,left=1}{\fmfoffsetpoint{t}{b},\fmfoffsetpoint{b}{t},\fmfoffsetpoint{t}{b}}
\fmf{fermion,right=0.8}{\fmfoffsetpoint{b}{t[-45]},\fmfoffsetpoint{t}{b[45]},}
\fmf{fermion}{\fmfoffsetpoint{t}{b[45]},\fmfoffsetpoint{b}{t[-45]}}
\fmf{fermion,right=0.8}{\fmfoffsetpoint{t}{b[-45]},\fmfoffsetpoint{b}{t[45]}}
\fmf{fermion}{\fmfoffsetpoint{b}{t[45]},\fmfoffsetpoint{t}{b[-45]}}
\end{fmfgraph}

输出为:在此处输入图片描述

相关内容