循环遍历字符串中的字符并应用带有附加参数的宏

循环遍历字符串中的字符并应用带有附加参数的宏

以下代码由@egreg 在 TeX Chat 中友好地提供给我。

此 LaTeX 3 代码循环遍历字符列表,并在每个字符周围放置一个框。它不会跳过空格

\documentclass[12pt]{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\spacechars}{m}
 {
  \tl_set:Nn \l_tmpa_tl { #1 }
  \tl_replace_all:Nnn \l_tmpa_tl { ~ } { \c_space_tl }
  \tl_map_function:NN \l_tmpa_tl \boxedchar
 }
 \ExplSyntaxOff

\NewDocumentCommand{\boxedchar}{m}{%
  \framebox[2em]{\strut#1}%
 }

\begin{document}

\spacechars{ab c d}

\end{document}

我希望增强此代码,使其\spacechars能够包含一个宽度参数,然后可以将其传递给\framebox

但它看起来不能\tl_map_function完成这项工作,除非有某种方法将一个宏传递给它,该宏是应用宽度参数的版本boxedchar(即部分函数应用)。

我查看了 LaTeX 3 界面文档(在我的系统上)中的函数 /usr/share/texlive/texmf-dist/doc/latex/l3kernel/interface3.pdf,但没有看到任何符合要求的内容。

答案1

你可以轻松做到。;-)

\documentclass[12pt]{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\spacechars}{O{1em}m}
 {
  \faheem_spacechars:nn { #1 } { #2 }
 }

\NewDocumentCommand{\boxedchar}{O{1em}m}
 {
  \faheem_spacechars_box:nn { #1 } { #2 }
 }

\tl_new:N \l__faheem_spacechars_tl
\tl_new:N \l__faheem_spacechars_char_tl

\cs_new_protected:Nn \faheem_spacechars:nn
 {
  \tl_set:Nn \l__faheem_spacechars_tl { #2 }
  \tl_replace_all:Nnn \l__faheem_spacechars_tl { ~ } { \c_space_tl }
  \tl_map_variable:NNn \l__faheem_spacechars_tl \l__faheem_spacechars_char_tl
   { \faheem_spacechars_box:nV { #1 } \l__faheem_spacechars_char_tl }
 }

\cs_new_protected:Nn \faheem_spacechars_box:nn
 {
  \framebox[#1]{\strut #2}
 }
\cs_generate_variant:Nn \faheem_spacechars_box:nn { nV }

\ExplSyntaxOff

\begin{document}

\spacechars{ab c d}

\spacechars[2em]{ab c d}

\end{document}

诀窍是\tl_map_variable:NNn

在此处输入图片描述

相关内容