Изменить стиль наконечника стрелы в украшениях.маркировках

Изменить стиль наконечника стрелы в украшениях.маркировках

Я хотел нарисовать линию со стрелкой посередине и нашел библиотеку 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).

Однако в своем вопросе вы привели два конкретных примера, которые легко воспроизвести, поскольку они представляют собой комбинации ранее существовавших наконечников стрел.

  1. Одна стрелка с окружностью вокруг. Вы можете объединить существующую latexстрелку с существующим o(кругом) наконечником стрелки, через \pgfarrowsdeclarecombine. Эта команда по умолчанию помещает один наконечник стрелки за другим, но вы можете указать смещение, которое перемещает второй. В этом случае я нашел (методом проб и ошибок), что -5ptдает желаемый результат.

  2. Две стрелы одна за другой. 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}

Результат:

Результат

Связанный контент