
Preciso criar uma função que transforme uma string como:
Hello\textbackslash{}Bye
nisso:
Hello \\ Bye
Tentei usar StrSubstitute
(do xstring
pacote) 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 \\
:
\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 \noexpandarg
modo 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 \noexpandarg
globalmente (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 \renewcommand
e não \let
? Porque essa redefinição também engole {}
.