我想要有与活动线宽按比例缩放的虚线图案,如下例所示:
\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 path
once 的某个属性,以便它始终选择按某个因子缩放的当前线宽。我尝试使用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
是一个长度,而不是一个宏,因此它不会被展开,而是被一个长度值替换。因此,如果你想要更改该值,必须在评估长度之前进行赋值,并且你不能在.code
key 内部进行此操作,因为正如你猜测的那样,它在评估样式之前不会执行。
一种解决方案是从长度更改\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 解析器能够评估该产品。否则这将不起作用。您通常不能像我在这里所做的那样通过宏来更改长度寄存器。