访问 pgfkeys 外部环境

访问 pgfkeys 外部环境

\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}

在此处输入图片描述

相关内容