hyperref 或 glossaries 命令后的索引间距更正

hyperref 或 glossaries 命令后的索引间距更正

当在变量和索引上使用某种命令时,我在数学模式下得到不同的间距。

下面的文本给出了我认为正确的间距(变量“M”和其索引之间):

$M_1 M_1 M_1$

当使用 hyperref 的\href命令时,间距会变大(我认为是错误的):

$\href{http://tex.stackexchange.com/}{M}_1 \href{http://tex.stackexchange.com/}{M}_1 \href{http://tex.stackexchange.com/}{M}_1$  

词汇表的命令也是如此gls

$\gls{M}_1 \gls{M}_1 \gls{M}_1$

请注意,索引在逻辑上不属于超链接或词汇表条目,因此它既不能点击也不能着色。相反,应该可以使用索引,它本身就是超链接或词汇表链接,即\gls{M}_\gls{k}

我有一种感觉(但这可能是错的),分组与问题有关。将“M”放入组中可获得正确的间距:

${M}_1 {M}_1 {M}_1$  

在“M”后面放置一个组会导致错误的间距:

$M{}_1 M{}_1 M{}_1$

请参见下表中的区别:

间距演示

\href在使用诸如或 之类的命令时,如何获得正确的间距\gls?如果解决方案取决于命令,那么我主要对命令感兴趣\gls

只是为了完成,最小(非)工作示例(除了着色)的代码如下(感谢 Scott Prahl 和 egreg):

\documentclass{article}
\usepackage[colorlinks]{hyperref}

\usepackage{glossaries}
\makeglossaries
\newglossaryentry{M}{name=M,description=M}

\begin{document}

\begin{tabular}{rl}
normal: & $M_1 M_1 M_1|$\\
href: & $\href{http://tex.stackexchange.com/}{M}_1
         \href{http://tex.stackexchange.com/}{M}_1
         \href{http://tex.stackexchange.com/}{M}_1|$\\
gls: & $\gls{M}_1 \gls{M}_1 \gls{M}_1|$\\
in group: & ${M}_1 {M}_1 {M}_1|$\\
group between: & $M{}_1 M{}_1 M{}_1|$
\end{tabular}

\end{document}

答案1

该图显示了我从以下最小示例中得到的结果:请注意可选参数\gls

\documentclass{article}

\usepackage[colorlinks]{hyperref}

\usepackage{glossaries}
\makeglossaries
\newglossaryentry{M}{name=M,description=M}

\begin{document}

\begin{tabular}{rl}
normal: & $M_1 M_1 M_1|$\\
href: & $\href{http://tex.stackexchange.com/}{M_1}
         \href{http://tex.stackexchange.com/}{M_1}
         \href{http://tex.stackexchange.com/}{M_1}|$\\
gls: & $\gls{M}[_1] \gls{M}[_1] \gls{M}[_1]|$\\
in group: & ${M}_1 {M}_1 {M}_1|$\\
group between: & $M{}_1 M{}_1 M{}_1|$
\end{tabular}

\end{document}

如您所见,前四行具有完全相同的间距。

在此处输入图片描述

答案2

只需将下标放在括号内即可。

\documentclass[11pt]{article}
\usepackage[colorlinks]{hyperref}
\begin{document}
\newcommand{\hk}[2]{\href{#1}{#2}\kern-1pt}
\begin{tabular}{rl} 
normal: & $M_1 M_1 M_1|$\\
href surrounding: & $\href{http://tex.stackexchange.com/}{M_1} \href{http://tex.stackexchange.com/}{M_1} \href{http://tex.stackexchange.com/}{M_1}|$\\
hk: & $\hk{http://tex.stackexchange.com/}{M}_1 \hk{http://tex.stackexchange.com/}{M}_1 \hk{http://tex.stackexchange.com/}{M}_1|$\\
href: & $\href{http://tex.stackexchange.com/}{M}_1 \href{http://tex.stackexchange.com/}{M}_1 \href{http://tex.stackexchange.com/}{M}_1|$\\
\end{tabular}
\end{document}

结果如下

字距调整后的结果

然而,获得您想要的颜色又是另一件麻烦事。

答案3

这个问题似乎比我想象的要复杂。我尝试了一下,想出了以下解决方案(我专注于\gls,但\href应该工作相同)。

感谢 Scott Prahl,如果没有他的回答,我可能会错过这个问题与字距调整有关。使用包lua-visual-调试,显示了框和间距,突出显示了使用 gls 时的区别在于变量和索引之间的字距(小矩形,填充黄色)。 无字距调整

一个好的解决方案是删除该字距调整。不幸的是,我不知道如何实现这一点,所以我很乐意提供意见。只要字距调整不能被删除,就必须进行补偿。因此,不是\gls直接调用,而是调用新定义的\var。如果变量后面有下划线,则\gls调用该变量,字距调整会得到补偿,索引可以跟在后面(感谢 egreg 提醒我\gls可选参数)。使用强大的 xparse 包,结果为。

\NewDocumentCommand{\var}{mt_}{%
    \IfBooleanTF{#2}{%
        \gls{#1}[\compensateKerning{#1}]_%
    }{%
        \gls{#1}%
    }%
}

为了补偿字距调整(其长度取决于变量的最后一个字符),最好有一个低级函数,该函数需要字符序列并返回尾随字距调整。同样,非常欢迎提出意见。在此之前,我们的想法是渲染内容两次,一次使用正确的链接,一次使用正确的字距调整,并保存两次宽度。两次宽度的差异就是所需的字距调整补偿。

\newlength\withoutKerning
\newlength\withKerning
\newlength\kerningLength
\NewDocumentCommand{\compensateKerning}{m}{%
    \settowidth{\withoutKerning}{\ensuremath{\gls{#1}_{}}}%
    \settowidth{\withKerning}{\ensuremath{\gls{#1}[_{}]}}%
    \deflength{\kerningLength}{\withKerning-\withoutKerning}%
    \kern\kerningLength%
}

\var使用索引的结果应该始终是正确的,因为红色矩形(负字距调整)与黄色矩形完全匹配。补偿字距调整

\var如果没有给出索引,该命令也会有效,因为这种情况经过了明确检查。无索引

如果使用幂而不是索引,理论上它不应该起作用,但由于大多数(如果不是全部)变量都应该向右倾斜,命令\compensateKerning应该返回0pt,这是非常正确的,所以实际上它也是有效的。使用权力

不幸的是,\var如果同时使用索引和幂,则不能完全模仿正常行为。带有幂和索引的 var

为了解决这个问题,需要另一个命令(或者需要更高级的 TeX 技能。我有没有提到欢迎评论?)。通过将索引和幂作为参数,它可以只补偿索引而不影响幂。它定义如下,其结果是正确的。

\NewDocumentCommand{\varIndexPower}{mmm}{%
    \gls{#1}_{\compensateKerning{#1}#2}^{#3}%
}

具有正确索引和功率的 var

最后,这是代码和整体外观。

\documentclass{article}
% \usepackage{lua-visual-debug}
\usepackage{xparse}

\usepackage[colorlinks]{hyperref}
\usepackage{glossaries}
\makeglossaries
\newglossaryentry{M}{name=M,description=M}

\begin{document}

\newlength\withoutKerning
\newlength\withKerning
\newlength\kerningLength
\NewDocumentCommand{\compensateKerning}{m}{%
    \settowidth{\withoutKerning}{\ensuremath{\gls{#1}_{}}}%
    \settowidth{\withKerning}{\ensuremath{\gls{#1}[_{}]}}%
    \deflength{\kerningLength}{\withKerning-\withoutKerning}%
    \kern\kerningLength%
}

\NewDocumentCommand{\var}{mt_}{%
    \IfBooleanTF{#2}{%
        \gls{#1}[\compensateKerning{#1}]_%
    }{%
        \gls{#1}%
    }%
}

\NewDocumentCommand{\varIndexPower}{mmm}{%
    \gls{#1}_{\compensateKerning{#1}#2}^{#3}%
}

\begin{tabular}{rl}
    normal: & $M_1 M_1 M_1|$\\
    gls: & $\gls{M}_1 \gls{M}_1 \gls{M}_1|$\\
    normal: & $M_1 M_1 M_1|$\\
    var: & $\var{M}_1 \var{M}_1 \var{M}_1|$\\
    no index normal: & $M M M|$\\
    no index var: & $\var{M} \var{M} \var{M}|$\\
    power normal: & $M^1 M^1 M^1|$\\
    power var: & $\var{M}^1 \var{M}^1 \var{M}^1|$\\
    power and index normal: & $M_1^1 M_1^1 M_1^1|$\\
    power and index var: & $\var{M}_1^1 \var{M}_1^1 \var{M}_1^1|$\\
    power and index normal: & $M_1^1 M_1^1 M_1^1|$\\
    power and index var: & $\varIndexPower{M}{1}{1} \varIndexPower{M}{1}{1} \varIndexPower{M}{1}{1}|$\\
\end{tabular}
\end{document}

一切都在一起

相关内容