Emparejar puntas de flecha en TikZ con puntas de flecha en modo matemático

Emparejar puntas de flecha en TikZ con puntas de flecha en modo matemático

TikZ es excelente para dibujar diagramas, pero hay una característica que encuentro bastante molesta y es el hecho de que la punta de flecha predeterminada proporcionada por TikZ no necesariamente respeta el modo matemático en cualquier fuente que estés usando. Sé que la biblioteca TikZ arrowste permite elegir entre varios tipos diferentes de puntas de flecha, pero ninguna ofrece la misma punta de flecha que la dibujada en modo matemático.

Al dibujar un diagrama en TikZ, quiero que las puntas de flecha coincidan con las puntas de flecha dibujadas por comandos como \too \xrightarrow{foo}.

¿Alguien sabe cómo arreglar esto?


Como lo sugirió Andrew Stacey en los comentarios a continuación, realmente debería brindarles un ejemplo de lo que estoy hablando.

Usando el siguiente código:

An arrow tip produced by TikZ:  
\begin{tikzpicture}
\node (A) at (0,0){$A$};
\node (B) at (1,0){$B$.};

\path (A) edge[->] node[midway,above]{$f$} (B);
\end{tikzpicture}

An arrow tip produced by \texttt{amsmath}: $A \xrightarrow{f} B$.  

Obtengo el siguiente resultado:

ingrese la descripción de la imagen aquí

Quiero que estas dos puntas de flecha sean idénticas.

Respuesta1

He preparado un conjunto completo de puntas de flecha que coinciden con las flechas de Computer Modern, ylo publiqué en CTAN(junto con alguna discusión sobre este tema y algunas cosas más que podrían ser útiles para diagramas matemáticos).

Las puntas de mis flechas no son tan precisas como las de Christian, pero son tan buenas como las que se pueden conseguir usando unos pocos trazos de línea (en lugar de rellenar una región), y en la práctica encuentro que el resultado es bastante bueno.

Aquí hay una comparación (Computer Modern arriba, flecha dibujada con tikz abajo).

\documentclass{article} 
\usepackage{tikz,tikz-cd,graphicx} 
\begin{document} 
\noindent\hspace{2mm} \scalebox{20}{$\hookrightarrow$} 
\vspace{2cm} 
\tikz \draw[line width=8pt,cm right hook-cm to] (0,0) to (7,0); 
\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

Aquí hay otra forma de dibujar puntas de flecha que se parecen a las de las computadoras modernas, usando un contorno delgado y rellenándolo. El problema con esta solución es que, cuando se imprime en 10 puntos, la punta de flecha se vuelve casi invisible. Por lo tanto, no utilice este código hasta que alguien encuentre una solución. En pantalla, el resultado se ve bien, por supuesto; a continuación se incluye un ejemplo.

Diagrama conmutativo

