다음 다이어그램을 만들고 싶습니다.
using 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)
. 이 웹사이트에는 이를 활용하는 다른 많은 예가 있으며 Ti 문서에도 이에 대한 예가 있습니다.케이Z-파인만 그 자체.
다양한 전파자를 교차하는 수직선에 관한 질문의 두 번째 부분은 자체적으로 새로운 사용자 정의 장식을 정의하는 사용자 정의 스타일을 사용하여 가장 잘 달성됩니다.
\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