xstring
:我想要这样的东西\StrSubstitute{abc,cde}{,}{\newline}
,但它不起作用。
答案1
这有效:
\documentclass{article}
\usepackage{xstring}
\begin{document}
\noindent
\StrSubstitute{abc,def}{,}{\noexpand\noexpand\noexpand\newline}
\end{document}
答案2
这xstring
包裹 文档提到这一点(部分3.1.1 命令\fullexpandarg
,\expandarg
和\noexpandarg
):
默认情况下会调用该命令,因此在宏对其起作用之前,
\fullexpandarg
所有参数都会完全展开(使用)。在大多数情况下,这种展开模式可以避免链式展开并允许更轻量的代码。当然,可以取消参数的展开,以使用命令或恢复 TeX 的通常行为。\edef
\expandafter
\noexpandarg
\normalexpandarg
在下面的列表中,[...] 紫色的参数可能会根据扩展模式进行扩展:
您放置\newline
在 中<stringB>
,这在尝试扩展时会导致问题。\normalexpandarg
加载后添加xstring
有效:
\documentclass{article}
\usepackage{xstring}
\normalexpandarg
\begin{document}
\StrSubstitute{abc,cde}{,}{;}
\StrSubstitute{abc,cde}{,}{\newline}
\end{document}
答案3
一种listofitems
方法
限制:分隔符不能在组内解析(即逗号不能在参数内\textbf
并转换为换行符)
\documentclass{article}
\usepackage{listofitems}
\newcommand\subnewlines[2]{%
\setsepchar{#1}%
\readlist\parsethis{#2}%
\foreachitem\z\in\parsethis[]{%
\ifnum\zcnt=1\relax\else\newline\fi
\z
}%
}
\begin{document}
\subnewlines{,}{abc,def,a test of \textbf{big}, proportions}
\end{document}
一种tokcycle
方法
这种方法独特的它允许在组内使用分隔符,而不会丢失功能:
\documentclass{article}
\usepackage{tokcycle}
\newcommand\subnewlines[2]{%
\tokcycle
{\ifx##1#1\addcytoks{\newline}\else\addcytoks{##1}\fi}
{\processtoks{##1}}
{\addcytoks{##1}}
{\addcytoks{##1}}
{#2}%
\the\cytoks%
}
\begin{document}
\subnewlines{,}{abc,def,a test of \textbf{big,ly} proportions}
\end{document}
答案4
使用expl3
和xparse
:
\documentclass[]{article}
\usepackage{xparse} % also loads expl3
\ExplSyntaxOn
\tl_new:N \l__schneider_substitute_tl
\cs_new_protected:Npn \schneider_substitute:nnn #1 #2 #3
{
\tl_set:Nn \l__schneider_substitute_tl { #1 }
\tl_replace_all:Nnn \l__schneider_substitute_tl { #2 } { #3 }
\l__schneider_substitute_tl
}
\NewDocumentCommand \substitute { +m +m +m }
{
\schneider_substitute:nnn { #1 } { #2 } { #3 }
}
\ExplSyntaxOff
\begin{document}
\substitute{abc,cde}{,}{\newline}
\end{document}