比标题更完整: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 在她的评论中指出的那样,pgf
TikZ 底层代码的低级命令也不需要分号。但作为 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
您给出的示例一样。