수학 모드 화살촉과 TikZ의 일치하는 화살촉

수학 모드 화살촉과 TikZ의 일치하는 화살촉

TikZ는 다이어그램을 그리는 데 능숙하지만 꽤 짜증나는 기능이 하나 있는데, 그것은 TikZ에서 제공하는 기본 화살촉이 사용 중인 글꼴에 관계없이 수학 모드를 반드시 준수하지는 않는다는 사실입니다. TikZ 라이브러리를 사용 arrows하면 여러 가지 유형의 화살촉 중에서 선택할 수 있지만 어느 것도 수학 모드에서 그린 것과 동일한 화살촉을 제공하지 않는다는 것을 알고 있습니다.

TikZ에서 다이어그램을 그릴 때 화살촉이 \to또는 같은 명령으로 그린 ​​화살촉과 일치하도록 하고 싶습니다 \xrightarrow{foo}.

이 문제를 해결하는 방법을 아는 사람이 있나요?


아래 댓글에서 Andrew Stacey가 제안한 것처럼 제가 말하는 내용에 대한 예를 실제로 제공해야 합니다.

다음 코드를 사용합니다.

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$.  

다음과 같은 결과가 나타납니다.

여기에 이미지 설명을 입력하세요

나는 이 두 개의 화살촉이 동일하길 원합니다.

답변1

컴퓨터 모던 화살표에 어울리는 포괄적인 화살표 팁 세트를 준비했고,CTAN에 올렸어요(이 문제에 대한 토론과 수학적 다이어그램에 유용할 수 있는 추가 내용과 함께)

내 화살표 팁은 Christian만큼 정확하지는 않지만 (영역을 채우는 것과는 반대로) 몇 개의 선 스트로크를 사용하여 얻을 수 있는 정도이며 실제로 결과가 충분하다고 생각합니다.

다음은 비교입니다(위는 Computer Modern, 아래는 tikz로 그린 화살표).

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

여기에 이미지 설명을 입력하세요

답변2

여기에 얇은 외곽선을 사용하고 채우는 방식으로 Computer Modern처럼 보이는 화살촉을 그리는 또 다른 방법이 있습니다. 이 솔루션의 문제점은 10포인트로 인쇄하면 화살촉이 거의 보이지 않는다는 것입니다. 따라서 누군가 해결 방법을 찾기 전에는 이 코드를 사용하지 마십시오. 물론 화면에서는 결과가 괜찮아 보입니다. 아래에 예가 포함되어 있습니다.

교환 다이어그램

코드는 다음과 같습니다.

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

답변3

이 질문은메타 화살표 팁화살표 끝은 일반적으로 지지선 너비에 비례하여 크기가 조정되어서는 안 된다는 매뉴얼을 가리킵니다. 여기서는 위의 링크된 질문에 있는 -my to화살표 스타일을 수정한 화살표 스타일을 정의했습니다 . -bad to이것은 귀하가 제공한 것과 거의 일치할 수 있는 수준입니다.

여기에 이미지 설명을 입력하세요

노트:

  • 이는 선 너비에 따라 크기가 조정되는 버전에서 채택되었으므로 다른 선 너비에서는 그다지 좋은 결과를 얻지 못할 것입니다(사실 매우 끔찍합니다). tikz버전 의 선 너비를 amsmath.

암호:

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

답변4

내가 사용하는 코드는 다음과 같습니다. Computer Modern 화살촉을 상당히 잘 재현합니다. 특히, 팁은 설명서 74항의 방법으로 얻을 수 있는 것보다 얇고 덜 둥그스름합니다. 아이디어는 여러 개의 호(두께의 절반으로 그려짐)를 사용하여 윤곽선을 만든 다음 채우는 것입니다.

다음은 결과의 예입니다. 검은색 화살표는 Computer Modern( 로 생성됨 \longrightarrow)이고 빨간색 화살표는 아래 코드로 생성됩니다.

화살촉의 예

나는 화살촉의 크기를 글꼴 크기 등에 맞게 조정할 만큼 전문가가 아닙니다. 두 번째 문제는 낮은 확대/축소 수준이나 인쇄 시 선이 약간 너무 두꺼워 보인다는 것입니다. 코드가 에서 작동하지 않기 때문에 및 화살표에 대한 코드도 \pgfdeclarearrowsdouble포함했습니다 .\into\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
    }

관련 정보