So platzieren Sie Pfeile auf Begrenzungskreisen im TQFT-Paket

So platzieren Sie Pfeile auf Begrenzungskreisen im TQFT-Paket

Ich zeichne einige einfache Kobordismen mit Tikz und TQFT. Ich möchte die Ausrichtung der eingehenden und ausgehenden Kreise angeben, indem ich Pfeilspitzen darauf platziere. Gibt es eine einfache Möglichkeit, das zu tun?

Der Code, den ich verwende, ist beispielsweise

\documentclass[varwidth=true, border=2pt]{standalone}
\usepackage{tikz}
\usepackage{tqft}
\begin{tikzpicture}[tqft/flow=east]
\node[tqft, incoming boundary components=1,
outgoing boundary components=1,draw, boundary lower style={dashed,draw}] at (0,0) {};
\end{tikzpicture}

was (allerdings in besserer Auflösung) ergibt:

Ein Zylinder

Die Art von Pfeil, die ich gerne hätte, ist wie auf diesem Bild (nur der hellgrüne Teil)Bildbeschreibung hier eingeben

Antwort1

Ich habe eine neue Version hochgeladen vontqftan CTAN (7. April 2014). Sobald dies im System verbreitet ist, funktioniert der folgende Code und fügt Pfeile auf die oberen Bögen der Begrenzungskreise ein.

