Xindex:区分不同格式的条目

Xindex:区分不同格式的条目

我正在玩弄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}

在此处输入图片描述

相关内容