在撰写博士论文时,我编写了一个命令来设置词汇表条目。如果未指定,此命令将排序设置为标签。但在打印时,LaTeX 不会对它们进行排序。为什么它在使用本机命令 \newglossaryentry 时有效,而在使用我的自定义 \gle 时无效?
MWE 位于底部
创建
typeout 调用写入
## glossary: wrong, label: a, sort: a
## glossary: wrong, label: b, sort: d
## glossary: wrong, label: c, sort: c
## glossary: wrong, label: d, sort: b
平均能量损失
\documentclass[a4paper,12pt]{report}
\usepackage[nomain]{glossaries}
\renewcommand{\glossarysection}[2][1]{% put glossaries on the same page
\def\theglstoctitle{#2}%
\par\noindent
{\section*{\theglstoctitle}}
}
%set it with \gle{glossary}{shortlabel}[sort]{text}{description} % call it with \gls{glossary-shortlabel}
%FIXME sort wont work
\newcommand\gle[2]{\def\storeglo{#1}\def\storelab{#2}\glei} % glossaries and label are mandatory
\newcommand\glei[1][\storelab]{\def\storesort{#1}\gleii} %sort is optionnal, default is label
\newcommand\gleii[2]{\newglossaryentry{\storeglo-\storelab}{type={\storeglo}, name={\ensuremath{#1}}, sort={\storesort}, description={#2}}
\typeout{## glossary: \storeglo, label: \storelab, sort: \storesort} % expected output on terminal !
}
\newglossary{wrong}{wls}{wlo}{Wrongly sorted Glossary}
\newglossary{good}{gls}{glo}{Sorted Glossary}
\makeglossaries
%set it with \gle{glossary}{shortlabel}[sort]{text}{description} % call it with \gls{glossary-shortlabel}
\gle{wrong}{a}{A}{label A, sort A}
\gle{wrong}{b}[d]{B}{label B, sort D}
\gle{wrong}{c}{C}{label C, sort C}
\gle{wrong}{d}[b]{D}{label D, sort B}
\newglossaryentry{good-a}{type={good}, name={\ensuremath{A}}, sort={a}, description={label A, sort A}}
\newglossaryentry{good-b}{type={good}, name={\ensuremath{B}}, sort={d}, description={label B, sort D}}
\newglossaryentry{good-c}{type={good}, name={\ensuremath{C}}, sort={c}, description={label C, sort C}}
\newglossaryentry{good-d}{type={good}, name={\ensuremath{D}}, sort={b}, description={label D, sort B}}
\begin{document}
\glsaddall
\printglossaries
\end{document}
答案1
默认情况下,该sort
值是经过清理的。如果您检查.wlo
示例中的文件,则每个条目的排序值都是文字字符串\storesort
:
\glossaryentry{\storesort ?\glossentry{wrong-a}|setentrycounter[]{page}\glsnumberformat}{1}
\glossaryentry{\storesort ?\glossentry{wrong-b}|setentrycounter[]{page}\glsnumberformat}{1}
\glossaryentry{\storesort ?\glossentry{wrong-c}|setentrycounter[]{page}\glsnumberformat}{1}
\glossaryentry{\storesort ?\glossentry{wrong-d}|setentrycounter[]{page}\glsnumberformat}{1}
因此所有条目都具有相同的排序值。
您可以使用以下方法关闭自动清理功能sanitizesort=false
:
\usepackage[nomain,sanitizesort=false]{glossaries}
设置后,该值将完全扩展。
清理将代码转换为文字字符。例如,假设我定义\teststring
如下:
\newcommand{\tmpA}{A}
\newcommand{\teststring}{\tmpA}
现在\teststring
定义为控制序列\tmpA
,它将扩展为A
。如果我清理\teststring
:
\@onelevel@sanitize\teststring
现在\teststring
被定义为字符序列\
t
m
p
A
后跟一个空格字符,因此它将扩展为文字字符串\tmpA
。
glossaries
自动清理值的原因sort
是,排序值在写入外部文件时通常不应扩展,而应被视为文字字符串。最常见的情况是使用带有inputenc
和 的扩展字符xindy
。例如,如果排序值为 ,则émigré
需要将其完全按照 和 写入外部文件,émigré
而不是扩展为 ,否则\IeC {\'e}migr\IeC {\'e}
将无法正确排序。
当sort
以编程方式设置值时(如在这个问题中),需要扩展,因此必须关闭清理。