Ersetzen Sie Zeichenfolgen, die einen Backslash enthalten

Ersetzen Sie Zeichenfolgen, die einen Backslash enthalten

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

Bildbeschreibung hier eingeben

\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 \noexpandargModus 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 xstringkö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 \renewcommandund warum nicht \let? Weil diese Neudefinition auch verschluckt {}.

verwandte Informationen