以一种非常巧妙的、截然不同的实现方式,回答egreg 帮助我通过 package 获得了自定义样式的索引imakeidx
。虽然布局符合要求,但有时似乎不起作用,尤其是名称较长时:如图所示,“Author9”的位置不正确。
另外,我希望能够定义子项的缩进量,我希望减少它:
以下是 MWE:
\begin{filecontents*}{\jobname.mst}
item_0 "\n\n \\item "
item_1 " \\firstlevel "
item_2 " \\secondlevel "
item_01 " \\firstlevel "
item_x1 " \\firstlevel "
item_12 " \\secondlevel "
item_x2 " \\secondlevel "
delim_0 ":~"
delim_1 ":~"
delim_2 ":~"
\end{filecontents*}
\documentclass[a4paper, 11pt, twoside, openright]{article}
\usepackage[top=49.5mm,bottom=52.5mm,inner=39mm,outer=39mm, headheight=4mm, headsep=6mm, marginparwidth=14mm, marginparsep=2mm, nofoot]{geometry}
\usepackage[no-math]{fontspec}
\defaultfontfeatures{Ligatures={TeX, NoCommon}}
\usepackage{polyglossia}
\setmainlanguage{italian}
\setotherlanguage[variant=ancient]{greek}
\setotherlanguage{german}
\setotherlanguage{english}
\setotherlanguage{latin}
\usepackage{microtype}
\usepackage{imakeidx}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \l_ale_index_item_seq
\seq_new:N \l_ale_index_subitem_seq
\tl_new:N \l_ale_index_author_tl
\tl_new:N \l_ale_index_work_tl
\dim_new:N \l_ale_index_indent_dim
\cs_set_protected:cpn { @idxitem } #1 \par
{
\tl_if_in:nnTF { #1 } { \firstlevel }
{
\tl_if_in:nnTF { #1 } { \secondlevel }
{
\ale_index_secondlevel:n { #1 }
}
{
\ale_index_firstlevel:n { #1 }
}
}
{
\ale_index_nolevel:n { #1 }
}
}
\cs_new_protected:Npn \ale_index_nolevel:n #1
{
\seq_set_split:NVn \l_ale_index_item_seq \c_colon_str { #1 }
\seq_pop_left:NN \l_ale_index_item_seq \l_ale_index_author_tl
\hbox_set:Nn \l_tmpa_box { \l_ale_index_author_tl, }
\dim_set:Nn \l_ale_index_indent_dim { \box_wd:N \l_tmpa_box }
\par\hangindent\l_ale_index_indent_dim
\l_ale_index_author_tl, \seq_use:Nn \l_ale_index_item_seq { }
}
\cs_generate_variant:Nn \seq_set_split:Nnn { NV }
\cs_new_protected:Npn \ale_index_secondlevel:n #1
{
\seq_set_split:Nnn \l_ale_index_item_seq { \firstlevel } { #1 }
\seq_pop_left:NN \l_ale_index_item_seq \l_ale_index_author_tl
\l_ale_index_author_tl\par\nobreak
\seq_map_function:NN \l_ale_index_item_seq \ale_index_subitem:n
}
\cs_new_protected:Npn \ale_index_subitem:n #1
{
\seq_set_split:Nnn \l_ale_index_subitem_seq { \secondlevel } { #1 }
\seq_pop_left:NN \l_ale_index_subitem_seq \l_ale_index_work_tl
\hbox_set:Nn \l_tmpa_box { \qquad \l_ale_index_work_tl,~ }
\dim_set:Nn \l_ale_index_indent_dim { \box_wd:N \l_tmpa_box }
\par\hangindent\l_ale_index_indent_dim % edited with intended indentation: \par\hangindent=2em
\qquad\l_ale_index_work_tl,~\seq_use:Nn \l_ale_index_subitem_seq { ~---~ } % edited with intended indentation: \quad\l_ale_index_work_tl,~\seq_use:Nn \l_ale_index_subitem_seq { ~---~ }
}
\cs_new_protected:Npn \ale_index_firstlevel:n #1
{
\seq_set_split:Nnn \l_ale_index_item_seq { \firstlevel } { #1 }
\seq_pop_left:NN \l_ale_index_item_seq \l_ale_index_author_tl
\hbox_set:Nn \l_tmpa_box { \l_ale_index_author_tl,~ }
\dim_set:Nn \l_ale_index_indent_dim { \box_wd:N \l_tmpa_box }
\par\hangindent\l_ale_index_indent_dim % edited with intended indentation: \par\hangindent=1em
\l_ale_index_author_tl,~\seq_use:Nn \l_ale_index_item_seq { ~---~ }
}
\ExplSyntaxOff
\makeindex[name=1]
\makeindex[name=2]
\makeindex[name=3]
\makeindex[name=4,options=-s \jobname.mst]
\newcommand*{\cose}[1]{\index[1]{#1}\ignorespaces}
\newcommand*{\parole}[1]{\index[2]{#1}\ignorespaces}
\newcommand*{\autori}[1]{\index[4]{#1}\ignorespaces}
\begin{document}
text
\autori{Author!Work1!1,15}
\autori{Author!Work1!9,32}
\autori{Author!Work2!2,24}
\autori{Author!Work2!5,11}
\autori{Author!Work2!2,25}
\autori{Author!Work2!5,12}
\autori{Author!Work1!11,42}
\autori{Author2!4,34}
\autori{Author3!6,12}
\autori{Author3!9,4}
\autori{Author4!9,4}
\autori{Author4!9,5}
\autori{Author4!2,6}
\autori{Author5!2,34}
\autori{Author6!2,4}
\autori{Author7!2,4}
\autori{Author8!2,12}
\autori{Author 123456!2,12}
\autori{Author 123456!2,13}
\autori{Author 123456!2,14}
\autori{Author 123456!2,15}
\autori{Author9 (ed. Author10)!Op. XYZ!2,45}
\autori{Author9 (ed. Author10)!Op. XYZ!2,46}
\autori{Author9 (ed. Author10)!Op. XYZ!2,47}
\autori{Author9 (ed. Author10)!Op. XYZ!2,48}
\autori{Author9 (ed. Author10)!Op. XYZ!2,49}
\autori{Author9 (ed. Author10)!Op. XYZ!2,50}
\printindex[4]
\end{document}
编辑 1:我设法获得了所需的缩进书写\par\hangindent=2em
,分别在部分中\par\hangindent=1em
代替和在部分中代替{ ~---~ } (参见 MWE)。\par\hangindent\l_ale_index_indent_dim
\ale_index_subitem:n #1
\ale_index_firstlevel:n #1
\quad\l_ale_index_work_tl,~\seq_use:Nn \l_ale_index_subitem_seq { ~---~ }
\qquad\l_ale_index_work_tl,~\seq_use:Nn \l_ale_index_subitem_seq
\ale_index_subitem:n #1
编辑 2:Andrew Swann 提出的解决方案对我有用。我想问一下是否可以在索引中获得对齐的文本,因为它目前是左对齐的,如下图所示:
编辑 3:加载包 idxlayout 我获得了一个合理的,但是现在引用和页码之间的距离太大:我该怎么做才能在引用和页码之间设置一个固定的距离?