对于我正在撰写的论文,我经常需要*
在某些符号前使用上标(在数学模式下)。我目前正在使用命令{}^*
来执行此操作。 和符号之间的间距*
通常不正确:对于小写或倾斜的符号(例如 A),间距太大,而对于其他符号,间距非常接近(例如 T)。我可以使用 删除间距\!
,但有时这会太多或不够。另外,我宁愿不必根据具体情况手动设置间距。
有没有办法根据符号的形状自动调整它们之间的间距?我尝试用括号括住上标,并使用命令\prescript
,mathtools
但似乎都没有什么效果。见下图。
以下是 MWE:
\documentclass[12pt]{article}
\usepackage{amssymb}
\usepackage{mathtools}
\newcommand{\N}{\mathbb{N}}
\newcommand{\h}{{}^*}
\newcommand{\hhh}[1]{\prescript{*}{}{#1}}
\begin{document}
$\begin{array}{cccc}
\h A & \h B & \h T & \h \N \\
{\h} A & {\h} B & {\h} T & {\h} \N \\
\hhh{A} & \hhh{B} & \hhh{T} & \hhh{\N} \\
\h\! A & \h\! B & \h\! T & \h\! \N \\
\end{array}$
\end{document}
注意前三行中,*
距离下一个符号通常太远。我希望它与 尽可能接近T
。使用\!
移除空格,它与 有一段距离B
,但距离 仍然太远,现在与和又A
太近。T
N
答案1
pdftex 无法访问字形的形状。但假设您有一组想要处理的有限小参数,您可以轻松设置一个更正列表(仅在默认设置不起作用的情况下才需要):
\documentclass[12pt]{article}
\usepackage{amssymb}
\usepackage{mathtools}
\newcommand{\N}{\mathbb{N}}
\newcommand{\h}{{}^*}
\newcommand{\hhh}[1]{\prescript{*\csname prescriptcorrection\detokenize{#1}\endcsname}{}{#1}}
\newcommand\prescriptcorrectionA{\mkern-5mu\relax}
\newcommand\prescriptcorrectionB{\!}
%wrong value, only to show how to handle commands like \N:
\makeatletter\@namedef{prescriptcorrection\detokenize{\N}}{\mkern-15mu\relax}\makeatother
\begin{document}
$\begin{array}{cccc}
\h A & \h B & \h T & \h \N \\
{\h} A & {\h} B & {\h} T & {\h} \N \\
\hhh{A} & \hhh{B} & \hhh{T} & \hhh{\N} \\
\end{array}$
\end{document}
答案2
多年来,我也一直在寻找这个问题的解决方案。问题是 TeX(或任何其他数学渲染系统,如带有 OpenType Math 字体的 MathML)没有用于定位左索引的指标。似乎没有人真正关心过这个问题。所以你唯一能做的就是取右下标的负缩进,并将相同的值用于左上标的缩进,并希望得到最好的结果。
基于egreg 的回答,我现在(昨天)添加了包左索引到 CTAN。它提供命令
\leftindex^{<left superscript>}_{<left subscript>} {<symbol>}
它的作用与我上面描述的完全一致。这对某些符号来说效果很好,但值得注意的是,对来说效果不佳A
。因此,\leftindex
需要几个可选参数。这里与我们相关的只有第一个:
\leftindex[<slanting phantom>]^{<left superscript>}_{<left subscript>}
{<symbol>}
如果使用此参数,包将改用度量来<slanting phantom>
定位左上标:
\documentclass[12pt]{article}
\usepackage{amssymb,leftindex}
\newcommand{\N}{\mathbb{N}}
\newcommand{\h}{{}^*}
\newcommand{\hhh}[1]{\leftindex^{*}{#1}}
\newcommand{\hhhhh}[1]{\leftindex[I]^{*}{#1}}
\begin{document}
$\begin{array}{cccc}
\h A & \h B & \h T & \h \N \\
{\h} A & {\h} B & {\h} T & {\h} \N \\
\hhh{A} & \hhh{B} & \hhh{T} & \hhh{\N} \\
\hhhhh{A} & \hhhhh{B} & \hhhhh{T} & \hhhhh{\N} \\
\leftindex[T]^{*} {A} & \leftindex[I]^{*} {B}
& \leftindex[I]^{*} {T} & \leftindex^{*} {\N} \\
\h\! A & \h\! B & \h\! T & \h\! \N \\
\end{array}$
\end{document}
它并不完美,但部分原因是 Computer Modern 实际上具有相当糟糕的度量(在P
或后面加一个下标\Gamma
,你就会明白我的意思)。尝试另一种字体,例如kpfonts
,会产生更好的结果:
答案3
包tensor
处理混合的上限和下限指标,其中必须遵守正确的水平间距。
\documentclass{article}
\usepackage{tensor}
\usepackage{amssymb}
\def\sstar#1{\tensor*[^*]{#1}{}}
\begin{document}
${}^*T\quad{}^*{\mathbb{N}}$
$\sstar{T}\quad\sstar{\mathbb{N}}$
\end{document}
正如@Ulrike Fischer 所说,如果您只需要排版一小组字符,这里有一个解决方案,使用一些键可以减少空间。
\documentclass{article}
\usepackage{tensor}
\usepackage{array}
\usepackage{amssymb,amsmath}
\usepackage{xparse}
\ExplSyntaxOn
\fp_new:N \g_mskip_fp
\keys_define:nn {sstar} {
a.fp_gset:N=\g_mskip_fp,
a.default:n=2,
b.fp_gset:N=\g_mskip_fp,
b.default:n=4,
c.fp_gset:N=\g_mskip_fp,
c.default:n=6,
}
\NewDocumentCommand {\sstarset} { m } {
\keys_set:nn {sstar} {#1}
}
\NewDocumentCommand {\sstar} { O{} m } {%
\fp_gset:Nn \g_mskip_fp {0}
\keys_set:nn {sstar} {#1}
\tensor*[^{*\mskip-\fp_use:N \g_mskip_fp mu}]{#2}{}
}
\ExplSyntaxOff
\begin{document}
\[
\begin{array}{lll}
\sstar[a]{A} &\sstar[a]{B} &\sstar{\mathbb{N}}\\
\sstar[b]{A} &\sstar[b]{B} &\sstar{\mathbb{N}}\\
\sstar[c]{A} &\sstar[c]{B} &\sstar{\mathbb{N}}\\
\end{array}
\]
\end{document}