
Me gustaría dibujar una línea con una punta de flecha en el medio y encontré la biblioteca decoracion.markings junto con el \arrow
comando disponible solo allí.
Sin embargo, encontré poca información sobre qué opciones y puntas de flecha están disponibles para el \arrow
comando.
Con prueba y error pude producir una flecha simple en el medio de la línea con
\tikzset{kb/.style={postaction={decorate,decoration={markings,mark=at position .5 with {\arrow{angle 90};}}}}}
Pero, ¿cómo puedo cambiar el estilo de la punta de flecha, es decir, tenerla con un círculo alrededor o tener dos puntas de flecha una tras otra?
Respuesta1
Entonces tu pregunta es ¿cómo definir nuevos tipos de puntas de flechas para usarlas como decoración?
La definición de nuevas puntas de flecha es independiente de dónde las usará, ya sea como parte de un \draw[->]
comando o como parte del \arrow
comando dentro de una decoración. La parte del manual que cubre la definición de nuevos tipos de flechas espágina 784.
En general, definir formas arbitrarias para las flechas es difícil, ya que hay que utilizar pgf*
comandos de bajo nivel. Además, si quieres que la flecha acepte estilos y sea escalable, tienes que aprender sobre las metaflechas (pág 785).
Sin embargo, en tu pregunta diste dos ejemplos particulares, que son fáciles de producir, ya que son combinaciones de puntas de flecha previamente existentes.
Una punta de flecha con un círculo alrededor. Puede combinar la
latex
flecha existente con lao
punta de flecha existente (círculo), hasta\pgfarrowsdeclarecombine
. De forma predeterminada, este comando coloca una punta de flecha tras otra, pero puede especificar un desplazamiento que mueva la segunda. En este caso, he encontrado (por prueba y error) que-5pt
produce el resultado deseado.Dos puntas de flecha, una tras otra. Command
\pgfarrowsdeclaredouble
está diseñado exactamente para esto.
Mira el siguiente 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 produce:
Actualizar
El OP señaló en un comentario que, si el tipo de flecha es angle 90
, entonces el círculo es demasiado pequeño.
Arreglarlo es un poco difícil y complicado.
Las flechas estándar no son personalizables, para hacerlo debes usar "metaflechas". Estos tipos requieren la última versión de pgf/tikz y el paquete arrows.meta
, donde se definen nuevos nombres para las puntas de las flechas. Por ejemplo, la flecha del "círculo hueco" recibe el nombre Circle[open]
en lugar de o
y la Straight Barb
flecha reemplaza a la angle 90
anterior. Verpágina 202 del último pgfmanual.
Sin embargo, no sé si es posible pasar diferentes opciones a las diferentes partes de una "flecha compuesta". Necesitamos darle un tamaño diferente al "ángulo de 90" y al "círculo", y no sé cómo hacerlo.
Pero encontré un truco. Si usa las nuevas metaflechas solo para el círculo, dejando las más antiguas arrow 90
para la punta, entonces las opciones que pase \arrow
se usan solo para la parte "meta" de la flecha compuesta, y de esta manera solo se cambia el tamaño de la parte del círculo.
Usando esta idea:
\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: