考虑以下 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}
,但它没有效果(仅对文档大小);输出是:
如果我使用\draw[/tikz/line width=1cm]
,那么是效果,输出为:
那么,问题是 - 为什么/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