带有词汇表和 Xindy 的不同格式的页码

带有词汇表和 Xindy 的不同格式的页码

这有点相关这个问题,但使用 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 的结果是

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

您需要手动更改已定义属性的顺序。如果您查看.gloMWE 文件,您应该会看到位置属性是pageglsnumberformat(默认格式)和(组合和pagehyperit时使用的格式):format=hyperitcounter=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}

相关内容