自动将带有子项目的索引条目设为斜体

自动将带有子项目的索引条目设为斜体

我想制作一个包含斜体条目和子项的索引,如下所述这个答案。但是,我想在背景中添加斜体格式,即我想在传递给之前index!subitem将其转换为。index@\textit{index}!subitem@\textit{subitem}\index

以下是我尝试过的:

梅威瑟:

\documentclass{book}
\usepackage{xparse}
\usepackage{makeidx}
\NewDocumentCommand{\italicise}{ >{\SplitList{!}} m }{%
  \ixtestfalse
  \ProcessList{#1}{\italiciseone}%
}
\newif\ifixtest
\NewDocumentCommand{\italiciseone}{m}{%
\ifixtest !\else\ixtesttrue\fi
#1@\textit{#1}}
\makeindex
\begin{document}
test
\index{Manual@\textit{Manual}!italics@\textit{italics}}
\index{\italicise{Automated!italics}}
\printindex
\end{document}

我想我已经完成了一半,但看起来好像命令\italicise需要在传递给时/之前进行扩展\index,正如 idx 文件所建议的那样:

\indexentry{Manual@\textit{Manual}!italics@\textit{italics}}{1}
\indexentry{\italicise{Automated!italics}}{1}

输出:

在此处输入图片描述

为了完整起见,ind 文件:

\begin{theindex}

  \item \italicise{Automated
    \subitem italics}, 1

  \indexspace

  \item \textit{Manual}
    \subitem \textit{italics}, 1

\end{theindex}

顺便说一句,我不知道使用xparse,但这些天,我总是先尝试那个。

编辑

我现在找到了一种无需使用的解决方案xparse,但我仍然感兴趣看看是否可以通过xparse或 LaTeX3-Syntax 来完成此操作。

答案1

现在我自己找到了一个解决方案,无需使用xparse。这会在 idx 文件中产生额外的空格(见下文),但我认为这并不重要。

\documentclass{book}
\usepackage{makeidx}
\makeatletter
% split an index entry in two parts at the first !
\def\@splitentry#1!#2\@nil
{%
   \def\@front{#1}%
   \def\@back{#2}%
}%
\newtoks\@ixtoks
\newtoks\@splittok
% generate tokens for italicised index entry
\def\generate@tokens#1{%
    \@ixtoks={}%
    \def\@back{#1}%
    \loop
        \expandafter\@splitentry\@back\@nil
        % if \@back is empty, this is the last item -> don't append the ! separator
        \ifx\@back\empty\@splittok={}\else\@splittok={!}\fi
        \edef\@settoks{\@ixtoks={\the\@ixtoks\@front @\noexpand\textit{\@front}\the\@splittok}}\@settoks
        % terminate if \@back is empty -> we're finished
        \unless\ifx\@back\empty
    \repeat
}
\def\italicisedindex#1{%
    % process with a manual trailing !, otherwise we get an error at the last entry
    \generate@tokens{#1!}%
    \edef\ixit{\noexpand\index{\the\@ixtoks}}\ixit
    }
\makeatother
\makeindex
\begin{document}
\index{Manual@\textit{Manual}!italics@\textit{italics}}
\italicisedindex{Automated!italics}
\italicisedindex{Three!level!italics}
\printindex
\end{document}

输出:

在此处输入图片描述

Idx 文件:

\indexentry{Manual@\textit{Manual}!italics@\textit{italics}}{1}
\indexentry{Second@\textit  {Second}!italics@\textit  {italics}!sub@\textit  {sub}!subsub@\textit  {subsub}}{1}
\indexentry{Automated@\textit  {Automated}!italics@\textit  {italics}!sub@\textit  {sub}}{1}

Ind 文件:

\begin{theindex}

  \item \textit  {Automated}
    \subitem \textit  {italics}
      \subsubitem \textit  {sub}, 1

  \indexspace

  \item \textit{Manual}
    \subitem \textit{italics}, 1

\end{theindex}

答案2

另一种方法是使用 imakeidx 和索引样式文件 (.ist)。以下是类似答案我在别处给了。

因此,为了普遍控制索引的格式,您可以创建一个索引样式文件,该文件会被读取,并且其代码会按照您的口述插入到成为索引代码的 .ind 文件中。对于您想要实现的目标,我相信这种组合应该有效。

(1)使用以下内容创建一个 .txt 文件,并将其保存为 .ist 或在文件管理器(Finder 或 Windows Explorer 等)中更改其结尾。

item_0 "\\indexspace \n \\item \\noindent "
item_x1 "\n \\subitem \\textit{"
item_1 " \n \\subitem \\textit{"
item_x2 "\n} \\subitem "
item_2 "\n \\subitem "

delim_0 "\\hfill"
delim_1 "} \\hfill"
delim_2 "\\hfill"

(2)在你的 TeX 文件中加上这个。这应该会减少你的序言中的材料。

\documentclass[a4paper]{book}
\usepackage{imakeidx}

\makeindex[name=itindex3,title=Example Index Title, options = -s itindex3.ist]

\makeindex
\begin{document}

This is a test.

\index[itindex3]{some stuff!some other stuff}
\index[itindex3]{Item 0!Item 1!Item 2}
\index[itindex3]{example!this .ist code requires a sub-item to work, since it closes the textit environment with a second curly bracket}
\index[itindex3]{Italics}


\printindex[itindex3]
\end{document}

编辑 .ist 文件时,请确保文本编辑器不会将直引号更改为弯引号(这会导致各种混乱)。另请参阅有关您可以在.ist 文件中使用的按键的信息。

这是生成的 .ind 文件:

\begin{theindex}
\indexspace 
 \item \noindent example
 \subitem \textit{this .ist code requires a sub-item to work, since it closes the textit environment with a second curly bracket} \hfill
        1

  \indexspace
\indexspace 
 \item \noindent Italics\hfill1\indexspace 
 \item \noindent Item 0
 \subitem \textit{Item 1
} \subitem Item 2\hfill1

  \indexspace
\indexspace 
 \item \noindent some stuff
 \subitem \textit{some other stuff} \hfill1

\end{theindex}

相关内容