我使用 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
在之前添加两个\expandafter
s来解决这个问题\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}