Aquí está el código:

    \usepackage{tikz}
    \usetikzlibrary{matrix,arrows}
    \newlength{\myarrowsize} 
    \newlength{\myoldlinewidth}

    \pgfarrowsdeclare{myto}{myto}{
        \pgfsetdash{}{0pt} 
        \pgfsetbeveljoin 
        \pgfsetroundcap 
        \setlength{\myarrowsize}{0.6pt}
        \addtolength{\myarrowsize}{.5\pgflinewidth}
        \pgfarrowsleftextend{-4\myarrowsize-.5\pgflinewidth} 
        \pgfarrowsrightextend{.7\pgflinewidth}
    }{
        \setlength{\myarrowsize}{0.6pt} 
        \addtolength{\myarrowsize}{.5\pgflinewidth}  
        \setlength{\myoldlinewidth}{\pgflinewidth}
        \pgfsetroundjoin
        % draw top half
        \pgfsetlinewidth{0.0001pt}
        \pgfpathmoveto{\pgfpoint{0.43\myarrowsize}{0}}
        \pgfpatharc{0}{70}{0.14\myarrowsize}
        \pgfpatharc{-110}{-169.5}{4\myarrowsize}
        \pgfpatharc{10.5}{189}{0.25\myarrowsize and 0.12\myarrowsize}
        \pgfpatharc{-170}{-119.5}{4.48\myarrowsize}
        % draw bottom half
        \pgfpathmoveto{\pgfpoint{0.43\myarrowsize}{0}}
        \pgfpatharc{0}{-70}{0.14\myarrowsize}
        \pgfpatharc{110}{169.5}{4\myarrowsize}
        \pgfpatharc{-10.5}{-189}{0.25\myarrowsize and 0.12\myarrowsize}
        \pgfpatharc{170}{119.5}{4.48\myarrowsize}
        \pgfpathclose
        \pgfsetstrokeopacity{0.25}
        \pgfusepathqfillstroke
    }

    \pgfarrowsdeclare{myonto}{myonto}{
        \pgfsetdash{}{0pt} 
        \pgfsetbeveljoin 
        \pgfsetroundcap 
        \setlength{\myarrowsize}{0.6pt}
        \addtolength{\myarrowsize}{.5\pgflinewidth}
        \pgfarrowsleftextend{-4\myarrowsize-.5\pgflinewidth} 
        \pgfarrowsrightextend{.7\pgflinewidth}
    }{
        \setlength{\myarrowsize}{0.6pt} 
        \addtolength{\myarrowsize}{.5\pgflinewidth}  
        \setlength{\myoldlinewidth}{\pgflinewidth}
        \pgfsetroundjoin
        % draw top half
        \pgfsetlinewidth{0.0001pt}
        \pgfpathmoveto{\pgfpoint{0.43\myarrowsize}{0}}
        \pgfpatharc{0}{70}{0.14\myarrowsize}
        \pgfpatharc{-110}{-169.5}{4\myarrowsize}
        \pgfpatharc{10.5}{189}{0.25\myarrowsize and 0.12\myarrowsize}
        \pgfpatharc{-170}{-119.5}{4.48\myarrowsize}
        \pgfpathlineto{\pgfpoint{0.43\myarrowsize-0.3em}{0}}
        \pgfpatharc{0}{70}{0.14\myarrowsize}
        \pgfpatharc{-110}{-169.5}{4\myarrowsize}
        \pgfpatharc{10.5}{189}{0.25\myarrowsize and 0.12\myarrowsize}
        \pgfpatharc{-170}{-119.5}{4.48\myarrowsize}
        % draw bottom half
        \pgfpathmoveto{\pgfpoint{0.43\myarrowsize}{0}}
        \pgfpatharc{0}{-70}{0.14\myarrowsize}
        \pgfpatharc{110}{169.5}{4\myarrowsize}
        \pgfpatharc{-10.5}{-189}{0.25\myarrowsize and 0.12\myarrowsize}
        \pgfpatharc{170}{119.5}{4.48\myarrowsize}
        \pgfpathlineto{\pgfpoint{0.43\myarrowsize-0.3em}{0}}
        \pgfpatharc{0}{-70}{0.14\myarrowsize}
        \pgfpatharc{110}{169.5}{4\myarrowsize}
        \pgfpatharc{-10.5}{-189}{0.25\myarrowsize and 0.12\myarrowsize}
        \pgfpatharc{170}{119.5}{4.48\myarrowsize}
        \pgfpathclose
        \pgfsetstrokeopacity{0.25}
        \pgfusepathqfillstroke
    }

    \pgfarrowsdeclare{myhook}{myhook}{
        \setlength{\myarrowsize}{0.6pt}
        \addtolength{\myarrowsize}{.5\pgflinewidth}
        \pgfarrowsleftextend{-4\myarrowsize-.5\pgflinewidth} 
        \pgfarrowsrightextend{.7\pgflinewidth}
    }{
        \setlength{\myarrowsize}{0.6pt} 
        \addtolength{\myarrowsize}{.5\pgflinewidth}  
        \pgfsetdash{}{+0pt}
        \pgfsetroundcap
        \pgfpathmoveto{\pgfqpoint{0pt}{-4.667\pgflinewidth}}
        \pgfpathcurveto
            {\pgfqpoint{4\pgflinewidth}{-4.667\pgflinewidth}}
            {\pgfqpoint{4\pgflinewidth}{0pt}}
            {\pgfpointorigin}
        \pgfusepathqstroke
    }

Respuesta3

