Expl3 命令在字母之间插入空格?

Expl3 命令在字母之间插入空格?

我想要制作一个expl3命令,在字母之间放置一个空格(~),并将每个字母变为大写。

\documentclass{article}

\ExplSyntaxOn

    % \NewDocumentCommand \addspaces { m }
    % Some code

\ExplSyntaxOff

\begin{document}

The command \verb|\addspaces{helLo9   $\Delta$  @}| should produce: \\
 
H E L L O 9 $\Delta$ @

\end{document}

在此处输入图片描述

编辑:我希望它能在这个环境中工作:

\makebox{} \\
{\centering
  \fontsize{0.023753\paperwidth}{0.023753\paperwidth} \makebox[\textwidth][s]{ \bfseries 
  {\scshape \addspaces{\the\month} \ \  \addspaces{\the\year}  \ \ \addspaces{edition} }}
\par}

但是根据@Skillmon 的回答,我得到了这个:

在此处输入图片描述

答案1

不用 Expl3 也可以解决该任务:

\def\addspaces#1{\uppercase\expandafter{\expandafter\addspacesA#1\end}}
\def\addspacesA#1{\ifx#1\end \else #1 \expandafter\addspacesA\fi}

当然,您不必升级您的 TeXlive 2022,因为这里只使用 TeX 原语,而且它们在 TeX 中已有 40 多年的历史。

答案2

以下产生您在问题中显示的输出。

\documentclass{article}

\ExplSyntaxOn
\tl_new:N \l__vebjorn_text_tl
\NewDocumentCommand \addspaces { m }
  {
    \tl_set:Nx \l__vebjorn_text_tl { \text_uppercase:n {#1} }
    \tl_remove_all:Nn \l__vebjorn_text_tl { ~ }
    \exp_last_unbraced:Ne \vebjorn_gobble_space:w
      { \text_map_function:nN \l__vebjorn_text_tl \__vebjorn_addspaces_aux:n }
  }
\use:n { \cs_new:Npn \vebjorn_gobble_space:w } ~ {}
\cs_new:Npn \__vebjorn_addspaces_aux:n #1 { ~ \exp_not:n {#1} }
\ExplSyntaxOff

\begin{document}

The command \verb|\addspaces{helLo9   $\Delta$  @}| should produce:
 
H E L L O 9 $\Delta$ @

Proof:

\addspaces{helLo9   $\Delta$  @}
\end{document}

在此处输入图片描述

答案3

我知道请求的是 expl3 方法。但是,该tokcycle包也可以使用 2e 语法提供此行为。

\documentclass{article}

\usepackage{tokcycle}
\newcommand\addspaces[1]{%
  \tokencycle
  {\addcytoks{\uppercase{##1}}%
   \tcpeek\z\ifcat A\z\addcytoks{~}\else
   \ifcat 0\z\addcytoks{~}\fi\fi}
  {\processtoks{##1}}
  {\addcytoks{##1}}
  {\addcytoks{##1}}#1\endtokencycle
}

\begin{document}

The command \verb|\addspaces{helLo9   $\Delta$  @}| should produce: \\
 
H E L L O 9 $\Delta$ @

\addspaces{helLo9   $\Delta$  @}

\end{document}

在此处输入图片描述

相关内容