在创建一些pgfmathsetmacro
算术宏时,我偶然发现了一个非常令人困惑的结果。请看以下示例:
\documentclass{article}
\usepackage{tikz}
\usepackage{xstring}
\begin{document}
\begin{tikzpicture}
\newcommand{\boxWidth}{6cm};
\newcommand{\boxHeight}{1cm};
\pgfmathsetmacro{\boxOffset}{\boxWidth / 2cm * 1cm} %%%wtf
\coordinate (Title) at (1cm + \boxOffset,0);
\draw [red] (0,0) -- (1,0);
\node[draw, rounded corners=.3cm, color=red, minimum width=\boxWidth, minimum height=\boxHeight, text=black] at (Title) {Hello};
\end{tikzpicture}
\end{document}
* 1cm
但是,如果从我的宏中删除\boxOffset
,就会出现完全出乎意料的结果:
什么?!从表面上看,这似乎是在说2 * 1 != 2
一句真话!
除此之外,当我正在尝试创建一个示例 LaTeX 脚本时,以下问题在这个论坛上,我偶然发现了一个类似的欺骗性算术:
\documentclass{article}
\usepackage{tikz}
\usepackage{xstring}
\begin{document}
\begin{tikzpicture}
\newcommand{\str}{hello};
\pgfmathsetmacro{\numOne}{width("\str") * 1pt / 4cm}; %%%wtf
\node at (0, 0) {\str};
\draw [color=black] (\numOne, 0cm) -- (\numOne,-1cm);
\end{tikzpicture}
\end{document}
以下示例创建非常可预测输出:
但是,如果我改变\numOne
来计算以下内容width("\str") * 1pt / 2cm / 2cm
,那么我得到一个非常难以预测输出:
什么?!这告诉我这个荒谬的说法x / 2 / 2 != x / 4
是真的。
谁能解释一下这里发生了什么?这不是我唯一一次遇到这种情况欺骗性算术我不知道发生了什么。
^这就是我现在的感受。
答案1
您认为乘以 1cm 与乘以 1 相同,这种假设是错误的。
那么乘以 1 英寸或 1 毫米怎么样?
该函数\pgfmathresult
返回一个数字,而不是尺寸。出于实现原因,数字 1 存储为长度,精确为 1pt。
因此3*1
是3
,但是3*1cm
是85.35823
,因为1cm=28.45275pt
(然后应用 TeX 的舍入)。
答案2
解决这个问题的最简单方法是看看两次计算的结果有什么不同\boxOffset
:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\newcommand{\boxWidth}{6cm}
\newcommand{\boxHeight}{1cm}
\pgfmathsetmacro{\boxOffset}{\boxWidth / 2cm}%
\verb|\boxOffset| 1: \boxOffset
\pgfmathsetmacro{\boxOffset}{\boxWidth / 2cm * 1cm}%
\verb|\boxOffset| 2: \boxOffset
\end{document}
在执行除法时6cm / 2cm
,tikz
将数量转换为统一的测量单位(pt
s)。但是,在这种情况下,如果除法中的测量值相似,则结果只是“分割”了测量值,得出了3
。这是可以理解的。将此结果乘以1cm
,首先将值转换为pt
s(每个中有28.45274个pt
s cm
;参见\newlength{\templen} \setlength{\templen}{1cm} \the\templen
),得出所需结果(3 x 28.45274 = 85.35822),并带有一些浮点误差。
类似的论点也适用于您的其他计算,因为pt
在执行算术之前长度会被转换为 s。