我正在努力使以下代码正常工作:
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\foreach \point in {(0,0),(0,2),(2,0),(2,2)} {
\begin{scope}[shift={\point}]
\fill (0,0) circle (0.1) ;
\end{scope}
}
\end{tikzpicture}
\end{document}
日志包含
包 tikz 错误:无法解析此坐标。
请参阅 tikz 包文档以了解解释。键入 H 可立即获得帮助。...
l.11 } 此错误消息由 \errmessage 命令生成,因此我无法提供任何明确帮助。假装您是 Hercule Poirot:检查所有线索,并按顺序和方法推断真相。缺少字符:nullfont 字体中没有 (!
缺少字符:字体 nullfont 中没有 0!
缺少字符:nullfont 字体中没有 ,!
缺少字符:字体 nullfont 中没有 0!
缺少字符:字体 nullfont 中没有 )!
有没有办法直接使用这些坐标,还是我应该采用 X/Y 样式?
更新:(针对声称()解决了问题)。我已通过控制台完全更新了 Miktex 安装。但是,仍然会出现以下几行(与 shift + () 的使用直接相关):
文件:epstopdf-sys.cfg 2021/03/18 v2.0 epstopdf 的 MiKTeX 配置 ))
缺少字符:字体 nullfont 中没有 )!
缺少字符:字体 nullfont 中没有 )!
缺少字符:字体 nullfont 中没有 )!
缺少字符:字体 nullfont 中没有 )!
[1]
列表中的每个坐标恰好有一个括号(使用不同数量的点进行检查)。
答案1
当 TikZ 解析器(也用于解析坐标shift
)发现它不理解的东西时,它通常会尝试扩展它前面的内容。
这就是为什么
\fill \point circle (0.1);
运行顺利。
如果用户写了错误的语法,TikZ 会有一个故障安全装置,因为它会减少内部计数器,并且只尝试扩展策略,直到该计数器达到 0。该计数器通常从 100 开始,并根据情况减少 1 或 10。
在某些地方,此计数器会重置为 100,例如在路径的起点处(这就是为什么
\fill[shift=\point] (0,0) circle (0.1) ;
有效)或解析器成功找到有效路径规范时。它没有重置在图片的开头或范围的开头。由于此时它仍然是默认值且已初始化为 0,因此解析会引发错误。
使用shift=(\point)
作品,因为还有一切正在发生的另一次扩展,但它会导致警告
Missing character: There is no ) in font nullfont!
这是因为它现在尝试解析
((0,0))解析器会识别
(0
为X坐标0
值为是值。但它将最后一个值留)
在 TeX 输入流上,类似于您所做的:
\path;
Foo
\path;
现在,为什么没有(0
引发任何错误?与 PGF/TikZ 中的许多东西一样,这将被输入到 PGFmath 并进行评估……而 PGFmath 对此没有问题。尝试
\pgfmathparse{(((((1}\pgfmathresult
甚至
\pgfmathparse{1))))}\pgfmathresult
我建议不要使用\expanded
和\noexpand
评论中建议的.expanded
密钥处理程序这将指示 PGFkeys 在将值赋给密钥之前先扩展该值。
(或者我们修补scope
环境或shift
密钥,或者只是手动重置计数器,但当 TikZ 本身不进行扩展时,使用密钥处理程序在其他地方总是能很好地工作。)
代码
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \point in {(0,0),(0,2),(2,0),(2,2)} {
\begin{scope}[shift/.expanded=\point]
\fill (0,0) circle[radius=.1];
\end{scope}
}
\end{tikzpicture}
\end{document}