\documentclass{article}
%\url{http://tex.stackexchange.com/q/166698/86}
\usepackage{tikz}
\usetikzlibrary{calc,tqft,decorations.markings}

\begin{document}

\begin{tikzpicture}[every tqft/.style={transform shape},rotate=90]
  \pic[
  tqft,
  incoming boundary components=1,
  outgoing boundary components=1,
  draw,
  every lower boundary component/.style={draw},
  every incoming lower boundary component/.style={dashed,draw},
  every outgoing upper boundary component/.style={
    decorate,
    decoration={
      markings,
      mark=at position .5 with {\arrow{>}},
    },
  },
  every incoming upper boundary component/.style={
    decorate,
    decoration={
      markings,
      mark=at position .5 with {\arrowreversed{>}},
    },
  },
  name=a
];
  \end{tikzpicture}

\end{document}

Beachten Sie, dass hierfür TikZ3.0 (oder höher) erforderlich ist. Außerdem wird das Paket jetzt als TikZ-Bibliothek und nicht als separate Stildatei geladen.

Möglicherweise möchten Sie größere Pfeile, aber das ist ein anderes Thema.

TQFT mit Pfeilen

Antwort2

ÜBERARBEITETE ANTWORT (Beschreibung der Methode siehe Originalantwort unten)

\documentclass{article}
\usepackage{tikz, tqft, graphicx, stackengine}
\parskip 1ex
\begin{document}
\def\figraw{\begin{tikzpicture}[tqft/flow=east]
\node[tqft, incoming boundary components=1,
outgoing boundary components=1,draw, boundary lower style={dashed,draw}] at (0,0) {};
\end{tikzpicture}}
\savestack{\fig}{\figraw}
\def\OUT{-1.60pt}
\def\IN{8.03pt}
\def\WW{1.5pt}
\def\VV{-1.5pt}
\def\VEE{\scalebox{0.6}{$\vee$}}
\def\WEDGE{\scalebox{0.6}{$\wedge$}}
\stackinset{r}{\IN}{c}{\VV}{\VEE}{\fig}\par
\stackinset{l}{\OUT}{c}{\VV}{\VEE}{%
  \stackinset{r}{\IN}{c}{\WW}{\WEDGE}{%
    \fig%
}}\par
\stackinset{l}{\OUT}{c}{\WW}{\WEDGE}{%
  \stackinset{r}{\IN}{c}{\VV}{\VEE}{%
    \fig%
}}\par
\end{document}

Bildbeschreibung hier eingeben

Und da ich mir die Mühe gemacht habe, es zu parametrisieren, um eine Syntax wie zu ermöglichen \LeftSideArrow\setoutside\uppointing{\fig}, zeige ich den Code hier:

\documentclass{article}
\usepackage{tikz, tqft, graphicx, stackengine}
\parskip 1ex
%
\def\OUT{-1.60pt}
\def\IN{8.03pt}
\def\WW{1.5pt}
\def\VV{-1.5pt}
\def\VEE{\scalebox{0.6}{$\vee$}}
\def\WEDGE{\scalebox{0.6}{$\wedge$}}
%
\def\LeftSideArrowHelper{\stackinset{l}}
\def\RightSideArrowHelper{\stackinset{r}}
\def\setinside{\IN}
\def\setoutside{\OUT}
\def\uppointing{{c}{\WW}{\WEDGE}}
\def\downpointing{{c}{\VV}{\VEE}}
\def\LeftSideArrow{\expandafter\expandafter\expandafter\LeftSideArrowHelper\expandafter}
\def\RightSideArrow{\expandafter\expandafter\expandafter\RightSideArrowHelper\expandafter}

\begin{document}
\def\figraw{\begin{tikzpicture}[tqft/flow=east]
    \node[tqft, incoming boundary components=1,
    outgoing boundary components=1,draw, boundary lower style={dashed,draw}] at (0,0) {};
  \end{tikzpicture}}
\savestack{\fig}{\figraw}

\LeftSideArrow\setoutside\uppointing{%
  \RightSideArrow\setinside\downpointing{%
    \fig}}
\end{document}

URSPRÜNGLICHE ANTWORT (bevor OP ein Bild gepostet hat)

Hier arbeite ich außerhalb von , tikzum die Pfeile festzulegen. Stattdessen verwende ich \stackinset. Ich zeige zunächst verschiedene Anwendungsfälle mit der Rohsyntax \stackinset. Wenn dies jedoch häufig vorkommt, könnte die Verwendung parametrisiert werden, wie ich am Ende meines MWE zeige.

\documentclass{article}
\usepackage{tikz, tqft, graphicx, stackengine}
\parskip 1ex
\begin{document}
\def\fig{\begin{tikzpicture}[tqft/flow=east]
\node[tqft, incoming boundary components=1,
outgoing boundary components=1,draw, boundary lower style={dashed,draw}] at (0,0) {};
\end{tikzpicture}}
\stackinset{r}{-18pt}{c}{-1.8pt}{\scalebox{2.5}{$\rightarrow$}}{\fig}\par
\stackinset{r}{-18pt}{c}{-1.8pt}{\scalebox{2.5}{$\leftarrow$}}{\fig}\par
\stackinset{r}{3pt}{c}{-1.8pt}{\scalebox{2.5}{$\leftarrow$}}{\fig}\par
\stackinset{l}{3pt}{c}{-1.8pt}{\scalebox{2.5}{$\leftarrow$}}{%
  \stackinset{r}{-18pt}{c}{-1.8pt}{\scalebox{2.5}{$\leftarrow$}}{%
    \fig%
}}\par
\stackinset{l}{-18pt}{c}{-1.8pt}{\scalebox{2.5}{$\rightarrow$}}{%
  \stackinset{r}{-18pt}{c}{-1.8pt}{\scalebox{2.5}{$\rightarrow$}}{%
    \fig%
}}\par
If this element were used often, it could be parameterized:
\def\LeftArrow{{\scalebox{2.5}{$\leftarrow$}}}
\def\RightArrow{{\scalebox{2.5}{$\rightarrow$}}}
\edef\insideleft{{l}{3pt}{c}{-1.8pt}}
\edef\outsideleft{{l}{-18pt}{c}{-1.8pt}}
\edef\insideright{{r}{3pt}{c}{-1.8pt}}
\edef\outsideright{{r}{-18pt}{c}{-1.8pt}}
\def\MakeArrow{\expandafter\stackinset}

\MakeArrow\outsideleft\LeftArrow{%
\MakeArrow\outsideright\RightArrow{%
\fig%
}}
\end{document}

Bildbeschreibung hier eingeben


Wenn das tikzBild immer wieder verwendet wird, spart es Zeit, es einmal zu erstellen und zu verpacken. In diesem Fall \def\fig{...}könnte das in meinem MWE durch ersetzt werden

\def\figraw{\begin{tikzpicture}[tqft/flow=east]
\node[tqft, incoming boundary components=1,
outgoing boundary components=1,draw, boundary lower style={dashed,draw}] at (0,0) {};
\end{tikzpicture}}
\savestack{\fig}{\figraw}

Dann \figstünde als Fertigbox mit dem Inhalt von zur Verfügung \figraw.


Wenn Sie einen anderen Pfeilstil wünschen, können Sie die Stealth-Pfeilglyphen aus importieren mathabx, indem Sie Folgendes in Ihre Präambel einfügen:

% Setup the matha font (from mathabx.sty)
\DeclareFontFamily{U}{matha}{\hyphenchar\font45}
\DeclareFontShape{U}{matha}{m}{n}{
      <5> <6> <7> <8> <9> <10> gen * matha
      <10.95> matha10 <12> <14.4> <17.28> <20.74> <24.88> matha12
      }{}
\DeclareSymbolFont{matha}{U}{matha}{m}{n}

% Define a subset character from that font (from mathabx.dcl)
% to completely replace the \subset character, you can replace
% \varsubset with \subset

\DeclareMathSymbol{\varleftarrow}{3}{matha}{"D0}
\DeclareMathSymbol{\varrightarrow}{3}{matha}{"D1}

Wenn Sie dann \varleftarrowund \varrightarrowanstelle von \leftarrowund verwenden \rightarrow, erhalten Sie beispielsweise Folgendes:

Bildbeschreibung hier eingeben

Antwort3

Hier ist eine Lösung innerhalb von tikz und tqft. Sie verwendet die im tqft-Paket bereitgestellten Knoten: Der gesamte Kobordismus ist ein Knoten namens „a“. Er hat Unterknoten „a.incoming bound n“, wobei n die eingehenden Grenzkreise aufzählt und dies analog für die ausgehenden gilt.

Leider wird die Verschiebung manuell ermittelt und da ich keine Ahnung von der Funktionsweise von Tikz habe, weiß ich nicht, wie es auf Skalierung oder ähnliches reagiert. Eine nette Geste wäre definitiv eine Option im TQFT-Paket, die diese kleinen Pfeile auf die Kreise setzt.

\begin{tikzpicture}[tqft/flow=east]
  \node[tqft, incoming boundary components=1,
  outgoing boundary components=1,draw, boundary lower style={dashed,draw}](a) at (0,0) {};
  \node at ($(a.incoming boundary 1)+(-0.166,0)$) {$\wedge$};
  \node at ($(a.outgoing boundary 1)+(-0.172,0)$) {$\vee$};
  \end{tikzpicture}

verwandte Informationen