按字典顺序排列索引

按字典顺序排列索引

我需要使用自定义排序顺序(T、K、m、C、P、M、N、SA),该顺序在下面的 lua 函数 Bsort 中实现。当我生成两个长度相同的索引时,此方法有效,例如,在附件中,索引 1011、1123、1124 ... 1335 的输出为 1T-1K、1K-2C、1K-2P ... 1K-2M,这很好。但下一行有一个三分量序列 1K-2C-3P,索引为 112334。

我想要的是按字典顺序排序,其中 112334 的条目位于 1123 之后,但位于 1124 之前,即

10,1011,1123,112334,1124...132335

平均能量损失

\documentclass{article}%

\RequirePackage{imakeidx}\makeindex
\RequirePackage{luacode}%

\begin{luacode*}
function Bsort(s)
    local t, u = "", ""

    --Generate a sort key for the input sequence.
    for c in s:gmatch"." do
      t = t .. (tonumber(c)
             or ({  T = "0",
                    K = "1",
                    m = "2",
                    C = "3",
                    P = "4",                  
                    M = "5",                    
                    N = "6",                    
                    S = "7"
                })[c] or "")
      if c == ";" then
        t = t .. "@" .. u
        u = ""
      else
        u = u .. c
      end
    end 

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

\DeclareRobustCommand{\Bsort}[1]{\directlua{Bsort([[#1]])}}%

\makeindex[name=seq,title=Liste of sequences]

\begin{document}

\begin{table}[t]
\begin{tabular}{*{4}{l}}
1T  &       &       &M  xxx avec une mineure xxx ;\\
    &Passe  &       &\Bsort{1T}\\
    &1K     &       &(sur 1T) Naturel, à jouer ;\Bsort{1T-1K}\\         
    &1SA    &       &Relais fort, xxx, présumé non-fitté ;\Bsort{1C-1SA}\\
1C  &       &2T     &Mini, T xxx ;\Bsort{1C-1SA; 2T}\\
1C  &       &2C     &Mini, K xxx ;\Bsort{1C-1SA; 2C}\\
1C  &       &3C     &Maxi, T xxx ;\Bsort{1C-1SA; 3C}\\
1C  &       &2P     &Maxi, K xxx ;\Bsort{1C-1SA; 2P}\\
1C  &       &3SA    &Distribution (05)44 ;\Bsort{1C-1SA; 3SA}\\
1C  &       &2P     &(sur 1T) xxx P ;\Bsort{1T-1SA; 2P}\\
1C  &       &4T     &T ;\Bsort{1C-1SA; 4T}\\
1C  &       &4K     &K .\Bsort{1C-1SA; 4K}\\
1C  &       &4C     &(sur 1K) xxx C ;\Bsort{1C-1SA; 4C}\\
1C  &2T     &       &e ou corrige à 2C ;\Bsort{1C-2T}\\
1C  &2C     &       &is, fitté, proposition de manche ;\Bsort{1C-2C}\\
\end{tabular}
\end{table}

\clearpage


\begin{table}[t]
\begin{tabular}{*{4}{l}}
1K  &       &       &M  xxx avec une mineure xxx ;\\
    &2C     &       &is, fitté, proposition de manche ;\Bsort{1K-2C}\\
    &       &3M     &Mini ;\Bsort{1C-2C-3M}\\
    &       &3P     &Maxi, T xxx ;\Bsort{1K-2C-3P}\\
    &       &3SA    &Maxi, K xxx ;\Bsort{1K-2C-3SA}\\
    &       &4T     &Beau T xxx ;\Bsort{1K-2C-4T}\\
    &       &4K     &Beau K xxx.\Bsort{1K-2C-4K}\\
    &2P     &       &(sur 1T) xxx P ;\Bsort{1K-2P}\\
    &3C     &       &(sur 1K) xxx C ;\Bsort{1K-3C}\\
    &3M     &       &Naturel, faible, barrage ;\Bsort{1C-3M}\Bsort{1K-3M}\\
    &4SA    &       &Volonté de jouer au palier de 5 en mineur.\Bsort{1K-4SA}\\
\end{tabular}
\end{table}

\printindex[seq]

\end{document}

答案1

当然,问题在于 makeindex 将数字串视为数字,并按大小排序,而不是按字典顺序将其作为文本字符串排序。一个简单的解决办法是将 T 重新编码为 Unicode Zero“^^^^0030”... S 重新编码为“^^^^0037”。现在 makeindex 将结果视为文本字符串。

相关内容