在另一个字符串的每个字符之间插入一个字符串的命令

在另一个字符串的每个字符之间插入一个字符串的命令

我想要一个命令,它接受一个字符串并在每个字符之间\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

使用*~不是,以便在调试时可见。

在此处输入图片描述

\documentclass{article}

\def\initials#1{\xinitials#1\relax}
\def\xinitials#1#2{#1\ifx\relax#2\else*\expandafter\xinitials\expandafter#2\fi}


\begin{document}

\initials{GRRM}

\end{document}

答案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}

在此处输入图片描述

相关内容