Zuerst dachte ich, das sei ein Problem meines PDF-Viewers. Zum Beispiel mit dem Code
\documentclass{article}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}
A & B
\arrow[Rightarrow, from=1-1, to=1-2]
\end{tikzcd}
\end{document}
Das Ergebnis Rightarrow
scheint zwei kleine zusätzliche graue Linien zu enthalten:
Das Problem wurde angesprochen indiese Fragevor ein paar Monaten, wo der Autor einen komplizierten neuen Stil bereitstellte nRightarrow
, der das Problem zu beheben scheint ( Rightarrow
oben, nRightarrow
unten):
Der Bedarf für diesen neuen Stil nRightarrow
scheint jedoch hauptsächlich aus anderen, komplizierteren Problemen zu resultieren. Daher würde ich gerne wissen, ob es für das Problem dieser beiden zusätzlichen grauen Linien inzwischen eine einfachere Lösung gibt?
nRightarrow
Unten ist ein MWE, in das ich den Code aus der verlinkten Frage kopiert habe .
\documentclass{article}
\usepackage{tikz-cd}
\usetikzlibrary{calc}
\newlength{\eqoffset}
\makeatletter
% relative coordinates: (0,0) is the arrow's tail, x points towards the head,
% y points perpendicular, unit distance is \eqoffset
\newcommand{\relptstart}[2]{($($(k0)!#1*\eqoffset+\pgf@shorten@start@additional!0:(k1)$)!#2*\eqoffset!90:(k1)$)}
% (0,0) is the arrow's tip, rest is the same
\newcommand{\relptend}[2]{($($(k1)!#1*\eqoffset-\pgf@shorten@end@additional
-2*\eqoffset-.5*\pgflinewidth!180:(k0)$)!#2*\eqoffset!-90:(k0)$)}
\tikzcdset{
nRightarrow/.style={line join=round,
no head,
/tikz/commutative diagrams/@shiftabletopath,
execute at begin to = {
% Do not use tikzcd@noda or tikzcd@x here, it causes interference.
% Use new names instead
\path (\tikztostart) -- (\tikztotarget) coordinate[pos=0] (k0) coordinate[pos=1] (k1);
\pgfpointnormalised{\pgfpointdiff{\pgfpointanchor{k1}{center}}{\pgfpointanchor{k0}{center}}}
\pgfgetlastxy{\kdx}{\kdy}
\tikzset{
to path={
% arrow body
% the .06 is from \pgftransformxshift{.06\pgfutil@tempdima}
\relptstart{0}{1}
-- \relptend{-.06}{1}
{
% correct vertical position, more central horizontal position
% [xshift=-\kdy*\eqoffset, yshift=\kdx*\eqoffset]
% matches original Rightarrow more closely
[xshift=-\kdy*\eqoffset-\kdx*(\eqoffset+.25*\pgflinewidth),
yshift=\kdx*\eqoffset-\kdy*(\eqoffset+.25*\pgflinewidth)]
\tikztonodes}
\relptstart{0}{-1}
-- \relptend{-.06}{-1}
% arrow tip
% fake the round cap by using round joins and drawing the path twice with a turnaround at the caps
\relptend{2}{0} % tip to top end
.. controls \relptend{1}{0.05} and \relptend{-0.75}{1.25} ..
\relptend{-1.4}{2.65} % top end back to tip
.. controls \relptend{-0.75}{1.25} and \relptend{1}{0.05} ..
\relptend{2}{0} % tip to bottom end
.. controls \relptend{1}{-0.05} and \relptend{-0.75}{-1.25} ..
\relptend{-1.4}{-2.65} % bottom end back to tip
.. controls \relptend{-0.75}{-1.25} and \relptend{1}{-0.05} ..
\relptend{2}{0}
% Add a degenerate path segment at the end so shorten < and shorten > are not applied again
(k1)
}}
}}
}
\setlength{\eqoffset}{.225ex}
\makeatother
\begin{document}
\begin{tikzcd}[column sep=large]
A & B
\arrow[Rightarrow, from=1-1, to=1-2]
\end{tikzcd}
\begin{tikzcd}[column sep=large]
A & B
\arrow[nRightarrow, from=1-1, to=1-2]
\end{tikzcd}
\end{document}
Antwort1
Die verknüpfte Frage spannte einenlange Diskussionmit dem Autor von TikZ-CD darüber, wie man parallele Linien neu implementiert. Der Code scheint fastauf PGF-Niveau abgeschlossen.
Kurz vor der Neuimplementierung der Art und Weise, wie PGF double
Linien zeichnet, finden Sie hier einen Proof of Concept, wie die Art und Weise, wie PGF die double
Linien zeichnet, leicht geändert werden kann
- entweder durch Verlängerung der inneren Linie
- oder durch Kürzen der äußeren Linie.
Dies ist bei weitem nicht perfekt, funktioniert aber am besten für
- gerade Linien
- das aus einem Segment besteht (nur ein Zug am Anfang),
- sind nicht gestrichelt und verwenden die normale
rect
Linienoberseite.
Außerdem wäre es am besten, wenn die Pfeile die gezeichneten Knoten nicht berühren.
Die spath3
Bibliothek könnte dazu beitragen, dass die Kurve durch die (Rück-)Verkürzung nicht verzerrt wird, und könnte auch dabei helfen, dies auf Pfade anzuwenden, die über mehr als ein Segment verfügen.
Code
\documentclass[tikz]{standalone}
\usepackage{tikz-cd}
\makeatletter
\def\pgf@double@cheat#1{%
\let\pgf@tips@mode\pgf@tips@mode@false
\pgfsetarrowsstart{}\pgfsetarrowsend{}%
\pgfsetshortenstart{#1}\pgfsetshortenend{#1}%
\pgf@prepare@end@of@path\pgf@prepare@start@of@path}
\pgfset{
shorten outer/.code=%
\pgfmathsetlength\pgfutil@tempdima{#1}%
\pgfkeyssetevalue{/pgf/shorten outer}{\the\pgfutil@tempdima},
shorten outer=+0pt,
unshorten inner/.code=%
\pgfmathsetlength\pgfutil@tempdima{#1}%
\pgfkeyssetevalue{/pgf/unshorten inner}{\the\pgfutil@tempdima},
unshorten inner=+0pt}
\usepackage{etoolbox}
\patchcmd{\pgf@stroke@inner@line}{\pgfsyssoftpath@invokecurrentpath}{%
\ifdim\pgfkeysvalueof{/pgf/unshorten inner}>0pt
\pgf@double@cheat{-\pgfkeysvalueof{/pgf/unshorten inner}}%
\fi\pgfsyssoftpath@invokecurrentpath}{}{\PatchFailed}
\patchcmd{\pgfusepath}{\fi\pgfsyssoftpath@invokecurrentpath\pgf@up@action}{%
\fi \ifdim\pgfinnerlinewidth>0pt
\ifdim\pgfkeysvalueof{/pgf/shorten outer}>0pt
\pgfgetpath\pgf@temppath
\pgf@double@cheat{\pgfkeysvalueof{/pgf/shorten outer}}\fi\fi
\pgfsyssoftpath@invokecurrentpath%
\ifdim\pgfinnerlinewidth>0pt
\ifdim\pgfkeysvalueof{/pgf/shorten outer}>0pt
\pgfsetpath\pgf@temppath\fi\fi\pgf@up@action}{}{\PatchFailed}
\makeatother
\newcommand*\everycell[1]{%
\draw[cd=Rightarrow,#1]node(A){$A$}node(B)at(2,0){$B$}(A)to(B);}
\begin{document}
\tikz[
cd/.code=\tikzcdset{#1}, anchor=base,
cd dbl/.style={cd={background color=green}},
cells={nodes={behind path, help lines, draw, shape=asymmetrical rectangle}},
column 1/.append style={anchor=base west, nodes=path only},
rows/.style args={#1 => #2}{row #1/.append style={#2}},
rows/.list={2 => unshorten inner = .05pt,
3 => shorten outer = .05pt,
4 => {cd dbl=green, unshorten inner = 2pt},
5 => {cd dbl=green, shorten outer = 2pt}}
]\matrix[column sep=\tabcolsep]{
\node{normal:}; & \everycell{} & \everycell{bend left} \\
\node{inner:}; & \everycell{} & \everycell{bend left} \\
\node{outer:}; & \everycell{} & \everycell{bend left} \\
\node{extreme inner:}; & \everycell{} & \everycell{bend left} \\
\node{extreme outer:}; & \everycell{} & \everycell{bend left} \\};
\begin{tikzcd}[unshorten inner=+0.01pt]
A & B
\arrow[Rightarrow, from=1-1, to=1-2]
\end{tikzcd}
\end{document}
Ausgabe
In diesem Fall ist es am besten, wenn Sie sich die Ausgabe selbst zusammenstellen und in verschiedenen Zoomstufen und mit verschiedenen PDF-Viewern/Renderern betrachten. Sie können jedoch auf die ersten beiden Bilder klicken, um eine größere Version davon anzuzeigen.
Antwort2
Ich hab geschriebentikz-nfoldspeziell um dieses Problem zu lösen:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{cd}
\usetikzlibrary{nfold}
\begin{document}
\begin{tikzcd}
A & B
\arrow[Rightarrow, from=1-1, to=1-2, nfold]
\end{tikzcd}
\end{document}
Nebenbei bemerkt, der Autor vontikz-cd
kürzlichinformierte michDabei \usepackage{tikz-cd}
handelt es sich um eine veraltete Funktion, es ist jedoch nichts falsch daran, sie zu verwenden.