索引 - xindy 属性层次结构

索引 - xindy 属性层次结构

我正在排版一份法语文档,因此使用 xindy 创建索引。

我有三个级别的参考:主要的,以粗体显示;默认,以罗马体显示;次要的,以斜体显示。

为了使索引更易于阅读,我希望遵循以下位置引用的顺序:主要、默认、次要;像这样:

在此处输入图片描述

然后,我编辑了 xindy 样式文件来创建组:

在此处输入图片描述

但我也想要次要的页码消失并采用默认页码:

在此处输入图片描述

几乎完成了,但是次要的由于其值,reference 仍显示在 default 之前。当我在 groups 定义中引入更多嵌套时,xindy 返回错误:

(define-attributes (("major") (("default") ("minor"))) )

ERROR: nesting level too deep !

我想要的风格,即按组排序和替换,可以用 xindy 实现吗?

下面是一个例子。

% pdflatex -draftmode test.tex; texindy -M style.xdy -C utf8 test.idx; pdflatex test.tex

\documentclass[a4paper, 12pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage[xindy]{imakeidx}

\usepackage{filecontents}
\begin{filecontents*}{style.xdy}
(define-attributes (("major") ("default" "minor")) )
(markup-attribute-group-list :sep "; ")

(merge-to "minor" "default" :drop)

(markup-locref :attr "major" :open "\textbf{" :close "}")
(markup-locref  :attr "minor" :open "\textit{" :close "}")

(markup-locclass-list :open "\dotfill")
\end{filecontents*}

\makeindex

\begin{document}

\verb+\index{Index entry|minor}+\index{Index entry|minor}

\newpage
\verb+\index{Index entry|major}+\index{Index entry|major}

\newpage
\verb+\index{Index entry}+\index{Index entry}

\verb+\index{Index entry|minor}+\index{Index entry|minor}


\printindex
\verb+(define-attributes (("major") ("default" "minor")) )+

\end{document}

附录:


在 Sergei Golovan 回答之后,我尝试了一些测试。

该方法似乎适用于独自的索引引用,尽管在使用 |(和 |)间隔时,可能会出现警告:

Processing index... [10%]
WARNING: Found a :close-range in the index that wasn't opened before!

在我看来,这个警告与这个错误非常相似:https://sourceforge.net/p/xindy/bugs/54/,就像当区间指标被使用。遗憾的是,它会删除位置引用。

有时,由于定义的组而发生的替换过程似乎也会导致警告。

这需要进行更多测试才能找到规律并避免最终文档出现错误。我认为这个问题应该对其他解决方案持开放态度。

答案1

我不确定我是否完全理解发生了什么,但是使用

(define-attributes (("major") ("default" "minor") ("minor")) )

似乎可以解决问题。如果次要条目和默认条目都出现在同一个页面上,则它们仍会归入同一个组,但如果一个页面上只有一个次要条目,则它会被归入一个单独的“次要”组,并排在默认组之后。

结果

答案2

因为我想在环境中创建索引范围,所以我想出了一个不同的解决方案。我没有设置\index{foo|(}开头和\index{foo|)}结尾之类的内容(这可能会导致所述问题),而是直接创建了这些条目,而没有指定范围的开始和结束,并设置texindy为完成构建范围的工作。这需要某种机制来在中间的每一页上创建重复的条目,因此我使用了钩子机制shipout。因此,一个工作示例如下所示:

\documentclass{article}
\usepackage{iftex}
\iftutex
  \usepackage{fontspec}
\else
  \usepackage[T1]{fontenc}
\fi
\usepackage{blindtext}
\makeindex

\newcommand*\texindyentries{}
\AddToHook{shipout/after}{\texindyentries}
\newcommand*\addtexindyentry[1]{%
  \expandafter\def\expandafter\texindyentries\expandafter{%
    \texindyentries\index{#1}%
  }%
}
\NewDocumentEnvironment{texindy}{>{\SplitList{,}}o}{%
  \IfValueT{#1}{\ProcessList{#1}{\addtexindyentry}}%
  \texindyentries%
}{%
  \texindyentries\endgraf%
}

\begin{document}
\meaning\texindyentries\par
\blindtext[4]

\begin{texindy}[AAA,BBB]
\meaning\texindyentries\par
\blindtext[4]

\begin{texindy}[CCC,DDD]
\meaning\texindyentries\par
\blindtext[8]
\end{texindy}

\meaning\texindyentries\par
\blindtext[4]
\end{texindy}

\meaning\texindyentries\par
\blindtext[4]
\end{document}

相关内容