使用自定义命令时,词汇表中的排序不起作用

使用自定义命令时,词汇表中的排序不起作用

在撰写博士论文时,我编写了一个命令来设置词汇表条目。如果未指定,此命令将排序设置为标签。但在打印时,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以编程方式设置值时(如在这个问题中),需要扩展,因此必须关闭清理。

相关内容