我想制作下图
使用TikZ
(上图是使用feynmf
包完成的)。到目前为止,我已经写了这个:
\documentclass[12pt]{article}
\usepackage[compat=1.1.0]{tikz-feynman}
\begin{document}
\begin{tikzpicture}
\feynmandiagram [ horizontal=i to v1] {
i -- [double] v1 -- [double] v2 -- [double] v3 -- [double] v1,
v2 -- [double] o1,
v3 -- [double] o2,
};
\end{tikzpicture}
\end{document}
并得到了这个
但是,我不知道如何减少外部线的长度。此外,我不知道如何使线像第一张图那样交叉。有什么建议吗?
答案1
如果你要使用自动放置算法钛钾费曼(加拿大运输安全局),那么不幸的是,没有直接的方法可以缩短外部线,因为底层算法不知道哪些线是外部的。
可以调整边缘的绘制距离shorten <=(distance)
(shorten >=(distance)
区别在于它是否切断末端的起点);但这只会影响绘画边缘的长度,而不是算法处理边缘长度的方式,因此我不建议使用这种方法。特别是,如果与样式一起使用,这会看起来很奇怪,particle
因为文本距离行尾很远。
对于您来说,实现所需结果的一个巧妙方法是利用简单的几何形状:
\RequirePackage{luatex85}
\documentclass[tikz,border=10pt]{standalone}
\usepackage[compat=1.1.0]{tikz-feynman}
\begin{document}
\begin{tikzpicture}
\begin{feynman}
\vertex (i);
\vertex [right=2cm of i] (center);
\pgfmathsetmacro\vert{2 * sin(2 * pi / 6 r)};
\pgfmathsetmacro\horz{2 * cos(2 * pi / 6 r)}
\vertex [above right=\vert cm and \horz cm of center] (o1);
\vertex [below right=\vert cm and \horz cm of center] (o2);
\vertex (v1) at ($(center)!0.7!(i)$);
\vertex (v2) at ($(center)!0.7!(o1)$);
\vertex (v3) at ($(center)!0.7!(o2)$);
\diagram* [edges=double] {
(i) -- (v1) -- (v2) -- (v3) -- (v1),
(v2) -- (o1),
(v3) -- (o2),
};
\end{feynman}
\end{tikzpicture}
\end{document}
最初,它会将所有外部顶点放置2cm
在center
顶点的外侧。然后,它会将每个v1
、v2
和v3
顶点放置在0.7
中心与所需外部顶点之间距离 的位置。
我意识到这个解决方案非常特定于上面的布局,根本不是通用的。不过,更一般地说,你可以调整距离above right=(distance) and (distance) of (vertex)
。本网站上还有许多其他利用这一点的例子,Ti 的文档中也有这样的例子钾Z-Feynman 本身。
至于问题的第二部分,有关穿过各个传播器的垂直线,最好使用自定义样式来实现,该样式本身定义了一种新的自定义装饰:
\RequirePackage{luatex85}
\documentclass[tikz,border=10pt]{standalone}
\usepackage[compat=1.1.0]{tikz-feynman}
\tikzfeynmanset{
crossed/.style={
/tikz/postaction={
/tikz/decoration={
show path construction,
lineto code={
\coordinate (tmp1) at ($(\tikzinputsegmentfirst)!5pt!(\tikzinputsegmentlast)$);
\draw
($(tmp1)!4pt!90:(\tikzinputsegmentlast)$)
-- ($(tmp1)!4pt!-90:(\tikzinputsegmentlast)$);
},
},
/tikz/decorate=true,
},
},
crossed'/.style={
/tikz/postaction={
/tikz/decoration={
show path construction,
lineto code={
\coordinate (tmp1) at ($(\tikzinputsegmentlast)!5pt!(\tikzinputsegmentfirst)$);
\draw
($(tmp1)!4pt!90:(\tikzinputsegmentlast)$)
-- ($(tmp1)!4pt!-90:(\tikzinputsegmentlast)$);
},
},
/tikz/decorate=true,
},
},
}
\begin{document}
\begin{tikzpicture}
\begin{feynman}
\vertex (i);
\vertex [right=2cm of i] (center);
\pgfmathsetmacro\vert{2 * sin(2 * pi / 6 r)};
\pgfmathsetmacro\horz{2 * cos(2 * pi / 6 r)}
\vertex [above right=\vert cm and \horz cm of center] (o1);
\vertex [below right=\vert cm and \horz cm of center] (o2);
\vertex (v1) at ($(center)!0.7!(i)$);
\vertex (v2) at ($(center)!0.7!(o1)$);
\vertex (v3) at ($(center)!0.7!(o2)$);
\diagram* [edges=double] {
(i) -- (v1) -- [crossed] (v2) -- [crossed] (v3) -- [crossed'] (v1),
(v2) -- [crossed] (o1),
(v3) -- [crossed] (o2),
};
\end{feynman}
\end{tikzpicture}
\end{document}
确保postaction
后面的内容(在本例中为装饰)绘制在最上面。然后我们告诉它在 中绘制一个装饰postaction
,装饰类型为show path construction
。
这种装饰是一种特殊的装饰,可以访问\tikzinputsegmentfirst
和\tikzinputsegmentlast
,并允许执行任意代码。在这种情况下,我们创建一个5pt
远离起点的临时坐标并将其称为tmp1
,然后我们绘制一条8pt
与原始路径成 90 度角的直线,穿过tmp1
。为了方便起见,我还定义了一种互补样式crossed'
,将tmp1
坐标放置5pt
在远离终点的位置。