我想做下圖
using TikZ
(上圖是使用feynmf
package完成的)。到目前為止我已經寫了這個:
\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
如果您打算使用自動放置演算法鈦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
。然後,它將每個v1
、v2
和v3
頂點放置在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
直線。為了方便起見,我還定義了一種補充樣式,將座標放置在遠離末端的位置。8pt
tmp1
crossed'
tmp1
5pt