喂食
\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
包将不包含分组。这意味着启用超链接的文档与未启用超链接的文档之间存在不一致。手册建议不要嵌套使用命令,因为这种分组的缺失会导致样式泄漏(即,格式化样式使用的占位符命令会发生变化,但不会恢复)。hyperref
glossaries
\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=false
和textformat=mathord
。
如果您不想要额外的分组,可以使用以下命令将其删除:
\renewcommand*{\glsencapwrcontent}[1]{#1}
\renewcommand*{\glsdonohyperlink}[2]{#2}
第一行将带您回到问题 #175,第二行不允许嵌套使用类似 的命令\gls
。如果您想用单个组封装 whatsit 和内容,您可以使用以下方法实现:
\renewcommand*{\glslinkwrcontent}[1]{{#1}}
但这将导致问题#189。