Esta pregunta sobrepuntas de meta flechaseñala el manual que dice que las puntas de las flechas normalmente no deben escalar en proporción al ancho de la línea de soporte. Aquí he definido un -my toestilo de flecha que es una versión modificada del -bad toestilo de flecha en la pregunta vinculada anteriormente. Esto es lo más parecido que puedo llegar a coincidir con el que usted proporcionó.

ingrese la descripción de la imagen aquí

Notas:

  • Dado que esto es una adaptación de una versión que escala con anchos de línea, no producirá muy buenos resultados con otros anchos de línea (de hecho, es bastante horrible). Intenté obtener el ancho de línea de la tikzversión lo más parecido al de amsmath.

Código:

\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}

\pgfarrowsdeclare{my to}{my to}
{
  \pgfarrowsleftextend{-2\pgflinewidth}
  \pgfarrowsrightextend{\pgflinewidth}
}
{
  \pgfsetlinewidth{0.8\pgflinewidth}
  \pgfsetdash{}{0pt}
  \pgfsetroundcap
  \pgfsetroundjoin
  \pgfpathmoveto{\pgfpoint{-5.5\pgflinewidth}{7.5\pgflinewidth}}
  \pgfpathcurveto
  {\pgfpoint{-4.0\pgflinewidth}{0.1\pgflinewidth}}
  {\pgfpoint{0pt}{0.25\pgflinewidth}}
  {\pgfpoint{0.75\pgflinewidth}{0pt}}
  \pgfpathcurveto
  {\pgfpoint{0pt}{-0.25\pgflinewidth}}
  {\pgfpoint{-4.0\pgflinewidth}{-0.1\pgflinewidth}}
  {\pgfpoint{-5.5\pgflinewidth}{-7.5\pgflinewidth}}
  \pgfusepathqstroke
}


\begin{document}
\begin{tikzpicture}
    \node (A) at (0,0){$A$};
    \node (B) at (0.82,0){$B$};
    \path (A) edge[-my to,line width=0.42pt]  (B);
\end{tikzpicture}

\hspace{0.33em}$A \xrightarrow{} B$
\end{document}

Respuesta4

Aquí está el código que estoy usando; reproduce bastante bien las puntas de flecha de Computer Modern. En particular, la punta es más delgada y menos redondeada que la que se obtiene con el método de la Sección 74 del manual. La idea es utilizar varios arcos (dibujados con la mitad del grosor) para crear un contorno y luego rellenarlo.

Aquí hay un ejemplo del resultado: la flecha negra es Computer Modern (producida con \longrightarrow), la flecha roja es producida por el código siguiente.

Un ejemplo de punta de flecha

