![\pgfkeysvalueof 如何工作?](https://linux22.com/image/241408/%5Cpgfkeysvalueof%20%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
通过这个最小的例子
\documentclass{report}
\usepackage{tikz}
\begin{document}
\tikzset{
line width = 5cm,
CC/.initial = 7cm
}
It doesn't works :\pgfkeysvalueof{/tikz/line width}
It works : \pgfkeysvalueof{/tikz/CC}
\end{document}
我无法获取线宽的值,而 CC 却无法获取。为什么?是不是因为 CC 像纯文本一样存储,而线宽不是?我该如何实现我的目标?
答案1
所显示的区别与工作原理无关\pgfkeysvalueof
。此宏只是扩展为给定的键,即它被定义为\csname pgfk@#1\endcsname
,因此您获得\pgfk@/tikz/CC
和\pgfk@/tikz/line width
(使用\csname
您可以在宏名称中包含空格和其他非字母)。
不同之处在于这些键的定义方式。/tikz/line width
被定义为.code={\tikz@semiaddlinewidth {#1}}
。这定义了一个名为的宏\pgfk@/tikz/line width/.@cmd
,它保存该代码并将值存储在其他地方。如果您使用键 PGF/TikZ(即pgfkeys
),则会检查 是否.@cmd
已定义并执行该代码。
现在,/tikz/CC
使用 来定义.initial
,它将7cm
值直接存储在键中,即在宏中。然后,您可以使用扩展到此宏\pgfk@/tikz/CC
再次获取该值。\pgfkeysvalueof{/tikz/CC}
因此,您不能只使用\pgfkeysvalueof
您自己未定义的任意键并希望它们能正常工作。内部实现可能比简单的分配更复杂。对于线宽,我可以为您提供帮助。最终的线宽存储在\pgflinewidth
维度寄存器中,即,您可以使用像 这样的因子来使用它0.5\pgflinewidth
。