Wie kann ich CS-String-Diagramme zeichnen?

Wie kann ich CS-String-Diagramme zeichnen?

Gibt es ein spezielles Paket zum Rendern von String-Diagrammen (CS-Strings, nicht Physik-Strings) wie in der folgenden Abbildung?

Saitendiagramm

Alternativ: Wie würden Sie eine solche Figur erstellen? Können Sie ein (sehr) minimales Beispiel liefern?

Antwort1

So können Sie dies tun Tikz:

Grundgedanken:

  • zeichne ein paar Linien
  • Setzen Sie einige \nodes für die Etiketten unten
  • \draweinige dekorierte Wege oben
  • Denken Sie daran, relevante coordinates zu berücksichtigen, um diese Aktionen zu unterstützen
  • Definieren Sie /.styles, während Sie den Code vereinfachen und Parameteränderungen nur an einer Stelle vornehmen
  • Versuchen Sie einen ausgewogenen Ansatz, der für Anfänger nicht zu schwierig ist UND verwenden Sie einige Pfadfunktionen für schöneren Code

Ergebnis

Linien:

Lassen Sie uns das Erste verdauen.

    \draw[bar] (0,0) coordinate (A) -- (1.5,0)  coordinate (B) node[a]{$a$};

Denken Sie daran, zunächst eine einfache Linie in absoluten Koordinaten zu zeichnen:

    \draw (0,0) -- (1.5,0);

Da Tikzes sich um Pfade handelt, die mit einem Semikolon enden ;, könnten wir einen Knoten hinzufügen und dabei das \vor dem Pfadende löschen. Dieser hier fügt also einen Knoten mit Text (Beschriftung) ein, nachdem (1.5,0) erreicht wurde; er akzeptiert Text mit einem gewissen Stil a, also im mathematischen Modus $a$:

    \draw (0,0) -- (1.5,0) node[a]{$a$};

Geben Sie Stilinformationen für die Zeile an den Anfang ein UND überlassen Sie es dem Stilabschnitt am Anfang, im Detail anzugeben, was hier gezeichnet werden soll:

    \draw[bar] (0,0) -- (1.5,0) node[a]{$a$};

Fügen Sie abschließend die \coordinateAnweisung in den Pfad ein, um sich bestimmte Standorte zu merken, UND lassen Sie das weg, \da es sich immer noch im selben Pfad befindet, der gezeichnet werden soll. Das sind Sie:

    \draw[bar] (0,0) coordinate (A) -- (1.5,0)  coordinate (B) node[a]{$a$};

Die anderen Pfade werden ähnlich erstellt, indem eine Mischung aus relativen Bewegungen --++(1.5,0), absoluten Koordinaten und dem Wissen über die Mindestbreite dieser Knoten verwendet wird, die hier mit 5 mm definiert wurde. Dies kann sicherlich systematischer erfolgen.

Beschriftungen unten:

    % ~~~ labels below ~~~~~~~~~~
    \node[mth] at                (A) {$1$};
    \node[mth] at ([xshift=-2.5mm]C) {$f(i) + 1$};

Das ist ziemlich unkompliziert. Die erste Zeile platziert den Text $1$an der gespeicherten Position (A)und verwendet dabei den Stil mth, wodurch der Text in y-Richtung ein wenig nach unten verschoben wird.

Das zweite ist sehr ähnlich, abgesehen von einigen Komplikationen, die durch die Platzierung des Knotens auf $a$meine Art und Weise entstehen. Eine Möglichkeit, die Position zu korrigieren, besteht darin, (C)ihn etwas nach hinten zu verschieben (die Hälfte der Mindestbreite):

([xshift=-2.5mm]C).

Überbrückung:

    % ~~~ labels above ~~~~
    \draw[decorate,blue] ([ys]A) -- ([ys]B) node[alf]{$\alpha$};
    \draw[decorate,blue] ([ys]D) -- ([ys]E) node[alf]{$\alpha$};

Es kombiniert die oben genannten Konzepte und verwendet decorate, das von der Tikz-Bibliothek bereitgestellt wird decorations.pathreplacing:

  • es zeichnet einen Weg von oben (A) nach oben (B)
  • ersetzt es durch eine Klammer
  • in Blau
  • Platzieren Sie einen Knoten in der Mitte und etwas darüber für $\alpha$.

Stilblock:

 \begin{tikzpicture}[
    a/.style={anchor=west,minimum width=5mm},   % for the node containing "a"
    bar/.style={{Bar[]}-{Bar[]}},               % start- and end-tipps as Bars
    bar2/.style={-{Bar[]}},                     % only end-tipp as bar
    mth/.style={yshift=-5mm},                   % for placing the math-labels
    decoration=brace,                           % the overbrace
    alf/.style={midway,yshift=3mm},             % placing \alpha there
    ys/.style={yshift=5mm},                     % shortcut for these yshifts
 ]

Zumindest bei mir entwickelt sich dieser Teil im Laufe der Zeit, beispielsweise so:

  • Erinnern Sie sich an den oben beschriebenen Zeilenteil
  • setzen nützliche Stil-Optionen direkt für drawundnode
  • sind sie zu lang? ODER werde ich sie mindestens zweimal brauchen?
  • dann verschieben Sie sie hierher, mit einigen nützlichen Namen
  • so dass ich später alle Beschriftungsverschiebungen usw. ganz einfach hier anpassen kann

Code:

\documentclass[10pt,border=3mm,tikz]{standalone}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{decorations.pathreplacing}

\begin{document}
 \begin{tikzpicture}[
    a/.style={anchor=west,minimum width=5mm},   % for the node containing "a"
    bar/.style={{Bar[]}-{Bar[]}},               % start- and end-tipps as Bars
    bar2/.style={-{Bar[]}},                     % only end-tipp as bar
    mth/.style={yshift=-5mm},                   % for placing the math-labels
    decoration=brace,                           % the overbrace
    alf/.style={midway,yshift=3mm},             % placing \alpha there
    ys/.style={yshift=5mm},                     % shortcut for these yshifts
 ]
    % ~~~ lines ~~~~~~~~~~~~
    \draw[bar] (0,0) coordinate (A) -- (1.5,0)  coordinate (B) node[a]{$a$};
    \draw[bar] (2,0) coordinate (C) -- (3.5,0)  coordinate (D);
    \draw[bar2](3.5,0)              --++(1.5,0) coordinate (E) node[a]{$a$};
    \draw[bar] (5.5,0)              --++(1.5,0)                node[a]{$P$};
    
    % ~~~ labels below ~~~~~~~~~~
    \node[mth] at                (A) {$1$};
    \node[mth] at ([xshift=-2.5mm]C) {$f(i) + 1$};
    \node[mth] at                (D) {$i - f(i) + 1$};
    \node[mth] at ([xshift=+2.5mm]E) {$i + 1$};
    
    % ~~~ labels above ~~~~
    \draw[decorate,blue] ([ys]A) -- ([ys]B) node[alf]{$\alpha$};
    \draw[decorate,blue] ([ys]D) -- ([ys]E) node[alf]{$\alpha$};
    
 \end{tikzpicture}
\end{document}

verwandte Informationen