我想要制作一个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}