为什么使用 expl3 创建的命令不能使用命令作为参数?

为什么使用 expl3 创建的命令不能使用命令作为参数?

我正在尝试使用 创建正则表达式命令,expl3它将短于三个字符的单词后面的破折号推入。这没有问题,并且它适用于简单文本,但是当我尝试使用\input\include作为参数时,我的正则表达式不起作用。之后,我使用文件中包含的文本创建新命令,但这也不起作用。

举个例子,我正在写下面的代码,它与我的问题的核心相同。

\documentclass{article}
\usepackage{expl3}

\ExplSyntaxOn
\tl_new:N \l_myCommand_tl
\cs_new:Npn \myCommand #1 {
    \tl_set:Nn \l_myCommand_tl {#1}
    \regex_replace_all:nnN {([\ \t\n\_\/]{1})(.{1,3})([\ \t\n]{1})} {\1\2\-} \l_myCommand_tl
    \tl_use:N \l_myCommand_tl
}
\ExplSyntaxOff

\newcommand{\SomeText}{Just put dast behind words with three or less length.}

\begin{document}

\myCommand{Just put dast behind words with three or less length.}

\myCommand{\SomeText}

\end{document}

这是pdflatex输出。

乳胶输出。

我能做什么?我尝试使用\expandafter,但这对我不起作用。我必须使用吗\NewDocumentCommand?如果是真的,我该怎么做?

答案1

似乎您误解了如何使用新的 LaTeX3 命名约定,以及编程层和文档层之间的分离。您可以按照以下方法操作:

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
  \tl_new:N \l_jiri_tmpa_tl
  \cs_new:Npn \jiri_dash_putter:n #1 {
      \tl_set:Nn \l_jiri_tmpa_tl { #1 }
      \regex_replace_all:nnN { \b(\w{1,3})\b } { \1\2- } \l_jiri_tmpa_tl
      \tl_use:N \l_jiri_tmpa_tl
  }
  \cs_generate_variant:Nn \jiri_dash_putter:n { e }
  \NewDocumentCommand \myCommand { m }
    { \jiri_dash_putter:e { #1 } }
\ExplSyntaxOff

\newcommand{\SomeText}{Just put dash behind words with three or less length.}

\begin{document}

\myCommand{Just put dash behind words with three or less length.}

\myCommand{\SomeText}

\end{document}

MWE 输出

那是:

  • 把你定义的所有名字分组到一个模块中,我jiri在这里调用它。
  • 遵守编程层的命名约定。特别是,任何用 定义的函数都\cs_new:Npn必须遵守此约定。请查看LaTeX3文档以了解详细信息。
  • 使用xparse用于定义文档级功能。
  • 为了在应用正则表达式之前扩展宏,请使用 LaTeX3 扩展控制功能。(我e在这里使用了变体。)

作为一个侧节点,您可以在这里使用临时变量\l_tmpa_tl,而不必定义自己的变量。

相关内容