词汇表 - 使用语言切换命令自动索引和排序条目

词汇表 - 使用语言切换命令自动索引和排序条目

后续问题这个

\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的定义:\sktilong

\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}

相关内容