¿Macro para reemplazar tokens coincidentes en un parámetro?

¿Macro para reemplazar tokens coincidentes en un parámetro?

Me gustaría tener una macro, llamarla, \magicreplaceque obtenga algún parámetro arbitrario (= secuencia de tokens) y reemplace cada aparición de algún token (por ejemplo, ao xo ,) con alguna secuencia fija de tokens (por ejemplo hello, o \text{hello}).

Entonces, \magicreplace{a}{abc{abc}}se expande a hellobc{abc}.

¿Hay algo disponible en algún paquete para hacer eso? Si no, ¿cómo haría para implementar esto?

Notas:

  • Puede ser LaTeX en lugar de TeX simple
  • pdftex y/o xetex por favor

Respuesta1

Esto ya está disponible de fábrica en expl3:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\magicreplace}{mmm}
 {
  \tl_set:Nn \l_einpoklum_magicreplace_tl { #3 }
  \tl_replace_all:Nnn \l_einpoklum_magicreplace_tl { #1 } { #2 }
  \tl_use:N \l_einpoklum_magicreplace_tl
 }
\tl_new:N \l_einpoklum_magicreplace_tl
\ExplSyntaxOff

\begin{document}

\magicreplace{a}{hello}{abc{abc}}

\magicreplace{a}{hello}{a b c{a b c}a}

\end{document}

ingrese la descripción de la imagen aquí

Una versión diferente donde la cadena de reemplazo es fija (pero modificable).

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\magicreplace}{mm}
 {
  \tl_set:Nn \l_einpoklum_magicreplace_tl { #2 }
  \tl_replace_all:NnV \l_einpoklum_magicreplace_tl { #1 } \l_einpoklum_magicreplace_rep_tl
  \tl_use:N \l_einpoklum_magicreplace_tl
 }
\NewDocumentCommand{\setreplacement}{m}
 {
  \tl_set:Nn \l_einpoklum_magicreplace_rep_tl { #1 }
 }

\tl_new:N \l_einpoklum_magicreplace_tl
\tl_new:N \l_einpoklum_magicreplace_rep_tl
\cs_generate_variant:Nn \tl_replace_all:Nnn { NnV }
\ExplSyntaxOff

\begin{document}

\setreplacement{hello}

\magicreplace{a}{hello}{abc{abc}}

\setreplacement{world}
\magicreplace{a}{a b c{a b c}a}

\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

Es posible tener más cuidado con los espacios en blanco, pero hay una versión simple.

ingrese la descripción de la imagen aquí

\documentclass{article}

\def\zz#1#2#3{\def\zzz##1#1{##1#2\zzz}{\zzz#3\zzzz#1\relax}}
\def\zzzz#1\relax{}
\begin{document}

\zz{a}{hello}{abc{abc}abc}
\end{document}

información relacionada