expl3 中的空间计数很奇怪

expl3 中的空间计数很奇怪

该函数\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

由于\detokenizeeTeX 中原始的工作方式(该行为继承自 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}

相关内容