费曼图中外部线的长度(TikZ)

费曼图中外部线的长度(TikZ)

我想制作下图

我不明白为什么这个图形在调整大小时会变黑

使用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}

并得到了这个

图2

但是,我不知道如何减少外部线的长度。此外,我不知道如何使线像第一张图那样交叉。有什么建议吗?

答案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}

输出

最初,它会将所有外部顶点放置2cmcenter顶点的外侧。然后,它会将每个v1v2v3顶点放置在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在远离终点的位置。

相关内容