Länge externer Linien in Feynman-Diagrammen (TikZ)

Länge externer Linien in Feynman-Diagrammen (TikZ)

Ich möchte das folgende Diagramm erstellen

Ichverstehenicht,warumdieseAbbildungschwarzwird,wennsieinderGrößeangepasstwird

using TikZ(Das obige Diagramm wurde mit feynmfPaket 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

Diagramm2

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 particleStil 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}

Ausgabe

Dadurch werden zunächst alle äußeren Scheitelpunkte 2cmvom Scheitelpunkt aus platziert center. Anschließend werden alle Scheitelpunkte v1und Scheitelpunkte im Abstand zwischen dem Mittelpunkt und dem gewünschten äußeren Scheitelpunkt platziert.v2v30.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}

Ausgabe

Das postactionsorgt 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 \tikzinputsegmentfirstund bietet \tikzinputsegmentlastund die Ausführung beliebigen Codes ermöglicht. In diesem Fall erstellen wir eine temporäre Koordinate 5ptweg vom Start und nennen sie tmp1. Anschließend zeichnen wir eine gerade Linie, die 8ptlang 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 .tmp15pt

verwandte Informationen