我想定义一个宏,(#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
包裹。