Al principio pensé que se trataba de un problema de mi visor de PDF. Por ejemplo, con el código
\documentclass{article}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}
A & B
\arrow[Rightarrow, from=1-1, to=1-2]
\end{tikzcd}
\end{document}
El resultado Rightarrow
parece contener dos pequeñas líneas grises adicionales:
El problema ha sido abordado enesta preguntahace unos meses, donde el autor proporcionó un nuevo estilo complicado nRightarrow
que parece solucionar el problema ( Rightarrow
arriba, nRightarrow
abajo):
Sin embargo, la necesidad de este nuevo estilo nRightarrow
parece provenir principalmente de otras cuestiones más complicadas. Por lo tanto, me gustaría saber que solo para el problema de estas dos líneas grises adicionales, ¿existe ya una solución más simple?
A continuación se muestra un MWE, en el que copié el código de nRightarrow
la pregunta vinculada.
\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}
Respuesta1
La pregunta vinculada surgió de unlarga discusióncon el autor de TikZ-CD sobre cómo volver a implementar líneas paralelas. El código parece estar casiterminado en un nivel PGF.
Aparte de volver a implementar la forma en que PGF dibuja double
líneas, aquí hay una prueba de concepto sobre cómo alterar ligeramente la forma en que PGF dibuja las double
líneas.
- ya sea alargando la línea interior
- o acortando la línea exterior.
Esto está lejos de ser perfecto, pero funciona mejor para
- lineas rectas
- que consta de un segmento (solo un movimiento al inicio),
- no están discontinuos y usan el
rect
límite de línea normal.
Además, sería mejor si las flechas no tocaran los nodos dibujados.
La spath3
biblioteca podría ayudar a que el (des)acortamiento no distorsione la curva y también podría ayudar a aplicar esto a caminos que tienen más de un segmento.
Código
\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}
Producción
En este caso, es mejor compilar usted mismo y ver el resultado en varios niveles de zoom y con diferentes visores/renderizadores de PDF. Aún así, puedes hacer clic en las dos primeras imágenes para ver una versión más grande.
Respuesta2
escribítikz-nfoldespecíficamente para resolver este problema:
\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}
Como nota al margen, el autor de tikz-cd
recientementeme informóEsa \usepackage{tikz-cd}
es una característica heredada, aunque no hay nada de malo en usarla.