按部分十进制顺序索引,路加福音 10:25 位于路加福音 1:5 之后

按部分十进制顺序索引,路加福音 10:25 位于路加福音 1:5 之后

我正在编写一份文档,其中大量引用了圣经,我设置了两个索引,一个按主题,另一个按诗句。目前,在按诗句的索引中,例如,路加福音 10:25 被编入路加福音 1:5 之前,因为这是按字母顺序排列的。有没有简单的方法可以让条目按照人类根据这三个字段(按书本字母顺序排列、按章节数字顺序排列、诗句)所期望的顺序出现?

我遇到了 bibleref 包,但它似乎不能处理这个问题。根据文档,它似乎被设计用来让你按照圣经顺序而不是字母顺序对圣经书籍进行索引,但这不是我关心的。

答案1

在此处输入图片描述

\documentclass{article}

\usepackage{imakeidx}

\makeindex

\newcommand\bindex[3]{\index{#1:\string\number\string\numexpr\the\numexpr1000+#2\relax-1000:\string\number\string\numexpr\the\numexpr1000+#3\relax-1000}}
\begin{document}

zzz\bindex{Luke}{10}{25}  zzz\bindex{Luke}{1}{5} zzz\bindex{Matthew}{1}{1}

\printindex
\end{document}

如果你查看生成的.ind文件,你就会知道它在做什么:

\begin{theindex}

  \item Luke:\number\numexpr1001-1000:\number\numexpr1005-1000, 1
  \item Luke:\number\numexpr1010-1000:\number\numexpr1025-1000, 1

  \indexspace

  \item Matthew:\number\numexpr1001-1000:\number\numexpr1001-1000, 1

\end{theindex}

添加 1000,因此所有数字最终都具有相同的长度,然后(排序后)减去 1000 并\number应用以删除前导零。

答案2

用零填充数字并使用该@特征进行排序。

\documentclass{article}
\usepackage{imakeidx}

\makeindex

\ExplSyntaxOn
\NewDocumentCommand{\indexverse}{mmm}
 {% #1 = name, #2 = chapter, #3 = verse
  \index
   {% the sorting part
    #1\prg_replicate:nn{4-\tl_count:n{#2}}{0}#2\prg_replicate:nn{4-\tl_count:n{#3}}{0}#3
    @
    #1~#2:#3
   }
 }
\ExplSyntaxOff

\begin{document}

text
\indexverse{Luke}{10}{25}
\indexverse{Luke}{10}{5}

\printindex

\end{document}

这是.idx文件

\indexentry{Luke00100025@Luke 10:25}{1}
\indexentry{Luke00100005@Luke 10:5}{1}

.ind文件

\begin{theindex}

  \item Luke 10:5, 1
  \item Luke 10:25, 1

\end{theindex}

答案3

谢谢 egreg 和 David Carlisle 的帮助!看到你们使用的技术后,我决定在 latex 之外重新实现相同的技术,如下所示:

perl -i -pe 's/(\d+)/$$1+1000/ge' jesus.idx
makeindex jesus.idx -o jesus.ind 
perl -i -pe 's/(\d\d\d\d)/$$1-1000/ge' jesus.ind

缺点是,这种方法不适用于运行 Windows 的用户。优点是,它只在我的构建脚本中添加了两行代码,可读性很高,并且可以正确处理格式不完全相同的字符串,例如《路加福音》第 5 章或《马太福音》第 8 章第 27 节至第 9 章第 1 节。所以,我想我会把这个作为自我回答发布出来,这样遇到这个问题的人就可以多一种选择。

相关内容