编号索引条目

编号索引条目

这是 Marcel Krüger 回答的一个问题的后续。我需要自定义排序,因此我生成一个排序键,将其添加到索引条目的前面。这非常有效,但我想知道最简单的方法是什么,为每个条目分配一个计数器,并在打印时在每个条目前面显示该计数器(这是条目 #1、#2、...#523 ...)。实际计数器值并不重要(只要它是唯一的)它可能是我以编程方式处理的 LaTeX 计数器,也可能是 .ind 文件中的行号。

我愿意不是想要按计数器排序,只需分配并使用它来引用索引条目它们已经分类了。

我可以通过编写一个程序来对 .ind 文件进行后处理,然后再运行一次 makeindex 来实现这一点。但我更希望在同一次处理中处理所有内容。.ind 文件的结构看起来好像将其转换为枚举列表可能会有效。

可能有一些方法可以使用 xindy 属性或标签来实现这一点,但我对此不够熟悉,无法说出来。

MWE 输出产生 13 行 - 将它们编号为 1-13 就可以了,我并不特别需要保留条目-子条目结构。

MWE(归功于 Marcel)

\documentclass{article}%                                                                      

\RequirePackage[para]{threeparttable}%
\RequirePackage{imakeidx}\makeindex%
\RequirePackage[unbalanced,indentunit=0.75em]{idxlayout}%

\RequirePackage{luacode}%

\begin{luacode}
function Bsort(s)
--Patch the index to use Bridge sort order
    local t=""

    --Generate a sort key for the input sequence.
    for c in s:gmatch"." do
        if tonumber(c) ~= nil then
            t = t .. c
        end

        if c == "T" then
          t = t .. "A"
       end
        if c == "K" then
          t = t .. "B"
       end
        if c == "C" then
          t = t .. "C"
       end
        if c == "P" then
          t = t .. "D"
       end
        if c == "m" then
          t = t .. "E"
       end
        if c == "M" then
          t = t .. "F"
       end
        if c == "S" then
          t = t .. "G"
       end
    end

    --Section the index. 
    s = string.gsub(s, ";", "!;")

    --Prefix the index with the sort order.
    s = t .. "@" .. s

    -- Write the index back to LuaLaTeX.
    s = "\\index[seq]{" .. s .. "}"
    tex.sprint(s)
    return s
end
\end{luacode}


\DeclareRobustCommand{\Bsort}[1]{\directlua{Bsort([[#1]])}}% 
\makeindex[name=seq,title=Liste des Séquences]

\begin{document}                                                                


\begin{threeparttable}[t]                                                       
\begin{tabular}{*{3}{l}}                                                                                                                              
2xxx    &3xxx   &\Bsort{2SA-3T}\\                                                             
3xxx    &       &\\                                                             
&3K   &Chassé-croisé\Bsort{2SA-3T;3K} \\                                            
&3SA                   &A jouer ;\Bsort{2SA-3T;3SA}\\                                                                                                                                             
2xxx    &3xxx   &\\                                                             
3xxx   &3xxx   &Chassé-croisé ;\Bsort{2SA-3T;3K-3C}\\                                               
3xxx    &       &Fit xxx xxx{3}, en attendant ;\Bsort{2SA-3T;3K-3C;3P}\\                               
3xxx    &       &Sans fit xxx xxx{3},  \Bsort{2SA-3T;3K-3C;3SA}\\                                      
\end{tabular}                                                                                            
\end{threeparttable}                                                            

\printindex[seq]         
\end{document}     

示例 .ind 文件

\begin{theindex}

  \item 2SA-3T: \hyperpage{35, 36}
  \item 2SA-3T; 3K: \hyperpage{36}
  \item 2SA-3T; 3K-3C: \hyperpage{39}
  \item 2SA-3T; 3K-3C; 3P: \hyperpage{39}
  \item 2SA-3T; 3K-3C; 3SA: \hyperpage{39}
  \item 2SA-3T; 3K-3C; 4T: \hyperpage{39}
  \item 2SA-3T; 3K-3C; 4K: \hyperpage{39}
  \item 2SA-3T; 3K-3C; 4C: \hyperpage{39}
  \item 2SA-3T; 3K-3C; 4P: \hyperpage{39}
  \item 2SA-3T; 3K-3P: \hyperpage{39}
  \item 2SA-3T; 3K-3P; 3SA: \hyperpage{39}
  \item 2SA-3T; 3K-3P; 4T: \hyperpage{39}
  \item 2SA-3T; 3K-3P; 4K: \hyperpage{39}
  \item 2SA-3T; 3K-3P; 4C: \hyperpage{39}
  \item 2SA-3T; 3K-3P; 4P: \hyperpage{39}
  \item 2SA-3T; 3K-3M: \hyperpage{39}
  \item 2SA-3T; 3K-3SA: \hyperpage{39}
  \item 2SA-3T; 3K-4m: \hyperpage{39}
  \item 2SA-3T; 3K-4M: \hyperpage{39}
  \item 2SA-3T; 3K-4SA: \hyperpage{39}
  \item 2SA-3T; 3C: \hyperpage{43}
  \item 2SA-3T; 3C-3P: \hyperpage{43}
  \item 2SA-3T; 3C-3P; 3SA: \hyperpage{43}
  \item 2SA-3T; 3C-3P; 4T: \hyperpage{43}
  \item 2SA-3T; 3C-3P; 4K: \hyperpage{43}
  \item 2SA-3T; 3C-3P; 4C: \hyperpage{43}
  \item 2SA-3T; 3C-3P; 4P: \hyperpage{43}

\end{theindex}

答案1

如果你希望索引被编号,你可以使用 patch\item命令来添加编号:首先你需要一个新的计数器,因此添加

\newcounter{seqindexitem}
\renewcommand\theseqindexitem{\#\arabic{seqindexitem}}

\item到你的序言中。要仅针对此索引更改命令,请替换

\printindex[seq]

\begingroup
  \makeatletter
  \let\@@idxitem\@idxitem
  \renewcommand\@idxitem{%
    \@@idxitem
    \refstepcounter{seqindexitem}%
    \leavevmode\llap{\theseqindexitem:}
  }
  \printindex[seq]
\endgroup

通过使用,可以\refstepcounterstepcounter索引条目添加标签来引用数字。

完整代码:

\documentclass{article}%                                                                      

\RequirePackage[para]{threeparttable}%
\RequirePackage{imakeidx}\makeindex%
\RequirePackage[unbalanced,indentunit=0.75em]{idxlayout}%

\RequirePackage{luacode}%

\newcounter{seqindexitem}
\renewcommand\theseqindexitem{\#\arabic{seqindexitem}}
\begin{luacode}
function Bsort(s)
--Patch the index to use Bridge sort order
    local t=""

    --Generate a sort key for the input sequence.
    for c in s:gmatch"." do
        if tonumber(c) ~= nil then
            t = t .. c
        end

        if c == "T" then
          t = t .. "A"
       end
        if c == "K" then
          t = t .. "B"
       end
        if c == "C" then
          t = t .. "C"
       end
        if c == "P" then
          t = t .. "D"
       end
        if c == "m" then
          t = t .. "E"
       end
        if c == "M" then
          t = t .. "F"
       end
        if c == "S" then
          t = t .. "G"
       end
    end

    --Section the index. 
    s = string.gsub(s, ";", "!;")

    --Prefix the index with the sort order.
    s = t .. "@" .. s

    -- Write the index back to LuaLaTeX.
    s = "\\index[seq]{" .. s .. "}"
    tex.sprint(s)
    return s
end
\end{luacode}

\DeclareRobustCommand{\Bsort}[1]{\directlua{Bsort("\luaescapestring{#1}")}}%
\makeindex[name=seq,title=Liste des Séquences]

\begin{document}                                                                


\begin{threeparttable}[t]                                                       
\begin{tabular}{*{3}{l}}                                                                                                                              
2xxx    &3xxx   &\Bsort{2SA-3T}\\                                                             
3xxx    &       &\\                                                             
&3K   &Chassé-croisé\Bsort{2SA-3T;3K} \\                                            
&3SA                   &A jouer ;\Bsort{2SA-3T;3SA}\\                                                                                                                                             
2xxx    &3xxx   &\\                                                             
3xxx   &3xxx   &Chassé-croisé ;\Bsort{2SA-3T;3K-3C}\\                                               
3xxx    &       &Fit xxx xxx{3}, en attendant ;\Bsort{2SA-3T;3K-3C;3P}\\                               
3xxx    &       &Sans fit xxx xxx{3},  \Bsort{2SA-3T;3K-3C;3SA}\\                                      
\end{tabular}                                                                                            
\end{threeparttable}                                                            

\begingroup
  \makeatletter
  \let\@@idxitem\@idxitem
  \renewcommand\@idxitem{%
    \@@idxitem
    \refstepcounter{seqindexitem}%
    \leavevmode\llap{\theseqindexitem:}
  }
  \makeatother
  \printindex[seq]         
\endgroup
\end{document}                                                                  

在此处输入图片描述

答案2

我最终决定将排序代码改为仅数字,例如 27303137,并将其和“)”添加到条目前面作为唯一参考编号。然后我将排序代码和“@”添加到结果前面。

这给了我一个唯一、不变、或多或少人类可读的参考编号来引用任何序列。它比索引中的条目数长得多,但事实上,当内容移动时它不会改变,这大大超过了长度。

我会使用接受的答案,但其他一些程序似乎会改变实时系统中的索引,因此该解决方案的修补索引无法正确打印。

相关内容