关于宏“\tikz@scan@one@point”的问题

2021-01-07 16:42发布

## 编译环境 操作系统 * [X] Windows 7/8/10 * [ ] macOS * [ ] Linux `若需勾选,请把[ ]改成[x]` Tex发行版 * [X] TexLive `年...

## 编译环境 操作系统 * [X] Windows 7/8/10 * [ ] macOS * [ ] Linux `若需勾选,请把[ ]改成[x]` Tex发行版 * [X] TexLive `年份` * [ ] MikTeX `版本号` * [ ] CTeX `若需勾选,请把[ ]改成[x]` Update: 感谢 muzimuzhi(知乎@慕子)大神 在 [Github](https://github.com/CTeX-org/forum/issues/178)上的回答。 ---- ## 一些关于`\tikz@scan@one@point`的疑问 我正在阅读`\tikz@scan@one@point`, 但是我遇到了一系列问题: 1. 如何分辨一个宏的parameter对应的参数?比如: ```tex \def\tikz@scan@one@point#1{% \let\tikz@to@use@whom=\tikz@to@use@last@coordinate% \tikz@shapeborderfalse% \pgfutil@ifnextchar+{\tikz@scan@relative#1}{\tikz@scan@absolute#1}}% ``` 如果输入 `\tikz@scan@one@point\pgfutil@firstofone(A)`, (A是一个node) 那么与定义中“`#1`”对应的 是 `\pgfutil@firstofone`,还是 `\pgfutil@firstofone(A)`呢? 2. `\tikz@scanexpand`只有一个参数(`\def\tikz@scanexpand#1{...`) 但是在`\tikz@scan@absolute`的定义中,`\tikz@scanexpand`的调用 却不带任何参数: ```tex \def\tikz@scan@absolute#1{% \pgfutil@ifnextchar({\tikz@scan@@absolute#1}%) {% \advance\tikz@expandcount by -1% \ifnum\tikz@expandcount<0\relax% \let\pgfutil@next=\tikz@@scangiveup% \else% \let\pgfutil@next=\tikz@@scanexpand% \fi% \pgfutil@next{#1}% }% }% ``` 这种现象在TikZ的源码中多次出现, 有大牛可以解释一下这是为什么吗^_^ 另外,有没有通读过`tikz.code.tex`的大佬 可以大概解释一下`\tikz@scan@one@point`是如何工作的? 可不可以展示一些例子?
1条回答
U9430
2021-01-09 08:43
谢谢邀请。 muzimuzhi(知乎@慕子) 在 Github上的回答已经很详细了,我是打酱油的,无法增益回答内容,只补充第一个问题,参考高德纳的书 The TeXbook 的第20章。 `\tikz@scan@one@point` 的主要作用是把 tikz 的坐标转换为 pgf 的坐标,为了识别各种 tikz 坐标,它的定义中使用了很多条件分支。举例子太麻烦,直接看定义代码吧。从定义看,这个命令可能需要库 calc 的支持。这个命令被用到了很多地方,有的库会用这个命令,很值得认真看一下。

一周热门 更多>