
TikZ eignet sich hervorragend zum Zeichnen von Diagrammen, aber es gibt eine Funktion, die ich ziemlich nervig finde, nämlich die Tatsache, dass die von TikZ bereitgestellte Standardpfeilspitze nicht unbedingt den Mathematikmodus in der von Ihnen verwendeten Schriftart berücksichtigt. Ich weiß, dass arrows
Sie in der TikZ-Bibliothek zwischen mehreren verschiedenen Arten von Pfeilspitzen wählen können, aber keine davon bietet dieselbe Pfeilspitze wie die im Mathematikmodus gezeichnete.
Wenn ich in TikZ ein Diagramm zeichne, möchte ich, dass die Pfeilspitzen mit den Pfeilspitzen übereinstimmen, die mit Befehlen wie \to
oder gezeichnet wurden \xrightarrow{foo}
.
Weiß jemand, wie man das behebt?
Wie Andrew Stacey in den Kommentaren unten vorschlägt, sollte ich Ihnen wirklich ein Beispiel dafür geben, wovon ich spreche.
Verwenden Sie den folgenden Code:
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$.
Ich erhalte die folgende Ausgabe:
Ich möchte, dass diese beiden Pfeilspitzen identisch sind.
Antwort1
Ich habe ein umfassendes Set an Pfeilspitzen passend zu den Computer Modern Pfeilen vorbereitet undhabe es auf CTAN gepostet(zusammen mit einigen Diskussionen zu diesem Thema und einigen weiteren Dingen, die für mathematische Diagramme nützlich sein könnten).
Meine Pfeilspitzen sind nicht so präzise wie die von Christian, aber sie sind ungefähr so gut, wie man mit ein paar Linienstrichen nur hinbekommt (im Gegensatz zum Ausfüllen einer Region), und in der Praxis finde ich das Ergebnis gut genug.
Hier ist ein Vergleich (Computer Modern oben, mit Tikz gezeichneter Pfeil unten).
\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}
Antwort2
Hier ist eine weitere Möglichkeit, Pfeilspitzen zu zeichnen, die wie die von Computer Modern aussehen, indem man einen dünnen Umriss verwendet und diesen ausfüllt. Das Problem bei dieser Lösung ist, dass die Pfeilspitze beim Drucken mit 10 Punkten fast unsichtbar wird. Verwenden Sie diesen Code also bitte nicht, bevor jemand eine Problemumgehung findet. Auf dem Bildschirm sieht das Ergebnis natürlich gut aus; unten finden Sie ein Beispiel.
Hier ist der Code:
\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
}
Antwort3
Diese Frage zuMeta-Pfeil-Tippsverweist auf das Handbuch, in dem steht, dass Pfeilspitzen normalerweise nicht proportional zur Breite der unterstützenden Linie skaliert werden sollten. Hier habe ich einen -my to
Pfeilstil definiert, der eine optimierte Version des -bad to
Pfeilstils in der oben verlinkten Frage ist. Dies kommt dem von Ihnen angegebenen so nahe, wie ich es erreichen kann.
Anmerkungen:
- Da dies von einer Version übernommen wurde, die mit Linienbreiten skaliert, wird dies mit anderen Linienbreiten keine sehr guten Ergebnisse liefern (tatsächlich ist es ziemlich schrecklich). Ich habe versucht, die Linienbreite der
tikz
Version so nah wie möglich an die von heranzubringenamsmath
.
Code:
\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}
Antwort4
Hier ist der Code, den ich verwende; er reproduziert die Pfeilspitzen von Computer Modern ziemlich gut. Insbesondere ist die Spitze dünner und weniger abgerundet als bei der Methode in Abschnitt 74 des Handbuchs. Die Idee besteht darin, mehrere Bögen (mit halber Dicke gezeichnet) zu verwenden, um einen Umriss zu erstellen und diesen dann auszufüllen.
Hier ist ein Beispiel für das Ergebnis: Der schwarze Pfeil ist der von Computer Modern (erstellt mit \longrightarrow
), der rote Pfeil wird durch den unten stehenden Code erzeugt.
Ich bin nicht Experte genug, um die Größe der Pfeilspitze an die Schriftgröße etc. anzupassen. Ein zweites Problem ist, dass die Linien bei niedrigen Zoomstufen oder im Druck etwas zu dick erscheinen. Da der Code mit nicht funktioniert , habe ich auch Code für und Pfeile \pgfdeclarearrowsdouble
eingefügt .\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
}