
Gostaria de traçar uma linha com uma ponta de seta no meio e encontrei a biblioteca Decoration.markings junto com o \arrow
comando disponível somente lá.
No entanto, encontrei poucas informações sobre quais opções e setas estão disponíveis para o \arrow
comando.
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 \arrow
comando 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.
Uma ponta de flecha com um círculo ao redor. Você pode combinar a seta existente
latex
com a ponta da seta existenteo
(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-5pt
produz o resultado desejado.Duas pontas de flecha, uma após a outra. O comando
\pgfarrowsdeclaredouble
foi 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:
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 Barb
seta substitui angle 90
aquela. 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 90
para a ponta, então as opções que você passar \arrow
serã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: