这有点相关这个问题,但使用 Xindy 作为后端,而不是makeindex
。
我正在尝试使用 创建索引glossaries
,并且此索引中的一些页码具有特殊含义。因此,这些页码以斜体排版。不幸的是,当按该顺序引用同一项具有其特殊含义和常规项时,索引中的页码不是斜体。以下 MWE 说明了该问题:
\documentclass{article}
\usepackage{hyperref}
\usepackage[xindy]{glossaries}
\newglossaryentry{test}{name={Test},description={\nopostdesc}}
\makeglossaries
\begin{document}
\glsadd[format=hyperit]{test}
\glsadd{test}
\printglossary[style=index]
\end{document}
此 MWE 的结果是
而我希望页码为斜体(即格式化的页码始终优先)或每次格式化时显示一次。可以使用 Xindy 作为后端吗?
我确实尝试了一种方法,其中我为特殊条目定义了一个假计数器,认为这会导致单独的条目:
\documentclass{article}
\usepackage{hyperref}
\usepackage[xindy]{glossaries}
\newcounter{fakepage}
\GlsAddXdyCounters{fakepage}
\newglossaryentry{test}{name={Test},description={\nopostdesc}}
\makeglossaries
\begin{document}
\setcounter{fakepage}{\thepage}
\glsadd[format=hyperit,counter=fakepage]{test}
\glsadd{test}
\printglossary[style=index]
\end{document}
不幸的是,这导致Xindy 的奇怪错误其结果与第一个 MWE 的结果相同。
答案1
您需要手动更改已定义属性的顺序。如果您查看.glo
MWE 文件,您应该会看到位置属性是pageglsnumberformat
(默认格式)和(组合和pagehyperit
时使用的格式):format=hyperit
counter=page
(indexentry :tkey (("Test" "\\glossaryentryfield{test}{\\glsnamefont{Test}}{\\nopostdesc }{\\relax }") ) :locref "{}{1}" :attr "pagehyperit" )
(indexentry :tkey (("Test" "\\glossaryentryfield{test}{\\glsnamefont{Test}}{\\nopostdesc }{\\relax }") ) :locref "{}{1}" :attr "pageglsnumberformat" )
.xdy
创建的默认文件将属性glossaries
列在属性pageglsnumberformat
之前pagehyperit
。需要交换此顺序。有两种可能性:
(define-attributes ( ("pagehyperit" "pageglsnumberformat")))
这将导致只有一个位置使用以下hyperit
格式:
第二种选择是:
(define-attributes ( ("pagehyperit") ("pageglsnumberformat")))
这将产生两个位置。第一个位置使用格式hyperit
,第二个位置使用默认pageglsnumberformat
格式:
无论哪种方式,如果您手动编辑.xdy
文件,则必须将其添加\noist
到文档中以防止.xdy
文件被覆盖:
\documentclass{article}
\usepackage{hyperref}
\usepackage[xindy]{glossaries}
\newglossaryentry{test}{name={Test},description={\nopostdesc}}
\noist
\makeglossaries
\begin{document}
\glsadd[format=hyperit]{test}
\glsadd{test}
\printglossary[style=index]
\end{document}
编辑:如果您不想手动编辑.xdy
文件,则需要重新定义一些glossaries
内部命令。
第一种情况:重新定义\@gls@addpredefinedattributes
按所需顺序列出属性:
\documentclass{article}
\usepackage{hyperref}
\usepackage[xindy]{glossaries}
\makeatletter
\renewcommand*{\@gls@addpredefinedattributes}{%
\GlsAddXdyAttribute{hyperit}
\GlsAddXdyAttribute{glsnumberformat}
}
\makeatother
\newglossaryentry{test}{name={Test},description={\nopostdesc}}
\makeglossaries
\begin{document}
\glsadd[format=hyperit]{test}
\glsadd{test}
\printglossary[style=index]
\end{document}
第二种情况更为复杂(\string"
用于双引号被激活的情况,例如 via ngerman
):
\documentclass{article}
\usepackage{hyperref}
\usepackage[xindy]{glossaries}
\makeatletter
\renewcommand*{\@gls@addpredefinedattributes}{%
\GlsAddXdyAttribute{hyperit}
\GlsAddXdyAttribute{glsnumberformat}
}
\renewcommand*\@glsaddxdyattribute[2]{%
\edef\@xdyattributes{\@xdyattributes) ^^J (\string"#1\string") ^^J
(\string"#2#1\string"}%
\expandafter\toks@\expandafter{\@xdylocref}%
\edef\@xdylocref{\the\toks@ ^^J%
(markup-locref
:open \string"\string~n%
\expandafter\string\csname glsX#2X#1\endcsname
\string" ^^J
:close \string"\string" ^^J
:attr \string"#2#1\string")}%
\expandafter\gdef\csname glsX#2X#1\endcsname##1##2{%
\setentrycounter[##1]{#2}\csname #1\endcsname{##2}%
}%
}
\makeatother
\newglossaryentry{test}{name={Test},description={\nopostdesc}}
\makeglossaries
\begin{document}
\glsadd[format=hyperit]{test}
\glsadd{test}
\printglossary[style=index]
\end{document}