
Я хотел нарисовать линию со стрелкой посередине и нашел библиотеку decoration.markings вместе с командой, \arrow
доступной только там.
Однако я нашел мало информации о том, какие опции и наконечники стрелок доступны для этой \arrow
команды.
Методом проб и ошибок мне удалось создать простую стрелку в середине линии.
\tikzset{kb/.style={postaction={decorate,decoration={markings,mark=at position .5 with {\arrow{angle 90};}}}}}
Но как изменить стиль наконечника стрелы, например, сделать так, чтобы он был обведен кругом или чтобы было два наконечника стрелы, расположенных один за другим?
решение1
Итак, ваш вопрос заключается в том, как определить новые виды наконечников стрел, чтобы использовать их в качестве украшения?
Определение новых наконечников стрел не зависит от того, где вы будете их использовать, как часть команды \draw[->]
или как часть команды \arrow
внутри украшения. Часть руководства, которая охватывает определение новых видов стрел, этостраница 784.
В общем, определение произвольных форм для стрелок является сложным, так как вам придется использовать низкоуровневые pgf*
команды. Кроме того, если вы хотите, чтобы стрелка принимала стили и была масштабируемой, вам нужно узнать о мета-стрелках (стр. 785).
Однако в своем вопросе вы привели два конкретных примера, которые легко воспроизвести, поскольку они представляют собой комбинации ранее существовавших наконечников стрел.
Одна стрелка с окружностью вокруг. Вы можете объединить существующую
latex
стрелку с существующимo
(кругом) наконечником стрелки, через\pgfarrowsdeclarecombine
. Эта команда по умолчанию помещает один наконечник стрелки за другим, но вы можете указать смещение, которое перемещает второй. В этом случае я нашел (методом проб и ошибок), что-5pt
дает желаемый результат.Две стрелы одна за другой. Command
\pgfarrowsdeclaredouble
создан именно для этого.
Посмотрите на следующий код:
\documentclass[11pt]{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,decorations.markings,arrows}
\pgfarrowsdeclarecombine[-5pt]{circled}{circled}{latex}{latex}{o}{o}
\pgfarrowsdeclaredouble{doubled}{doubled}{stealth}{stealth}
\tikzset{
kb1/.style={postaction={decorate,
decoration={markings,mark=at position .5 with {\arrow{circled};}}}
},
kb2/.style={postaction={decorate,
decoration={markings,mark=at position .5 with {\arrow{doubled};}}}
},
}
\begin{document}
\begin{tikzpicture}%
\draw[kb1] (0,0) -- + (2,0);
\draw[kb2] (0,.5) -- + (2,0);
\end{tikzpicture}
\end{document}
который производит:
Обновлять
Автор комментария указал, что если стрелка имеет вид angle 90
, то круг слишком мал.
Исправить это немного сложно и хакерски.
Стандартные стрелки не настраиваются, для этого нужно использовать "мета-стрелки". Для таких стрелок требуется последняя версия pgf/tikz и пакет arrows.meta
, где определены новые имена для наконечников стрелок. Например, стрелка "полый круг" названа Circle[open]
вместо o
, а Straight Barb
стрелка заменяет angle 90
ее. Смотритестраница 202 последнего pgfmanual.
Однако я не знаю, можно ли передать разные параметры разным частям "составной стрелки". Нам нужно задать разный размер для "угла 90" и "окружности", и я не знаю, как это сделать.
Но я нашел хак. Если вы используете новые мета-стрелки только для круга, оставляя старые arrow 90
для кончика, то переданные вами параметры \arrow
используются только для "мета"-части составной стрелки, и таким образом изменяется только размер круга.
Используя эту идею:
\documentclass[11pt]{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,decorations.markings,arrows,arrows.meta}
\pgfarrowsdeclarecombine[-2mm]{circled}{circled}{angle 90}{angle 90}{Circle[open]}{Circle[open]}
\pgfarrowsdeclaredouble{doubled}{doubled}{angle 90}{angle 90}
\tikzset{
kb1/.style={postaction={decorate,
decoration={markings,mark=at position .5 with {\arrow{circled[width=3mm,length=3mm]};}}}
},
kb2/.style={postaction={decorate,
decoration={markings,mark=at position .5 with {\arrow{doubled};}}}
},
}
\begin{document}
\begin{tikzpicture}%
\draw[kb1] (0,0) -- + (2,0);
\draw[kb2] (0,.5) -- + (2,0);
\end{tikzpicture}
\end{document}
Результат: