Я рисую несколько простых кобордизмов с помощью 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
Я загрузил новую версиюtqft
в CTAN (7 апреля 2014 г.). Как только это распространится по системе, следующий код заработает и поместит стрелки на верхние дуги граничных кругов.
\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, а не как отдельный файл стиля.
Возможно, вам понравятся стрелки побольше, но это уже другой вопрос.
решение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}
ОРИГИНАЛЬНЫЙ ОТВЕТ (до того, как автор поста опубликовал изображение)
Здесь я работаю за пределами, 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
and \varrightarrow
вместо \leftarrow
and \rightarrow
, можно получить, например, что-то вроде этого:
решение3
Вот решение в tikz и tqft. Оно использует узлы, предоставленные в пакете tqft: Весь кобордизм — это узел с именем «a». Он имеет подузлы «a.incoming border 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}