通过重新定义命令调整下标距离

通过重新定义命令调整下标距离

我使用 Fourier 作为数学字体,但我发现某些字母的下标离字母本身太远,所以看起来很不完整(见 (1))。更好的是 (2) 甚至 (3)。

现在,我可以手动完成此操作,但每次都必须这样做,所以我想重新定义\sigma以自动将下标放得更近。

此外,可能存在上标,不应移动得太近(参见(4)),而应像(5)中那样。

有没有什么办法可以实现这一点?

例子

    \documentclass[10pt]{book}

    \usepackage{fourier}
    \usepackage{amsmath}

    \begin{document}
        \begin{align*} 
         \underbrace{\sigma_i \sigma_j}_{(1)} \quad
         \underbrace{\sigma_{\!i} \sigma_{\!j}}_{(2)} \quad
         \underbrace{\sigma_{\!\!i} \sigma_{\!\!j}}_{(3)} \\
         \underbrace{\sigma\!\!_{i}^2 \sigma\!\!_j^2}_{(4)} \quad
         \underbrace{\sigma_{\!\!i}^2 \sigma_{\!\!j}^2}_{(5)} \\
        \end{align*}
    \end{document}

答案1

无需额外的软件包,你可以重新定义\sigma以下方式

\makeatletter
\newcommand*{\closeindex}[1]{_{\mkern-4.5mu#1}}
\let\sigmareal\sigma
\DeclareRobustCommand{\sigma}{\sigmareal\@ifnextchar_{\expandafter\closeindex\@gobble}{}}
\makeatother

检查\@ifnextchar是否\sigma后面跟着下划线,然后将其吃掉,\@gobble并将以下标记传递给\closeindex。我使用了\DeclareRobustCommand能够在图形标题中使用该命令。

请注意,有些情况会出现问题(但在某种程度上,这里介绍的其他解决方案也会有问题):

  • 上标必须跟在下标后面,也就是说\sigma_i^2\sigma^2_i不行。
  • 下划线必须明确跟在后面,\sigma\foo因此\newcommand{\foo}{_i}处理。
  • 分组与正常行为略有不同。例如,通常情况下,\sigma_\mathrm{i}会起作用,但在这里不起作用,但\sigma_{\mathrm{i}}可以。问题是,pure\mathrm被视为下一个标记并放入下标中。可以通过\mathrm在之前添加两个\expandafters来解决这个问题\closeindex,但\mathrm{i}不会扩展为一个组,因此实际上 a\protect最终会出现在下标中,而 i 会以全高跟在后面。所以欢迎提出建议让这部分工作正常……

答案2

这是一个基于预处理器的方法,在 LuaLaTeX 下运行。下面的代码根据“j”是否处于下标位置进行不同的间距调整。

在此处输入图片描述

输入语法的唯一限制是任何上标项都必须指定,不在下标项之前。因此,\sigma_i^2将被正确处理,但\sigma^2_i不会。

% !TeX program = lualatex
\documentclass{book}
\usepackage{fourier,amsmath}

%>>>>>> add the following code to your preamble:
\usepackage{luacode}
\begin{luacode}
function change_sigma_subs ( s ) 
    s = string.gsub ( s , "\\sigma%s-_%s-(%b{})" , "\\sigma_{\\mkern-4mu %1}" )
    s = string.gsub ( s , "\\sigma%s-_%s-j"      , "\\sigma_{\\mkern-6mu j}"  )
    s = string.gsub ( s , "\\sigma%s-_%s-(%a)"   , "\\sigma_{\\mkern-4mu %1}" )
    return ( s )
end
\end{luacode}
\AtBeginDocument{\directlua{luatexbase.add_to_callback ( 
    "process_input_buffer", change_sigma_subs, "change_sigma_subs")}}
%<<<<<<<<

\begin{document}
with adjustments:

$\sigma_{k} \sigma_{m} \quad \sigma_i \sigma_j \quad\sigma_{i-2}$

$A_{\sigma _ i \sigma _j}$ $A_{B_{\sigma_ i \sigma_j}}$

\bigskip
without adjustments:
\directlua{luatexbase.remove_from_callback ( 
    "process_input_buffer", "change_sigma_subs")}

$\sigma_{k} \sigma_{m} \quad \sigma_i \sigma_j \quad\sigma_{i-2}$

$A_{\sigma _ i \sigma _j}$ $A_{B_{\sigma_ i \sigma_j}}$

\end{document}

答案3

您可以\sigma使用下标的可选参数来更新命令,而不改变上标的放置方式。

我曾经用来etoolbox测试上标是否存在:

\documentclass[10pt]{book}
\usepackage{fourier}
\usepackage{amsmath}
\usepackage{etoolbox}

\let\oldsigma\sigma
\renewcommand{\sigma}[1][]{%
    \ifstrempty{#1}{%
        \oldsigma
    }{%
        \oldsigma_{\!\!#1}
    }}

\begin{document}
    \[      
    \sigma \quad
    \sigma[i] \sigma[j]  \quad
    \sigma[i]^2 \sigma[j]^2
    \]
\end{document}

在此处输入图片描述

相关内容