我只是想知道是否有人熟悉一些明显不太常规的语法来创建\newcommand
...
抱歉,如果这是基础的话,但我只是想对\mathtool
's\overbracket
和\underbracket
命令进行一些小修改,以测试我编写的一些公式的不同选项。切换命令并比较修改或原始修改的最简单方法是保持相同的语法和 Ctrl+F/替换任何命令名称,所以我希望能够以与\overbracketmod{...}^{...}
股票\overbracket{...}^{...}
命令相同的精神编写一些内容
是否有人知道如何编写一个\newcommand
可以让我保留这种语法的代码(或任何提到这种语法的参考资料)?我很确定几天前我在网上看到了一些示例代码,并认为“嗯,很酷,我想用它”,但后来我丢失了资源,我最近的搜索(例如带有插入符号/上标的 newcommand、带有升高/降低参数的 newcommand 等)都没有成功……(如果有帮助的话,我想我依稀记得它的形式是\newcommand...#1^#2
?)
提前致谢
答案1
mathtool
's\underbracket
被定义为使用\mathop
外部包装器,它本质上允许使用上标和下标执行这样的行为——它将参数放在相应的上面和下面。
这是一个简单的例子
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\[
\mathop{\pi}^{up}_{down}
\]
\end{document}
因此,你可以将自己的定义\overbracketmod
如下
\newcommand{\overbracketmod}[1]{\mathop{<command definition>}}
然而,正如评论中提到的那样,更通用的方法是使用\NewDocumentCommand
具有多种参数类型的 LaTeX3(请参阅手动的)。也就是说,您要寻找的是e
修饰类型,这样,如果您e{^_}
在定义中指定,#1
将正是您在之后输入的内容^
,也是#2
您通过传递的内容_
。例如:
\documentclass{article}
\NewDocumentCommand{\overbracketmod}{ m e{^_} }{arg: \emph{#1} superscript: \emph{#2}, subscript: \emph{#3}}
\begin{document}
\overbracketmod{test}^{up}_{down}
\end{document}
答案2
该语法\overbracket{<math>}^{<math>}
对于 LaTeX 来说是陌生的,它源于 Knuth 用于 的一种低级技巧\overbrace
。
我的建议是不是用它。
我们来看一个例子:
\documentclass{article}
\usepackage{mathtools}
\begin{document}
\begin{gather*}
\overbracket{1+1+\dots+1}^{n}+1 \\
\mspace{6mu} 1+1+\dots+1+1
\end{gather*}
\end{document}
小空格用于对齐两行的数字,以使问题更加清晰。
你能看出问题所在吗?是的,顶行中最后一个 + 号周围的空格完全错误。为什么?因为最终,构造\overbracket
会变成一个\mathop
原子,而 TeX 规则最终会将最后一个 + 视为普通原子,而不是二进制运算。
您可以通过将整个事物变成一个普通原子来解决该问题。
\documentclass{article}
\usepackage{mathtools}
\NewDocumentCommand{\obracket}{oomm}{{% note the second brace
\IfNoValueTF{#2}{%
\IfNoValueTF{#1}{%
\overbracket{#3}^{#4}%
}{%
\overbracket[#1]{#3}^{#4}%
}%
}{%
\overbracket[#1][#2]{#3}^{#4}%
}%
}}
\begin{document}
\begin{gather*}
1+\obracket{1+1+\dots+1}{n}+1 \\
1+1+1+\dots+1+1
\end{gather*}
\end{document}
现在您可以看到所有符号的间距都正确,因为整个结构周围的附加括号使其成为一个普通原子。
如果要保留外来语法,可以使用“修饰”参数类型:
\documentclass{article}
\usepackage{mathtools}
\NewDocumentCommand{\obracket}{oome{^}}{{% note the second brace
\IfNoValueTF{#2}{%
\IfNoValueTF{#1}{%
\overbracket{#3}\IfValueT{#4}{^{#4}}%
}{%
\overbracket[#1]{#3}\IfValueT{#4}{^{#4}}%
}%
}{%
\overbracket[#1][#2]{#3}\IfValueT{#4}{^{#4}}%
}%
}}
\begin{document}
\begin{gather*}
1+\obracket{1+1+\dots+1}^{n}+1 \\
1+1+1+\dots+1+1
\end{gather*}
\end{document}
输出与之前相同。以类似的方式定义您自己的命令(可能没有可选参数)。