TikZ 内置的双线功能对内线和外线/背景线使用完全相同的长度,这很合理。但是,由于舍入误差或抗锯齿等原因,背景线在渲染过程中往往会在末端“渗出”。当然,“渗出”很小,但通常仍然很明显,使双线的错觉变得模糊。例如:
\documentclass[border=3pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows}
\begin{document}
\tikz\draw (0,0) edge[double equal sign distance,-implies] (.5,0);
\end{document}
其结果如下:
左侧有泄漏的黑线。(渲染到我的屏幕时(这与演示或以电子方式阅读文档有关)以及使用较低分辨率时,它通常会出现在两侧。)
我想要的只是将内线延长一点点,这样就可以消除伪影。如果我自己构造双线,我就可以做到这一点,如果我可以让它与箭头implies
和配合得很好double equal sign distance
,我想这也是一个可以接受的解决方案。(或者任何其他可以修复泄漏伪影的方法。)
是否有任何选项可用于将 ashorten <=-.1pt
或类似内容插入内线样式?鉴于它是一种低级机制,如果没有重大黑客攻击,也许没有办法做到这一点?
答案1
内线由下面的宏绘制,在pgfcorepathusage.code.tex
。
\def\pgf@stroke@inner@line@if@needed{% \ifdim\pgfinnerlinewidth>0pt\relax% \let\pgf@temp@save=\pgf@strokecolor@global \pgfsys@beginscope% {% \pgfsys@setlinewidth{\pgfinnerlinewidth}% \pgfsetstrokecolor{\pgfinnerstrokecolor}% \pgfsyssoftpath@invokecurrentpath% \pgfsys@stroke% }% \pgfsys@endscope% \global\let\pgf@strokecolor@global=\pgf@temp@save \fi% }
rect
因此,一个简单的解决方法是使用 line-cap或绘制内线round
。
\documentclass[tikz,border=3pt]{standalone}
\usetikzlibrary{arrows}
\makeatletter
\def\pgf@stroke@inner@line@if@needed{%
\ifdim\pgfinnerlinewidth>0pt\relax%
\let\pgf@temp@save=\pgf@strokecolor@global
\pgfsys@beginscope%
{%
\pgfsetrectcap% <-- adding this line
\pgfsys@setlinewidth{\pgfinnerlinewidth}%
\pgfsetstrokecolor{\pgfinnerstrokecolor}%
\pgfsyssoftpath@invokecurrentpath%
\pgfsys@stroke%
}%
\pgfsys@endscope%
\global\let\pgf@strokecolor@global=\pgf@temp@save
\fi%
}
\begin{document}
\tikz\draw (0,0) edge[double equal sign distance,double=red,-implies] (.5,0);
\tikz\draw (0,0) edge[double equal sign distance,double=red,line cap=round] (.5 ,0);
\tikz\draw (0,0) edge[double equal sign distance,double=red,line cap=rect] (.5 ,0);
\end{document}
请注意,当使用特定的线帽绘制外线时,这将产生有趣的结果。
为了解决这个问题,可以重新定义\pgfsetbuttcap
、pgfsetroundcap
,\pgfsetrectcap
使得 Ti钾Z 会记住线帽的全局设置并为内线选择合适的线帽。