tqft パッケージの境界円に矢印を配置する方法

tqft パッケージの境界円に矢印を配置する方法

tikz と tqft を使用して、簡単なコボルディズムを描いています。入ってくる円と出ていく円の方向を示すために、矢印を付けたいと思います。簡単な方法はありますか?

私が使用しているコードは例えば

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

これによって(解像度は向上しますが)次の結果が生成されます。

シリンダー

私が欲しい矢印はこの写真のようなもの(薄緑の部分のみ)ですここに画像の説明を入力してください

答え1

新しいバージョンをアップロードしましたtqftCTAN へ (2014 年 4 月 7 日)。これがシステム全体に伝わると、次のコードが機能し、境界円の上部の円弧に矢印が表示されます。

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

これには TikZ3.0 (またはそれ以降) が必要であることに注意してください。また、パッケージをロードする方法は、個別のスタイル ファイルとしてではなく、TikZ ライブラリとしてになりました。

もっと大きな矢印が欲しいと思うかもしれませんが、それは別の問題です。

矢印付きTQFT

答え2

修正された回答(方法の説明については、以下の元の回答を参照してください)

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

ここに画像の説明を入力してください

そして、 のような構文を可能にするためにこれをパラメータ化する作業を行ったので\LeftSideArrow\setoutside\uppointing{\fig}、そのコードをここに示します。

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

元の回答(OPが画像を投稿する前)

ここでは、tikz矢印を確立するために の外側で作業しています。代わりに を使用しています\stackinset。まず、生の構文を使用してさまざまな使用例を示します\stackinset。ただし、これが一般的な発生である場合は、MWE の最後に示すように、使用法をパラメーター化できます。

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

ここに画像の説明を入力してください


tikz画像を何度も使用する場合は、一度作成して箱に入れる方が時間の節約になります。したがって、その場合、\def\fig{...}私のMWEの は次のように置き換えることができます。

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

そうすると、\figの内容物が入った既製のボックスとして利用できるようになります\figraw


mathabx別の矢印スタイルが必要な場合は、プリアンブルに以下を挿入することで、ステルス矢印グリフを からインポートできます。

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

そして、と の代わりに\varleftarrowと を使用すると、たとえば次のようになります。\varrightarrow\leftarrow\rightarrow

ここに画像の説明を入力してください

答え3

tikz と tqft 内のソリューションを以下に示します。tqft パッケージ内で提供されるノードを使用します。全体のコボルディズムは「a」と呼ばれるノードです。これにはサブノード「a.incoming boundary n」があり、n は入力境界円を列挙し、出力境界円も同様です。

残念ながら、変位は手動で検出され、tikz の内部動作については何も知らないため、スケーリングなどにどう反応するかはわかりません。tqft パッケージに、円に小さな矢印を配置するオプションがあれば、間違いなく素晴らしいと思います。

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

関連情報