tikz-cd: zusätzliche graue Linie mit Rechtspfeil

tikz-cd: zusätzliche graue Linie mit Rechtspfeil

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 Rightarrowscheint zwei kleine zusätzliche graue Linien zu enthalten:

Bildbeschreibung hier eingeben

Das Problem wurde angesprochen indiese Fragevor ein paar Monaten, wo der Autor einen komplizierten neuen Stil bereitstellte nRightarrow, der das Problem zu beheben scheint ( Rightarrowoben, nRightarrowunten):

Bildbeschreibung hier eingeben

Der Bedarf für diesen neuen Stil nRightarrowscheint 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?

nRightarrowUnten 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 doubleLinien zeichnet, finden Sie hier einen Proof of Concept, wie die Art und Weise, wie PGF die doubleLinien 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 rectLinienoberseite.

Außerdem wäre es am besten, wenn die Pfeile die gezeichneten Knoten nicht berühren.

Die spath3Bibliothek 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.

Bildbeschreibung hier eingebenwie oben, jedoch mit eingezeichneten Knoten

Bildbeschreibung hier eingeben

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.

Antwort3

Wenn Sie xyein Paket für ein kommutatives Diagramm verwenden, gibt es am Ende des Pfeils keine vertikale oder parallele Linie.

\documentclass[a4paper,12pt]{article}
\usepackage[all,cmtip]{xy}

\begin{document}
\xymatrix@C=3pc{A \ar@{=>}[r]& B}
\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen