String substituta que contém uma barra invertida

String substituta que contém uma barra invertida

Preciso criar uma função que transforme uma string como:

Hello\textbackslash{}Bye

nisso:

Hello \\ Bye

Tentei usar StrSubstitute(do xstringpacote) sem sucesso. Eu tentei coisas nesse sentido:

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

\TRANSFORM{Hello\textbackslash{}Bye}

Responder1

Você poderia redefinir temporariamente o significado de \textbackslash, deixando-o \\:

insira a descrição da imagem aqui

\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}

Responder2

Você precisa usar o \noexpandargmodo de xstring, para não tentar expandir seus 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}

Dependendo do uso de xstring, você também pode definir \noexpandargglobalmente (comentando/descomentando as linhas relevantes).

Claro que, neste caso, redefinir uma macro é melhor:

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

Por que \renewcommande não \let? Porque essa redefinição também engole {}.

informação relacionada