我正在尝试了解什么是 LaTeX3 标记列表。不幸的是,LaTeX3 文档毫无帮助。根据LaTeX3 接口文档可以通过两种方式查看令牌列表 (第 35 页):
标记列表(显式的,或存储在变量中)可以看作是“项目”列表或“标记”列表。项目可以是任何
\use:n
可以作为其参数的东西:单个非空格标记或括号组,带有可选的前导显式空格字符(因此每个项目本身都是一个标记列表)。标记可以是普通N
参数,也可以是␣
、{
或}
(假设是普通的 TeX 类别代码)。
什么是 LaTeX3 代币?
根据以上摘录
标记要么是普通
N
参数,要么是␣
,{
,或}
(假设是普通的 TeX 类别代码)。
- 什么是“正常
N
论点”? - 考虑短语“
␣
,{
,或}
(假设正常的 TeX 类别代码)”。这是否与说“TeX 标记(字符代码 = 32,类别代码 = 10),(字符代码 = 123,类别代码 = 1),或(字符代码 = 125,类别代码 = 2)”相同?或者与说“任何 TeX 标记,其类别代码是 1、2 或 10 之一”相同?
什么是 LaTeX3 项目?
根据以上摘录
项目是 \use:n 将作为其参数抓取的任何内容:单个非空格标记或括号组,带有可选的前导显式空格字符(因此每个项目本身就是一个标记列表)。
“单个非空格标记”是什么意思?“标记”一词是指 TeX 标记还是 LaTeX3 标记?“非空格”这个表达式是指不是(字符代码 = 32,类别代码 = 10)的任何 TeX 标记,还是指类别代码不是 10 的任何 TeX 标记,还是指字符代码不是 32 的任何 TeX 标记?其他空白字符(例如换行符)呢?它们算吗?
什么是“括号组”?它包括分隔括号吗?它包括括号内的空格吗?
短语“带有可选的前导显式空格字符”是否仅指括号组,还是也指单个非空格标记?这是什么意思明确的空格字符?前导显式空格字符是项目的一部分吗?非显式空格字符呢?
答案1
在expl3
行话来说,令牌与基本 TeX 相同,请参阅什么是代币?
但是,标记列表(在变量中或显式中)可以以双重方式看到:
- 一个装有 token 的容器
- 项目清单
例如,如果您执行\tl_use:N \l_tmpa_tl
或传递一个标记列表作为V
参数(对于变量)或参数n
(通常用括号括起来),则操作模式为 1;当您将其传递给\tl_map_inline:Nn
或\tl_map_function:NN
(对于变量)或\tl_map_inline:nn
或\tl_map_function:nN
(对于显式标记列表,通常用括号括起来)时,将使用模式 2。
有什么不同?
显式空格标记是类别 10(任何字符代码)的字符标记。在expl3
代码中( 之后\ExplSyntaxOn
),空格字符的类别代码为 9(忽略),但~
类别代码为 10,因此它算作显式空格标记。
现在假设你
\tl_set:Nn \l_tmpa_tl {~{ab}~c~\foo}
标记列表变量将由九个标记和三个项目组成。因此,调用\tl_map_inline:Nn \l_tmpa_tl {<code>}
将执行三个步骤,因为根据 TeX 解析规则,显式空格标记将被忽略,这使得 TeX 在查找未定界的宏参数时忽略显式空格标记。
代币\c_space_token
当然,在这种情况下,隐式空间标记\@sptoken
(与传统 LaTeX相同),也不\c_space_tl
),也不会,因为它是一个标记列表变量包含明确的空间标记。
N
关于和参数的区别n
是 LaTeX3 惯例。当使用N
参数类型时,程序员应该总是传递一个 token 给它,当它有一个n
参数类型时,程序员应该传递一个 (平衡的) 括号组{<tokens>}
。但是,完全执行这个惯例是不可能的,因为毕竟我们正在阅读 TeX 代码。
所以如果我们有这个函数\foo_bar:Nn
,正确的调用应该是这样的
\foo_bar:Nn \cs {abc}
其中\cs
代表控制序列(但也可以是单个字符标记)。由于 TeX 解析规则,该调用\foo_bar:Nn {\cs}{abc}
将是等效的,但它违反了 LaTeX3 的良好做法。
你的问题。
正常
N
参数是单个标记,但显式空格标记将被忽略;如果调用\foo_bar:Nn ~ \cs {abc}
,则第一个参数仍然是\cs
。括号组是你传递的由更多标记组成的无界参数,如 TeXbook 中所述;当参数替换宏的替换文本中的相应参数标记时,括号将被删除
令牌列表中的项目能前面是(显式的)空格标记,在模式 2 中使用标记列表时将被忽略。
上面的一条评论提到
{ Hello } ~ world
\ExplSyntaxOn
如果在生效时遇到这种情况,则它由 13 个令牌组成,准确地说
{
1H
11e
11l
11l
11o
11}
2~
10w
11o
11r
11l
11d
11
因为空间特点类别代码为 9,因此在标记化过程中会被忽略。该列表有六项
{Hello}
w
o
r
l
d
制表符(^^I
)同样会被忽略并\endlinechar
设置为 -1,因此新行也是无关紧要的。