在覆盖规范中使用 pgfkeys

在覆盖规范中使用 pgfkeys

我想使用标签来分配覆盖规范。下面是我目前拥有的代码。我的主要问题是为什么下面的代码无法编译。

\documentclass[11pt]{beamer}
\usepackage{pgfkeys}
\pgfkeys{/.unknown/.code=%
        {\PackageError{some name}{Label \pgfkeyscurrentname{} not defined}{}}%
}
\begin{document}
    \begin{frame}{Title}        
        \pgfkeys{/bar 1/.append={2}}
        \pgfkeys{/foo 2/.append={1}}
        \begin{itemize}
            \item<\pgfkeys{/bar 1}> Some bar
            \item<\pgfkeys{/foo 2}> and foo
        \end{itemize}
    \end{frame}
\end{document}

我目前的解决方案:

以下代码修复了上述问题。但是,当我在覆盖规范中错误地写入其中一个标签时,pdflatex 不会终止,因为密钥未知。这意味着.unknown处理程序被忽略,这就是我对我的解决方案不满意的原因。

\documentclass[11pt]{beamer}
\usepackage{pgfkeys}
\pgfkeys{/.unknown/.code=%
    {\PackageError{some name}{Label \pgfkeyscurrentname{} not defined}{}}%
}
\begin{document}    
    \begin{frame}{Title}        
        \pgfkeys{/bar 1/.append={2}}
        \pgfkeys{/foo 2/.append={1}}
        \begin{itemize}
            \item<\pgfkeysvalueof{/bar 1}> Some bar
            \item<\pgfkeysvalueof{/foo 2}> and foo
        \end{itemize}
    \end{frame}
\end{document}

相关问题:

这里有人建议直接重新定义\item。但是,我不确定如何以良好且通用的方式重新定义覆盖宏。使用我目前的方法,我可以将标签方法与所有覆盖感知命令一起使用。

这里我第一次问过这个问题。我不用pgfkeys,而是将值存储在宏中,这样就让它工作了。但是我只能在标签中使用字母,这很不方便。

这里建议保护pgfkeys使用该命令\protect,但不起作用。我认为它们是相关的,因为导致的问题是相同的。

答案1

第一个代码

\item<\pgfkeys{/bar 1}> Some bar
\item<\pgfkeys{/foo 2}> and foo

不起作用,因为\pgfkeys是处理键的命令,它不返回给定键的值——beamer 应该用它做什么\pgfkeys{/bar 1, /foo 2, tikz/draw=green}

如果您需要将值存储在键中,\pgfkeysvalueof请像第二个示例中那样使用。但是,当使用不存在的键时,\pgfkeysvalueof将扩展为\relax,这将破坏 Beamer 的<…>解析器。

我没有看到在这里插入错误消息的方法(这仍然会干扰 Beamer)但您可以默认使用覆盖规范1-

代码

\documentclass[11pt]{beamer}
\newcommand\pgfkeysValueof[1]{%
  \csname\ifcsname pgfk@#1\endcsname pgfk@#1\else pgfkeysValueofDefault\fi\endcsname}
\newcommand*\pgfkeysValueofDefault{1-}

\begin{document}
\begin{frame}{Title}        
\pgfkeys{/bar 1/.append={2}}
\pgfkeys{/foo 2/.append={1}}
\begin{itemize}
    \item<\pgfkeysValueof{/bar 1}> Some bar
    \item<\pgfkeysValueof{/foo 2}> and foo
    \item<\pgfkeysValueof{/foobar}> I'm wrong
\end{itemize}
\end{frame}
\end{document}

相关内容