Заменить строку, содержащую обратную косую черту

Заменить строку, содержащую обратную косую черту

Мне нужно создать функцию, которая преобразует строку, например:

Hello\textbackslash{}Bye

в это:

Hello \\ Bye

Я пробовал использовать StrSubstitute(из xstringпакета) без успеха. Я пробовал делать что-то в этом роде:

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

\TRANSFORM{Hello\textbackslash{}Bye}

решение1

Вы могли бы просто временно переопределить значение \textbackslash, оставив его следующим \\:

введите описание изображения здесь

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

решение2

Вам нужно использовать \noexpandargрежим xstring, чтобы он не пытался расширять свои аргументы:

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

В зависимости от вашего использования xstringвы также можете задать \noexpandargглобальное значение (комментируя/раскомментируя соответствующие строки).

Конечно, в этом случае лучше переопределить макрос:

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

Почему \renewcommandи нет \let? Потому что это переопределение также поглощает {}.

Связанный контент