我在文件中保存了以下代码~/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
。[...] 这种特殊的语法检测是在处理键时执行的第一件事,在执行任何后续操作之前。
问题
- 为什么编译失败?
- 我如何更改代码以便生成的 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}