我正在玩弄xindex
并试图做一些我可以做的事情xindy
。
考虑以下 MWE:
\documentclass{article}
\usepackage[imakeidx]{xindex}
\makeindex
\begin{document}
\index{\textsc{Test}}\textsc{Test} \index{\emph{Test}}\emph{Test} \index{Test}Test
\printindex
\end{document}
目前,\textsc{Test}
和\emph{Test}
被排序为“符号”下的不同条目。我想要实现的是将它们全部排序在“T”下,但作为不同的条目。所以我希望能够区分“测试”的不同实例。使用xindy
,我能够做到这一点。我确信这也可以通过一些Lua
魔法来实现,但我不知道如何做到。
编辑
进一步解释:xindy
不喜欢makeindex
用于这种排序的 @-divider。相反,它提供了强大的替换功能。xindy
我使用以下代码实现了我想要的功能:
(merge-rule "\\textsc\{(.*)\}" "\1~b2" :eregexp :again)
(merge-rule "\\emph \{(.*)\}" "\1~b1" :eregexp :again)
我可以使用传统的 @ 路线,xindex
但我更喜欢类似 的路线xindy
。我认为它更优雅,并且提供了更多可能性(我xindy
也使用 正则表达式替换其他内容)。
正如我所说,我确信这可以做到Lua
,我只是不知道如何做。
编辑2
我还对诸如将《世界大战》等标题自动归类为 W 而不是 T 感兴趣(我知道这也可以用 @ 来实现,但使用一般规则会容易得多)。所以也许我应该更笼统地提出这个问题:如何使用正则表达式在 中进行替换xindex
。
答案1
我不认为有支持此接口的接口,但鉴于配置文件只是一个 Lua 脚本,该脚本在定义所有函数后执行,并且几乎所有内容都通过全局名称访问,因此您可以覆盖 sortstring 生成:
创建一个xindex-sort-pattern.lua
包含内容的文件(这主要是原始文件的副本index-cfg.lua
,并带有两个附加的 Lua 函数):
-----------------------------------------------------------------------
-- FILE: xindex-sort-pattern.lua
-- DESCRIPTION: modified configuration file for xindex.lua
-- REQUIREMENTS:
-- AUTHOR: Herbert Voß and Marcel Krüger
-- LICENSE: LPPL1.3
-----------------------------------------------------------------------
itemPageDelimiter = "," -- Hello, 14
compressPages = true -- something like 12--15, instead of 12,13,14,15. the |( ... |) syntax is still valid
fCompress = true -- 3f -> page 3, 4 and 3ff -> page 3, 4, 5
minCompress = 3 -- 14--17 or
rangeSymbol = "--"
numericPage = true -- for non numerical pagenumbers, like "VI-17"
sublabels = {"", "-\\,", "--\\,", "---\\,"} -- for the (sub(sub(sub-items first one is for item
pageNoPrefixDel = "" -- a delimiter for page numbers like "VI-17" -- not used !!!
indexOpening = "" -- commands after \begin{theindex}
idxnewletter = "\\textbf" -- Only valid if -n is not set
local patt do
local l = lpeg or require'lpeg'
local special = l.S'@!|'
local atfield = l.Cg('@' * (1-special)^0 * l.Cc'')
patt = l.Cs(l.Cg(' ' * l.Cc'')^-1 * (atfield + 1)^0)
end
local cache = setmetatable({}, {__index = function(t, entry)
local value = patt:match(entry)
-- >> Insert your replacement here
value = value:gsub("\\textsc%s*{(.*)}", "%1~b2")
value = value:gsub("\\emph%s*{(.*)}", "%1~b1")
-- >> End of replacements
if getCharType(utf.sub(value, 1, 1)) == 0 then
value = ' ' .. value
end
t[entry] = value
return value
end,
})
function getSortString(Entry)
return cache[Entry]
end
-- Update sortChar to refer to the first character of the modified sortChar and not the first original char
function SORTendhook(list)
for i=1,#list do
local entry = list[i]
entry.sortChar = utf.sub(entry.SortKey, 1, 1)
end
return list
end
--[[
Each character's position in this array-like table determines its 'priority'.
Several characters in the same slot have the same 'priority'.
]]
alphabet_lower = { -- for sorting
{ ' ' }, -- only for internal tests
{ 'a', 'á', 'à', 'ä', 'â', 'å', 'æ', },
{ 'b' },
{ 'c', 'ç' },
{ 'd' },
{ 'e', 'é', 'è', 'ë', 'ê' },
{ 'f' },
{ 'g' },
{ 'h' },
{ 'i', 'í', 'ì', 'î', 'ï' },
{ 'j' },
{ 'k' },
{ 'l' },
{ 'm' },
{ 'n', 'ñ' },
{ 'o', 'ó', 'ò', 'ö', 'ô', 'ø', 'œ', 'ø'},
{ 'p' },
{ 'q' },
{ 'r' },
{ 's', 'š', 'ß' },
{ 't' },
{ 'u', 'ú', 'ù', 'ü' , 'û'},
{ 'v' },
{ 'w' },
{ 'x' },
{ 'y', 'ý', 'ÿ' },
{ 'z', 'ž' }
}
alphabet_upper = { -- for sorting
{ ' ' },
{ 'A', 'Á', 'À', 'Ä', 'Å', 'Æ', 'Â' },
{ 'B' },
{ 'C', 'Ç' },
{ 'D' },
{ 'E', 'È', 'É', 'Ë', 'Ê' },
{ 'F' },
{ 'G' },
{ 'H' },
{ 'I', 'Í', 'Ì', 'Ï', 'Î' },
{ 'J' },
{ 'K' },
{ 'L' },
{ 'M' },
{ 'N', 'Ñ' },
{ 'O', 'Ó', 'Ò', 'Ö', 'Ø','Œ', 'Ø', 'Ô'},
{ 'P' },
{ 'Q' },
{ 'R' },
{ 'S', 'Š' },
{ 'T' },
{ 'U', 'Ú', 'Ù', 'Ü', 'Û' },
{ 'V' },
{ 'W' },
{ 'X' },
{ 'Y', 'Ý', 'Ÿ' },
{ 'Z', 'Ž' }
}
在这里我们使用Lua 模式。它们与正则表达式不同,但非常相似。如果您需要更强大的替代品,您可能可以使用 LPEG 或任何其他 Lua 代码。
然后您只需使用选项来调用xindex
即可-c sort-pattern
使用新配置。如果您使用 imakeindex 自动调用 xindex,则可以使用参数来\makeindex
传递选项:
\documentclass{article}
\usepackage[imakeidx]{xindex}
\makeindex[options=-c sort-pattern]
\begin{document}
\index{\textsc{Test}}\textsc{Test} \index{\emph{Test}}\emph{Test} \index{Test}Test
\printindex
\end{document}