我尝试过 def 命令或 pgfmathsetmacro,但费曼图的绘制方式好像变量始终设置为“1”。我发现的唯一解决方法是将费曼图放入宏中,并使用参数作为变量输入,但这不够灵活,无法用于一般用途(例如,我想使用随机数来更改图中的张力等)。以下是一个完整的代码示例,显示中间光子线的曲率不受“\temp”变量更改的影响。
\documentclass[border=2cm]{standalone}
\usepackage{feynmp}
\usepackage[pdftex]{graphicx}
\usepackage{pgf}
\DeclareGraphicsRule{*}{mps}{*}{}
\begin{document}
\begin{fmffile}{fgraphs}
\begin{fmffile}{simple}
\begin{fmfgraph*}(450,320)
\fmftopn{t}{3} \fmfn{plain}{t}{3}
\fmfbottomn{b}{3} \fmfn{plain}{b}{3}
\pgfmathsetmacro{\temp}{0.1}
\fmf{photon, foreground=blue, tension=0.1, right=\temp}{t2,b2}
\end{fmfgraph*}
\end{fmffile}
\end{fmffile}
\end{document}
答案1
vconnect
这是定义的相关部分feynmp.mp
:
elseif match_option (opt[nopt], "right"):
if known opt[nopt]arg:
vlist[nfrom]arc[vlist[nfrom]arc.last]lsr
:= scantokens (opt[nopt]arg);
else:
vlist[nfrom]arc[vlist[nfrom]arc.last]lsr := 1;
fi
如果你查看生成的文件simple.mp
,你会看到它\temp
是按字面意思写的;反斜杠是无操作并且temp
是一个未知变量,因此代码替换为 1。
您可以制作以下“扩展”版本\fmf
:
\documentclass[border=10]{standalone}
\usepackage{feynmp}
\usepackage{graphicx}
\usepackage{pgf}
\DeclareGraphicsRule{*}{mps}{*}{}
\newcommand{\efmf}[1]{%
\begingroup\edef\x{\endgroup\noexpand\fmf{#1}}\x
}
\begin{document}
\begin{fmffile}{simple}
\begin{fmfgraph*}(450,320)
\fmftopn{t}{3} \fmfn{plain}{t}{3}
\fmfbottomn{b}{3} \fmfn{plain}{b}{3}
\pgfmathsetmacro{\temp}{0.1}
\efmf{photon, foreground=blue, tension=0.1, right=\temp}{t2,b2}
\end{fmfgraph*}
\end{fmffile}
\end{document}