Cadena sustituta que contiene una barra invertida

Cadena sustituta que contiene una barra invertida

Necesito crear una función que transforme una cadena como por ejemplo:

Hello\textbackslash{}Bye

dentro de esto:

Hello \\ Bye

Intenté usar StrSubstitute(del xstringpaquete) sin éxito. He intentado cosas en este sentido:

\newcommand{\TRANSFORM}[1]{\StrSubstitute{#1}{\textbackslash{}}{ \noexpand\\ }}

\TRANSFORM{Hello\textbackslash{}Bye}

Respuesta1

Podrías redefinir temporalmente el significado de \textbackslash, dejándolo así \\:

ingrese la descripción de la imagen aquí

\documentclass{article}

\newcommand{\TRANSFORM}[1]{{\let\textbackslash\\#1}}
\setlength{\parindent}{0pt}% Just for this example

\begin{document}

Hello\textbackslash{}Bye

\TRANSFORM{Hello\textbackslash{}Bye}

\end{document}

Respuesta2

Debes usar el \noexpandargmodo de xstring, para que no intente expandir sus argumentos:

\documentclass{article}
\usepackage{xstring}

%\noexpandarg % set \noexpandarg globally

\newcommand{\TRANSFORM}[1]{%
  \saveexpandmode\noexpandarg % set \noexpandarg locally
  \StrSubstitute{#1}{\textbackslash{}}{\\}%
  \restoreexpandmode % restore the previous mode
}

\begin{document}

\TRANSFORM{Hello\textbackslash{}Bye}

\end{document}

Dependiendo de su uso de xstring, también puede configurarlo \noexpandargglobalmente (comentando/descomentando las líneas relevantes).

Por supuesto, en este caso, es mejor redefinir una macro:

\newcommand\TRANSFORM[1]{{% open a group
   \renewcommand{\textbackslash}[1]{\\}%
   #1%
}}

¿Por qué \renewcommandy no \let? Porque esta redefinición también traga {}.

información relacionada