我想定义一个宏来显示 C 或 Java 等语言中的数组访问。
我的第一次尝试是这样的:
\newcommand{\accessI}[2]{#1\left[#2\right]}
\[
\accessI{a}{i}
\]
我不喜欢这个,因为括号的字距似乎不正确(我认为它们应该更接近一些)。 字距可以轻松用 来修复\mkern
。
\newcommand{\accessII}[2]{#1\mkern-3mu\left[#2\right]}
\[
\accessII{a}{i}
\]
这看起来很棒,但是当我在下标中使用这样的术语时,字距调整再次看起来很糟糕(这次括号太近了)。
\[
A_{\accessII{a}{i}}
\]
我现在正在寻找
- 这样的命令
\mkern
是上下文相关的(即在下标中使用时会缩小调整范围)或 - 一种方法来判断宏在哪个上下文中使用,以便我可以在宏中使用不同的
\mkern
调用\accessII
答案1
周围过多的空间\left[ i\right]
是设计使然。如果您想避免这种设计特点,我建议您使用包mleftright
及其\mleft
宏\mright
或mathtools
包及其宏。在下面的示例中,这些想法分别用于创建名为和的\DeclarePairedDelimiter
用户级宏。\accessII
\accessIII
\documentclass{article}
\usepackage{mathtools} % for \DeclarePairedDelimiter macro
\DeclarePairedDelimiter\brackets\lbrack\rbrack
\usepackage{mleftright} % for \mleft and \mright macros
\newcommand{\accessI}[2]{#1\left[#2\right]} % bad
\newcommand{\accessII}[2]{#1\mleft[#2\mright]} % good
\newcommand{\accessIII}[2]{#1\brackets*{#2}} % equally good
\begin{document}
\[
\accessI{a}{i} \quad
\accessII{a}{i} \quad
\accessIII{a}{i} \quad
A_{\accessII{a}{i}} \quad
A_{\accessIII{a}{i}}
\]
\end{document}
答案2
我将 Mico 的答案标记为正确,因为它解决了我的具体问题,但如果有人需要做一些与括号无关的类似事情,他们可以(正如我同时了解到的)使用\mathchoice
在 TeX stack exchange 其他地方解释的宏(什么是 \mathchoice?)对于手头的问题,例如可以定义
\newcommand{\accessIV}[2]{#1
\mathchoice{\mkern-3mu}{\mkern-3mu}{\mkern-1.5mu}{\mkern-2mu}
\left[#2\right]}
要在不同位置使用不同的字距:
\[
\accessIV{a}{i}
\]
\[
A_{\accessIV{a}{i}}
\]
\[
A_{a_{\accessIV{a}{i}}}
\]