背景

背景

背景

什么时候标签显示为费因普,它们超出了图形的框。可以使用\fmfframe分配一个不可见的框架来容纳它们,但似乎需要手动调整所有参数。

问题

是否有一种简单的方法可以自动将费曼图放置在适当的框架中?

具体来说,我希望能够在方程式中自然地使用图形,并且尽量减少人工干预。以下示例有效,但存在以下问题:

  1. 我习惯\raisebox{-0.5\height}{}将图表垂直居中,但效果不太好。我该如何解决这个问题?
  2. 人们可以用\fmfframe(<left>,<top>)(<right>,<bottom>){}它来“填充”图形,但我能看到的获取这些值的唯一方法是手动调整(使用一个框架,这样\fbox我就能看到我在做什么)。

    注意:中的所有数字()都是根据\unitlength定义的feynmp(默认为1pt)。

  3. 的一个丑陋“特性”\fmfframe是,它排除了参数中的空行(这对于分隔图形定义很有用)。有什么简单的解决方法吗?

这是一个最小的工作示例:

\documentclass{minimal}
\usepackage{feynmp}

% Needed to interpret generated *.1, *.2 etc. as ps files.
\DeclareGraphicsRule{*}{mps}{*}{} 

\setlength{\fboxsep}{0pt}
\begin{document}
\begin{fmffile}{fgraphs}
\begin{equation}
  5\times
  \raisebox{-0.5\height}{     % 1: center vertically -- does not quite work.
    \fbox{                    % Draw fram so we can tweak the fmfframe
      \fmfframe(5,17)(20,17){ % 2: Had to manually guess these.
        \begin{fmfgraph*}(40,30)
          % Note that the size is given in normal parentheses 
          % instead of curly brackets in units of \unitlength 
          % (1pt by default)
          \fmfleft{i1,i2} % Define external vertices from bottom to top
          \fmfright{o1,o2} 
          \fmf{fermion}{i1,v1,o1} 
          \fmf{fermion}{i2,v2,o2} 
          \fmf{photon,tension=0.3}{v1,v2}
          % 3: Blank lines not allowed in fmfframe!
          \fmflabel{$\vec{p}$}{i1}
          \fmflabel{$\vec{q}$}{i2}
          \fmflabel{$\vec{p}+\vec{k}$}{o1}
          \fmflabel{$\vec{p}-\vec{k}$}{o2}
        \end{fmfgraph*}
      }
    }
  }
  = 5i V_k.
\end{equation}
\end{fmffile}
\end{document}

使用以下命令进行编译:

pdflatex tst
mpost fgraphs
pdflatex tst
pdflatex tst

要得到:

示例的输出。

答案1

在对 或 METAPOST 一无所知的情况下feynmp,我删除了fbox,我只是尝试将所有内容放入 TikZ 节点中。然后我根据 的边界框的基线进行了居中,tikzpicture结果居中了。所以剩下的问题是,它有多强大?,我一点头绪都没有。但似乎没有坏盒投诉等。我很遗憾,这得由你和其他熟练的 METAPOST 用户来测试并尝试解决这个问题。

\documentclass{article}
\usepackage{feynmp,tikz}

% Needed to interpret generated *.1, *.2 etc. as ps files.
\DeclareGraphicsRule{*}{mps}{*}{} 

\setlength{\fboxsep}{0pt}
\begin{document}
To populate this line and to see how far is the equation spacing. 
\begin{fmffile}{fgraphs}
\begin{equation}
  5\times
\begin{tikzpicture}[baseline=(current bounding box.center)]
\node {
      \fmfframe(5,17)(20,17){ % 2: Had to manually guess these.
        \begin{fmfgraph*}(40,30)
          % Note that the size is given in normal parentheses 
          % instead of curly brackets in units of \unitlength 
          % (1pt by default)
          \fmfleft{i1,i2} % Define external vertices from bottom to top
          \fmfright{o1,o2} 
          \fmf{fermion}{i1,v1,o1} 
          \fmf{fermion}{i2,v2,o2} 
          \fmf{photon,tension=0.3}{v1,v2}
          % 3: Blank lines not allowed in fmfframe!
          \fmflabel{$\vec{p}$}{i1}
          \fmflabel{$\vec{q}$}{i2}
          \fmflabel{$\vec{p}+\vec{k}$}{o1}
          \fmflabel{$\vec{p}-\vec{k}$}{o2}
        \end{fmfgraph*}
      }
    };
    \end{tikzpicture}
  = 5i V_k.
\end{equation}
\end{fmffile}
\end{document}

在此处输入图片描述

因为我什么都不懂,所以我也可以尝试一些愚蠢的事情,比如将环境fmffile完全放在节点内,换句话说,将其嵌套在里面tikzpicture。这会产生相同的结果。但我觉得第二个更强大。

回到手动猜测的参数\fmfframe,我可以看到,如果省略手动设置的线条,边界框仅覆盖图形而不覆盖矢量p,q,p+k等。因此,我只放置了一个不可见的矩形来设置放大的边界框2.5ex。这不是一个完美的解决方案,但至少可以让你预测遗漏了多少。所以我只是选择了,2.5ex因为我知道只有一个带箭头的字母突出来了。

\documentclass{article}
\usepackage{feynmp,tikz}
% Needed to interpret generated *.1, *.2 etc. as ps files.
\DeclareGraphicsRule{*}{mps}{*}{} 
\begin{document}
To populate this line and to see how far is the equation spacing. 

\begin{equation}
  5\times
\begin{tikzpicture}[baseline=(current bounding box.center)]
\node {\begin{fmffile}{fgraphs}
        \begin{fmfgraph*}(40,30)
          \fmfleft{i1,i2} % Define external vertices from bottom to top
          \fmfright{o1,o2} 
          \fmf{fermion}{i1,v1,o1} 
          \fmf{fermion}{i2,v2,o2} 
          \fmf{photon,tension=0.3}{v1,v2}
          %
          \fmflabel{$\vec{p}$}{i1}
          \fmflabel{$\vec{q}$}{i2}
          \fmflabel{$\vec{p}+\vec{k}$}{o1}
          \fmflabel{$\vec{p}-\vec{k}$}{o2}
        \end{fmfgraph*}
    \end{fmffile}
        };
        \path[use as bounding box] ([shift={(2.5ex,2.5ex)}]current bounding box.north east) rectangle ([shift={(-2.5ex,-2.5ex)}]current bounding box.south west);
    \end{tikzpicture}
  = 5i V_k.
\end{equation}
Same thing here... To populate this line and protect it at all costs. Now fmffile is inside the TikZ picture...
\end{document}

从下图可以看出,我忘记考虑水平效应,所以等号比它应该在的位置稍微靠左了一点。如果费曼绘图的边界框上有句柄,TikZ 可以轻松进行居中和所有其他花哨的事情。否则,至少你不必重新编译费曼绘图,因为边界框计算现在在 TikZ 端,而且更容易调整,因为你只需添加额外的移位,而不是硬编码数字。

在此处输入图片描述

相关内容