使用 feynmp 变量时出现的问题

使用 feynmp 变量时出现的问题

我尝试过 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}

在此处输入图片描述

相关内容