是否可以使用 FeynMP 绘制椭圆形?以下是 blob(即一个圆圈)的 mwe:
\documentclass[10pt,a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{feynmp}
\usepackage{rotating}
\setlength{\unitlength}{1mm}
\pagestyle{empty}
\usepackage{ifpdf}
\ifpdf
\DeclareGraphicsRule{*}{mps}{*}{}
\fi
\makeatletter
\def\endfmffile{%
\fmfcmd{\p@rcent\space the end.^^J%
end.^^J%
endinput;}%
\if@fmfio
\immediate\closeout\@outfmf
\fi
\IfFileExists{\thefmffile.mp}{\immediate\write18{mpost \thefmffile}}{}
\let\thefmffile\relax
}
\makeatother
\begin{document}
\begin{center}
\begin{fmffile}{lower_bloba}
\begin{fmfgraph*}(50,70)
\fmfrightn{r}{1}
\fmfleftn{l}{1}
\fmftopn{t}{1}
\fmfblob{.5w}{v1}
\fmf{fermion}{l1,v1}
\fmf{fermion}{v1,r1}
\fmf{photon}{t1,v1}
\end{fmfgraph*}
\end{fmffile}
\end{center}
\end{document}
答案1
我认为如果不修改 FeynMP 源就不可能实现,或者至少我不知道如何实现。
但是您可以修改 feynmp.sty 和 feynmp.mp 的源代码来执行您想要的操作。请确保将 feynmp.sty 和 feynmp.mp 放在编译 latex 文件的同一目录中,然后执行以下操作。(编辑:请参阅下文以了解 feynmp.mp 的更简单补丁)
在文件 feynmp.mp:1325(第 1325 行)中有 vblob() 的定义。基于它,我在其下方创建了另一个名为 vblobOval() 的过程:
vardef vblobOval (expr bd) (text vl)=
forsuffixes $=vl:
if not vexists $: venter $; fi
vlist[vlookup $]decor.shape := fullcircle xscaled 1.4;
vlist[vlookup $]decor.size := bd;
vlist[vlookup $]decor.sty := "shaded";
endfor
enddef;
唯一的区别是xscaled 1.4
使圆变成椭圆的部分(你可以使用这个数字;我觉得 1.4 不错)。
在文件 feynmp.sty:289 中有 的定义\fmfblob
。基于它我写了\fmfblobOval
\def\fmfblobOval#1#2{\fmfcmd{vblobOval ((#1), \fmfpfx{#2});}}
低于原来的\fmfblob
,所以你仍然拥有两者。
现在在你的 latex 文件上,\fmfblob
你可以使用\fmfblobOval
,
\fmfblobOval{.5w}{v1}
你会得到一个椭圆形的顶点:
编辑:可以编写一行补丁到 feynmp.mp,以包含 blob 的椭圆样式。如果你写
elseif match_prefix (n, "oval"): p := fullcircle xscaled 1.4;
在 feynmp.mp 中的第 1282 行以下,您可以使用以下行在您的 latex 文件中绘制一个椭圆形的斑点:
\fmfv{decor.shape=oval, decor.filled=shaded, decor.size=(.5w)}{v1}
该命令\fmfv
是绘制 blob 的等效方法(请参阅 FeynMF 手册第 17 页),它允许明确指定选项。因此,您可以使用上面单行补丁中的新“椭圆”形状。