这不是我第一次遇到这个问题。"(no default, initially xxx)" 和 "(default xxx)" 有什么区别吗?谢谢。
答案1
文档pgfkeys
给出了一些线索:.initial
在定义时存储到键中的值,.default
如果用户没有为键指定值,则使用的值
示例 with (在后端tcolorbox
使用pgfkeys
and )tikz
key是一个布尔值,在开始时(最初)lower separated
设置为,但只说是 key 就足够了,省略,这样就不需要记住默认值了。true
lower separated
=true
现在,colframe
key 选项最初设置为,因此如果没有指定,black!75!white
则将使用此颜色,但它没有默认值,因此仅仅说没有有效的语法。colframe
colframe
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}