![如何以相反的顺序获取(xindy)索引(旨在首先显示最后的历史变化)?](https://linux22.com/image/343088/%E5%A6%82%E4%BD%95%E4%BB%A5%E7%9B%B8%E5%8F%8D%E7%9A%84%E9%A1%BA%E5%BA%8F%E8%8E%B7%E5%8F%96%EF%BC%88xindy%EF%BC%89%E7%B4%A2%E5%BC%95%EF%BC%88%E6%97%A8%E5%9C%A8%E9%A6%96%E5%85%88%E6%98%BE%E7%A4%BA%E6%9C%80%E5%90%8E%E7%9A%84%E5%8E%86%E5%8F%B2%E5%8F%98%E5%8C%96%EF%BC%89%EF%BC%9F.png)
考虑以下 MWE (例如test.tex
),并使用以下命令进行编译:
pdflatex test
texindy -M test.xdy test.idx
pdflatex test
其中,更改是通过(稍微)定制的索引列出的(我不需要包提供的\RecordChanges
、、机制)。\PrintChanges
\changes
doc
\documentclass{article}
\usepackage[xindy,nonewpage]{imakeidx}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.xdy}
(markup-index :open "~n
\begin{theindex}
\small
\providecommand*\lettergroupDefault[1]{}
\providecommand*\lettergroup[1]{}
~n"
:close "~n~n\end{theindex}~n"
:tree)
\end{filecontents*}
\makeindex[title=Change History,columns=1,options=-M \jobname.xdy]
\newcommand\changes[2]{\index{#1!#2}}
\newcommand\PrintChanges{\printindex}
\begin{document}
\changes{v1.0}{First public version}%
\changes{v2.0}{Second public version (much better)}%
%
This is a nice document but its next version will be much better.
%
\PrintChanges
\end{document}
这很好,但最后的更改位于最后的位置,如果更改历史变得很长,那就不是很方便,特别是对于经常想要检查最后更改的勤奋读者来说。
因此,最好是将更改历史记录(因此这里是索引)按相反的顺序排列。(请注意,此请求对于doc
包提供的更改历史记录也有效。)
更新
感谢 egreg 的建议,我尝试使用define-sort-rule-orientations
手册中所述的命令:
此命令必须位于索引样式中的所有排序规则命令之前。
好的,让我们尝试这样做。texindy
使用-d script
选项运行让我们看到,实际上,运行:
texindy -d script test.idx
实际上运行:
xindy -d script -L general -C latin -M tex/inputenc/latin -M texindy -M page-ranges -M word-order -I latex test.idx
但即使减少到最低限度:
xindy -d script test.idx
运行xindy
加载模块latin9-lang.xdy
,包含:
(require "lang/general/latin9.xdy")
(define-sort-rule-orientations (forward backward forward forward))
(use-rule-set :run 0
:rule-set ("xy-alphabetize" "xy-ignore-special"))
(use-rule-set :run 1
:rule-set ("xy-resolve-diacritics" "xy-ignore-special"))
(use-rule-set :run 2
:rule-set ("xy-resolve-case" "xy-ignore-special"))
(use-rule-set :run 3
:rule-set ("xy-resolve-special"))
因此,似乎不可能define-sort-rule-orientations
在所有排序规则之前指定另一个。
因此,问题仍然存在:如何以相反的顺序获取(xindy)索引?
答案1
抱歉回答晚了:几天前,我在研究以相反顺序打印 babel-french 的变更历史时发现了这个帖子。
以下是我对丹尼斯提出的问题的一些想法。
使用“define-sort-rule-orientations”不是一个选项:它用于在 4 个排序阶段从左到右(向前)或从右到左(向后)读取模式,而不是用于反向排序;参见http://xindy.sourceforge.net/doc/new-sort-rules.ps
在由 LaTeX、XeLaTeX 或 LuaLaTeX 生成的索引或词汇表上运行 xindy (或 texindy) 需要二进制“tex2indy”,它将“.idx”或“.glo”文件转换为 xindy 可读的格式。不幸的是,一些字符代码(即由 \levelchar、\actualchar、\quotechar 定义的代码)被硬编码到二进制文件中,以作为“.idx”文件的默认值;由于“doc.sty”会更改它们,因此 tex2indy 不适合转换使用 doc.sty 生成的“.glo”文件。
因此,必须使用自制的过滤器绕过“tex2indy”,该过滤器必须能够将“.glo”文件转换为“xindy -I xindy”可读的内部格式。
doc.sty 生成的“.glo”条目示例:
\changes{v.2.3c}{2001/01/01}{Foo 更改为 Bar} 发生在第 15 页,未嵌入 \begin{macro}...\end{macro} 环境中,产生
\glossaryentry{v2.3c> =General:>Foo 更改为 Bar}{15}
它应该转换为 xindy 内部语法,如下所示:
(indexentry :tkey (("sort-key0" "v2.3c") ("sort-key1" "General:") (" Foo 更改为 Bar")) :locref "15")
过滤器(依赖于正则表达式)可以在Perl,Lua等中写为fi。
——“sort-key0”可以从版本号2.3c(按升序或降序)派生,以实现正常或反向排序,而无需更改xindy模块中的任何内容。
—— 可以选择“sort-key1”来将这些更改排序在 {macro} 环境内所做的更改之前(或之后)。
使用适当的样式模块(“-M style.xdy”)运行“xindy -I xindy”将生成最终的、正确排序的“.gls”文件。