次のような図を作りたい
使用して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
自動配置アルゴリズムを使用する場合は、ティけZ-ファインマン(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)
この Web サイトにはこれを利用した他の例がたくさんあり、Ti のドキュメント内にもこの例があります。けZ-ファインマンそのもの。
さまざまなプロパゲータを横切る垂直線に関する質問の 2 番目の部分については、新しいカスタム装飾を定義するカスタム スタイルを使用するのが最適です。
\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