Alterar o estilo da ponta da seta em decorações.marcações

Alterar o estilo da ponta da seta em decorações.marcações

Gostaria de traçar uma linha com uma ponta de seta no meio e encontrei a biblioteca Decoration.markings junto com o \arrowcomando disponível somente lá.

No entanto, encontrei poucas informações sobre quais opções e setas estão disponíveis para o \arrowcomando.

Com tentativa e erro consegui produzir uma seta simples no meio da linha com

\tikzset{kb/.style={postaction={decorate,decoration={markings,mark=at position .5 with {\arrow{angle 90};}}}}}

Mas como posso mudar o estilo da ponta da seta, ou seja, tê-la com um círculo ao redor ou ter duas pontas de seta uma após a outra?

Responder1

Então sua dúvida é como definir novos tipos de pontas de flecha para usá-las como decoração?

A definição de novas pontas de seta independe de onde você as utilizará, seja como parte de um \draw[->]comando ou como parte do \arrowcomando dentro de uma decoração. A parte do manual que cobre a definição de novos tipos de flechas épágina 784.

Em geral, definir formas arbitrárias para as setas é difícil, pois é necessário usar pgf*comandos de baixo nível. Além disso, se você quiser que a seta aceite estilos e seja escalável, você terá que aprender sobre meta-setas (pág. 785).

Porém, na sua pergunta você deu dois exemplos particulares, que são fáceis de produzir, pois são combinações de pontas de flechas já existentes.

  1. Uma ponta de flecha com um círculo ao redor. Você pode combinar a seta existente latexcom a ponta da seta existente o(círculo), através de \pgfarrowsdeclarecombine. Este comando por padrão coloca uma ponta de seta após a outra, mas você pode especificar um deslocamento que mova a segunda. Neste caso, descobri (por tentativa e erro) que -5ptproduz o resultado desejado.

  2. Duas pontas de flecha, uma após a outra. O comando \pgfarrowsdeclaredoublefoi projetado exatamente para isso.

Observe o seguinte código:

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

que produz:

resultado

Atualizar

O OP apontou em um comentário que, se o tipo de seta for angle 90, então o círculo é muito pequeno.

Consertar isso é um pouco difícil e hackeado.

As setas padrão não são personalizáveis, para isso é necessário usar "meta setas". Esses tipos requerem a versão mais recente de pgf/tikz e package arrows.meta, onde são definidos novos nomes para as pontas das setas. Por exemplo, a seta "círculo vazio" é nomeada Circle[open]em vez de o, e a Straight Barbseta substitui angle 90aquela. Verpágina 202 do último pgfmanual.

Porém, não sei se é possível passar opções diferentes para as diferentes partes de uma "seta composta". Precisamos dar um tamanho diferente ao "ângulo 90" e ao "círculo", e não sei como fazer isso.

Mas eu encontrei um hack. Se você usar as novas meta-setas apenas para o círculo, deixando as mais antigas arrow 90para a ponta, então as opções que você passar \arrowserão usadas apenas para a parte "meta" da seta composta, e desta forma apenas a parte do círculo será redimensionada.

Usando esta ideia:

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

Resultado:

Resultado

informação relacionada