为什么设置optionsalpha=0.5
里面的key 的值(即)不生效semilogxaxis
\begin{semilogxaxis}[alph=0.5]
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\pgfkeys{/tikz/.cd,
alph/.store in=\alph,
alph=1
}
\begin{tikzpicture}[declare function = { CFDfixedalph(\time) = \time^(\alph-1);}]
\begin{semilogxaxis}[alph=0.5]
\addplot[domain = 1e-6 : 1e6, samples = 100] {CFDfixedalph(x)};
\end{semilogxaxis}
\end{tikzpicture}
\end{document}
tikzpicture
与设置选项内的值不同(即\begin{tikzpicture}[declare function = { CFDfixedalph(\time) = \time^(\alph-1);},alph=0.5]
)?
答案1
我会将您的\alph
宏重命名为,\alphstore
因为我是一个胆小鬼,担心重新定义 LaTeX 的\alph
命令(即使是在本地),在某些情况下可能会产生不良的副作用。
背景与分析
pgfkeys
使用其类似文件系统的密钥层次结构实现命名空间1。当您使用基于pgfkeys
(例如tikz
,,,,,... )的包并将密钥传递给此pgfplots
包的命令forest
或环境而不指定密钥的完整路径时,通常会使用tikz-cd
tcolorbox
默认路径对于包。对于tikz
,默认路径为/tikz
;对于forest
,/forest
;对于tikz-cd
, ;对于 , /tikz/commutative diagrams
;对于tcolorbox
,/tcb
;对于 ,为 。对于pgfplots
,它是/pgfplots
。
您的代码:
\pgfkeys{/tikz/.cd,
alph/.store in=\alphstore,
alph=1
}
定义并调用键,因为/tikz/alph
。2/tikz/.cd
当你这样做时:
\begin{tikzpicture}[declare function = { ... }, alph=0.5]
alph=0.5
由从 获得的命令处理\begin{tikzpicture}
。这是一个 Ti钾Z 命令,因此由于您的密钥alph
没有给出完整路径,因此会在 中查找/tikz
。换句话说,完整路径变为/tikz/alph
。这是您定义的密钥,因此可以毫无问题地运行。但是,当您执行以下操作时:
\begin{semilogxaxis}[alph=0.5]
情况有点不同。处理的命令alph=0.5
不属于 Ti钾Z,而是属于pgfplots
。因此,它与 中的键一起使用/pgfplots
。在这种情况下,键/tikz/alph
是已执行,但显然对情节来说为时已晚。3
建议的修复
为了解决这个问题,只需在准备情节时考虑的alph
地方定义你的密钥,如下所示:pgfplots
\pgfkeys{/pgfplots/.cd,
alph/.store in=\alphstore,
alph=1
}
其实,这有一个捷径,那就是\pgfplotsset{alph/.store in=\alphstore, alph=1}
.\pgfplotsset
是Ti 是pgfplots
什么\tikzset
钾Z、\tikzcdset
to tikz-cd
、\forestset
to forest
、\tcbset
totcolorbox
等。有了这些\...set
宏,您无需记住每个包的前缀,但请记住,\...set
对于基于 的包,或多或少总会有一个以包名称开头的宏pgfkeys
。此宏通常对于自定义与所考虑的包相关的内容非常有用。
您的这个改变的例子:
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\pgfplotsset{alph/.store in=\alphstore, alph=1}
\begin{tikzpicture}[declare function = { CFDfixedalph(\time) = \time^(\alphstore-1);}]
\begin{semilogxaxis}[alph=0.5]
\addplot[domain = 1e-6 : 1e6, samples = 100] {CFDfixedalph(x)};
\end{semilogxaxis}
\end{tikzpicture}
\end{document}
其他技术
另一种方法是将其定义/pgfplots/alph
为直接存储值的键(而不是存储要执行的代码的键,后者是.store in
处理程序创建的)。这可能更符合精神pgfkeys
,但也更冗长,因为您需要恢复键的值(\pgfkeysvalueof{/pgfplots/alph}
)。也就是说,您可以使用快捷宏(例如\getalph
以下示例中的宏)来规避这个冗长问题,所以这可能也是一个很好的解决方案。
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\pgfplotsset{alph/.initial=1}
\newcommand*{\getalph}{\pgfkeysvalueof{/pgfplots/alph}} % convenient shortcut
\begin{tikzpicture}[
declare function = { CFDfixedalph(\time) = \time^(\getalph-1); } ]
\begin{semilogxaxis}[alph=0.5]
\addplot[domain = 1e-6 : 1e6, samples = 100] {CFDfixedalph(x)};
\end{semilogxaxis}
\end{tikzpicture}
\end{document}
脚注
谈论编程语言时使用的术语。
cd
代表“更改目录”。这与文件系统类似;例如,在许多 shell(POSIX、MS-DOS...)中,该cd
命令用于更改当前目录。/tikz/.cd
指示pgfkeys
转到/tikz
“目录”(它不是真正的文件系统目录;整个pgfkeys
目录层次结构只是一个树状结构,其中包含在记忆中)。这个新的“当前目录”(pgfkeys
术语中的默认路径)将一直有效,直到下一次.cd
(嵌套调用\pgfkeys
也可以更改它,但只能在嵌套调用内部)。这会导致使用此路径解析键的后续相对路径。例如,\pgfkeys{/tikz/.cd, line width=2pt, line cap=round}
相当于\pgfkeys{/tikz/line width=2pt, /tikz/line cap=round}
。这将导致打印以下消息:
包
pgfplots
警告:y 轴的轴范围几乎为空;[1.0000000000:1.0000000000]
在输入行 14 上将其扩大(它是)。