请问有人知道 pgfkeys-core 文件中以下代码中提到的“过滤状态”吗?
\def\pgfkeys@install@filter@and@invoke#1{%
\ifpgfkeysfilteringisactive
\pgfkeys@error{Sorry, nested calls to key filtering routines are
not allowed. Reason: It is not possible to properly restore the
previous filtering state after returning from the nested call}%
\fi
\pgfkeysfilteringisactivetrue
\let\pgfkeys@case@one=\pgfkeys@case@one@filtered
\let\pgfkeys@try=\pgfkeys@try@filtered
\let\pgfkeys@keyunknown=\pgfkeys@keyunknown@filtered
#1%
\let\pgfkeys@case@one=\pgfkeys@orig@case@one
\let\pgfkeys@try=\pgfkeys@orig@try
\let\pgfkeys@keyunknown=\pgfkeys@orig@unknown
\pgfkeysfilteringisactivefalse
}
‘国家’有以下功能吗?
\pgfkeysfilteringisactive % boolean
\pgfkeys@case@one
\pgfkeys@case@one@filtered
\pgfkeys@try
\pgfkeys@try@filtered
\pgfkeys@keyunknown
\pgfkeys@keyunknown@filtered
答案1
我相信我写了那个代码。事实上,我首先编写了完整的密钥过滤内容。所以,答案应该是“我应该早该知道的”。
您的问题听起来像是“为什么嵌套键过滤有害?”,甚至是“如何扩展键过滤以允许嵌套调用?”。您的问题似乎是试图通过第三个问题来回答这个问题,对吗?
我认为禁止嵌套键过滤调用的原因是键过滤本质上是有状态的:键过滤意味着调用某个处理程序;并且
pgfkeys
对该(外部!)处理程序及其状态一无所知。例如,它可能意味着收集过滤后的键(常见用例)。这可以正确用于嵌套调用吗?这会重新启动处理程序吗?它需要这样做吗?根级和嵌套处理程序是否应该同时处于活动状态?还是只有其中一个?为什么?为什么需要嵌套键过滤?我正在大量使用键过滤(用于
pgfplots
),我甚至从未触及过这个限制……
无论如何,我建议继续离线讨论,因为这主要是关于 PGF 的实现细节。也许我可以找到答案,也许 pgf CVS 历史记录功能会告诉您有关该功能的更多信息,甚至无需询问我。如果您想继续讨论,可以给我发送电子邮件。
答案2
我认为过滤器状态更像是所有宏的值以及描述当前过滤情况的内容,\pgfkeyscurrentkey
诸如此类\pgfkeyscurrentvalue
。
您提到的名称只是固定命令,只有在激活过滤器时才会在“filtered”和“orig”之间切换,它们并不代表状态。
从我在代码中看到的情况来看,已经进行了一些尝试来实现保存/恢复,例如
% % THIS VERSION IS TOO SLOW. See below.
% \def\pgfkeysevalkeyfilterwith#1{%
% \edef\pgfkeys@eval@key@filter@subroutine@restorestate{%
% \noexpand\def\noexpand\pgfkeyscurrentkey{\pgfkeyscurrentkey}%
% \noexpand\def\noexpand\pgfkeyscurrentkeyRAW{\pgfkeyscurrentkeyRAW}%
% \noexpand\def\noexpand\pgfkeyscurrentname{\pgfkeyscurrentname}%
% \noexpand\def\noexpand\pgfkeyscurrentvalue{\pgfkeyscurrentvalue}%
% \noexpand\pgfkeys@pathtoks={\pgfkeyscurrentpath}%
% }%
% \pgfkeysinterruptkeyfilter
% \let\pgfkeys@case@one=\pgfkeys@eval@key@filter@subroutine@case@one
% \pgfkeysalso{#1}%
% \endpgfkeysinterruptkeyfilter% this here also restored \pgfkeys@case@one.
% \pgfkeys@eval@key@filter@subroutine@restorestate
% }%
%--------------------------------------------------
但似乎不使用 TeX 分组就无法实现这一点。至少我在代码中读到的是这样的。