以下代码由@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
。