
Мне нужно создать функцию, которая преобразует строку, например:
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
? Потому что это переопределение также поглощает {}
.