\index 参数中的扩展宏

\index 参数中的扩展宏

我有一个命令\persName{key},可以扩展为由键字符串表示的人的姓名。

我想创建一个命令\eindex,可以将该命令作为参数,将其完全扩展为人名,然后使用它作为参数\sindex(来自splitidx-pacakge)。

\NewDocumentCommand{\persName}{m}{%
    % Only an example. Is more complicated than that.
    John Doe (#1)%
}%

\NewDocumentCommand{\eindex}{o m}{%
    \edef\temp@a{#2}
    \IfValueTF{#1}{%
        \sindex[#1]{\temp@a}%
    }{%
        \sindex{\temp@a}%
    }%
}%

但这个解决方案并没有达到预期的效果。如果我使用\eindex[names]{\persName{Marc}}它输入

\indexentry{\persName {Marc}}{1}

放入 .idx 文件中。创建索引时,它将扩展为“John Doe (Marc)”,但在索引中按“M”排序,而不是按“J”排序。

我希望在将\eindex强制参数输入 .idx 文件之前先将其扩展,如下所示:

\indexentry{John Doe (Marc)}{1}

更复杂的版本\persName

我使用 LuaLaTeX 并定义了一个 Lua 函数(在外部包“Persons”中)从通讯录中收集相关人员的姓名。

\define@cmdkey[pers]{pers}[cT@]{instance}[]{}%
\define@cmdkey[pers]{pers}[cT@]{organization}{}%
\NewDocumentCommand{\persName}{O{} m d() o}{%
    \presetkeys[pers]{pers}{instance=nil}{}%
    \setkeys[pers]{pers}{#1}%
    \begingroup
        \if@emphasize%
            \bfseries%
        \fi%
        \if@color%
            \color{\@pers@color}%
        \fi%
        \luaexec{
            local _case
            \csname IfValueTF\endcsname{#3}{%
                _case = tostring( '\luatexluaescapestring{#3}' )
            }{}%
            local _form
            \csname IfValueTF\endcsname{#4}{%
                _form = tostring( '\luatexluaescapestring{#4}' )
            }{}%
            local _key = tostring( '\luatexluaescapestring{#2}' )
            local _instance = tonumber( '\luatexluaescapestring{\cT@instance}' )
            tex.sprint( Persons.name( _key, { form=_form, case=_case, instance=_instance, } ) )
        }%
    \endgroup%
}%

相关内容