带线宽的刻度虚线图案

带线宽的刻度虚线图案

我想要有与活动线宽按比例缩放的虚线图案,如下例所示:

\documentclass[tikz]{standalone}
\newdimen\gpdashlength
\begin{document}

\begin{tikzpicture}
\pgfsetlinewidth{2pt}
\gpdashlength=0.5\pgflinewidth
\tikzset{gp path/.style={dash pattern=on 7.5\gpdashlength off 7.5\gpdashlength}}

\draw[gp path] (1.012,3.528)--(11.947,5.469);

\pgfsetlinewidth{4pt}
\gpdashlength=0.5\pgflinewidth
\draw[gp path] (1.012,2.557)--(11.947,6.440);
\end{tikzpicture}
\end{document}

在此处输入图片描述

这很好用,但我想设置gp pathonce 的某个属性,以便它始终选择按某个因子缩放的当前线宽。我尝试使用gp path/.code,但没有效果。以下文档未显示任何内容:

\documentclass[tikz]{standalone}
\newdimen\gpdashlength
\begin{document}

\begin{tikzpicture}
\tikzset{gp path/.code={\gpdashlength=0.5\pgflinewidth},
         gp path/.style={dash pattern=on 7.5\gpdashlength off 7.5\gpdashlength}}

\pgfsetlinewidth{2pt}
\draw[gp path] (1.012,3.528)--(11.947,5.469);

\pgfsetlinewidth{4pt}
\draw[gp path] (1.012,2.557)--(11.947,6.440);
\end{tikzpicture}
\end{document}

在我看来,该.code部分是在之后执行的,.style因此\gpdashlength设置不正确。

第二个例子有什么问题?

请注意,这应该用于 gnuplot 的lua tikz终端,因此可能无法对示例进行整体重构。这意味着,不能\pgflinewidth包含在虚线图案定义中,因为它位于系统范围的样式文件中,并且线宽和虚线图案之间的缩放因子可以在文档之间更改。

答案1

问题是,它\gpdashlength是一个长度,而不是一个宏,因此它不会被展开,而是被一个长度值替换。因此,如果你想要更改该值,必须在评估长度之前进行赋值,并且你不能在.codekey 内部进行此操作,因为正如你猜测的那样,它在评估样式之前不会执行。

一种解决方案是从长度更改\gpdashlength为宏,即:

\def\gpdashlength{0.5*\pgflinewidth}

这样,当发现此宏是虚线模式的一部分时,它会被展开,因此\pgflinewidth此时会使用 的当前值。您必须更改虚线模式以在 之前包含乘号 ( *) \gpdashlength。即:

\documentclass[tikz]{standalone}
\begin{document}

\def\gpdashlength{0.5*\pgflinewidth}
\begin{tikzpicture}
\tikzset{
         gp path/.style={dash pattern=on 7.5*\gpdashlength
                                     off 7.5*\gpdashlength}}

\draw[thin, gp path] (1.012,3.528)--(11.947,5.469);
\draw[very thick, gp path] (1.012,2.557)--(11.947,6.440);
\end{tikzpicture}
\end{document}

其结果为:

结果

请注意,这是因为 tikz 解析了包含 的数学表达式*。也就是说,在执行完所有扩展后,tikz“看到”以下破折号模式(例如,假设在此示例中\pgflinewidth为):0.8pt

 dash pattern=on 7.5*0.5*0.8pt off 7.5*0.5*0.8pt

Tikz 解析器能够评估该产品。否则这将不起作用。您通常不能像我在这里所做的那样通过宏来更改长度寄存器。

相关内容