以下示例在 tikz 3.0.0(TL 2014 以及可能的 2015)以下版本中运行良好,但从 tikz 3.0.1a(直到现在)开始出现故障:
\documentclass{report}
\usepackage{calc}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
Start image
\begin{tikzpicture}[inner sep=0pt, inner ysep=0.3ex]
\path let \p1 = (0,4), \p2 = (0,8) in node (foo) at (0,0+\maxof{\y1}{\y2}) {Hello};
\end{tikzpicture}
\end{document}
出现以下错误:
! Missing number, treated as zero.
<to be read again>
m
l.8 ...,8) in node (foo) at (0,0+\maxof{\y1}{\y2})
{Hello};
?
只需将一个文件(pgfmathparser.code.tex
)从旧安装复制到新安装,示例即可再次开始工作。
这是一个已知问题吗?
谢谢
答案1
在较新的 pgf 版本中,calc 的兼容性代码已从 \pgfmathparse@
更“内部”的命令移出,这会中断令牌处理。如果我再次添加代码,\pgfmathparse@
它会再次运行:
\documentclass{report}
\usepackage{calc}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{xpatch}
\makeatletter
\xpretocmd\pgfmathparse@{\let\maxof=\pgfmath@calc@maxof}{}{\fail} %and so on
\makeatother
\begin{document}
Start image
\begin{tikzpicture}[inner sep=0pt, inner ysep=0.3ex]\tracingmacros=1
\path let \p1 = (0,4), \p2 = (0,8) in node (foo) at (0,{0+\maxof{\y1}{\y2}}) {Hello};
\path let \p1 = (0,4), \p2 = (0,8) in node (foo) at (0, 0+\maxof{\y1}{\y2}) {Hello};
\path let \p1 = (0,4), \p2 = (0,8) in node (foo) at (0,{0+ max(\y1,\y2)}) {Hello};
\end{tikzpicture}
\end{document}
但我不知道为什么代码被移动了,因此可能会产生不必要的副作用。也有可能在两个位置的中间某个地方有更好的位置放置代码。
编辑
我找到了做出更改的提交。这是在实施“快速通道”时完成的:
为数学解析器添加了自动“快速通道”:
如果输入的是没有单位的数字,它将按原样返回。对于大型散点图,排版时间减少 66%,而对于数学密集型数字,开销仅为 1%。
我认为代码不是故意移到内部命令中的,而或多或少是偶然的,因为新的内部命令是通过改变现有的pgfmathparse@
并将 calc-compability 代码移回而编写的pgfmathparse@
,应该可以正常工作。