我获得了以任意 Tikz 支持的格式指定的长度(即,用户可能分配给键的任何内容,例如inner sep
)。
我想将该长度转换为 TeX 尺寸(即,我可以将其分配给 TeX 尺寸寄存器)。长度应解释为 y 坐标中的长度,以防出现差异。
为了具体起见,假设长度存储在中\length
,并且我想将结果放入中\@tempdima
。
我尝试过以下方法:
\def\length{1pt}% Just as an example. 1cm or 1 or \dimen should also work
\pgfpointxy{0}{\length}% This computes a point at (0,\length)
\@tempdima\pgf@y% Assigns the y-coordinate of the computed point to \@tempdima
\typeout{\the\@tempdima}%
有趣的是,这输出的是 28.45274pt,而不是预期的 1pt。
获取 TeX 坐标中长度的正确方法是什么。
(背景:我正在一组节点周围绘制一个边界框,类似于fit
,并且我想支持指定额外填充的键,类似于inner sep
。)
澄清:它应该适用于 等键支持的任何长度inner sep
。因此,如果\length
是3pt
,则\@tempdima
应该是 3pt。如果\length
是1mm
,则\@tempdima
应该是2.845274pt
。如果\length
是10
,则\@tempdima
应该是 垂直坐标单位的十倍(默认情况下为284.5274pt
)。
答案1
\pgfpointxy
宏使用其参数作为单位 x 和 y 长度的因子(即当前范围内的\pgf@xx
值\pgf@yy
)。数学解析器会为了方便起见将长度单位从量级中剥离出来,这样您就无需自己剥离它们了。
因此,实际发生的情况是,它1pt
变为 1,并乘以\pgf@yy
默认值 1cm。1cm 等于 28.45274 个 TeX 点。
如果您希望尊重长度,那么您需要使用\pgfpoint
宏。
\def\length{1pt}%
\pgfpoint{0pt}{\length}% Notice pt after 0 for consistency
\@tempdima\pgf@y%
\showthe\@tempdima%
得到1.0pt
。请注意,TikZ/PGF 还提供 scracth dimens\pgf@x<a,b,c,d>
以实现快速操作。
您还可以设置任何 TeX 尺寸以\pgfmathsetlength
进行算术运算。
要检查输入是否为维度表达式,您可以使用\ifpgfmathunitsdeclared
\documentclass{article}
\usepackage{pgf}
\makeatletter
\def\myfunc#1{%
\def\mylength{#1}%
\pgfmathparse{\mylength}
\ifpgfmathunitsdeclared%
\pgfpoint{0}{\mylength}%
\else%
\pgfpointxy{0}{\mylength}% This computes a point at (0,\length)
\fi%
\@tempdima=\pgf@y% Assigns the y-coordinate of the computed point to \@tempdima
}
\makeatother
\begin{document}
\myfunc{10}
\the\csname @tempdima\endcsname
\myfunc{10pt}
\the\csname @tempdima\endcsname
\end{document}
这给出
284.52744pt
10.0pt