我在文件中保存了以下代码~/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”是如何出现在等号右边的。
问题
- 为什么第二次编译没有像第一次编译那样产生字符串“precision=0”?
- 为什么第二次编译会产生字符串“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}