背景与分析

背景与分析

为什么设置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-cdtcolorbox默认路径对于包。对于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}。这是一个 TiZ 命令,因此由于您的密钥alph没有给出完整路径,因此会在 中查找/tikz。换句话说,完整路径变为/tikz/alph。这是您定义的密钥,因此可以毫无问题地运行。但是,当您执行以下操作时:

\begin{semilogxaxis}[alph=0.5]

情况有点不同。处理的命令alph=0.5不属于 TiZ,而是属于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什么\tikzsetZ、\tikzcdsetto tikz-cd\forestsetto forest\tcbsettotcolorbox等。有了这些\...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}

脚注

  1. 谈论编程语言时使用的术语。

  2. 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}

  3. 这将导致打印以下消息:

    pgfplots警告:y 轴的轴范围几乎为空;[1.0000000000:1.0000000000]在输入行 14 上将其扩大(它是)。

相关内容