![使用 feynmp fmffor 变量时出现的问题](https://linux22.com/image/394060/%E4%BD%BF%E7%94%A8%20feynmp%20fmffor%20%E5%8F%98%E9%87%8F%E6%97%B6%E5%87%BA%E7%8E%B0%E7%9A%84%E9%97%AE%E9%A2%98.png)
这是这个问题。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}
行。