忽略宏参数中包含的括号

忽略宏参数中包含的括号

我希望宏忽略作为参数一部分的括号,而只将最后一个括号视为分隔符,我找到了一个解决方案\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}

在此处输入图片描述

相关内容