背景
什么时候标签显示为费因普,它们超出了图形的框。可以使用\fmfframe
分配一个不可见的框架来容纳它们,但似乎需要手动调整所有参数。
问题
是否有一种简单的方法可以自动将费曼图放置在适当的框架中?
具体来说,我希望能够在方程式中自然地使用图形,并且尽量减少人工干预。以下示例有效,但存在以下问题:
- 我习惯
\raisebox{-0.5\height}{}
将图表垂直居中,但效果不太好。我该如何解决这个问题? 人们可以用
\fmfframe(<left>,<top>)(<right>,<bottom>){}
它来“填充”图形,但我能看到的获取这些值的唯一方法是手动调整(使用一个框架,这样\fbox
我就能看到我在做什么)。注意:中的所有数字
()
都是根据\unitlength
定义的feynmp
(默认为1pt
)。- 的一个丑陋“特性”
\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 端,而且更容易调整,因为你只需添加额外的移位,而不是硬编码数字。