自动为符号前的上标提供正确的间距

自动为符号前的上标提供正确的间距

对于我正在撰写的论文,我经常需要*在某些符号前使用上标(在数学模式下)。我目前正在使用命令{}^*来执行此操作。 和符号之间的间距*通常不正确:对于小写或倾斜的符号(例如 A),间距太大,而对于其他符号,间距非常接近(例如 T)。我可以使用 删除间距\!,但有时这会太多或不够。另外,我宁愿不必根据具体情况手动设置间距。

有没有办法根据符号的形状自动调整它们之间的间距?我尝试用括号括住上标,并使用命令\prescriptmathtools但似乎都没有什么效果。见下图。

以下是 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太近。TN

答案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}

相关内容