我需要创建一个函数来转换字符串,例如:
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
?因为这个重新定义也吞噬了{}
。