以下代码\node at ($(tag-node) + (2.5,0)$)
允许通过计算来放置节点$(tag-node) + (2.5,0)$
。
TikZ 是否通过改变 catcode 来做到这一点$
?
答案1
不,Ti钾Z 不会改变\catcode
的$
。事实上,如果你尝试自己改变 TikZ 的 的,\catcode
将会$
出现错误:
! Package tikz Error: Sorry, some package has redefined the meaning of the math
-mode dollar sign. This is incompatible with tikz and its calc library and migh
t cause unrecoverable errors.
TikZ 假设这$
是一个数学移位字符,并使用解析器来检查。其中tikz.code.tex
有以下代码:
\def\tikz@@@scan@@absolute#1({%
\tikz@ensure@dollar@catcode
\pgfutil@ifnextchar{$}%$
{\tikz@parse@calculator#1(}
{\tikz@scan@no@calculator#1(}%
}%
如果 ,则会\tikz@ensure@dollar@catcode
导致上述错误\catcode`$ != 3
。然后\pgfutil@ifnextchar{$}
检查 后面的字符是否(
为,并在这种情况下$
使用。\tikz@parse@calculator
其中tikzlibrarycalc.code.tex
有的定义\tikz@parse@calculator
:
\def\tikz@parse@calculator#1(${%$
\def\tikz@cc@command{#1}%
\begingroup%
%
% Parse main computation. It's a series of optional factors in front
% of coordinates.
%
\pgf@xa=0pt% We accumulate the result in here.
\pgf@ya=0pt%
\tikz@cc@parse+%
}%
\def\tikz@cc@parse{%
\pgfutil@ifnextchar${%$
% Ok, we found the end...
\tikz@cc@end%
}
{\pgfutil@ifnextchar+{%
% Ok, we found a coordinate...
\tikz@cc@add%
}{%
\pgfutil@ifnextchar-{%
\tikz@cc@sub%
}{%
\tikzerror{+ or - expected}%
\tikz@cc@end$%$
}%
}%
}%
}%
宏\tikz@parse@calculator
将使用\tikz@cc@parse
来解析表达式,最终检查结尾$
并完成计算。所有这些都假设\catcode`$=3
。