TikZ 什么时候需要分号?

TikZ 什么时候需要分号?

比标题更完整:TikZ 何时需要或禁止在命令末尾使用分号?

学习 TikZ 时,我自然而然地上网复制我想要制作的绘图说明。许多示例在每个命令后都有一个分号,这似乎是 TikZ 手册的做法。

但是许多其他示例(其中包含许多命令)没有使用分号,但对我来说仍然很好用。我尝试在其中一个示例中的每个命令末尾添加分号,它仍然有效。但是在命令末尾添加分号有时会引起麻烦吗?

一般规则是什么?

正如评论所要求的那样,这里有一个适合我使用的 TikZ 绘图,没有分号:

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{tkz-euclide}
\usetikzlibrary{calc,through,intersections}
\usetkzobj{all}

\begin{document}
\begin{tikzpicture}[scale=1.5]
\tkzDefPoint(2,2){A}
\tkzDefPoint(5,-2){B}
\tkzDefPoint(1,-2){C}
\tkzDefCircle[in](A,B,C)
\tkzGetPoint{I} \tkzGetLength{rIN}
\tkzDefCircle[circum](A,B,C)
\tkzGetPoint{K} \tkzGetLength{rCI}
\tkzDrawPoints(A,B,C,I,K)
\tkzDrawCircle[R,blue](I,\rIN pt)
\tkzDrawCircle[R,red](K,\rCI pt)
\tkzLabelPoints[below](B,C)
\tkzLabelPoints[above left](A,I,K)
\tkzDrawPolygon(A,B,C)
\end{tikzpicture}
\end{document} 

答案1

对你的问题的简单回答是“几乎总是”。根据经验,每个tikz绘图命令都用分号分隔。该\foreach命令还使用最后的分号,即使它不一定绘制任何东西。但是,正如你在示例代码中所展示的那样,可以构造tikzpicture不需要分号的环境内的代码。

原因是您显示的所有命令都是宏,这些命令已使用宏定义中已包含的分号进行定义。这是软件包作者的设计选择tkz-euclide。我不会评论这是否是一个好的设计。它显然简化了界面,但代价是使命令的行为与常规tikz命令不同。

例如,该\tkzDrawCircle命令使用的内部命令的简化版本如下:(我简化了实际代码以使示例更清晰。)

\def\tkz@DrawCircle[#1](#2){
\begingroup
... set some keys for DrawCircle/.cd using #2
\draw[/DrawCircle/.cd,line style,#1]%
   (tkzPointResult) circle (\tkzLengthResult pt);%      
\endgroup
}

因此实际tikz命令\draw在定义内由分号分隔。

正如 cfr 在她的评论中指出的那样,pgfTikZ 底层代码的低级命令也不需要分号。但作为 TikZ 的常规最终用户,您不太可能使用或看到这些命令,因为它们通常仅在宏定义或\tikzset命令中使用。

此例外也适用于命令\tikzset本身,即使在tikzpicture环境中使用它也不会使用分号。


分号语法的一个好处是,由于有分号来终止当前命令,因此您可以为参数顺序等引入更多灵活性,并且 TikZ 可以尽可能好地解析它。这在固定结构中是不可能的,例如,如果您碰巧忘记删除

\tkzDefPoint (1,-2) {C}

它会导致一个错误,提示宏无法运行,因为它找不到它的参数,尽管它只差一个字符。

但是,请考虑以下两个有效的节点规范:

\node[draw] (n) at (2,1)           {a} ;
\node       at (2,1) [draw] (n)    {a} ;

这种灵活性是有限制的(请注意,节点内容始终在末尾给出,等等),但只要我们表现良好,它就会更加灵活,并且没有分号就需要非常严格的顺序和语法,就像在 PGF 级别或tkz-euclide您给出的示例一样。

相关内容