tikz-cd: Rightarrow가 있는 추가 회색 선

tikz-cd: Rightarrow가 있는 추가 회색 선

처음에는 이것이 PDF 뷰어의 문제인 줄 알았습니다. 예를 들어, 코드를 사용하면

\documentclass{article}
\usepackage{tikz-cd}
\begin{document}

\begin{tikzcd}
    A & B
    \arrow[Rightarrow, from=1-1, to=1-2]
\end{tikzcd}

\end{document}

결과에는 Rightarrow두 개의 작은 추가 회색 선이 포함된 것 같습니다.

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

문제는 다음에서 해결되었습니다.이 질문몇 달 전, 저자는 nRightarrow문제를 해결하기 위해 복잡한 새로운 스타일을 제공했습니다( Rightarrow위, nRightarrow아래).

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

그러나 이 새로운 스타일의 필요성은 nRightarrow주로 다른 더 복잡한 문제에서 비롯된 것 같습니다. 따라서 나는 이 두 개의 추가 회색 선 문제에 대해 지금까지 존재하는 더 간단한 해결책이 있는지 알고 싶습니다.

nRightarrow아래는 연결된 질문 의 코드를 복사한 MWE입니다 .

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

답변1

연결된 질문은긴 토론TikZ-CD의 저자와 함께 평행선을 다시 구현하는 방법에 대해 설명합니다. 코드는 거의PGF 수준에서 완료.

여기서 PGF가 선을 그리는 방식을 다시 구현하는 것보다 PGF가 선을 double그리는 방식을 약간 변경하는 방법에 대한 개념 증명이 부족합니다.double

  • 안쪽 라인을 늘려서
  • 또는 바깥쪽 선을 줄여서.

완벽하지는 않지만 다음 경우에 가장 적합합니다.

  • 직선
  • 하나의 세그먼트로 구성됩니다(처음에는 하나만 이동).
  • 점선으로 표시하지 않고 일반 rect라인 캡을 사용합니다.

또한 화살표가 그려진 노드에 닿지 않는 것이 가장 좋습니다.

라이브러리 spath3는 단축(비)단축이 곡선을 왜곡하지 않도록 하는 데 도움이 될 수 있으며 두 개 이상의 세그먼트가 있는 경로에 이를 적용하는 데에도 도움이 될 수 있습니다.

암호

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

산출

이 경우 직접 컴파일하고 다양한 확대/축소 수준과 다양한 PDF 뷰어/렌더러를 사용하여 출력을 보는 것이 가장 좋습니다. 그래도 처음 두 이미지를 클릭하면 더 큰 버전을 볼 수 있습니다.

여기에 이미지 설명을 입력하세요위와 같지만 그려진 노드가 있음

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

답변2

나는 썼다tikz-nfold특히 이 문제를 해결하기 위해:

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

참고로 tikz-cd최근 에 저자는나에게 알려줬어이는 \usepackage{tikz-cd}레거시 기능이지만 사용하는 데 아무런 문제가 없습니다.

답변3

교환 다이어그램에 패키지를 사용하는 경우 xy화살표 꼬리에 수직선이나 평행선이 없습니다.

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

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

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

관련 정보