将 xkeyval 键参数中的 CSV 列表拆分为几部分

将 xkeyval 键参数中的 CSV 列表拆分为几部分

是否可以将键值参数(cvs 列表)存储到宏(通过)并使用包中的命令\def拆分/进一步处理该宏的内容? \forcsvlistetoolbox

我想提供一个索引条目列表,并以,这样的方式分隔,即每个条目都可以以特殊方式格式化和布局(作为索引/词汇表,仍然需要定义细节)。

可以(参见 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}

相关内容