扫描参数中的括号

扫描参数中的括号

我想定义一个宏,(#1)如果#1不包含任何括号,则扩展为,但\big(#1\big)如果包含括号,则扩展为。

我会选择简单性而不是通用性:如果解决方案在最明显的用例(即\foo{x}\foo{\sin(x)})中有效,那对我来说就足够了。扫描此类特定字符的宏参数的最简单方法是什么?是否有某个包已经定义了可立即使用的“如果内容包含给定字符”类型的宏?LaTeX3 包中是否有一些有用的东西?

作为我的方法的替代方案,我也欢迎一些现有的替代方案,以\left(#1\right)确保所选的分隔符大小始终大于内容中的最大大小,而不仅仅是与内容一样大。我不知道这样的事情是否存在,但如果存在,那肯定会很有用,可以解决我上面的问题以及其他一些问题。

答案1

下面是使用xstring包裹。

截屏

\documentclass{article}
\usepackage{xstring}

\newcommand{\mycommand}[1]{%
\StrCount{#1}{(}[\parenthesiscount]
    \ifnum\parenthesiscount>0
        \StrSubstitute{#1}{(}{\left(}[\newstring]%
        \StrSubstitute{\newstring}{)}{\right)}%
    \else
        #1
    \fi}
\begin{document}

$\mycommand{23}$

$\mycommand{\sin(x)}$

$\mycommand{(\frac{1}{2})}$

$\mycommand{((\frac{1}{2}))}$

$\mycommand{\cos(\frac{1}{3})}$

\end{document}

这个想法是计算 的数量(,如果数量大于 ,则对字符串进行操作0。如果你不喜欢\left(和给出的间距\right,你可能想看看mleftright包裹。

相关内容