No soy lo suficientemente experto como para ajustar el tamaño de la punta de flecha al tamaño de fuente, etc. Un segundo problema es que, con niveles de zoom bajos o al imprimir, las líneas parecen demasiado gruesas. Como el código no funciona con , también \pgfdeclarearrowsdoublehe incluido código para \intoy flechas.\onto

    \usepackage{tikz}
    \usetikzlibrary{matrix,arrows}
    \newlength{\myarrowsize} 

    % Version similar to Computer Modern
    \pgfarrowsdeclare{cmto}{cmto}{
            \pgfsetdash{}{0pt} 
            \pgfsetbeveljoin 
            \pgfsetroundcap 
            \setlength{\myarrowsize}{0.6pt}
            \addtolength{\myarrowsize}{.5\pgflinewidth}
            \pgfarrowsleftextend{-4\myarrowsize-.5\pgflinewidth} 
            \pgfarrowsrightextend{.8\pgflinewidth}
    }{
            \setlength{\myarrowsize}{0.6pt} 
            \addtolength{\myarrowsize}{.5\pgflinewidth}  
            \pgfsetlinewidth{0.5\pgflinewidth}
            \pgfsetroundjoin
            % top half
            \pgfpathmoveto{\pgfpoint{1.5\pgflinewidth}{0}}
            \pgfpatharc{-109}{-170}{4\myarrowsize}
            \pgfpatharc{10}{189}{0.58\pgflinewidth and 0.2\pgflinewidth}
            \pgfpatharc{-170}{-115}{4\myarrowsize+\pgflinewidth}
            \pgfpathclose
            \pgfusepathqfillstroke
            % bottom half
            \pgfpathmoveto{\pgfpoint{1.5\pgflinewidth}{0}}
            \pgfpatharc{109}{170}{4\myarrowsize}
            \pgfpatharc{-10}{-189}{0.58\pgflinewidth and 0.2\pgflinewidth}
            \pgfpatharc{170}{115}{4\myarrowsize+\pgflinewidth}
            \pgfpathclose
            \pgfusepathqfillstroke
            % Change line width back
            \pgfsetlinewidth{2\pgflinewidth}
    }

    \pgfarrowsdeclare{cmonto}{cmonto}{
            \pgfsetdash{}{0pt} 
            \pgfsetbeveljoin 
            \pgfsetroundcap 
            \setlength{\myarrowsize}{0.6pt}
            \addtolength{\myarrowsize}{.5\pgflinewidth}
            \pgfarrowsleftextend{-4\myarrowsize-.5\pgflinewidth} 
            \pgfarrowsrightextend{.8\pgflinewidth}
    }{
            \setlength{\myarrowsize}{0.6pt} 
            \addtolength{\myarrowsize}{.5\pgflinewidth}  
            \pgfsetlinewidth{0.5\pgflinewidth}
            \pgfsetroundjoin
            % top half
            \pgfpathmoveto{\pgfpoint{1.5\pgflinewidth}{0}}
            \pgfpatharc{-109}{-170}{4\myarrowsize}
            \pgfpatharc{10}{189}{0.58\pgflinewidth and 0.2\pgflinewidth}
            \pgfpatharc{-170}{-115}{4\myarrowsize+\pgflinewidth}
            \pgfpathclose
            \pgfusepathqfillstroke
            % bottom half
            \pgfpathmoveto{\pgfpoint{1.5\pgflinewidth}{0}}
            \pgfpatharc{109}{170}{4\myarrowsize}
            \pgfpatharc{-10}{-189}{0.58\pgflinewidth and 0.2\pgflinewidth}
            \pgfpatharc{170}{115}{4\myarrowsize+\pgflinewidth}
            \pgfpathclose
            \pgfusepathqfillstroke
            % top half (2)
            \pgfpathmoveto{\pgfpoint{1.5\pgflinewidth-0.3em}{0}}
            \pgfpatharc{-109}{-170}{4\myarrowsize}
            \pgfpatharc{10}{189}{0.58\pgflinewidth and 0.2\pgflinewidth}
            \pgfpatharc{-170}{-115}{4\myarrowsize+\pgflinewidth}
            \pgfpathclose
            \pgfusepathqfillstroke
            % bottom half (2)
            \pgfpathmoveto{\pgfpoint{1.5\pgflinewidth-0.3em}{0}}
            \pgfpatharc{109}{170}{4\myarrowsize}
            \pgfpatharc{-10}{-189}{0.58\pgflinewidth and 0.2\pgflinewidth}
            \pgfpatharc{170}{115}{4\myarrowsize+\pgflinewidth}
            \pgfpathclose
            \pgfusepathqfillstroke
            % Change line width back
            \pgfsetlinewidth{2\pgflinewidth}
    }

    \pgfarrowsdeclare{cmhook}{cmhook}{
            \pgfsetdash{}{0pt} 
            \pgfsetbeveljoin 
            \pgfsetroundcap 
            \setlength{\myarrowsize}{0.6pt}
            \addtolength{\myarrowsize}{.5\pgflinewidth}
            \pgfarrowsleftextend{-4\myarrowsize-.5\pgflinewidth} 
            \pgfarrowsrightextend{.8\pgflinewidth}
    }{
            \setlength{\myarrowsize}{0.6pt} 
            \addtolength{\myarrowsize}{.5\pgflinewidth}  
            \pgfsetdash{}{0pt}
            \pgfsetroundcap
            \pgfpathmoveto{\pgfqpoint{0pt}{-4.667\pgflinewidth}}
            \pgfpathcurveto
            {\pgfqpoint{4\pgflinewidth}{-4.667\pgflinewidth}}
            {\pgfqpoint{4\pgflinewidth}{0pt}}
            {\pgfpointorigin}
            \pgfusepathqstroke
    }

información relacionada