令人困惑的算术!

令人困惑的算术!

在创建一些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*13,但是3*1cm85.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 / 2cmtikz将数量转换为统一的测量单位(pts)。但是,在这种情况下,如果除法中的测量值相似,则结果只是“分割”了测量值,得出了3。这是可以理解的。将此结果乘以1cm,首先将值转换为pts(每个中有28.45274个pts cm;参见\newlength{\templen} \setlength{\templen}{1cm} \the\templen),得出所需结果(3 x 28.45274 = 85.35822),并带有一些浮点误差。

类似的论点也适用于您的其他计算,因为pt在执行算术之前长度会被转换为 s。

相关内容