使用自定义排序顺序和子条目进行索引

使用自定义排序顺序和子条目进行索引

我正在使用 LuaLaTeX 生成排序键,以覆盖出价序列的默认排序顺序。更简单的条目看起来像 \index[seq]{1T-1K}、\index[seq]{1T-1C}、\index[seq]{1SA-2T},表示 1 个梅花 (Trèfles) 的开局和 1 个方块 (K=Carreaux) 的响应,因此主要排序顺序是按出价级别 (数字 1--7) 排序,然后按花色排序 (T、K、C、P、SA)。

因此,我根据这些生成一个密钥,例如 2G3A 用于 2SA-3T 序列,它将排在 2G3D 用于 2SA-3P 序列之前,并排在 1A2B 用于 1T-2K 序列之后。

现在我生成从这个起点继续的序列,例如 2SA-3T;3K-3C 将生成键 2G3A3B3C 等,并且这些序列排序正确。

但我想要做的是将其作为索引中的子条目,并且我生成了一个“!”,它被插入到条目的适当位置(“;”标记了延续点)。

这部分有效,并给出一个具有重复主要术语的索引,例如

Liste des Séquences
2SA-3T, 1
2SA-3T;3K, 1
2SA-3T;3K-3C, 1
2SA-3T;3K-3C;3P, 1
2SA-3T;3K-3C;3SA, 1 
2SA-3T;3SA, 1 

我想删除重复的根条目并得到更类似的结果

2SA–3T: 1
  3K, 1
  3K–3C, 1
  3K-3C;3P, 1
  3K-3C;3SA, 1 
  3SA, 1 

我不确定如何纠正主条目 - 子条目问题。

这就是我想要的结果

Page 7: \index{gnat!size of}
Page 32: \index{gnat}
Page 35: \index{gnat!anatomy}
\index{gnus!good}
Page 38: \index{gnus!bad}

gnat, 32
    anatomy, 35
    size of, 7
gnus
    bad, 38
    good, 35

平均能量损失

\documentclass{article}%                                                                      

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

\RequirePackage{luacode}%

\directlua{require "lualoader"%
assert(loadfile("TeXmacros.lua"))("French")%
}%

\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}                                                                  

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

序列号

  \indexentry{2G3A@2SA-3T}{1}
\indexentry{2G3A3B@2SA-3T!; 3K}{1}
\indexentry{2G3A3G@2SA-3T!; 3SA}{1}
\indexentry{2G3A3B3C@2SA-3T!; 3K-3C}{1}
\indexentry{2G3A3B3C3D@2SA-3T!; 3K-3C!; 3P}{1}
\indexentry{2G3A3B3C3G@2SA-3T!; 3K-3C!; 3SA}{1}

答案1

您可以在 makeindex 的手册页中找到有关索引语法的详细信息。 在您的例子中,必须为每个级别提供单独的排序索引,因此

\index{2G3A3B@2SA-3T!; 3K}

你需要

\index{2G3A@2SA-3T!3B@3K}

它们可以像这样生成:

\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 maxdepth = 2
  local t, u = "", ""

  --Generate a sort key for the input sequence.
  for c in s:gmatch"." do
    t = t .. (tonumber(c)
           or ({ T = "A",
                 K = "B",
                 C = "C",
                 P = "D",
                 m = "E",
                 M = "M",
                 S = "G"
              })[c] or "")
    if maxdepth > 0 and c == ";" then
      t = t .. "@" .. u .. "!"
      u = ""
      maxdepth = maxdepth - 1
    else
      u = u .. c
    end
  end

  -- Write the index back to LuaLaTeX.
  s = "\\index[seq]{" .. t .. "@" .. u .. "}"
  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}                                                            

\printindex[seq]         
\end{document}             

在此处输入图片描述 如果你只想要一层嵌套,你可以 maxdepth改为1在此处输入图片描述

相关内容