![为什么 \pgfkeys 中的空格很重要?](https://linux22.com/image/406165/%E4%B8%BA%E4%BB%80%E4%B9%88%20%5Cpgfkeys%20%E4%B8%AD%E7%9A%84%E7%A9%BA%E6%A0%BC%E5%BE%88%E9%87%8D%E8%A6%81%EF%BC%9F.png)
作为另一个问题的一部分(检测空的 PGFKEYS),我发布了一个代码片段,其中有人告诉我空格无关紧要。我已经能够重现它有关系的情况。有人能帮我理解为什么以下代码中不允许使用空格吗(见下面的评论)
梅威瑟:
\documentclass{minimal}
\usepackage{pgfkeys}
\pgfkeys{
/dir/.is family,
/dir/akey/.code={do something}
}
\newcommand\test[1]{% Note, don't put a space between the , and the #1, why? I don
't know.
\pgfkeys{/dir,#1}
}
\begin{document}
\test{
akey
}
\end{document}
如果在“/dir,#1”中的逗号后添加一个空格,pdflatex 会拒绝此代码并显示错误“我不知道密钥‘/dir/akey’”。这是怎么回事?
答案1
这里发生的事情是:Latex 通常会将可能看到的尽可能多的空格组合成一个空格:因此 Latex 会自动将 a⎵⎵⎵b 转换为 a⎵b。因此,具体来说,如果您说,\pgfkeys{ some key = some value }
那么它会将键周围的空格变成一个空格。(Latex 还会将单个换行符转换为空格并将其与相邻空格组合,并忽略行中的初始空格。)然后\pgfkeys
删除键周围的单个空格填充。
但是,如果您先说\newcommand\somecommand[1]{#1 }
然后说,\somecommand{ }
那么这将扩展为两个相邻的空格。相邻空格的删除是在解析文件时完成的,并且这两个空格一开始并不是相邻的。
在您的示例中\pgfkeys
看到“⎵⎵akey”,将其变成“⎵akey”,然后抱怨“⎵akey”是一个未定义的键。
使用如下命令删除键周围的空格,\pgfkeys@spdef
其用法类似于\pgfkeys@spdef\somecommand{<some argument>}
并定义\somecommand
为<some argument>
从末尾删除最多一个空格,从开头删除最多一个空格。\pgfkeys@spdef
在文件 pgfkeys.code.tex 第 466 行定义。
该trimspaces
包有一种更简单的方法来修剪空格,但它也只会修剪其参数的开始和结束处的一个空格。