提问于:
浏览数:
1272
## 编译环境
操作系统
* [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 回答
0
谢谢邀请。
muzimuzhi(知乎@慕子) 在 Github上的回答已经很详细了,我是打酱油的,无法增益回答内容,只补充第一个问题,参考高德纳的书 The TeXbook 的第20章。
`\tikz@scan@one@point` 的主要作用是把 tikz 的坐标转换为 pgf 的坐标,为了识别各种 tikz 坐标,它的定义中使用了很多条件分支。举例子太麻烦,直接看定义代码吧。从定义看,这个命令可能需要库 calc 的支持。这个命令被用到了很多地方,有的库会用这个命令,很值得认真看一下。
-
嗯 谢谢你的回答^_^ – X Æ A-Xii 2021-01-13 18:26 回复
你的回答
请登录后回答
你的回答将会帮助更多人,请务必认真回答问题。