
Ich muss eine Funktion erstellen, die einen String wie den folgenden transformiert:
Hello\textbackslash{}Bye
das mögen:
Hello \\ Bye
Ich habe erfolglos versucht StrSubstitute
, (aus dem Paket) zu verwenden. Ich habe Dinge in dieser Art versucht:xstring
\newcommand{\TRANSFORM}[1]{\StrSubstitute{#1}{\textbackslash{}}{ \noexpand\\ }}
\TRANSFORM{Hello\textbackslash{}Bye}
Antwort1
Sie könnten die Bedeutung von vorübergehend neu definieren \textbackslash
, indem Sie es folgendermaßen belassen \\
:
\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}
Antwort2
Sie müssen den \noexpandarg
Modus von verwenden xstring
, sodass nicht versucht wird, die Argumente zu erweitern:
\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}
Abhängig von Ihrer Verwendung von xstring
können Sie dies auch global festlegen \noexpandarg
(indem Sie die entsprechenden Zeilen kommentieren/die Kommentierung aufheben).
Natürlich ist es in diesem Fall besser, ein Makro neu zu definieren:
\newcommand\TRANSFORM[1]{{% open a group
\renewcommand{\textbackslash}[1]{\\}%
#1%
}}
Warum \renewcommand
und warum nicht \let
? Weil diese Neudefinition auch verschluckt {}
.