后续问题这个。
\documentclass{memoir}
\usepackage{polyglossia}
\setdefaultlanguage{english}
\setotherlanguage{sanskrit}
\setotherlanguage{german}
\setotherlanguage{french}
\newfontfamily\sanskritfont{Latin Modern Roman}[Ligatures=TeX]
\newcommand{\skti}[1]{\emph{\textsanskrit{#1}}}
\usepackage[xindy]{glossaries-extra}
\GlsSetQuote{+}
\GlsXtrSetEscChar{+}
\makeglossaries
\makeindex
\glssetcategoryattribute{abbreviation}{dualindex}{true}
\glssetcategoryattribute{general}{glossname}{firstuc}
\GlsXtrEnableIndexFormatOverride
\renewcommand*{\glsxtrautoindexentry}[1]{\string\glsentryfirst{#1}}
%\renewcommand*{\glsxtrautoindexassignsort}[2]{%
% \ifglshaslong{#2}%
% {\glsletentryfield{#1}{#2}{long}}%
% {\glsletentryfield{#1}{#2}{sort}}%
%}
\setabbreviationstyle{long-short}
\newabbreviation{yh}{YH}{\skti{Yoginīhṛdaya}}
%\newabbreviation{yh}{YH}{Yoginīhṛdaya}
\begin{document}
\gls{yh}
\printglossaries
\printindex
\end{document}
这个例子编译得很好。如果我在重新定义的地方注释\glsxtrautoindexassignsort
它就会停止工作,
Writing index file test.idx
(./test.aux)
! Undefined control sequence.
\in@ #1#2->\begingroup \def \in@@
##1#1{}\toks@ \expandafter {\in@@ #2{}{}#1...
l.34 \gls{yh}
?
除非我通过更改为注释掉的版本来删除我的语言切换命令。
的重新定义\glsxtrautoindexassignsort
是从 复制而来的sample-autoindex.tex
,它应该具有按照长格式 (Yoginīhṛdaya) 而不是短格式 (YH) 对条目进行排序的效果,这是人们想要的。我使用 latexmk 调用 xelatex 和 xindy (texindy) 来编译它。
编辑:将 的定义更改为\skti
使用\newrobustcmd
它进行编译,但“Yoginīhṛdaya”条目被排序在 S 下,大概是因为 的存在\skti
。\indexentry{\\skti {Yoginīhṛdaya}@\glsentryfirst{yh}}{1}
是 idx 文件中的行。奇怪的是,在我的实际文件中,它出现在 Y 下,但在其他条目之前,这表明它已排序在 YH 下。那里的 idx 文件行是\indexentry{\skti {Yoginīhṛdaya}@\glsentryfirst{yh}}{1}
,出于某种原因,测试文件有两个反斜杠,\\skti
。
答案1
该glossaries
软件包的xindy
选项使用 xindy 的本机格式(而不是 texindy 提供的 makeindex 模拟)。这意味着它必须转义 xindy 的特殊字符,而不是 makeindex 的特殊字符。例如,如果您有:
\newglossaryentry{sample}{name={\skti{Yoginīhṛdaya}},description={}}
使用该xindy
选项时,sort
值(从 获取name
)必须对反斜杠进行转义,以便将其写入 xindy 文件,如下所示:
(indexentry :tkey (("\\skti {Yoginīhṛdaya}" "\\glossentry{sample}") ) :locref "{}{1}" :attr "pageglsnumberformat" )
自动索引函数使用 makeindex 语法,\index
并尝试转义任何特殊字符。它应该只转义由类似命令标识的特殊字符,\GlsXtrSetEscChar
但它似乎还在尝试转义反斜杠,因为基本glossaries
代码处于本机模式。这就是为什么在索引文件中xindy
会出现双反斜杠。\\skti
解决此问题的一种方法是提供从字段获取排序值时去除\glsxtrautoindexassignsort
的定义:\skti
long
\makeatletter
\renewcommand*{\glsxtrautoindexassignsort}[2]{%
\glsxtrifhasfield*{long}{#2}%
{%
\let\orgskti\skti
\let\skti\@firstofone
\protected@edef#1{\glscurrentfieldvalue}%
\let\skti\orgskti
}%
{\glsletentryfield{#1}{#2}{sort}}%
}
\makeatother
这暂时定义\skti
为\@firstofone
,这意味着该命令将在 期间被删除\protected@edef
。
另一种可能性是将格式化命令移出字段long
并移入缩写样式:
\renewcommand*{\glsxtrautoindexassignsort}[2]{%
\ifglshaslong{#2}%
{\glsletentryfield{#1}{#2}{long}}%
{\glsletentryfield{#1}{#2}{sort}}%
}
\setabbreviationstyle{long-short}
\renewcommand{\glslongfont}[1]{\skti{#1}}
\newabbreviation{yh}{YH}{Yoginīhṛdaya}