该函数\str_count_spaces:n{}
应该计算其参数中的空格数。
对我来说,它输出了意想不到的结果。
\str_count_spaces:n{he llo} %->0
不过这些都还好,
\str_count_spaces:n{he\ llo} %->1
\str_count_spaces:n{he~llo} %->1
\str_count_spaces:n{he\char{32}llo} %->1
我是否误解了这个函数的定义?
答案1
是的,你误解了 expl3 中的字符串的概念。
TeX 字符串(因此也是 expl3 字符串)是一系列字符,这些字符的类别代码为 12(“其他”),但空格字符除外,空格字符的类别代码为 10(“空格”)。因此,从技术层面上讲,TeX 字符串是具有相应类别代码的标记列表。在本文档中,这些简称为字符串。
有一个问题:要理解这意味着什么,你需要理解 TeX 中“token”的含义,这最终归结为阅读 TeXbook 等......(资源)
无论如何,\char
或者\
不是字符标记,但所有str
函数都会将其参数转换为字符串。您可以使用以下命令查看字符串\str_show:n
:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\str_show:n{he\ llo}
\str_show:n{he~llo}
\str_show:n{he\char{32}llo}
\ExplSyntaxOff
\end{document}
结果:
he\ llo
he llo
he\char {32}llo
由于\detokenize
eTeX 中原始的工作方式(该行为继承自 TeX 源代码中用于实现将标记列表转换为字符串的任何函数,在 expl3 文档中提到转换是在将\tl_to_str:n
的描述\detokenize
复制到那里的情况下完成的)在 之后添加了一个空格\char
,这与数字为 32 并且在正常运行时会排版空格的事实无关。
答案2
内部\ExplSyntaxOn
及\ExplSyntaxOff
所有空格均被忽略。
插入明确的空间使用~
(正如您所注意到的,它有效)。
您可以创建一个 LaTeX 命令,该命令包装expl3
宏以在 Expl3 编程环境之外以非奇怪的方式计算空格:
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand \CountSpaces { m }
{
\str_count_spaces:n { #1 }
}
\ExplSyntaxOff
\begin{document}
\CountSpaces{he llo} % -> 1
\end{document}