我正在使用 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}