
Necesito crear una función que transforme una cadena como por ejemplo:
Hello\textbackslash{}Bye
dentro de esto:
Hello \\ Bye
Intenté usar StrSubstitute
(del xstring
paquete) 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í \\
:
\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 \noexpandarg
modo 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 \noexpandarg
globalmente (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é \renewcommand
y no \let
? Porque esta redefinición también traga {}
.