这是一个从我一开始接触这门语言就产生的问题。一般而言,基于厚积薄发原理,我们学习一门编程语言都会进行按如下顺序进行:

  1. 先跑一个Hello World,一方面是检验编译环境搭建好没,另一方面是感受该语言风格魅力;
  2. 数据类型、变量合法性;
  3. 基本语法;
  4. 顺序、条件、循环;
  5. 作用域、生存期;
  6. 语言高级特性;
  7. 语法糖;
  8. ……

然而不幸的是,我最初接触 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 发布出来后变得那么难看,在编辑预览时还是好好的。

2 回答2

0
你再改改这个问题描述吧……
  • 回复 undefined :没关系,目前问答网站还需要继续提高,你未来也可以养成习惯,提问之后再回头看一眼 – 啸行 2019-12-25 23:01 回复
  • 啊啊啊啊啊,相信我,我编辑的时候markdown预览是没问题的!!真的T^T – zhaochongbin 2019-12-25 22:53 回复
0
适合去[https://github.com/CTeX-org/forum/issues](https://github.com/CTeX-org/forum/issues)提问

你的回答

请登录后回答

你的回答将会帮助更多人,请务必认真回答问题。