![TikZ 源代码中 \scope 定义在哪里?](https://linux22.com/image/359829/TikZ%20%E6%BA%90%E4%BB%A3%E7%A0%81%E4%B8%AD%20%5Cscope%20%E5%AE%9A%E4%B9%89%E5%9C%A8%E5%93%AA%E9%87%8C%EF%BC%9F.png)
控制序列在 TikZ 源代码中出现多次,例如在文件内部宏\scope
定义的以下行:\tikz@lib@graph@parser@
<tex installation directory>/tex/generic/pgf/frontendlayer/tikz/libraries/graphs/tikzlibrariesgraphs.code.tex
\scope[graphs/.cd,@graph drawing setup/.try,@operators=,every graph/.try,#1]%
我找不到它在哪里定义。
我已经编辑了( ) 的grep
整个pgf
目录树,但是什么也没有出现。\def\scope
grep -rF "\def\scope" pgf
我对 执行了同样的操作\let\scope
,结果只出现了两个相关结果,分别位于宏\tikz@installcommands
和中\tikz@uninstallcommands
(均在文件中frontendlayer/tikz/tikz.code.tex
)。但这些宏似乎只与 s 相关tikzpicture
,更重要的是,它们似乎已经假设\scope
控制序列是在其他地方定义的:
\let\tikz@origscope=\scope
...
\let\scope=\tikz@origscope
那么这个控制序列是在哪里定义的呢?
答案1
在 TikZ 环境的设置中\tikz@installcommands
调用。
%
% Main TikZ Environment
%
\def\tikzpicture{%
\begingroup%
\tikz@startup@env%
\pgfutil@ifnextchar[\tikz@picture{\tikz@picture[]}}%}
\def\tikz@picture[#1]{%
\pgfpicture%
\let\tikz@atbegin@picture=\pgfutil@empty%
\let\tikz@atend@picture=\pgfutil@empty%
\let\tikz@transform=\relax%
\def\tikz@time{.5}%
\tikz@installcommands% <==============================This line
\scope[every picture,#1]%
\iftikz@handle@active@code%
\tikz@switchoff@shorthands%
\fi%
\expandafter\tikz@atbegin@picture%
\tikz@lib@scope@check%
}
这又具有以下结构
%
% Install the abbreviated commands
%
\def\tikz@installcommands{%
\let\tikz@origscope=\scope% <======== If scope is not yet defined, becomes undefined
\let\tikz@origscoped=\scoped%
\let\tikz@origendscope=\endscope%
.....
%
\let\scope=\tikz@scope@env%<======== This is the actual definition
\let\scoped=\tikz@scoped%
\let\endscope=\endtikz@scope@env%
\let\startscope=\scope%
\let\stopscope=\endscope%
\let\path=\tikz@command@path%
\let\againpath=\tikz@command@againpath%
%
......
}