tikz:如何将一种样式设置为另一种样式的值?

tikz:如何将一种样式设置为另一种样式的值?

我有一个由虚线组成的像素网格,我想使用 设置一个像素minimum size

如您所见,我手动设置了最小尺寸,这是可行的。但是,我想将其设置为另一个继承的样式键。我该怎么做?(幼稚的)注释掉的代码不起作用。

\documentclass[tikz, border=3mm]{standalone}

\usetikzlibrary{calc}

\tikzset{
  grid lines/.style={
    line width=0.5pt,
    dashed,
    step=5mm},
  pixel/.style={
    grid lines,
    solid,
    draw,
%   minimum size=\pgfkeysvalueof{step},
    minimum size=5mm,
    fill}
}

\begin{document}
\begin{tikzpicture}
  \draw[grid lines] (0,0) grid (1,1);
  \node[pixel] at (0.25,0.25) {};
\end{tikzpicture}
\end{document}

姆韦

答案1

可以深入研究代码来了解其step工作原理并读回神奇数字(\tikz@grid@x\tikz@grid@y),但我建议采用不同的方法,即使用单独的键设置这些参数,然后在两个部分中使用这些键。

\documentclass[tikz, border=3mm]{standalone}
%\url{https://tex.stackexchange.com/q/660910/86}
\usetikzlibrary{calc}

\tikzset{
  pixel/line width/.initial=0.5pt,
  pixel/size/.initial=5mm,
  grid lines/.style={
    line width=\pgfkeysvalueof{/tikz/pixel/line width},
    dashed,
    step=\pgfkeysvalueof{/tikz/pixel/size}
  },
  pixel/.style={
    solid,
    draw,
    line width=\pgfkeysvalueof{/tikz/pixel/size},
    minimum size=\pgfkeysvalueof{/tikz/pixel/line width},
    inner sep=0pt,
    fill}
}

\begin{document}
\begin{tikzpicture}
  \draw[grid lines] (0,0) grid (1,1);
  \node[pixel] at (0.25,0.25) {};
\end{tikzpicture}
\end{document}

带有填充正方形的网格

答案2

\pgfkeysvalueof宏仅适用于实际值键。

我猜是由于遗留的原因,键xstepystep只是定义了另一个宏(这里\tikz@grid@x\tikz@grid@y),尽管它们也可以是值键。

并将step这两个宏设置为相同的值?不,因为它还允许以坐标形式(以 开头()的值,并将 xstep 设置为该坐标的X值和该坐标的 ystep价值。

即使我们找到了一种方法来检索赋予其中一个键的值,也需要考虑如何处理step = (15:1cm)


嗯,你总是可以在现有的密钥上添加更多内容,比如说,

@step/.initial=1cm,
step/.append style={/tikz/@step={#1}}

然后\pgfkeysvalueof{/tikz/@step}返回最后给出的值step(也可能是(15:1cm)!)。


我们可以重写xstepystepstep工作原理:

\tikzset{
  xstep/.initial=1cm,
  ystep/.initial=1cm,
}
\makeatletter
\def\tikz@step@single#1{%
  \pgfkeyssetvalue{/tikz/xstep}{#1}%
  \pgfkeyssetvalue{/tikz/ystep}{#1}}
\def\tikz@step@point#1{%
  \pgf@process{#1}%
  \pgfkeyssetevalue{/tikz/xstep}{\the\pgf@x}%
  \pgfkeyssetevalue{/tikz/ystep}{\the\pgf@y}}
\def\tikz@grid@x{\pgfkeysvalueof{/tikz/xstep}}
\def\tikz@grid@y{\pgfkeysvalueof{/tikz/ystep}}
\makeatother

现在您可以使用\pgfkeysvalueof{/tikz/xstep}/ \pgfkeysvalueof{/tikz/ystep}...
但是您仍然会遇到 的情况,step = 1因为 TikZ 允许在 xy 坐标系中使用无量纲单位。 ( 中的无量纲单位minimum size将被解释为pt。)

在您的情况下,您明确地使用step=5mm并放入grid lines其中,pixel因此您避开了所有这些问题,但我想强调当您考虑到所有一般可能性和用例时,这会变得多么复杂。


综上所述,Andrew Stacey 的解决方案是一种更简洁的方法,可以让您(或您的用户)更好地控制绘制的内容。只是不要忘记只使用带单位的尺寸pixel/size

相关内容