当键路径包含宏时,如何扩展 pgfkeys 值?

当键路径包含宏时,如何扩展 pgfkeys 值?

这个问题代表了第二次更简单的尝试我之前问过一个问题,但是没有得到答复

简而言之,我需要将对 的调用的完整展开结果\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}

相关内容