这是我正在尝试做的一个极其简单的例子。
\documentclass{article}
\usepackage{pgfkeys}
\pgfkeys
{
/ae/example/set/parameters/.cd,
keya/.code = { \def\mykeya{#1} },
keyb/.code = { \def\mykeyb{#1} },
/ae/example/use/parameters/.cd,
keya/.code = { \mykeya },
keyb/.code = { \mykeyb },
}
\newcommand{\setkeys}[1]{\pgfkeys{ /ae/example/set/parameters/.cd, #1}}
\newcommand{\usekeys}[1]{\pgfkeys{ /ae/example/use/parameters/.cd, #1}}
\pagestyle{empty}
\begin{document}
\setkeys{keya={{\bfseries hello}},keyb={world!}}
\usekeys{keya,keyb}
This following text should not be \textbf{bold.}
\end{document}
总体来说,我有二传手和吸气剂键定义。一般来说,宏call 比仅仅为命令名称分配值要复杂得多。但上面的例子说明了我遇到的问题。我的内括号被完全剥离了。
我不想假设键值是定义子组。也就是说,我不一定想将键定义为
/ae/example/set/parameters/.cd,
keya/.code = { \def\mykeya{{#1}} },
我希望用户能够像在 MWE 中一样使用内部括号来指定分组:
\setkeys{keya={{\bfseries hello}}
我知道对于上面的例子我可以写
\setkeys{keya={\textbf{hello}}
一切都会好起来。但这种方法不适用于其他命令,例如\footnotesize
和其他类似命令。另外,我知道我可以将东西包装在盒子里
\setkeys{keya=\mbox{\bfseries hello}}}
但这会阻止盒子内部看到从外部调用的标记。
pgfkeys
关于如何在剥离牙套时不那么贪婪,有什么想法吗?
更新
我考虑过做类似的事情:
\setkeys{keya="\bfseries hello"}
并使用一些预处理器将转换"
为适当的括号。我还考虑定义一个变体关键喜欢
/ae/example/set/parameters/.cd,
keya*/.code = { \def\mykeya{{#1}} },
但我想知道是否有人有更好的方法。
答案1
从输入中剥离括号对是 TeX 的“标准”操作,例如
\def\foo#1\stop{\detokenize{#1}}
\foo{bar}\stop
\foo{bar} \stop
在第一种情况下,您会丢失括号,但在第二种情况下不会丢失。这种类型的代码(分隔参数)在任何键值(“keyval”)处理器中都是非常需要的,因此如果您不想意外“丢失”括号,则需要小心。
可以在内部设置代码,以便删除已知数量的括号。例如,LaTeX3 keyval 代码将在恰好一个来自输入的括号集,这意味着
foo = bar
和
foo = {bar}
等同但不同于
foo = {{bar}}
然而,这并不是要求创建 keyval 包时,括号剥离以这种方式工作。测试包pgfkeys
,它将剥离至少两组和最多三组括号,具体取决于输入中任何空格的确切位置。改变这种行为需要重写部分内容pgfkeys
,这可能会对使用该代码的其他包产生连锁反应:一些包可能隐式依赖于括号删除。当然,打开和关闭此类更改会很复杂(可行,但并非易事)。因此,我建议如果您确实需要确定剥离的括号对的数量,则使用明确记录结果的 keyval 包。
您可能希望将此问题报告给 的维护人员pgfkeys
,但我不确定他们是否会将其视为错误(他们没有记录应删除特定数量的括号)。正如我所说,更改此内容可能会造成破坏!