如何才能一致地调整下标内外的字距?

如何才能一致地调整下标内外的字距?

我想定义一个宏来显示 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\mrightmathtools包及其宏。在下面的示例中,这些想法分别用于创建名为和的\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}}}
\]

在此处输入图片描述

相关内容