pgfkeys‘过滤状态’

pgfkeys‘过滤状态’

请问有人知道 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

  1. 我相信我写了那个代码。事实上,我首先编写了完整的密钥过滤内容。所以,答案应该是“我应该早该知道的”。

  2. 您的问题听起来像是“为什么嵌套键过滤有害?”,甚至是“如何扩展键过滤以允许嵌套调用?”。您的问题似乎是试图通过第三个问题来回答这个问题,对吗?

  3. 我认为禁止嵌套键过滤调用的原因是键过滤本质上是有状态的:键过滤意味着调用某个处理程序;并且pgfkeys对该(外部!)处理程序及其状态一无所知。例如,它可能意味着收集过滤后的键(常见用例)。这可以正确用于嵌套调用吗?这会重新启动处理程序吗?它需要这样做吗?根级和嵌套处理程序是否应该同时处于活动状态?还是只有其中一个?为什么?

  4. 为什么需要嵌套键过滤?我正在大量使用键过滤(用于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 分组就无法实现这一点。至少我在代码中读到的是这样的。

相关内容