Ich möchte das folgende Diagramm erstellen
using TikZ
(Das obige Diagramm wurde mit feynmf
Paket erstellt). Bisher habe ich Folgendes geschrieben:
\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}
und erhielt dies
Ich kann jedoch nicht herausfinden, wie ich die Länge der äußeren Linien verringern kann. Außerdem kann ich nicht herausfinden, wie ich Linien wie in der ersten Abbildung kreuzen kann. Irgendwelche Vorschläge?
Antwort1
Wenn Sie die automatischen Platzierungsalgorithmen inTikZ-Feynman(CTAN), dann gibt es leider keine direkte Möglichkeit, die externen Zeilen zu kürzen, da der zugrunde liegende Algorithmus keine Ahnung hat, welche Zeilen extern sind.
Es ist möglich, die Länge der Kanten mit shorten <=(distance)
und anzupassen shorten >=(distance)
(der Unterschied besteht darin, ob der Anfang oder das Ende abgeschnitten wird); dies betrifft jedoch nur dieZeichnungder Kante und nicht die Art und Weise, wie der Algorithmus die Kantenlänge behandelt, und daher würde ich die Verwendung nicht wirklich empfehlen. Insbesondere wird dies in Verbindung mit dem particle
Stil seltsam aussehen, da der Text weit vom Zeilenende entfernt sein wird.
In Ihrem Fall können Sie das gewünschte Ergebnis am besten erzielen, indem Sie die einfache Geometrie ausnutzen:
\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}
Dadurch werden zunächst alle äußeren Scheitelpunkte 2cm
vom Scheitelpunkt aus platziert center
. Anschließend werden alle Scheitelpunkte v1
und Scheitelpunkte im Abstand zwischen dem Mittelpunkt und dem gewünschten äußeren Scheitelpunkt platziert.v2
v3
0.7
Mir ist klar, dass diese Lösung sehr spezifisch für das obige Layout ist und überhaupt nicht allgemeingültig ist. Allgemeiner ausgedrückt können Sie jedoch die Abstände in anpassen above right=(distance) and (distance) of (vertex)
. Auf dieser Website gibt es zahlreiche weitere Beispiele, die dies nutzen, und in der Dokumentation für Ti finden Sie Beispiele dafür.kZ-Feynman selbst.
Was den zweiten Teil Ihrer Frage bezüglich der senkrechten Linien betrifft, die die verschiedenen Propagatoren kreuzen, lässt sich dies am besten mit einem benutzerdefinierten Stil erreichen, der selbst eine neue benutzerdefinierte Dekoration definiert:
\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}
Das postaction
sorgt dafür, dass das Folgende (in diesem Fall die Dekoration) oben gezeichnet wird. Wir sagen ihm dann, dass es eine Dekoration in zeichnen soll postaction
, und der Dekorationstyp ist show path construction
.
Diese Verzierung ist eine spezielle Art der Verzierung, die Zugriff auf \tikzinputsegmentfirst
und bietet \tikzinputsegmentlast
und die Ausführung beliebigen Codes ermöglicht. In diesem Fall erstellen wir eine temporäre Koordinate 5pt
weg vom Start und nennen sie tmp1
. Anschließend zeichnen wir eine gerade Linie, die 8pt
lang ist und im 90-Grad-Winkel zum ursprünglichen Pfad verläuft, der durch geht tmp1
. Der Einfachheit halber habe ich auch einen komplementären Stil definiert , der die Koordinate weg vom Ende crossed'
platziert .tmp1
5pt