我想使用标签来分配覆盖规范。下面是我目前拥有的代码。我的主要问题是为什么下面的代码无法编译。
\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}