我希望宏忽略作为参数一部分的括号,而只将最后一个括号视为分隔符,我找到了一个解决方案\text{}
。
有没有更好的(和简单的)解决方案?
\documentclass{report}
\makeatletter
\def\test(#1,#2){ #1--#2}
\makeatother
\begin{document}
\test(paremeter (1), paremeter (2))
\test(paremeter (1\text{)}, paremeter (2\text{)})
\end{document}
答案1
xparse
已经内置系统来匹配正确配对的分隔符。
\documentclass{scrreprt}
\usepackage{xparse}
\NewDocumentCommand\test{>{\SplitArgument{1}{,}}r()}{\testaux#1}
\NewDocumentCommand\testaux{mm}{ #1--#2}
\begin{document}
\test(paremeter (1), paremeter (2))
\end{document}
答案2
这对于简单的设置有效,但并不适用于所有场合
\documentclass{report}
\makeatletter
\def\@testhelper#1(#2){#2}
\def\test(#1,#2){\@testhelper#1--\@testhelper#2}
\makeatother
\begin{document}
\test(Foo (1), Parameter long long long useless stuff before the number appears(2))
\end{document}
答案3
\setdelimiter[]
根据 OP 的评论,他会考虑使用一个用大括号分隔、用逗号分隔的列表的宏。已编辑以允许使用(默认逗号)指定参数间分隔符。
\documentclass{article}
\newcounter{argcounter}
\def\test{}
\newcommand\setdelimiter[1][,]{%
\renewcommand{\test}[1]{%
\setcounter{argcounter}{0}%
\parseargs##1#1\relax\relax%
}
\def\parseargs##1#1##2\relax{%
\stepcounter{argcounter}%
\expandafter\gdef\csname arg\romannumeral\value{argcounter}\endcsname{##1}%
\if\relax##2\relax\gdef\narg{\theargcounter}\else\parseargs##2\relax\fi%
}
}
\setdelimiter
\begin{document}
\setdelimiter[:]
\noindent\test {A:B}%
There are \narg{} arguments, \argi{} and \argii
\noindent\test {parameter (1): parameter\{2\}: parameter {3}:E}%
There are \narg{} arguments: \argi{}, \argii, \argiii, and \argiv\par
\setdelimiter[,]
\noindent\test {A:B}%
There is \narg{} arguments, \argi{}
\noindent\test {A,B}%
There are \narg{} arguments, \argi{} and \argii
\end{document}