不带括号的命令指定参数时,只将其后的第一个元素作为参数,因此a^bc
将只有上标 b。我想利用 LaTex 中的排版函数(如、等)来利用这一点\ln
。\sin
如果只有一个参数(如\ln{a}bc
或)\ln abc
,则函数不会使用括号排版。如果参数中有多个元素(如)\ln{abc}
,则会在参数周围排版括号,即显示的三重乘积。
这样做的动机是对数中括号的可变需求和代码的可读性。例如,我可以写成\ln{a + b}
明确地引用和的对数,并\ln ab
明确地引用乘积的对数(按照大多数惯例)。由于对数或其他数学运算符只是一个独立的排版,因此在没有括号的情况下,虚假参数(\ln ab
相当于\ln{a}b
)不会对排版产生影响。这在可读性方面具有优势,例如,对比\ln\left(a + \frac bc\right)
和\ln{a + \frac bc}
。
如何定义一个命令来识别参数中有多少个元素,并且如果有多个元素则添加括号?
答案1
我的解决方案使用\@gobble
一个简单的 if 语句来测试宏参数是否包含多个字符。可能有更好的方法来做到这一点。一旦你有一个在某些条件下添加括号的宏,你可以将它添加到任何带有的函数中\g@addto@macro
。
以下是包含您提到的示例的 MWE:
\documentclass{article}
\makeatletter
\newcommand{\addparentheses}[1]{%
\if\@gobble#1\relax\relax#1\else\left(#1\right)\fi
}
\g@addto@macro{\ln}{\addparentheses}
\makeatother
\begin{document}
Tests:
$\ln ab$
$\ln{a}b$
$\ln{a + b}$
$\ln{a + \frac bc}$
\end{document}
输出: