当在变量和索引上使用某种命令时,我在数学模式下得到不同的间距。
下面的文本给出了我认为正确的间距(变量“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
如果同时使用索引和幂,则不能完全模仿正常行为。
为了解决这个问题,需要另一个命令(或者需要更高级的 TeX 技能。我有没有提到欢迎评论?)。通过将索引和幂作为参数,它可以只补偿索引而不影响幂。它定义如下,其结果是正确的。
\NewDocumentCommand{\varIndexPower}{mmm}{%
\gls{#1}_{\compensateKerning{#1}#2}^{#3}%
}
最后,这是代码和整体外观。
\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}