这个问题代表了第二次更简单的尝试我之前问过一个问题,但是没有得到答复。
简而言之,我需要将对 的调用的完整展开结果\pgfkeys
放入宏中以供以后使用,并且关键路径本身包含宏。目的是我有一些参数会根据文档的类型和部分而变化,并且我希望对 的单个调用\pgfkeys
(将出现在其他宏/环境的定义中)自动查找当前活动设置的正确参数。
我尝试使用.estore in
,但出现错误TeX capacity exceeded, sorry [input stack size=5000]
。
使用.store in
允许我设置密钥,但是由于宏包含未扩展的\pgfkeys
函数,因此我无法在像另一个宏/环境的参数这样的上下文中使用它,并且在调用另一个宏之前我无法弄清楚如何扩展它。 (在我使用的各种实验中\edef
,我通常会以无休止的编译告终。)在 MWE 中,multicols
以这种方式打开具有定义宏的环境会导致错误!Missing number, treated as zero
。
\pgfkeys
那么,当赋值语句的右侧本身就是对 的调用时,如何才能将完全扩展的值放入由 设置的宏中\pgfkeys
?
\pgfkeys
我倾向于使用仍然允许我使用而不是\pgfkeysvalueof
或其他键值包的解决方案,因为我大量使用.search also
处理程序,但此时我愿意考虑其他方法,包括l3keys
,即使它需要在其他地方进行大规模重写。
梅威瑟:
\documentclass{article}
\usepackage{pgfkeys}
\usepackage{multicol}
\newcommand{\ActiveFormat}{generic}
\newcommand{\ActiveDomain}{default}
\newcommand{\colnum}{1}
\pgfkeys{/stdt/.cd,
num-columns/.store in=\colnum,
% num-columns/.estore in=\colnum,
generic/default/num-columns/.initial=2,
}
\begin{document}
\textbackslash colnum = \colnum
\pgfkeys{/stdt/num-columns=\pgfkeys{/stdt/\ActiveFormat/\ActiveDomain/num-columns}}
% This is fine with the .sore in version
\textbackslash colnum = \colnum
% There will be an error here
\begin{multicols}{\colnum}
Some text.
Some more text.
\end{multicols}
\end{document}
答案1
如果我理解正确的话,我认为你应该使用/stdt/generic/default
与 Ti 相同的键钾z 使用其样式来设置基目录中的其他键(在本例中/stdt
而不是/tikz
)。
以下示例的结果是:
\documentclass{article}
\usepackage{pgfkeys}
\usepackage{multicol}
\newcommand\ActiveFormat{generic}
\newcommand\ActiveDomain{default}
\newcommand{\colnum}{1}
\pgfkeys{/stdt/.cd,
num-columns/.store in=\colnum,
generic/default/num-columns/.initial=2,
generic/default/.code=\pgfkeys{/stdt/num-columns=2},
generic/non-default/.code=\pgfkeys{/stdt/num-columns=4},
}
\begin{document}
\textbackslash colnum = \colnum
%\pgfkeys{/stdt/num-columns=\pgfkeys{/stdt/\ActiveFormat/\ActiveDomain/num-columns}}
\pgfkeys{/stdt/\ActiveFormat/\ActiveDomain}
% This is fine with the .store in version
\textbackslash colnum = \colnum
% No errors
\begin{multicols}{\colnum}
Some text.
Some more text.
\end{multicols}
\def\ActiveDomain{non-default}
\pgfkeys{/stdt/\ActiveFormat/\ActiveDomain}
\textbackslash colnum = \colnum
% No errors
\begin{multicols}{\colnum}
Some text.
Some more.
Some more.
Final column.
\end{multicols}
\end{document}