例如,使用此代码
%! TEX program = lualatex
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\char_set_catcode_other:N \%
\tl_set:Nn\var{%}
\tl_analysis_show:N\var
\ExplSyntaxOff
\end{document}
输出为
The token list \var contains the tokens:
> % (the character %).
正如预期的那样,它也能处理所有其他特殊字符。但是当我尝试使用换行符(在 UNIX 上用值为 10 的字节编码)时
\char_set_catcode_other:n {10}
\tl_set:Nn\var{
}
\tl_analysis_show:N\var
输出是
The token list \var is empty
为什么会发生这种情况?(^^J
或^^M
导致相同的输出,而文字换行符导致下面的输出)
The token list \var contains the tokens:
> (the character ).
答案1
范围内的\ExplSyntaxOn
值\endlinechar
设置为32(空格),并且空格的类别代码设置为9(忽略)。
因此您的代码等效于\tl_set:Nn \var {}
并且令牌列表确实是空的。
设置 Unix 换行符(字符 10)的类别代码是无关紧要的,因为这个字符无处不在:当 TeX 读取一条记录(一行输入)时,它会立即丢弃记录结束操作系统特定字符并将其替换为\endlinechar
。