TikZ 手册中的“(无默认值,最初为 xxx)”和“(默认 xxx)”有什么区别?

TikZ 手册中的“(无默认值,最初为 xxx)”和“(默认 xxx)”有什么区别?

这不是我第一次遇到这个问题。"(no default, initially xxx)" 和 "(default xxx)" 有什么区别吗?谢谢。

答案1

文档pgfkeys给出了一些线索:.initial在定义时存储到键中的值,.default如果用户没有为键指定值,则使用的值

示例 with (在后端tcolorbox使用pgfkeysand )tikz

key是一个布尔值,在开始时(最初)lower separated设置为,但只说是 key 就足够了,省略,这样就不需要记住默认值了。truelower separated=true

现在,colframekey 选项最初设置为,因此如果没有指定,black!75!white则将使用此颜色,但它没有默认值,因此仅仅说没有有效的语法。colframecolframe

OP 中的示例对我来说无法编译,但initially lineto意味着密钥从一开始就设置为lineto并以这种方式使用,但no default意味着不能只说pre,即必须使用此密钥指定一个值。

我们在几乎所有界面代码中都看到相同的行为key-value

\documentclass{article}

\usepackage[most]{tcolorbox}

\begin{document}

\begin{tcolorbox}[lower separated]

Foo

\tcblower

foobar
\end{tcolorbox}

\end{document}

答案2

为了补充 Christian 的回答,区分“代码键”(具有/.code处理程序)和“值键”(仅存储值)可能会有所帮助。事实上,一个键可以同时是两者(甚至更多),但关键点在于处理程序/.default负责处理默认参数对于/.code处理程序,而/.initial处理程序负责处理初始值(存储在\pgfkeys@<key>例如和中并通过\pgfkeysvalueof和访问\pgfkeyssetvalue)。这个答案可能有助于理解区别。

无论如何,让我们考虑一个例子,只有pgfkeys

\documentclass{article}
\usepackage{pgfkeys}
\begin{document}

\pgfkeys{/code key with initial/.initial={initial value}, /code key with initial/.code={code key with initial(#1)}}
\pgfkeys{/code key with default/.default={default value}, /code key with default/.code={code key with default(#1)}}

\pgfkeys{/value key with initial/.initial={initial value}}
\pgfkeys{/value key with default/.default={default value}}

\begin{enumerate}
    \item \pgfkeys{/code key with initial}
    % => code key with initial()
    \item \pgfkeys{/code key with default}
    % => code key with default(default value)
    \item \pgfkeys{/code key with initial=argument}
    % => code key with initial(argument)
    \item \pgfkeys{/code key with default=argument}
    % => code key with default(argument)
    \item \pgfkeysvalueof{/value key with initial}
    % => initial value
    \item \pgfkeysvalueof{/value key with default}
    % => (nothing!)
    \item \pgfkeyssetvalue{/value key with initial}{new value} \pgfkeysvalueof{/value key with initial}
    % => new value
    \item \pgfkeyssetvalue{/value key with default}{new value} \pgfkeysvalueof{/value key with default}
    % => new value
\end{enumerate}


\end{document}

我定义了两个“代码键”,以便它们只打印其名称和参数。当没有参数时,默认改用值(定义时)[并且根本不使用初始值]。当给出参数时,确实不使用默认值。

现在,我们还可以使用键来存储值,并使用\pgfkeysvalueof(以及其他可能性)检索它们。在这种情况下,键的值设置为定义键时赋予的值/.initial,如 Christian 所解释的那样,默认值不起作用。

最后,我们可以/.code使用相同的键,但随后您将进入一个毁灭的世界,因为您重载了默认值\pgfkeys@<key>/.@cmd(由设置),这将(暂时!请参阅和/.code的文档/.initial这个答案)将键的值设置为某个值……

关于您的示例,文档中所谓的“默认值”实际上是一个初始值,我们可以在源代码中检查,tikzlibrarydecorations.code.tex我们在其中找到了/pgf/decoration/pre/.initial=lineto。此键在之后的几行中使用\pgfkeysvalueof。在这里,pre=[something]在 tikz 中使用将仅在本地(通过默认处理程序)修改键的值,因为所有内容都在组内执行。我们可以通过一个简单的pgfkeys示例重现这一点,

\documentclass{article}
\usepackage{pgfkeys}
\begin{document}

\def\pgfkeysingroup#1{
    \bgroup
    \pgfkeys{#1}
    \egroup
}

\pgfkeys{/val/.initial={initial}, /do/.code={val=\pgfkeysvalueof{/val}}}

\pgfkeysingroup{do}
% => val=initial
\pgfkeysingroup{val=argument,do}
% => val=argument
\pgfkeysingroup{do}
% => val=initial
\end{document}

与以下内容对比:

\documentclass{article}
\usepackage{pgfkeys}
\begin{document}

\pgfkeys{/val/.initial={initial}, /do/.code={val=\pgfkeysvalueof{/val}}}

\pgfkeys{do}
% => val=initial
\pgfkeys{val=argument,do}
% => val=argument
\pgfkeys{do}
% => val=argument
\end{document}

相关内容