使用 imakeidx 修复索引布局:一种新的实现

使用 imakeidx 修复索引布局:一种新的实现

以一种非常巧妙的、截然不同的实现方式,回答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 我获得了一个合理的,但是现在引用和页码之间的距离太大:我该怎么做才能在引用和页码之间设置一个固定的距离?

在此处输入图片描述

相关内容