我想制作一个包含斜体条目和子项的索引,如下所述这个答案。但是,我想在背景中添加斜体格式,即我想在传递给之前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}