为什么 \pgfkeys 中的空格很重要?

为什么 \pgfkeys 中的空格很重要?

作为另一个问题的一部分(检测空的 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包有一种更简单的方法来修剪空格,但它也只会修剪其参数的开始和结束处的一个空格。

相关内容