pgfmath 函数使用以 0 为前导的数字时产生意外结果

pgfmath 函数使用以 0 为前导的数字时产生意外结果

pgfmath 函数在用于前导零的数字时会产生意外结果。下面示例中的输出是否符合0011和的预期0021

\documentclass{article}
\usepackage{tikz}

\newcommand\truncateline[2]{% 
    #1 & #2 & \pgfmathtruncatemacro{\foo}{#1}\foo \\%
}
\newcommand\roundline[2]{% 
    #1 & #2 & \pgfmathround{#1}\pgfmathresult \\%
}
\newcommand\intline[2]{% 
    #1 & #2 & \pgfmathint{#1}\pgfmathresult \\%
}

\begin{document}

\section{pgfmathtruncatemacro}
\begin{tabular}{lll}
Input & Expected & Output \\
\truncateline{0}{0}
\truncateline{1}{1}
\truncateline{01}{1}
\truncateline{001}{1}
\truncateline{0011}{11}
\truncateline{0021}{21}
\end{tabular}

\section{pgfmathround}
\begin{tabular}{lll}
Input & Expected & Output \\
\roundline{0}{0}
\roundline{1}{1}
\roundline{01}{1}
\roundline{001}{1}
\roundline{0011}{11}
\roundline{0021}{21}
\end{tabular}

\section{pgfmathint}
\begin{tabular}{lll}
Input & Expected & Output \\
\intline{0}{0}
\intline{1}{1}
\intline{01}{1}
\intline{001}{1}
\intline{0011}{11}
\intline{0021}{21}
\end{tabular}

\end{document}

答案1

各州pgfmanual(第 62.1 条解析表达式的命令,第 526 页(v2.10 版本):

带有零前缀的整数(当然不包括零本身)被解释为八进制数,并自动转换为十进制。

所以021或者0021实际上是 2x8+2x1 = 17,而不是 21。

您需要避免或删除前导 0,例如使用如下递归宏:

\def\removeleadingzeros#1{\if0#1 \expandafter\removeleadingzeros\else#1\fi}

但是这在一般情况下不起作用(仅使用000等会破坏 eg)。使用 扩展数字\the\numexpr <number>\relax也会将 eg 变成0021,但这当然会首先21限制使用 的实用性。pgfmath


在搜索手册并查看源代码后,pgfmathparser.code.tex这种行为似乎是硬编码的并且不可配置。

相关内容