我需要使用自定义排序顺序(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 将结果视为文本字符串。