tikz foreach 与坐标列表的非平凡用法

tikz foreach 与坐标列表的非平凡用法

我正在努力使以下代码正常工作:

\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
解析器会识别(0X坐标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}

相关内容