pgfkeys 太急于摘掉我的牙套

pgfkeys 太急于摘掉我的牙套

这是我正在尝试做的一个极其简单的例子。

\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,但我不确定他们是否会将其视为错误(他们没有记录应删除特定数量的括号)。正如我所说,更改此内容可能会造成破坏!

相关内容