可以使用 splitidx 截断索引中的页面范围吗?

可以使用 splitidx 截断索引中的页面范围吗?

以下 MWE

\documentclass{book}
\usepackage{splitidx}
\makeindex
\newindex{idx}
\newindex{aut}    
\begin{document}    
\setcounter{page}{124}\index{Topic1|(}\index{Topic2|(}Text\newpage    
\setcounter{page}{126}\index{Topic1|)}Text\newpage    
\setcounter{page}{130}\index{Topic2|)}Text\newpage     
\printindex[idx][Subject Index]     
\end{document}

生成以下索引条目:

主题1, 124-126

主题2, 124-130

我想拥有:

主题1,124-6

主题2,124-30

可以使用 splitidx 来完成吗?

从 egreg 的评论来看,我似乎没有提出一个明确的问题。我很高兴所有索引都采用相同的样式。我想要的是页面范围的不同格式。我希望输出为“124-6”,而不是“124-126”,因此会删除“126”中的“12”。同样,不要使用“124-130”,而要删除“130”中的“1”,得到“124-30”。

答案1

每个索引只能splitindex使用一种索引样式。如果您只对索引使用范围或希望所有索引共享相同的属性,那么这不是问题。

这里的解决方案使用imakeidx,因为为不同的索引指定不同的样式更容易,并且不需要单独运行splitindexmakeindex

我定义了一个索引样式(使用filecontents*以使示例自成一体);它将页码封装为 的参数\checkrange。如果--没有出现,则仅打印页码。否则执行检查。

如果数字不同,则打印两个数字(以 分隔--)。否则,打印第一个数字并将数字与第二个数字进行比较。直到数字相同,才打印任何内容。一旦发现不同的数字,就会打印它和第二个数字中的其余数字。

\begin{filecontents*}{subjind.ist}
delim_0 ", \\checkrange{"
delim_t "}"
\end{filecontents*}

\documentclass{book}
\usepackage{xparse}
\usepackage{imakeidx}

\makeindex[title=Subject Index,options=-s subjind]

\ExplSyntaxOn
\NewDocumentCommand{\checkrange}{>{\SplitArgument{1}{--}}m}
 {
  \formatrange#1
 }
\NewDocumentCommand{\formatrange}{mm}
 {
  \IfNoValueTF { #2 }
   { % no --, it's not a range
    #1
   }
   { % it's a range
    \egreg_range:nn { #1 } { #2 }
   }
 }

\bool_new:N \l__egreg_range_compare_bool

\cs_new_protected:Nn \egreg_range:nn
 {
  % print the start number
  #1--
  \int_compare:nNnTF { \str_count:n { #1 } } = { \str_count:n { #2 } }
   {% same number of digits, remove equal ones at the start
    \__egreg_range_compare:nn { #1 } { #2 }
   }
   {% different number of digits, print both
    #2
   }
 }
\cs_new_protected:Nn \__egreg_range_compare:nn
 {
  \bool_set_true:N \l__egreg_range_compare_bool
  % do a loop on the digits in the first number
  \int_step_inline:nn { \str_count:n { #1 } }
   {
    \bool_if:NTF \l__egreg_range_compare_bool
     {
      % if the digits coincide, print nothing
      \str_if_eq:eeF { \str_item:nn { #1 } { ##1 } } { \str_item:nn { #2 } { ##1 } }
       {
        \str_item:nn { #2 } { ##1 }
        % at the first differing digit, don't compare any longer
        \bool_set_false:N \l__egreg_range_compare_bool
       }
     }
     { \str_item:nn { #2 } { ##1 } }
   }
 }
\ExplSyntaxOff

\begin{document}
\setcounter{page}{95}\index{Topic0|(}Text\newpage
\setcounter{page}{101}\index{Topic0|)}Text\newpage
\setcounter{page}{124}\index{Topic1|(}\index{Topic2|(}Text\newpage
\setcounter{page}{126}\index{Topic1|)}Text\newpage
\setcounter{page}{134}\index{Topic2|)}Text\newpage
\printindex
\end{document}

在此处输入图片描述

相关内容