\documentclass{article}
\usepackage{makeidx}
\makeindex
\newcommand{\key}[1]{ #1 \index{#1} }
\begin{document}
\cleardoublepage
This shows \key{1.1},\key{1.2},\key{1.3},\key{1.4},\key{2}.
% \key{1.1,1.2,1.3,1.4,2}
\cleardoublepage
This shows \key{1.1},\key{1.2},\key{2.3},\key{1.4},\key{2}.
% \key{1.1,1.2,2.3,1.4,2}
\cleardoublepage
This shows \key{1.1},\key{3.2},\key{5.3},\key{A},\key{C}.
\cleardoublepage
This shows \key{1.1},\key{E},\key{A},\key{D},\key{3.2}.
\printindex
\end{document}
有没有办法不使用单独的,而是\key{}
使用 ONE \key{}
,但仍然可以使用它进行索引?
例如:
谢谢!
答案1
这是一种快速而简单的方法,既显示索引键,又将其添加到索引中,使用\forcsvlist
命令作为第一个参数\key
,即 CSV - 列表
必须输入带有空格的较长键{...}
以及带有,
内部的键。
这\dispkey
是 CVS 列表处理(辅助)宏。
\documentclass{article}
\usepackage{etoolbox}
\usepackage{makeidx}
\makeindex
\newcommand{\dispkey}[1]{%
#1 \index{#1}%
}
\newcommand{\key}[1]{%
\forcsvlist{dispkey}{#1}%
}
\usepackage{blindtext}
\begin{document}
\blindtext[5]
\key{This,that,{and this one}}
\blindtext[2]
\key{1.1,1.2,1.3}
\printindex
\end{document}
答案2
一个非常简短的实现expl3
:
\documentclass{article}
\usepackage{xparse}
\usepackage{makeidx}
\makeindex
\ExplSyntaxOn
\NewDocumentCommand{\key}{m}
{
\clist_map_inline:nn { #1 }
{
##1\index{##1}~
}
\unskip
}
\ExplSyntaxOff
\begin{document}
\key{This,that,{and this one}}
\key{1.1,1.2,1.3}
\printindex
\end{document}
如果要保留文本中键之间的逗号,则需要采用稍微复杂一些的方法。我们将键存储在一个序列中,然后提取要特殊处理的第一个项(前面没有逗号),然后映射其余项,并在其前面加上逗号空格。如果只有一个项,则映射将不会产生任何结果。
\documentclass{article}
\usepackage{xparse}
\usepackage{makeidx}
\makeindex
\ExplSyntaxOn
\NewDocumentCommand{\key}{m}
{
\chen_key:n { #1 }
}
\seq_new:N \l_chen_keys_seq
\tl_new:N \l_chen_first_tl
\cs_new_protected:Npn \chen_key:n #1
{
\seq_set_split:Nnn \l_chen_keys_seq { , } { #1 }
\seq_pop_left:NN \l_chen_keys_seq \l_chen_first_tl
\chen_print_and_index:Vn \l_chen_first_tl {}
\seq_map_inline:Nn \l_chen_keys_seq
{
\chen_print_and_index:nn { ##1 } { ,~ }
}
}
\cs_new_protected:Npn \chen_print_and_index:nn #1 #2
{
#2 #1 \index{#1}
}
\cs_generate_variant:Nn \chen_print_and_index:nn { V }
\ExplSyntaxOff
\begin{document}
\key{This,that,{and this one}}
\key{1.1,1.2,1.3}
\printindex
\end{document}
这是第一页:
答案3
这是一个简单的解决方案,没有额外的包,也没有 expl3 语法。(我并不是说这些是优点。但它们是我的答案的特点,无论好坏。)
此解决方案很简短,在连续的键之间插入逗号和空格,并且不会在列表中的第一个键之前或最后一个键之后插入此类内容。如果列表由单个键组成,则仅打印该键。
\documentclass{article}
\usepackage{makeidx}
\makeindex
\makeatletter
\newcommand\key[1]{%
\def\my@keys{#1}%
\let\my@join\relax
\@for \xx:=\my@keys \do {%
\index{\xx}\my@join\xx\gdef\my@join{, }%
}%
}
\makeatother
\begin{document}
Some keys: \key{1.1,1.2,1.3,1.4,2} are shown here.
\key{1.1,1.2,2.3,1.4,2} are some more keys.
\key{1.1}, which is a nice key, comes before the extremely horrid key \key{3.2}.
Keys \key{5.3,A} and \key{C} are other keys.
Keys \key{1.1,E,A,D,3.2} show that something.
\printindex
\end{document}