費曼圖中外部線的長度(TikZ)

費曼圖中外部線的長度(TikZ)

我想做下圖

我不明白為什麼這個圖在調整大小時會變黑

using TikZ(上圖是使用feynmfpackage完成的)。到目前為止我已經寫了這個:

\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

如果您打算使用自動放置演算法kZ-費曼CTAN),那麼不幸的是,沒有直接的方法來縮短外部線,因為底層演算法不知道哪些線是外部的。

可以調整用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。然後,它將每個v1v2v3頂點放置在0.7中心與所需外部頂點之間的距離。

我意識到這個解決方案對於上面的佈局來說是非常具體的,根本不通用。但更一般地說,您可以調整above right=(distance) and (distance) of (vertex).本網站上還有很多其他範例使用此功能,Ti 的文檔中也有這樣的範例kZ-費曼本身。

至於你的問題的第二部分關於穿過各種傳播器的垂直線,最好使用自訂樣式來實現,該樣式本身定義了新的自訂裝飾:

\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遠離起點的臨時座標並將其命名為 ,然後繪製一條與經過 的原始路徑成 90 度角的長tmp1直線。為了方便起見,我還定義了一種補充樣式,將座標放置在遠離末端的位置。8pttmp1crossed'tmp15pt

相關內容