是否可以将键值参数(cvs 列表)存储到宏(通过)并使用包中的命令\def
拆分/进一步处理该宏的内容? \forcsvlist
etoolbox
我想提供一个索引条目列表,并以,
这样的方式分隔,即每个条目都可以以特殊方式格式化和布局(作为索引/词汇表,仍然需要定义细节)。
可以(参见 MWE)在语句中的 - 命令\index
主体定义中直接使用该命令,从而导致某种类型的索引文件。\define@key
\forcvslist
\immediate\write
我更希望稍后处理 cvs 列表的条目,比如,在一个名为 的特殊命令中\MyCmd
,说\forcvslist{\index}{\KVMacroCSVList}
,其中该\index
命令可能被另一个命令包装,该命令期望列表拆分输入作为最后一个参数。
\index
但是,即使使用作为参数的简化形式也会\forcsvlist
失败并显示错误消息
! 未定义控制序列。\string \indexentry {\KVMacroCSVList }{\thepage } l.47 \MyCmd[IndexList={First,Second}]
这是我的不起作用的MWE:
\documentclass{book}
\usepackage{etoolbox}
\usepackage{makeidx}
\usepackage{xkeyval}
\makeatletter
\def\KeyFamilyName{SplitListFamily}
\define@key{\KeyFamilyName}{IndexList}[]{%
%Fails to recognize the comma input, does not split!!!
\def\KVMacroIndexList{#1}%
% Generating the index for testing purposes only
\index{#1}%
}%
\define@key{\KeyFamilyName}{CSVList}[]{%
\def\KVMacroCSVList{#1}%
\forcsvlist{\index}{#1}% Works
}%
\newcommand*{\MyCmd}[1][]{%
\setkeys{\KeyFamilyName}{#1}%
% Assume that \KVMacroCSVList is defined
% Process and format the List%
% However this fails
\forcsvlist{\index}{\KVMacroCSVList}%
}%
\makeatother
\makeindex%
\begin{document}
\chapter{Einstein's theory of relativity}%
\MyCmd[IndexList={First,Second}]
\MyCmd[CSVList={First,Second}]
\printindex
\end{document}
\forcsvlist
下图显示了在 中注释时的行为\MyCmd
。单独的条目源自对 的第二次调用\MyCmd
,而单行源自对 的第一次调用\MyCmd
。
\expandafter
这是等等的问题吗\protected
?
编辑
我不坚持\forcvslist
,另一种方法也可以。
答案1
你必须使用
\expandafter\forcsvlist\expandafter
{\expandafter\index\expandafter}%
\expandafter{\KVMacroCSVList}
是的,有五个,因为您想在\forcsvlist
对列表宏执行操作之前展开它。
采用不同的方法expl3
:
\documentclass{scrbook}
\usepackage{imakeidx}
\usepackage{xparse}
\makeindex
\ExplSyntaxOn
\NewDocumentCommand{\MyCmd}{ O{} }
{
\keys_set:nn { hupfer/index } { #1 }
\clist_map_inline:Nn \l_hupfer_index_items_clist
{
\hupfer_wrap_index:n { ##1 }
}
}
\cs_new_protected:Npn \hupfer_wrap_index:n #1
{
\index{#1} % for demonstration purposes
}
\keys_define:nn { hupfer/index }
{
IndexList .clist_set:N = \l_hupfer_index_items_clist,
}
\ExplSyntaxOff
\begin{document}
\chapter{Einstein's theory of relativity}
\MyCmd[IndexList={First,Second}]
\printindex
\end{document}