pgfkeys 第一次字符语法检​​测的奇怪行为

pgfkeys 第一次字符语法检​​测的奇怪行为

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

\documentclass{article}

\usepackage{pgfkeys}

\pgfkeys{
   precision/.code={precision=#1},
   unit/.code={unit=#1},
   /handlers/first char syntax=true,
   /handlers/first char syntax/the character 0/.initial=\Precision,
   /handlers/first char syntax/the letter a/.initial=\Unit
}

\def\Precision#1{\pgfkeysalso{precision=#1}}
\def\Unit#1{\pgfkeysalso{unit=#1}}

\begin{document}

\pgfkeys{0}

\end{document}

代码配置命令\pgfkeys检查每个键的第一个字符,如果这个字符是数字0或字母a,则\Precision分别调用\Unit命令,使用单个参数:键。命令\Precision扩展为字符串“precision=#1”,其中 #1 是其参数,类似地,命令\Unit扩展为“unit=#1”。然后代码调用\pgfkeys,将键0(即数字零)传递给它。

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

> cd ~
> pdflatex Test

因此文件~/Test.pdf已创建。在 PDF 查看器中打开时,它显示字符串“precision=0”,正如预期的那样。

然后我按照以下方式更改了代码。我the letter a用字符串替换了字符串the letter p。然后我重新编译。生成的 PDF 文件现在显示字符串“unit=precision”。

这让我很惊讶。我以为第二次编译的结果会和第一次编译的结果一样,因为\pgfkeys文档主体中的命令参数没有改变,而且它既不是a也不是p

此外,我不明白字符串“unit”是如何出现在等号右边的。

问题

  1. 为什么第二次编译没有像第一次编译那样产生字符串“precision=0”?
  2. 为什么第二次编译会产生字符串“unit=precision”?

答案1

此答案基于大卫·卡莱尔的建议我从以下网址获取了 TeX 尺寸列表这里。我只需要0到5这六个精度值。

\documentclass{article}

\usepackage{pgfkeys}

\pgfkeys{
   /stripdim/.cd,
   precision/.value required,
   precision/.code={\pgfkeyssetvalue{/stripdim/precision}{#1}[precision=#1]},
   unit/.value required,
   unit/.initial=cm,
   unit/.code={\pgfkeyssetvalue{/stripdim/unit}{#1}[unit=#1]},
   pt/.style={unit=pt},
   pc/.style={unit=pc},
   bp/.style={unit=bp},
   in/.style={unit=in},
   cm/.style={unit=cm},
   mm/.style={unit=mm},
   dd/.style={unit=dd},
   cc/.style={unit=cc},
   sp/.style={unit=sp},
   ex/.style={unit=ex},
   em/.style={unit=em},
   fil/.style={unit=fil},
   fill/.style={unit=fill},
   filll/.style={unit=filll},
   0/.style={precision=0},
   1/.style={precision=1},
   2/.style={precision=2},
   3/.style={precision=3},
   4/.style={precision=4},
   5/.style={precision=5}
}

\newcommand{\stripdim}[1][]{%
   \pgfkeys{/stripdim/.cd,#1}%
}

\begin{document}

[\stripdim]\par
\stripdim[precision=3]\par
\stripdim[unit=cm]\par
\stripdim[precision=3,unit=cm]\par
\stripdim[unit=cm,precision=3]\par
\stripdim[3]\par
\stripdim[cm]\par
\stripdim[3,cm]\par
\stripdim[cm,3]\par

\end{document}

使用 pgfkeys 来推断密钥。

相关内容