这是一个从我一开始接触这门语言就产生的问题。一般而言,基于厚积薄发原理,我们学习一门编程语言都会进行按如下顺序进行:
- 先跑一个
Hello World
,一方面是检验编译环境搭建好没,另一方面是感受该语言风格魅力; - 数据类型、变量合法性;
- 基本语法;
- 顺序、条件、循环;
- 作用域、生存期;
- 语言高级特性;
- 语法糖;
- ……
然而不幸的是,我最初接触 TeX 语言仅仅是直接套模板,根本没有也不需要考虑任何以上问题。然而这种知其然,却不知其所以然的学习方式极大地限制了我后期对它的控制能力。当我试图去高度定制化模板和接触更底层的命令时,我时常觉得举步维艰。本文仅讨论 2 和 5 的疑惑。
命名合法性
命令与环境
对于变量命名的合法性,在 Java 语言中
int $a_1 = 2;
定义了一个合法的变量$a_1
,在 TeX 语言中
\newcommand{\$a_1}{2}
却不能定义出一个合法的命令$a_1
,这是因为$
和_
在数学环境中有特殊含义。如果\$a_1
命令合法,那么$\$a_1$
将会发生歧义。
另外\@
在 TeX 中是一个合法的命令,但是却不能自定义出
\newcommand{\@a}{1}
\newcommand{\a@}{1}
这样的命令。那么这个@
究竟是不是合法的命名符号?文档中大量形如\@xxx
的命令是怎么来的?
标记
起初我以为\label{}
和\bibitem{}
的使用原理是,先在{}
中命名一个新“变量”,例如\label{a}
、\bibitem{b}
。然后在引用位置调用这个“变量”即可\ref{va}
、\cite{b}
。
但事实是,这里面放的并不是一个“变量”,或者说,其命名规则与我们平常所理解的变量有所出入。因为它可以出现一些特殊符号,如\label{fig:a}
。更一般地,\label{: +-*/}
也是一个合法的标记名。
\node[](xxx){};
的标记名xxx
也有与上类似的命名法则。
作用域
有一些命令的作用域只是后面紧跟的{}
。例如
\section{变成sec的格式}
正文内容格式
有一些命令的作用域是这个命令所在的整个区域。例如数学环境中的\rm
命令,其作用域包含于该命令所在的{}
内。
$斜体 {斜体 \rm{正体} 正体} 斜体$
听群友说
\def
出来的东西是局部有效的,但可以加\global
修饰(或等价\gdef
)使他全局生效。——3071241501
能否基于这类问题详细介绍一下作用域的控制与识别。
生存期
对 Python 来说
for i in [1,2,3]:
pass
退出循环后i
的值仍存在;对 C++ 来说
for(int i=0; i<3; i++);
退出循环后i
被释放;那么对 TeX 来说
\foreach \i in {1,2,3}{}
退出循环后,编译器又会对\i
如何处理呢?退出tikzpicture
环境后呢?
上面列出列出的这些问题我只是举个例子,旨在抛砖引玉,希望能得到不囿于以上所述的、更精细的解答。
没有财富值所以悬赏不了大家了抱歉T^T,我也不知道为什么 Markdown 发布出来后变得那么难看,在编辑预览时还是好好的。