将 Tikz 长度转换为 TeX 长度

将 Tikz 长度转换为 TeX 长度

我获得了以任意 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。因此,如果\length3pt,则\@tempdima应该是 3pt。如果\length1mm,则\@tempdima应该是2.845274pt。如果\length10,则\@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

相关内容