使用 feynmp fmffor 变量时出现的问题

使用 feynmp fmffor 变量时出现的问题

这是这个问题。egreg 提供的解决方案有效,但尝试在 fmffor 循环内更新变量时,相同的解决方案无效。下面显示了一个完整的示例。预期的行为是产生两个光子,每个光子都向相反方向弯曲(右=+0.5,右=-0.5),但在 simple.mp 文件中,\temp 始终设置为 +0.5。

\documentclass[border=2cm]{standalone}
\usepackage{feynmp}
\usepackage[pdftex]{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}{-1.5}
      \begin{fmffor}{n}{1}{1}{2}
        \pgfmathsetmacro{\temp}{\temp+1}
        \efmf{photon, foreground=blue, tension=0.1, right=\temp}{t2,b2}
      \end{fmffor}
    \end{fmfgraph*}
\end{fmffile}

\end{document}

这是另一个完整的示例,其中包括 fmffor 所需的功能(它应该在左侧显示向左弯曲的光子环,在右侧显示向右弯曲的光子环):

\documentclass[border=2cm]{standalone}
\usepackage{feynmp}
\usepackage{graphicx}
\usepackage{xparse}
\usepackage{pgf}

\DeclareGraphicsRule{*}{mps}{*}{}

\ExplSyntaxOn
\NewDocumentCommand{\efmf}{mm}
 {
  \xfmf_fmf:xn { #1 } { #2 }
 }
\cs_new_protected:Nn \xfmf_fmf:nn { \fmf{#1}{#2} }
\cs_generate_variant:Nn \xfmf_fmf:nn { x }
\NewDocumentCommand{\fmfcycle}{mmmm}
 {
  \cs_set:Nn \__xfmf_fmfcycle:n { #4 }
  \int_step_function:nnnN { #1 } { #2 } { #3 } \__xfmf_fmfcycle:n
 }
\ExplSyntaxOff

\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}{-2}
      \begin{fmffor}{n}{1}{1}{3}
        \pgfmathsetmacro{\temp}{\temp+1}
        \efmf{photon, foreground=blue, tension=0.1, right=\temp/5}{t[n],b[n]}
      \end{fmffor}
    \end{fmfgraph*}
\end{fmffile}

\end{document}

答案1

环境fmffor不会多次执行主体。

这里我提出了一个不同的循环宏。前三个参数分别是起始点、步骤和终止点。循环期间您可以像#1在第四个参数中一样引用当前值。

\documentclass[border=2cm]{standalone}
\usepackage{feynmp}
\usepackage{graphicx}
\usepackage{xparse}

\DeclareGraphicsRule{*}{mps}{*}{}

\ExplSyntaxOn
\NewDocumentCommand{\efmf}{mm}
 {
  \xfmf_fmf:xn { #1 } { #2 }
 }
\cs_new_protected:Nn \xfmf_fmf:nn { \fmf{#1}{#2} }
\cs_generate_variant:Nn \xfmf_fmf:nn { x }
\NewDocumentCommand{\fmfcycle}{mmmm}
 {
  \cs_set:Nn \__xfmf_fmfcycle:n { #4 }
  \int_step_function:nnnN { #1 } { #2 } { #3 } \__xfmf_fmfcycle:n
 }
\ExplSyntaxOff

\begin{document}

\begin{fmffile}{simple}
    \begin{fmfgraph*}(450,320)
      \fmftopn{t}{3}    \fmfn{plain}{t}{3}
      \fmfbottomn{b}{3} \fmfn{plain}{b}{3}
      \fmfcycle{0}{1}{1}{
        \efmf{photon, foreground=blue, tension=0.1, right=-0.5+#1}{t2,b2}
      }
    \end{fmfgraph*}
\end{fmffile}

\end{document}

在此处输入图片描述

就像在我之前的代码中一样,我删除了pdftex选项graphicx和无用\begin{fmffile}{fgraphs}以及匹配的\end{fmffile}行。

相关内容