如果 hyperoutside 为 false,则 \mathord{\gls{relationSymbol}} 不会消除关系符号前面的空格

如果 hyperoutside 为 false,则 \mathord{\gls{relationSymbol}} 不会消除关系符号前面的空格

喂食

\documentclass{article}
\pagestyle{empty}
\usepackage[makeindex,toc,nogroupskip,nomain]{glossaries-extra}
\newglossary[nlg]{notation}{not}{ntn}{Symbols}
%%% See http://tex.stackexchange.com/questions/399338/hyperref-glossaries-latex-bad-spacing-around-math-relations
\glssetcategoryattribute{mathrelation}{hyperoutside}{false}%% Using "false" gives good math-relation spacing in general but applying \mathord fails to kill the pre-spacing. Using "true" kills all spacing, unfortunately.
\glssetcategoryattribute{mathrelation}{textformat}{mathrel}
\newglossaryentry{not:prefixRelation}{type=notation, name={\(\sqsubseteq\)}, category=mathrelation, text=\sqsubseteq, sort=prefixRelation, description={A prefix relation. Given finite or infinite sequences \(s\) and \(s'\), the relation \(s \prefixRelationSymbol s'\) holds iff a sequence \(r\) exists that satisfies \(sr = s'\).}}
\begin{document}\noindent
\(x\gls{not:prefixRelation}z\)\\
\(x{\gls{not:prefixRelation}}z\)\\
\(x\mathord{\gls{not:prefixRelation}}z\)
\end{document}

从当前 TeX Live 2022(截至 2023-01-06)开始,任何 [pdf|xe|lua]latex 都无法消除

答案1

\gls命令内部使用的代码取决于是否支持超链接。内部命令采用两个参数:标签(用于超链接目标)和超链接文本。如果不支持超链接,则忽略第一个参数。无论哪种方式,条件都会hyperoutside确定命令是否有可能形成超链接在封装格式命令之外或之内。因此,即使hyperref未加载,条件仍然有效。

为了防止在嵌套的情况下发生样式泄漏\gls(即,\gls在另一个词汇表条目的字段值中出现 where),需要内部分组。这会自动发生\hyperlink。该glossaries-extra包重新定义\glsdonohyperlink以确保添加分组,并进行一些调整以进一步减轻嵌套链接的影响。正是这种内部分组导致了数学模式中的间距问题。

如果有hyperoutside=true,无论您是否使用hyperref,封装命令都会在链接文本参数中,这意味着它在分组内,所以您本质上有x{\mathrel{\sqsubseteq}}z,它会删除间距。

如果有hyperoutside=false,那么封装命令(\mathrel在本例中)在其参数内有内部代码(有可能创建超链接),所以你本质上有x\mathrel{{\sqsubseteq}}z

例子:

\documentclass{article}
\usepackage{glossaries-extra}
\newglossaryentry{rel}{name={\sqsubseteq},description={...},category={mathrelation}}
\begin{document}
Test:

\(x\mathrel{\sqsubseteq} z\)

\(x\gls[textformat=mathrel,hyperoutside=false]{rel}z\)\par

\(x\gls[textformat=mathrel,hyperoutside=true]{rel}z\)\par

\glssetcategoryattribute{mathrelation}{textformat}{mathrel}
\glssetcategoryattribute{mathrelation}{hyperoutside}{false}

\(x\gls{rel}z\)\par
\end{document}

结果图像

这就是为什么注释掉设置hyperoutside为 false 的行会删除间距,因为默认设置是 true。

textformat选项覆盖了textformat属性:

\documentclass{article}
\usepackage{glossaries-extra}

\glssetcategoryattribute{mathrelation}{textformat}{mathrel}
\glssetcategoryattribute{mathrelation}{hyperoutside}{false}

\newglossaryentry{rel}{name={\sqsubseteq},description={...},category={mathrelation}}
\begin{document}
Using attribute textformat=mathrel:

\(x\gls{rel}z\)

Using option textformat=mathord (mathrel not used):

\(x\gls[textformat=mathord]{rel}z\)
\end{document}

文档图像:第二个示例周围没有空格

如果您需要经常执行此操作但又不喜欢输入可选参数的不便,那么您可以定义一个类似的命令\gls但会自动设置所需的选项:

\documentclass{article}
\usepackage{glossaries-extra}

\glssetcategoryattribute{mathrelation}{textformat}{mathrel}
\glssetcategoryattribute{mathrelation}{hyperoutside}{false}

\glsxtrnewgls[textformat=mathord]{}{\gmord}

\newglossaryentry{rel}{name={\sqsubseteq},description={...},category={mathrelation}}
\begin{document}
Using attribute textformat=mathrel:

\(x\gls{rel}z\)

Using option textformat=mathord (mathrel not used):

\(x\gls[textformat=mathord]{rel}z\)

Equivalently:

\(x\gmord{rel}z\)
\end{document}

请注意,如果不使用,基础glossaries包将不包含分组。这意味着启用超链接的文档与未启用超链接的文档之间存在不一致。手册建议不要嵌套使用命令,因为这种分组的缺失会导致样式泄漏(即,格式化样式使用的占位符命令会发生变化,但不会恢复)。hyperrefglossaries\gls

我考虑过为基础包添加分组glossaries,这可以通过重新定义\glsdonohyperlink以包含分组来完成,但是基础glossaries包没有该hyperoutside选项,此示例演示了该分组可能导致的问题。因此,如果您只使用基础glossaries包,请不要嵌套命令,\gls但如果您有超链接,则添加的隐式分组\hyperlink将导致数学模式中的间距问题。

我认为引入间距的原因\mathord{\gls{rel}}是因为执行索引的分组内容。你基本上有:

\documentclass{article}
\makeindex
\begin{document}
Analogous to \verb|x\mathord{\gls[textformat=mathrel,hyperoutside=false]{rel}}z|:

\(x\mathord{{\index{rel}}\mathrel{{\sqsubseteq}}}z\)

Analogous to \verb|x\gls[textformat=mathord,hyperoutside=false]{rel}z|:

\(x{\index{rel}}\mathord{{\sqsubseteq}}z\)

\end{document}

结果图像:第一个例子有额外的间距

围绕 whatsit 进行分组是为了修复问题 #189。该问题是由修复问题 #175,这又涉及到由 whatsit 导致的不正确间距。基本上,索引 whatsit 和正确工作所需的分组\gls会干扰数学模式间距。唯一的解决方法是使用hyperoutside=falsetextformat=mathord

如果您不想要额外的分组,可以使用以下命令将其删除:

\renewcommand*{\glsencapwrcontent}[1]{#1}
\renewcommand*{\glsdonohyperlink}[2]{#2}

第一行将带您回到问题 #175,第二行不允许嵌套使用类似 的命令\gls。如果您想用单个组封装 whatsit 和内容,您可以使用以下方法实现:

\renewcommand*{\glslinkwrcontent}[1]{{#1}}

但这将导致问题#189。

相关内容