pgfkeys 的第一个字符语法检​​测失败

pgfkeys 的第一个字符语法检​​测失败

我在文件中保存了以下代码~/Test.tex

\documentclass{article}
\usepackage{pgfkeys}
\pgfkeys{
   /handlers/first char syntax=true,
   /handlers/first char syntax/the character a/.initial=\LowercaseA
}
\def\LowercaseA#1{#1}
\begin{document}
\pgfkeys{aardvark}
\end{document}

代码将\pgfkeys命令配置为检查每个键的第一个字符,如果这个字符是字母a,则使用单个参数调用\LowercaseA命令:键。\LowercaseA命令只是扩展为其参数。然后代码调用\pgfkeys,并将键传递给它aardvark

然后我在终端中执行了以下命令。

> cd ~
> pdflatex Test

编译失败,并~/Test.log包含以下错误消息。

! Package pgfkeys Error: I do not know the key '/aardvark' and I am going to ignore it. Perhaps you misspelled it.

See the pgfkeys package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.9 \pgfkeys{aardvark}

这真是一个意想不到的惊喜。我原本以为编译会成功,PDF 文件会显示字符串“aardvark”。我的预期是基于第 87.3.1 节中的以下引文首字符语法检​​测PGF 与 TikZ3.1.9a 版(当前版本)手册,第 977 页:

通常,键的形式为〈key〉=〈value〉,而如何处理此类键将在本节的其余部分讨论。但是,也可以为输入的某些部分设置不同的语法\pgfkeys。[...] 这种特殊的语法检测是在处理键时执行的第一件事,在执行任何后续操作之前。

问题

  1. 为什么编译失败?
  2. 我如何更改代码以便生成的 PDF 文件显示字符串“aardvark”?

答案1

检查\meaning a它的 catcode 是 11 个字母,因此:

\documentclass{article}
\usepackage{pgfkeys}
\pgfkeys{
   /handlers/first char syntax=true,
   /handlers/first char syntax/the letter a/.initial=\LowercaseA
}
\def\LowercaseA#1{#1}
\begin{document}
\pgfkeys{aardvark}
\end{document}

答案2

必须

/handlers/first char syntax/the letter a/.initial=\LowercaseA

手动状态

应该<meaning of character>是 TeX 命令返回的文本\meaning[...]。

由于a是字母(猫码11)而不是字符(catcode 12,其他), 这是the letter a

您可以自行检查 – 如手册所述 –

\meaning a

或者,如果你只想让 TeX 完成工作,只需这样做

/handlers/first char syntax/\meaning a/.initial=\LowercaseA

首先。

当然,如果 catcode 发生a变化,你的代码将不再起作用,但如果确实发生了变化,你就会遇到更大的问题……

代码

\documentclass{article}
\usepackage{pgfkeys}
\pgfkeys{
   /handlers/first char syntax=true,
%   /handlers/first char syntax/\meaning a/.initial=\LowercaseA,
   /handlers/first char syntax/the letter a/.initial=\LowercaseA,
}
\def\LowercaseA#1{#1}
\begin{document}

\pgfkeys{aardvark}

%\begingroup % This will fail because a is no longer a letter
%  \catcode`\a=12
%  \pgfkeys{aardvark}
%\endgroup

\end{document}

相关内容