Cambiar el estilo de la punta de flecha en las decoraciones.marcas

Cambiar el estilo de la punta de flecha en las decoraciones.marcas

Me gustaría dibujar una línea con una punta de flecha en el medio y encontré la biblioteca decoracion.markings junto con el \arrowcomando disponible solo allí.

Sin embargo, encontré poca información sobre qué opciones y puntas de flecha están disponibles para el \arrowcomando.

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 \arrowcomando 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.

  1. Una punta de flecha con un círculo alrededor. Puede combinar la latexflecha existente con la opunta 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 -5ptproduce el resultado deseado.

  2. Dos puntas de flecha, una tras otra. Command \pgfarrowsdeclaredoubleestá 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:

resultado

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 oy la Straight Barbflecha reemplaza a la angle 90anterior. 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 90para la punta, entonces las opciones que pase \arrowse 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:

Resultado

información relacionada