![访问 pgfkeys 外部环境](https://linux22.com/image/453517/%E8%AE%BF%E9%97%AE%20pgfkeys%20%E5%A4%96%E9%83%A8%E7%8E%AF%E5%A2%83.png)
\pgfkeys
我发现在内部定义的键的值environment
不能在该环境之外调用。
aaa
在下面的例子中,我想在环境之外排版键的值minipage
并失败。
如何让这种按键在外界环境中被“看到”?
例子:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{minipage}{1.0\linewidth}
\pgfkeys{aaa/.initial=aaa,bbb/.initial=bbb}
Inside minipage, the value of the key "aaa" is \pgfkeysvalueof{/aaa}
\end{minipage}
Outside minipage, the value of the key "aaa" is |\pgfkeysvalueof{/aaa}|
\end{document}
答案1
由于其他答案和评论解释了为什么你的代码会这样运行,所以这里是.ginitial
处理程序是全球的。
这意味着初始化aaa/.ginitial = aaa
以及通过分配新值aaa = AAA
都是全局的。
但是,处理程序.add
、.prefix
、.append
和.get
不会.link
全局更改该值。 (为此,
我们需要.gadd
、 、...。).gprefix
在下面的代码中,密钥/bbb
仍然是本地的。
代码
\documentclass{article}
\usepackage{tikz}
\makeatletter
\long\def\pgfkeysgdef#1#2{%
\long\def\pgfkeys@temp##1\pgfeov{#2}%
\pgfkeysglet{#1/.@cmd}{\pgfkeys@temp}%
\pgfkeyssetgvalue{#1/.@body}{#2}%
}
\long\def\pgfkeysglet#1#2{%
\expandafter\global\expandafter\let\csname pgfk@#1\endcsname#2%
}
\long\def\pgfkeyssetgvalue#1#2{%
\pgfkeys@temptoks{#2}\expandafter\xdef\csname pgfk@#1\endcsname{\the\pgfkeys@temptoks}%
}
\pgfkeys{
/handlers/.ginitial/.code=%
\edef\pgfkeys@temp{% \pgfkeysgdef is basically /.gcode
\noexpand\pgfkeysgdef{\pgfkeyscurrentpath}%
{\noexpand\pgfkeyssetgvalue{\pgfkeyscurrentpath}{####1}}}%
\pgfkeys@temp
\pgfkeyssetgvalue{\pgfkeyscurrentpath}{#1}%
}
\makeatother
\begin{document}
\noindent
\begin{minipage}{1.0\linewidth}
\pgfkeys{aaa/.ginitial = aaa, bbb/.initial = bbb, aaa = AAA}
Inside minipage, the values of the keys --/aaa--/bbb-- are --\pgfkeysvalueof{/aaa}--\pgfkeysvalueof{/bbb}--
\end{minipage}
Outside minipage, the values of the key --/aaa--/bbb-- are --\pgfkeysvalueof{/aaa}--\pgfkeysvalueof{/bbb}--
\end{document}
输出
答案2
由于作用域,您在 中设置的键minipage
仅在该环境内定义。因此,您需要在环境之外定义键或以某种方式全局定义它。
你可以将方法应用于这个答案并创建宏的全局版本\pgfkeys
。但是,这种方法可能有风险,因为\pgfkeys
内部执行的所有操作都是全局的。在某些情况下,这可能会导致意外结果并破坏其他代码(感谢 Skillmon 和 David Carlisle 指出这一点)。
对于非常简单的任务,您可能还会使用\global\pgfkeyslet
,但使用这种方法,诸如 之类的东西.initial
将不适用。此外,与上述相同的警告也适用于此处。因此,如果您打算让其他人使用您的代码,请不要使用此方法!
因此,我建议重构文档的逻辑并在环境之外定义键。
\documentclass{article}
\usepackage{tikz}
%%% not recoomended!
\newcommand\gpgfkeys[1]{%
\begingroup%
\globaldefs=1\relax%
\pgfkeys{#1}%
\endgroup%
}
%%%
\begin{document}
\pgfkeys{aaa/.initial=aaa}
\noindent
\begin{minipage}{1.0\linewidth}
\def\mybbbkey{bbb} %%%
\global\pgfkeyslet{/bbb}{\mybbbkey} %%%
%%%
\gpgfkeys{ccc/.initial=ccc} %%% not recommended!
Inside minipage, the value of the key "aaa" is \pgfkeysvalueof{/aaa} \\
Inside minipage, the value of the key "aaa" is \pgfkeysvalueof{/bbb} \\
Inside minipage, the value of the key "ccc" is \pgfkeysvalueof{/ccc}
\end{minipage}
\bigskip
\noindent
Outside minipage, the value of the key "aaa" is ---\pgfkeysvalueof{/aaa}--- \\
Outside minipage, the value of the key "bbb" is ---\pgfkeysvalueof{/bbb}--- \\
Outside minipage, the value of the key "ccc" is ---\pgfkeysvalueof{/ccc}---
\end{document}