我有一个命令\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%
}%