这是 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
通过使用,可以\refstepcounter
为stepcounter
索引条目添加标签来引用数字。
完整代码:
\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,并将其和“)”添加到条目前面作为唯一参考编号。然后我将排序代码和“@”添加到结果前面。
这给了我一个唯一、不变、或多或少人类可读的参考编号来引用任何序列。它比索引中的条目数长得多,但事实上,当内容移动时它不会改变,这大大超过了长度。
我会使用接受的答案,但其他一些程序似乎会改变实时系统中的索引,因此该解决方案的修补索引无法正确打印。