读取 - 以及效果 - (默认) tikz/pgf 键?

读取 - 以及效果 - (默认) tikz/pgf 键?

考虑以下 MWE:

\documentclass[varwidth,tightpage,border=1bp]{standalone}

\usepackage{tikz}
\pagecolor{yellow!15} % ignored with preview, but not w/ varwidth

\begin{document}

  \begin{tikzpicture}

    \tikzset{/tikz/line width=1cm} % no effect
    \draw %[/tikz/line width=1cm] % has effect here
      (0,0) -- ++(1,0)
      node[fill,scale=0.5](A){};

    \pgfkeysgetvalue{/tikz/line width}{\tmp}
    \typeout{tmpX \tmp \meaning\tmp}

  \end{tikzpicture}

\end{document}

我的第一个问题是:在这里我尝试\tikzset{/tikz/line width=1cm},但它没有效果(仅对文档大小);输出是:

测试03a.png

如果我使用\draw[/tikz/line width=1cm],那么效果,输出为:

测试03b.png

那么,问题是 - 为什么/tikz/line width没有任何效果?我原本以为它是一种“主”密钥/变量(如果没有指定其他内容,它就会启动)。

但对我来说更重要的是 - 我如何读取tikz/pgf键?如您所见,我正在尝试使用\pgfkeysgetvalue{/tikz/line width}{\tmp},但当我尝试将其打印到标准输出时,我得到了以下信息:

tmpX \tmp \relax

...这意味着\tmp无法扩展,可能是因为它已被“放”到\relax;所以我无法读取其中的任何信息/tikz/line width

那么,我如何以可扩展格式读取 TikZ/PGF 键,以便可以在代码中使用它们?


编辑:阅读后pgfkeys 的简单示例,我只是尝试过.initial

\tikzset{/tikz/line width/.initial=1cm} 

...然后,标准输出打印输出为:

tmpX 1cmmacro:->1cm

...这意味着我读取键的语法是正确的 - 但显然,/tikz/line width不是存在,即使我试图“设置”它?!

那么我的问题就变成了 - 在我们没有指定任何内容的情况下,什么控制线宽\draw,以及如何找到并打印相应的键值(如果存在)?


可能相关:

答案1

并非每个键都会设置一个值。

一个键可以执行任意代码。如果我们查看,tikz.code.tex就会发现当你调用\tikzset{line width=2pt}时它不会设置值,而是调用\tikz@semiaddlinewidth{2pt}。这反过来会扩展为\tikz@addoption{\pgfsetlinewidth{2pt}}\pgfmathsetlength\pgflinewidth{2pt}

这里有两件事。一是\pgfsetlinewidth设置为稍后调用。另一件事是\pgflinewidth设置为所需宽度。现在,\pgfsetlinewidth真正的关键就在这里。它在 PGF 子系统的深处设置线宽。所有的乱七八糟的事情\pgflinewidth实际上并没有设置真正的线宽。它需要真正的调用才能\pgfsetlinewidth做到这一点。

但是键/tikz/line width不会直接调用\pgfsetlinewidth。它将其设置为稍后调用。这就是它的作用\tikz@addoption。这些选项在路径构建后和渲染之前被调用。但是选项列表在路径构建开始时是空白的。因此,在它有机会生效之前\tikz@addoption,以下\draw命令会使其效果无效。

您可以\tikzset{every path/.append style={line width=\pgflinewidth}}确保环境线宽用作每条路径的默认线宽。或者您可以定义一个新键\tikzset{ambient line width/.code={\pgfsetlinewidth{#1}}}(无需\pgflinewidth在此处明确设置)。

正如 Paul Gaborit 在评论中指出的那样,你可以将一组路径放在一个范围内,并在范围的可选参数中设置线宽,从而实现更改一组路径的线宽。也就是说,

\begin{scope}[line width=1cm]
...
\end{scope}

将所有中间路径的线宽设置为 1cm。

原因是将可选参数scope传递给环境\tikzset,然后立即展开标记列表。这意味着隐藏在标记列表中\tikz@options的密钥部分实际上已被执行,因此行宽在 PGF 的核心深处被正确设置。line width\tikz@options

相关内容