我想要一个命令,它接受一个字符串并在每个字符之间\initials
插入另一个字符串(例如)。因此将排版为。~
\initials{GRRM}
G~R~R~M
答案1
一种可扩展的解决方案,可以在 8 位引擎中正确处理变音符号和其他非 ASCII 字符:
\documentclass{article}
% unexpanded will tokenize the `~` before \ExplSyntaxOn, making it the active
% tilde
\unexpanded{\ExplSyntaxOn\NewExpandableDocumentCommand\initials{O{~}m}}
{ \fredrik_initials:nn {#1} {#2} }
\cs_new:Npn \fredrik_initials:nn #1#2
{
\exp_not:e
{
\use:e
{
\exp_not:N \use_none:nn
\text_map_function:nN {#2} \__fredrik_initials:nw
\use_none:nnn \q_stop \use_none:n {#1}
}
}
}
\cs_new:Npn \__fredrik_initials:nw #1 #2 \q_stop \use_none:n #3
{
\exp_not:n { \exp_not:n {#3} } \exp_not:n { \exp_not:n {#1} }
#2 \q_stop \use_none:n {#3}
}
\ExplSyntaxOff
\begin{document}
\initials{FOOBÄR}
\initials[*]{FOOBÄR}
\end{document}
答案2
答案3
也许您的姓名首字母不仅仅是 ASCII 字符。在这种情况下,您需要比逐字节处理更深层次的东西:将文本逐个字素拆分为一个序列,然后“使用”在每个项目之间添加所需的标记。
由于~
在编程环境中无法轻松使用expl3
,我采取了一种间接的方法,定义一个通用命令并专门用于~
在具有通常含义时插入。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\insertbetween}{mm}
{% #1 = text, #2 = what to insert
\fredrik_initials:nn { #1 } { #2 }
}
\seq_new:N \l__fredrik_initials_in_seq
\cs_new_protected:Nn \fredrik_initials:nn
{
\seq_clear:N \l__fredrik_initials_in_seq
\text_map_inline:nn { #1 }
{
\seq_put_right:Nn \l__fredrik_initials_in_seq { ##1 }
}
\seq_use:Nn \l__fredrik_initials_in_seq { #2 }
}
\ExplSyntaxOff
\NewDocumentCommand{\initials}{m}{\insertbetween{#1}{~}}
\begin{document}
\initials{ČÉABÔ}
\insertbetween{ČÉABÔ}{*}
\end{document}
答案4
这里,我使用一个标记循环来完成任务。从输入流中读取每个“字符”后,都会执行一次检查,以查看它是否是流中的最后一个标记(当下一个“窥视”的标记是\empty
组深度\tcdepth
为 0 时)。
如果不是流的末尾,则组成用户定义的标记\myfill
将被添加到回显标记本身之后。
这种方法还有一个额外的优点,那就是非字符(组、宏和空格)会回显到输出流,而无需添加\myfill
。因此,如第 3 个示例所示,内部斜体可以保留在输入流的一部分上。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{tokcycle}
\newcommand\initials[1]{\tokencycle
{\addcytoks{##1}\tcpeek{\z}%
\ifx\empty\z
\ifnum\tcdepth=0 \else\addcytoks[1]{\myfill}\fi
\else\addcytoks[1]{\myfill}\fi}% CHARACTERS
{\processtoks{##1}}% GROUPS
{\addcytoks{##1}}%MACROS
{\addcytoks{##1}}%SPACES
#1\endtokencycle}
\begin{document}
\newcommand\myfill{~}
\initials{GRRM}
\renewcommand\myfill{*}
\initials{GRRM}
\initials{G\textit{RR}M}
Detokenized: ``\detokenize\expandafter{\the\cytoks}''
\end{document}