diff options
author | Karl Berry <karl@freefriends.org> | 2015-01-25 00:02:50 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2015-01-25 00:02:50 +0000 |
commit | 7e0fbbc50510cbdec843cdb1582134505db85f14 (patch) | |
tree | 31cb083f7a079fd28fb9f4a6635df12af5ce8fe3 | |
parent | 8b58e6d19940ed8b837e805827f54b8683ba83b0 (diff) |
indextools (24jan15)
git-svn-id: svn://tug.org/texlive/trunk@36138 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r-- | Master/texmf-dist/doc/latex/indextools/README | 10 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/indextools/indextools.pdf | bin | 0 -> 519530 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/indextools/latexmkrc | 2 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/indextools/makefile | 14 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/indextools/indextools.dtx | 1671 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/indextools/indextools.sty | 424 | ||||
-rwxr-xr-x | Master/tlpkg/bin/tlpkg-ctan-check | 2 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc | 1 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/indextools.tlpsrc | 0 |
9 files changed, 2123 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/latex/indextools/README b/Master/texmf-dist/doc/latex/indextools/README new file mode 100644 index 00000000000..19007a2f749 --- /dev/null +++ b/Master/texmf-dist/doc/latex/indextools/README @@ -0,0 +1,10 @@ +#License and Copyright + +2010-2013 Enrico Gregorio imakeidx +2014 Maïeul Rouquette indextools + +The LATEX Project Public License 1.3 + +#What is it + +A fork of imakeidx to avoid some limits. diff --git a/Master/texmf-dist/doc/latex/indextools/indextools.pdf b/Master/texmf-dist/doc/latex/indextools/indextools.pdf Binary files differnew file mode 100644 index 00000000000..d7d4ff2803b --- /dev/null +++ b/Master/texmf-dist/doc/latex/indextools/indextools.pdf diff --git a/Master/texmf-dist/doc/latex/indextools/latexmkrc b/Master/texmf-dist/doc/latex/indextools/latexmkrc new file mode 100644 index 00000000000..b043a4ff095 --- /dev/null +++ b/Master/texmf-dist/doc/latex/indextools/latexmkrc @@ -0,0 +1,2 @@ +$pdflatex = "pdflatex %S"; +$pdf_mode = "1"; diff --git a/Master/texmf-dist/doc/latex/indextools/makefile b/Master/texmf-dist/doc/latex/indextools/makefile new file mode 100644 index 00000000000..c5392aa39e3 --- /dev/null +++ b/Master/texmf-dist/doc/latex/indextools/makefile @@ -0,0 +1,14 @@ +FILES = *dtx *pdf README makefile latexmkrc +dist: indextools.pdf indextools.sty + @$(RM) ../indextools.zip + rm -rf indextools + mkdir indextools + ln $(FILES) indextools + zip -r ../indextools.zip indextools +README: README.md + cp README.md README +%.pdf %.sty: %.dtx + latexmk *dtx + +clean: + @$(RM) *.pdf *.toc *.aux *.out *.fdb_latexmk *.log *.bbl *.bcf *.blg *run.xml *.synctex.gz* diff --git a/Master/texmf-dist/source/latex/indextools/indextools.dtx b/Master/texmf-dist/source/latex/indextools/indextools.dtx new file mode 100644 index 00000000000..ed33f77fe38 --- /dev/null +++ b/Master/texmf-dist/source/latex/indextools/indextools.dtx @@ -0,0 +1,1671 @@ +% \iffalse +%<*internal> +\begingroup +\input docstrip.tex +\keepsilent +\usedir{tex/latex/indextools} +\preamble + ___________________________________________________________ + The indextools package for LaTeX + Copyright (C) 2010-2013 Enrico Gregorio + Copyright (C) 2014-* Maïeul Roquette + All rights reserved + + License information appended + +\endpreamble +\postamble + +Copyright 2010--2013 Enrico Gregorio <Enrico dot Gregorio at univr dot it> + +Copyright 2014 Maïeul Rouquette <maieul at maieul dot it> + +Distributable under the LaTeX Project Public License, +version 1.3c or higher (your choice). The latest version of +this license is at: http://www.latex-project.org/lppl.txt + +This work is "author-maintained" + +This work consists of this file indextools.dtx, a README file +and the derived files indextools.sty and indextools.pdf. + +\endpostamble +\askforoverwritefalse + +\generate{\file{indextools.sty}{\from{indextools.dtx}{package}}} + +\def\tmpa{plain} +\ifx\tmpa\fmtname\endgroup\expandafter\bye\fi +\endgroup +%</internal> +% +%<*driver> +\ProvidesFile{indextools.dtx}% +%</driver> +%<package>\NeedsTeXFormat{LaTeX2e}[2005/12/01] +%<package>\ProvidesPackage{indextools}% +%<*package> + [2015/01/23 v1.4 Package for typesetting indices in a synchronous mode] +%</package> +%<*driver> +\documentclass{ltxdoc} +\def\prog#1{\textsf{\slshape#1}} +\def\progpdflatex{\textsf{(\textsl{pdf})\textsl{latex}}} +\def\eTeX{\mbox{$\varepsilon$-\TeX}} +\def\Kvalue#1{\textsf{\textsl{#1}}} +\def\pack#1{\textsf{#1}} +\def\class#1{\textsf{\itshape#1}} +\def\opz#1{\texttt{#1}} +\usepackage{multicol} +\usepackage[colorlinks]{hyperref} +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage[english]{babel} +\usepackage{textcomp,metalogo,booktabs} +\begin{document} +\frenchspacing +\makeatletter +\GetFileInfo{indextools.dtx}% dtx extension required +\title{The package \pack{indextools}\thanks{Version number \fileversion; last + revision \filedate.}} +\author{Maïeul Rouquette\thanks{\texttt{maieul at maieul dot net}} from Enrico Gregorio's work} +\date{} +\maketitle +\begin{multicols}{2} +\tableofcontents +\end{multicols} +\smallskip +\RecordChanges +\DocInput{indextools.dtx} +\end{document} +%</driver> +% \fi +% \CheckSum{798} +% +% \changes{v1.0}{2010/07/10}{First public version} +% \changes{v1.0a}{2010/07/12}{Small bug correction} +% \changes{v1.1}{2012/05/09}{Fixed compatibility with \pack{memoir}} +% \changes{v1.1}{2012/05/09}{Modified interaction with Lua\TeX} +% \changes{v1.1a}{2012/09/07}{Fixed bug with possibly defined \cs{directlua}} +% \changes{v1.2}{2012/08/31}{made package compatible with showidx} +% \changes{v1.2}{2012/08/31}{made package compatible with fancyhdr} +% \changes{v1.2}{2012/08/31}{added index processing engine option truexindy} +% \changes{v1.2c}{2012/10/02}{Fixed regression} +% \changes{v1.2d}{2012/10/06}{Fixed bugs with index internal names} +% \changes{v1.2e}{2012/10/22}{Fixed bug with showidx simulated by memoir} +% \changes{v1.3}{2013/07/11}{Added internal so as to cooperate in a better +% way with eledmac (by Maïeul Rouquette)} +% \changes{v1.4}{2015/01/23}{Compatibility with bidi. Fork from imakeidx. New name indextools} +% +% \begin{abstract} +% This package is a fork of the \pack{imakeidx} package. The original authors +% of \pack{imakeidx} were Claudio Beccari and Enrico Gregorio; the first author withdrew his availability as a maintainer in 2013. The second author declined +% some upgrade suggestions to remove some incompatibilities with certain +% packages that are particularly important with critical editions dealing with +% languages that are being written from right to left. +% Therefore this fork, named \pack{indextools}, was created by Maïeul Rouquette, +% who acknowledges the work of the two preceding authors thanking them for the +% excellent package they created; nevertheless this fork was necessary in order +% to let other users benefit from its functionalities very useful in the field +% of humanities. +% +% We hope that one day, only one package will be provided. +% The differences with the \pack{imakedix} are: +% \begin{itemize} +% \item the name; +% \item the compatibility with package \pack{bidi}; +% \item this documentation. +% \end{itemize} +% This package replaces and extends the functionalities of \pack{imakeidx}, +% therefore it MUST not be loaded at the same time as \pack{imakeidx}. Some +% controls are implemented to avoid these situations; if loading of +% \pack{indextools} is required after \pack{imakeidx} is already loaded, +% it does not get loaded; at the same time, if it gets loaded, it sets a +% suitable macro so that \pack{imakeidx} can't be loaded after +% \pack{indextools}. +% +% This package exploits the |\write18| facility of modern \TeX\ system +% distributions that allows to run system commands while typesetting a +% document written with the \LaTeX{} mark up. By so doing, the index +% or indices, that are usually typeset at the very end of the +% document, are possibly split and sorted so as to include them in the +% document itself. This process has some minor limitations: it's +% impossible to start an index before all other pages have been +% ejected. +% +% For support, please open issues on:\\[1ex] +% \makebox[\linewidth]{\url{https://github.com/maieul/indextools}} +% \end{abstract} +% +% \section{Introduction} +% It's been some years now that the typesetting engine of the \TeX\ +% system is just \prog{pdftex}; the original Knuthian \prog{tex} is +% still corrected by D.\,E.~Knuth himself, but is frozen, according to +% his will; it is still distributed by every \TeX\ distribution, but +% in practice \prog{pdftex}, \prog{xetex} or \prog{luatex} are the most used +% interpreters and typesetting engines of most macro packages. +% +% This program \prog{pdftex} was originally born with the facility of +% producing either a pdf output file, as its name suggests, or a dvi +% file. Since then it has been enriched with many upgrades, also with +% regard to the evolution of the PDF language itself. It also +% incorporates the extensions of \eTeX\ and has the ability to open a +% shell so as to run system commands with their arguments. The same +% is true for \prog{xetex} and \prog{luatex}. +% +% This facility, since the \TeX~Live 2010 distribution, is official, +% but is sort of restricted, in the sense that the \TeX\ system +% configuration file contains a list of ``safe'' system commands that +% can be run by \prog{pdftex}; presently the only program relevant for +% this package is \prog{makeindex}. This precaution is necessary in +% order to avoid running malicious code. Other programs can be run, +% though, but it's necessary to expressly tell \prog{pdftex} that it +% can do so; this authorisation is given by means of a suitable +% program option, as explained below. +% +% This package will exploit this facility in order to run a perl +% script that is capable of splitting a raw index file into different +% chunks and to run the \prog{makeindex} or \prog{xindy} \TeX\ system +% programs so as to sort and format the index entries according to a +% specified index style file. Once the shell is terminated, the +% typesetting program resumes its work and possibly prints the various +% formatted indices produced in previous steps. In this way the document +% indices are always synchronous with their document and no further +% typesetting runs are necessary. +% +% In order to reach this goal, it is necessary that at least the +% restricted |write18| facility is enabled; if the \TeX\ distribution +% in use does not enable this restricted feature by default, it +% is necessary to enable the typesetting engine to run such facility; +% depending on the distribution and the shell editor that is being +% used to work on a specific document, it is necessary to add +% \texttt{-\/-shell-escape} (or \texttt{-\/-enable-write18} for MiK\TeX) +% to the command with which the typesetting program is launched, +% possibly through the shell editor. This applies to all three +% \prog{pdftex}, \prog{xetex}, and \prog{luatex} typesetting engines. +% +% {\medskip\footnotesize If Lua\LaTeX{} is used and \prog{luatex} is +% version 0.42 to 0.66, it's impossible to distinguish whether the +% restricted shell escape is active or not, so the automatic procedure +% will be tried anyway, unless disabled with the \texttt{noautomatic} +% package option. With version 0.68 or later, the behaviour is the same +% as with the other engines.\par} +% +% +%\section{Package usage} +% This package is invoked as usual by means of a \cs{usepackage} command: +% \begin{flushleft} +% \cs{usepackage}\oarg{options}\texttt{\{indextools\}} +% \end{flushleft} +% +% The available \meta{options} consist in a comma separated list of +% the following options: +% ^^A +% \begin{description}\def\Item[#1]{\item[\normalfont\ttfamily#1]} +% ^^A +% \Item[makeindex] in order to use the \prog{makeindex} sorting and +% formatting engine; this option is the default and is mutually +% exclusive with the next option. +% ^^A +% \Item[xindy] in order to use the \prog{xindy} sorting and formatting +% engine; \texttt{texindy} is an alias for \texttt{xindy} and actually +% it's the script \prog{texindy} which is called by this package. +% Nevertheless if the real \prog{xindy} is desired, in order to avoid +% the settings made up by \prog{texindy}, so as to add \prog{xindy} +% the command line specific settings, it is possible to specify the +% option \texttt{truexindy}; the user is then responsible to set up +% the \prog{xindy} engine with the suitable command line options. +% ^^A +% \Item[noautomatic] disables the automatic splitting of the raw +% index files and running of the system programs; this option might +% be used to save time when one knows for sure that the index files +% are already OK and do not need to be refreshed. Actually the time +% spent in splitting, sorting and formatting is so short that this +% option might be useful only when very lengthy indices are being +% processed. +% ^^A +% \Item[nonewpage] inhibits the new page command to be issued when +% using an article type document class and multiple indices are being +% typeset. We don't see why someone would use multiple indices in an +% article (except possibly for package documentations, which usually +% provide a macro index and a list of changes). +% ^^A +% \Item[quiet] suppresses all messages about manual index processing. +% ^^A +% \Item[original] uses the class-provided \texttt{theindex} +% environment for typesetting the indices; it is implicitly set if the +% document class option \texttt{twocolumn} has been specified. +% ^^A +% \Item[splitindex] calls the \prog{splitindex} script by Markus Kohm, +% which is included in every \TeX~Live distribution since 2009. With +% this option all index entries, which are written in one raw index +% file, are successively split into all the requested index files; +% in this way there is virtually no limit on the number of indices +% that is possible to create for a particular document. +% ^^A +% \end{description} +% +% The last described option deserves an explanation. \LaTeX\ can +% write on a limited number of files during a run, and some of these +% \emph{output streams} are already reserved (among these: aux files, +% toc files, lof files, lot files, plus several other ones). When more than +% one index is produced, there's the risk to run off the number of +% writable files, because normally \pack{indextools} reserves an output +% stream for each index. So the \texttt{splitindex} option comes to +% rescue: with it only \emph{one} raw index file is written out. At the +% first \cs{printindex} command, the program \prog{splitindex} is +% called; it splits the large index file into as many parts as the +% number of requested indices; after this, \prog{makeindex} or +% \prog{xindy} can do their job. In this way only one output stream is +% needed during the \LaTeX\ run. +% +% When should you apply this option, then? With one index it's +% useless, you should begin to consider it for two or more indices and +% definitely use it if you get the error message +% \begin{verbatim} +% ! No room for a new \write +% \end{verbatim} +% Apart from this case, with or without it, the results are the +% same. See section~\ref{sec:wrong} to see what files are written +% during the \LaTeX\ run with or without the option. +% +% \section{Specific package commands} +% As it is customary when just one index is produced, the standard +% \LaTeX\ facilities, i.e.\ the commands \cs{makeindex}, \cs{index}, +% and \cs{printindex} must be used. This package redefines them so as +% to produce multiple indices and defines some other commands. The first three +% of the following commands may be used only in the preamble. +% ^^A +% \begin{description}\def\Item[#1]{\item[\normalfont\ttfamily\cs{#1}]} +% ^^A +% \Item[makeindex] with the syntax:\\[1ex] +% \cs{makeindex}\oarg{key-values}\\[1ex] +% where \meta{key-values} is a comma separated list of key-value +% assignments of the form: \texttt{key=value}; the available +% keys are the following: +% ^^A +% \begin{description}\def\Item[#1]{\item[\normalfont\sffamily\textsl{#1}]} +% ^^A +% \Item[name] is the symbolic name for an index; if this key is not +% specified, it defaults to the value of the \cs{jobname} control +% sequence, in other words the name of the current main \texttt{.tex} +% file, i.e., the file that |\input|s and/or |\include|s all the files +% of the complete document. This symbolic name is necessary only when +% doing multiple indices and is used with the \cs{index} +% command to point to the right index.\\* +% Example: \texttt{name=nameidx} +% ^^A +% \Item[title] is the title that is typeset at the beginning of the +% specific index; if not specified, the \cs{indexname} value is +% used.\\* Example: \texttt{title=Index of names}. +% ^^A +% \Item[program] is the name of the system program that is used to +% sort and format an index; valid choices are \prog{makeindex}, +% \prog{xindy}, or \prog{texindy}, plus \prog{truexindy}. If not +% specified the program specified among the package options is used. +% If no option is specified, \prog{makeindex} is used. In order to +% use \prog{xindy}, it's necessary to call \prog{pdflatex} with +% the shell escape command line option.\\* Example: \texttt{program=xindy}. +% ^^A +% \Item[options] is the list of options to be passed to the sorting +% and formatting program; this list is a balanced text of program +% options, separated with the syntax required by the sorting and +% formatting program. For example, in order to use a different +% \prog{makeindex} sorting and formatting style \pack{mystyle.ist} and +% avoiding any message in the screen output, write \texttt{options=-s +% mystyle}. +% ^^A +% \Item[noautomatic] is a boolean key that defaults to \texttt{false}; +% you can set it to \texttt{true} by simply listing its key in the +% key-value list, without necessarily specifying the \texttt{=true} +% part. If specified the index sorting program won't be called during +% the typesetting run for this particular index. +% ^^A +% \Item[intoc] is a boolean variable that defaults to \texttt{false}; +% if you want to set it \texttt{true} you must simply list this key in +% the key-value list, with no need of specifying the \texttt{=true} +% part. By setting this key to \texttt{true} an entry for this +% particular index is put in the table of contents. +% ^^A +% \Item[columns] accepts an integer representing the number of columns +% in the index; this is silently ignored if the \texttt{original} or +% the \texttt{twocolumn} options are set; the number can even +% be~$1$.\\* Example: \texttt{columns=3} +% ^^A +% \Item[columnsep] accepts a dimension representing the separation +% between index columns; the default is $35$\,pt as in the standard +% classes.\\* Example: \texttt{columnsep=15pt} +% ^^A +% \Item[columnseprule] is a boolean option; if it is set, a rule will appear +% between the index columns. +% ^^A +% \end{description} +% ^^A +% \Item[indexsetup] with the syntax:\\[1ex] +% \cs{indexsetup}\marg{key-values}\\[1ex] +% where again \meta{key-values} is a comma separated list of \texttt{key=value} +% assignments; the available keys are: +% ^^A +% \begin{description}\def\Item[#1]{\item[\normalfont\sffamily\textsl{#1}]} +% ^^A +% \Item[level] whose acceptable values are sectioning commands such as +% \cs{chapter} or \cs{chapter*}. Actually any command with an argument +% will do and will receive the index title as its argument. The +% default is \cs{chapter*} or, if the class doesn't provide chapters, +% \cs{section*}. If you specify |\chapter| so as to override the default +% starred command |\chapter*|, the index title goes directly to the table +% of contents; in this case do not specify the \texttt{intoc} option. +% ^^A +% \Item[toclevel] whose acceptable value is a sectioning command +% \emph{name} such as \texttt{section} to indicate the level at which +% we want the indices appear in the table of contents. +% ^^A +% \Item[noclearpage] is a boolean option; when set, no \cs{clearpage} +% will be issued between indices. You might want to set it in order to +% have a `chapter of indices'; in this case you are responsible for +% setting the right value of the above keys. For example +%\begin{verbatim} +% \indexsetup{level=\section*,toclevel=section,noclearpage} +% ... +% \chapter*{Indices} +% \printindex +% \printindex[names] +% \printindex[objects] +%\end{verbatim} +% See more on this subject in section~\ref{sec:hints} +% ^^A +% \Item[firstpagestyle] whose acceptable value is a page style, default +% \texttt{plain}. You might want to set it to \texttt{empty} or some +% other page style defined by the class or by yourself. This keyword +% is disabled when the package \pack{fancyhdr} is loaded; any definition +% or choice of page styles must be done before typesetting the indices. +% ^^A +% \Item[headers] which takes two values: the left and right marks. You +% might want to use this for disabling automatic uppercasing, by +% saying, for example, |headers={\indexname}{\indexname}|; notice that +% these values should always be a pair of balanced braced texts. +% Don't use these keys if you use \pack{fancyhdr}. +% ^^A +% \Item[othercode] whose acceptable value is arbitrary \TeX\ code that +% will be executed at the beginning of index entries typesetting. For +% example you might want to change here the setting of \cs{parskip}. +% \end{description} +% ^^A +% \Item[splitindexoptions] must have as its argument the command line +% option to \prog{splitindex}; this might be necessary on some +% systems. The default is |-m ""|, because we want it only for +% splitting the large index file into its components which are later +% processed by this package. See the \prog{splitindex} documentation +% for other options. +% ^^A +% \Item[index] with the syntax:\\[1ex] +% \cs{index}\oarg{name}\marg{entry}\\[1ex] +% inserts \meta{entry} in the raw index file named \meta{name}; if only +% one raw index file is being built in order to split it in different index +% files by means of \prog{splitindex}, the \meta{entry} is listed in the +% specific slit index file with name \meta{name}; if no name is specified, +% this \meta{entry} is added to the default index with name +% \cs{jobname}. The \meta{entry} should be written according to the +% particular syntax of the sorting and formatting program. +% ^^A +% \Item[indexprologue] with the syntax:\\*[1ex] +% \cs{indexprologue}\oarg{spacing}\marg{text}\\[1ex] +% is used to define some \meta{text} to go between the index header and the +% entries; the \meta{spacing} should be a vertical space command such +% as |\vspace{36pt}| (default is \cs{bigskip}), controlling the +% spacing between the prologue and the index proper. The command +% affects only the next index produced by \cs{printindex} and is best +% placed just before this command. Please read ahead for further +% information on the use of this command. +% ^^A +% \Item[printindex] with the syntax:\\*[1ex] +% \cs{printindex}\oarg{name}\\[1ex] +% is used to typeset the particular index named \meta{name}; if no +% optional argument is specified, the default index with name +% \cs{jobname.ind} is typeset. Actually this command activates all +% the mechanism of closing the output to the raw index file, shelling +% out, possibly calling the \prog{splitindex} script in order to +% divide the single raw file generated by the typesetting engine into +% distinct raw files according to the default or specified +% \meta{name}s for each index, calling the sorting and +% formatting program on each of these split raw files (unless +% inhibited by a \Kvalue{noautomatic} option; in which case a warning +% is issued in order to remember the typesetter that this particular +% index has not been processed), producing the sorted and formatted +% \texttt{.ind} files, and eventually inputs and typesets these +% formatted files. \ Deep breath. +% \end{description} +% +% Let's see an example. The sequence of commands +%\begin{verbatim} +% ... +% \usepackage{indextools} +% ... +% \makeindex[title=Concept index] +% \makeindex[name=persons,title=Index of names,columns=3] +% ... +% \begin{document} +% ... +% ...relativity\index{relativity}... +% ... +% ... Einstein\index[persons]{Einstein, Albert}... +% ... +% And this is the end of the story. +% +% \printindex +% +% \indexprologue{\small In this index you'll find only +% famous people's names} +% \printindex[persons] +% \end{document} +%\end{verbatim} +% will produce two indices. Entries for either index must be typed as +% shown above. The prologue will be printed (full text width) only +% in the ``Index of names'', which will be typeset in three columns. +% +% When the \texttt{original} option is set, maybe implicitly because +% of \texttt{twocolumn}, \cs{indexsetup} and the keys +% \Kvalue{columns}, \Kvalue{columnsep} and \Kvalue{columnseprule} for +% \cs{makeindex} have no effect. Please read more on this matter further~on. +% +% \section{If something goes wrong}\label{sec:wrong} +% Since \pack{indextools} relies on good cooperation between package +% options and command line options for the \LaTeX\ run, in some cases +% it may happen that the indices are not correctly built or built at +% all. +% +% If you use only \prog{makeindex} and \TeX~Live 2010 or later, then +% you shouldn't need anything special, since \prog{makeindex} is among +% the safe programs allowed to be called during a \LaTeX\ run, be it +% \prog{latex}, \prog{pdflatex}, \prog{xelatex}, or \prog{lualatex}. +% +% When the options \texttt{splitindex}, \texttt{xindy}, +% \texttt{texindy} or \texttt{truexindy} are specified (globally or +% locally), the \LaTeX\ run should be called with the unrestricted +% \texttt{-\/-shell-escape} (which is \texttt{-\/-enable-write18} for +% MiK\TeX) typesetting program option or the \texttt{noautomatic} +% option should be specified when loading \pack{indextools}. +% +% Let's look at a couple of examples. In both we suppose that the +% document \texttt{mybook.tex} defines two indices through +%\begin{verbatim} +% \makeindex[...] +% \makeindex[name=secondary,...] +%\end{verbatim} +% where |...| denotes possible options excluding \texttt{name}. +% +% First of all we examine the case when \pack{indextools} is called +% \emph{without} \texttt{splitindex}. Two files called +% \texttt{mybook.idx} and \texttt{secondary.idx} will be written +% during the \LaTeX\ run. At the corresponding \cs{printindex} +% command, \prog{makeindex} will act on each of them producing the files +% \texttt{mybook.ind}, \texttt{mybook.ilg}, \texttt{secondary.ind} and +% \texttt{secondary.ilg}. The \texttt{.ind} files contain the relevant +% \texttt{theindex} environments with alphabetised entries, while in +% the \texttt{.ilg} files \prog{makeindex} will write its log. You can +% check in \texttt{mybook.log} whether the \prog{makeindex} run has +% been executed by searching for a line +%\begin{verbatim} +% runsystem(makeindex <...>)...executed +%\end{verbatim} +% where |<...>| stands for the rest of the command line in the +% particular case. If this line is not present, then \prog{makeindex} +% has not been called; this happens when you didn't specify the shell +% escape command line option for the \LaTeX\ run or the restricted +% shell escape is not active; also, of course, if you set the +% \texttt{noautomatic} option for the index. +% +% {\tolerance=9999 +% When using \prog{splitindex}, the situation is different. During the +% \LaTeX\ run, only a large index file called \texttt{mybook.idx} file +% gets written; the first \cs{printindex} command will call +% \prog{splitindex} (unrestricted shell escape \emph{must} be active), +% which will produce the two partial index files \texttt{mybook-mybook.idx} +% and \texttt{mybook-secondary.idx}. These two files will be processed by +% \prog{makeindex} producing the four files \texttt{mybook-mybook.ind}, +% \texttt{mybook-mybook.ilg}, \texttt{mybook-secondary.ind} and +% \texttt{mybook-secondary.ilg}. +% The line +%\begin{verbatim} +% runsystem(splitindex <...>)...executed +%\end{verbatim} +% in \texttt{mybook.log} will tell that the splitting has been done +% (see later on if this doesn't seem true). In table~\ref{tab:files} you +% can see what files are produced when the first two lines are in the +% preamble.\par} +% +% \begin{table}[tp] +% \centering\begingroup\ttfamily +% \begin{tabular}{rll} +% \toprule +% \multicolumn{3}{c}{\ttfamily\cs{makeindex}\hphantom{[name=secondary]}}\\ +% \multicolumn{3}{c}{\ttfamily\cs{makeindex}[name=secondary]}\\ +% \midrule +% \addlinespace +% &\normalfont without \texttt{splitindex} & +% \normalfont with \texttt{splitindex} \\ +% \cmidrule(lr){2-2} \cmidrule(lr){3-3} +% \addlinespace +% \normalfont(at \cs{begin}\texttt{\{document\}})\\ +% \addlinespace +% &mybook.idx & mybook.idx \\ +% &secondary.idx \\ +% \addlinespace +% \normalfont(at \cs{printindex})\\ +% \addlinespace +% &mybook.ind & mybook-mybook.idx \\ +% &mybook.ilg & mybook-secondary.idx\\ +% &secondary.ind & mybook-mybook.ind\\ +% &secondary.ilg & mybook-mybook.ilg\\ +% & & mybook-secondary.ind \\ +% & & mybook-secondary.ilg \\ +% \bottomrule +% \end{tabular}\endgroup +% \caption{Files written during a \LaTeX\ run}\label{tab:files} +% \end{table} +% +% Everything is the same when using \prog{texindy} for alphabetising, +% except that, by default, it doesn't write \texttt{.ilg} files. If +% you want them, add |options=-t |\meta{name}|.ilg| to the relevant +% \cs{makeindex} command, in our example it should be +%\begin{verbatim} +% \makeindex[...,options=-t mybook.ilg] +% \makeindex[name=secondary,...,options=-t secondary.ilg] +%\end{verbatim} +% The name of the \texttt{.ilg} file \emph{must} be specified. +% Remember, though, that \prog{xindy} \texttt{.ilg} files may turn out +% to be very large. +% +% When something different from expected appears to take place, check +% also the time stamps of the produced files; if they are older than +% \texttt{mybook.log}, it means that they have not been written in the +% last run. The most common case is that you forgot to activate the shell +% escape feature (which is not necessary with \TeX~Live 2010 or later, +% provided you use only \prog{makeindex}). +% +% Another cause of malfunction might be a wrong option passed to +% \prog{makeindex}, \prog{texindy} or \prog{splitindex}. For example, +% if you specify a style option for \prog{makeindex} such as +% |options=-s mystyle.ist| and the style file is missing or its name +% is mistyped, the run of \prog{makeindex} will result in +% \texttt{mybook.log}, but it will be aborted and the \TeX\ program +% has no control over this process. In this case the \texttt{.ilg} and +% \texttt{.ind} files will not be produced and you can spot the +% problem by checking the time stamps. On some systems a message such as +%\begin{verbatim} +% Index file mystyle.ist not found +% Usage: makeindex [-ilqrcgLT] [-s sty] [-o ind] [-t log] [-p num] +%\end{verbatim} +% may appear on the screen, but often this window gets closed before +% you realize you have a problem. The time stamp is the best clue to +% detect such problems. +% +% Shell hackers may be able to redirect the \texttt{stderr} stream to +% a file, but this requires skills that can't be explained here, +% because they require tens of different tricks, depending on what +% method is used to start a \LaTeX\ run. From the command line, +% assuming \prog{bash}, it would be something like +%\begin{verbatim} +% pdflatex --shell-escape mybook.tex 2>latex-errors +%\end{verbatim} +% If shell hackers know a way to access the exit status of the called +% program, we'd be glad to implement a supplementary check. +% +% ^^A G +% \section{Hints}\label{sec:hints} +% Actually this package reaches two goals: (\textit{a})~it typesets +% the indices of a specific document in just one run, and +% (\textit{b})~it lets the author\slash typesetter produce +% documents with multiple indices. +% +% \subsection{Conflicts} +% +% \subsubsection{Two columm typesetting and index prologue} +% As it has been already mentioned, it is possible to use the command +% |\indexprologue| to write some text before the index proper gets typeset; +% an optional space may be used in place of the default one-line spacing +% between the index title, the prologue and the index body. +% +% This facility relies on a particular feature of the |multicols| +% environment, that \pack{indextools} uses to instruct the typesetting +% program to typeset the index with a specified number of balanced columns. +% The choice of |multicols| has been made because it balances the +% columns in the last page; the declaration |\twocolum| does not +% perform the same way, and, if used, it makes |\printindex| typeset +% the index in two-column mode with an unbalanced last column. +% +% In the previous sections it has been clearly stated that any +% configuration of the way \pack{indextools} typesets the indices +% is bypassed if the option \opz{original} has been specified +% either explicitly or implicitly. It is implicitly specified +% if the option \opz{twocolumn} is specified in the class +% declaration statement. +% +% Why? Because if two column typesetting is desired for the whole +% document, it is not clear if the index has to be typeset in one +% column within each column of the document, or if it should be +% typeset in two column mode after a |\onecolumn| command is being +% issued; the results are not the same: with the former method the +% columns remain unbalanced, while the latter has balanced columns. +% Furthermore the |\onecolum| command forces a page break; without +% the |\onecolumn| command if the index is treated as a chapter, +% there is a page break, while if it is configured to be typeset +% as a section there is no forced page break. With this plethora +% of combinations we decided to avoid any configuration of the +% index typesetting and left the decision to the user. This +% requires the user to practice some ingenuity in order to obtain +% what he expects. +% +% First of all the user shall not specify the \opz{twocolumn} +% option to the class. Secondly the user asks for the use of +% \pack{indextools} and sets up the single or multiple |\makindex| +% commands. thirdly he loads all other packages required for his +% document; possibly he uses also \pack{geometry} in order to +% specify a specific page layout. He shall specify the |\twocolumn| +% declaration after the above has been completed, in any case +% after the \pack{indextools} package has been loaded and the single +% or multiple |\makeindex| commands are configured. +% +% A good example might be this one: +%\begin{verbatim} +%\documentclass[a4paper,11pt]{book} +%\usepackage{indextools} +%\indexsetup{level=\section*,toclevel=section,noclearpage} +%\makeindex[title=Index of places,columns=1] +%\twocolumn +%\usepackage[T1]{fontenc} +%\usepackage{lmodern} +%\usepackage[italian,english]{babel} +%\usepackage[utf8]{inputenc} +%\usepackage[a4paper,margin={1in,1in},binding=3mm]{geometry} +%\usepackage[english]{varioref} +%\usepackage[hang]{caption} +%\begin{document} +%... +%\indexprologue{This index lists all the residences where Lady Esther +%lived during the time span described in the book.} +%\printindex +%\end{document} +%\end{verbatim} +% In this way the index is typeset as a ``section'', not as a +% ``chapter'', in one column mode within the two column document +% style; the indicated prologue is typeset between the index +% title ``Index of places'' and the start of the index proper. +% +% On the opposite the following code: +%\begin{verbatim} +%\documentclass[a4paper,11pt]{book} +%\usepackage{indextools} +%\makeindex[title=Index of places,columns=2] +%\twocolumn +%\usepackage[T1]{fontenc} +%\usepackage{lmodern} +%\usepackage[italian,english]{babel} +%\usepackage[utf8]{inputenc} +%\usepackage[a4paper,margin={1in,1in},binding=3mm]{geometry} +%\usepackage[english]{varioref} +%\usepackage[hang]{caption} +%\begin{document} +%... +%\onecolumn +%\indexprologue{This index lists all the residences where Lady Esther +%lived during the time span described in the book.} +%\printindex +%\end{document} +%\end{verbatim} +% produces an index typeset as a ``chapter'', starting on a new page; +% it is typeset in two balanced columns. The prologue is typeset where it should. +% The ingenious reader can experiment mixing the various settings +% used in these two examples in order to find out what benefits or +% disadvantages one can obtain with settings that are not physically +% impossible, but that may be aesthetically conflicting with one another. + +% \subsubsection{Class \class{memoir}} +% +% The first public version of this package was not compatible with the +% \pack{memoir} class. Since version 1.1 it is; however, one has to +% keep in mind that all index processing is done with the methods of +% the present package, and \emph{not} with \pack{memoir}'s; however +% the syntax used is the same and there should be no problem. There is +% an interaction between \pack{memoir} and \pack{showidx} that required +% special attention. See below about using \pack{showidx}. +% +% \subsubsection{Package \pack{showidx}} +% +% Up to version 1.1 this package did not allow to use it together with +% the \pack{showidx} package; now it is, provided that \pack{showidx} +% is loaded \emph{before} \pack{indextools}. See below more information +% on using \pack{showidx}. +% +% \subsubsection{Package \pack{fancyhdr}} +% +% When using package \pack{fancyhdr} some inconveniences did show up; +% now we believe we have detected the causes and we implemented the +% necessary corrections\footnote{Thanks to Maïeul Rouquette who, before +% creating this fork, spotted the problems and suggested some patches.}. +% +% \subsubsection{Package \pack{combine}} +% +% Apparently there might be some conflicts with package \pack{combine}, +% because this package redefines the contents of |\jobname|; we tried +% to control this behaviour, and made the necessary patches, but it is still +% necessary to load this package \pack{indextools} \emph{before} package +% \pack{combine}. +% +% \subsubsection{Package \pack{ledmac}} +% +% Some users reported some conflicts with package \pack{ledmac}; in order +% to mark with an italic `n' the pages where the reference was made in +% one of the footnotes, it is necessary to use the package \pack{etoolbox} +% and its command |\pretocmd|; actually it is not necessary to load +% \pack{etoolbox}, because this \pack{indextools} package provides for it: +%\begin{verbatim} +%... +%\usepackage{letltxmacro} +%\usepackage{indextools} +%... +%\makeatletter +%\LetLtxMacro\orig@@index\index +%\newcommand\nindex[1]{\orig@@index{#1|innote}} +%\newcommand\innote[1]{#1\textit{n}} +%... +%\makeindex[...] +%... +%\AtBeginDocument{% +% \pretocommand{\@footnotetext}{\let\index\nindex}{}{} +%} +%\end{verbatim} +% We did not apply this patch directly because we tried to avoid possible +% conflicts that might show up when loading other packages. Therefore we +% simply show what to do in case it might be necessary. +% +% With the newer \pack{eledmac} package there are no problems. +% +% \subsection{Package \pack{bidi}} +% A strange conflict was discovered between packages \pack{imakeidx} and +% \pack{bidi}, in order to let \pack{hyperref} redefine some +% internal macros so as to have index hyperlinks properly executed. +% This implies that the ``index'' package be loaded before \pack{hyperref}; +% on the opposite \pack{bidi} (for bidirectional writing, needed for +% typesetting Arabic and Hebrew scripts, among other ones) \emph{must} +% be loaded after \pack{hyperref} and redefines some hyper commands +% that have influence on the indexing package; therefore after loading +% \pack{bidi} the previous redefinitions are lost. A solution was found +% by modifying the definition of the environment |theindex| and delaying +% its definition to the execution of |\begin{document}|. This is the main +% reason of this fork so that \pack{indextools} may be loaded, as most +% packages normally do, before \pack{hyperref}. +% +%\subsection{Index layout customisation} +% If you redefine yourself the \texttt{theindex} environment, please +% remember not to number the chapter or section that introduces the +% index if you ask for the \Kvalue{intoc} option; either use the +% commands \cs{chapter*} or the \cs{section*} respectively and the +% \Kvalue{intoc} option or don't use this option and redefine your +% \texttt{theindex} environment with numbered chapter or section +% commands, that will put the index titles directly into the table of +% contents. See below the effect of the |\backmatter| declaration. +% You may use the \pack{idxlayout} package by Thomas Titz, +% which offers many functions for index typesetting customisation and +% is compatible with our package; remember to load \pack{idxlayout} +% after \pack{indextools}. This package has a similar function to our +% \cs{indexprologue}, called \cs{setindexprenote}; however +% \pack{idxlayout} doesn't reset the index prologue, which must be +% declared anew or disabled with \cs{noindexprenote} before the next +% \cs{printindex} command. In any case take into serious consideration +% what is being said hereafter about customisation. +% +% \subsection{Index page customisation} +% The same, more or less, holds true if you customise your headings; +% \pack{indextools} can deal with standard settings, but it generally +% cannot deal with personal styles and customisations. This is why +% if you load \pack{fancyhdr}, some of the |\indexsetup| settings may be +% disabled. + +% When you make any kind of customisation, remember that there are +% several classes, or personal settings, or features that may render your +% customisation very difficult to handle. Typically: +%^^A +%\begin{itemize} +%^^A +% \item There are classes where the normal usable highest sectioning +% command, disregarding |\part|, is not |\chapter|, but |\section|; for +% example classes \class{article}, \class{scrartcl}. +%^^A +%\item Sectioning commands come in two varieties: starred and unstarred; +% the former ones are not numbered and do not produce any entry in the +% headings and in the table of contents; the latter ones may behave +% differently according to the next item. +%^^A +% \item There are some classes (for example \class{book}, +% \class{scrbook}, \class{menoir},\dots) that have the special +% ``sectioning'' declarations |\frontmatter|, |\mainmatter|, and +% |\backmatter| which modify how the unstarred sectioning commands behave for +% what concerns the heading and the table of contents entries. +% +% For what concerns indices, these are generally typeset at the document +% end. This means that the |\backmatter| declaration may be in force; +% in this case unstarred sectioning commands are not numbered but they +% produce normal headings and table of contents entries. +%^^A +%\item Heading entries are used by the output routine paging algorithm +% in such a way as to extract the left or the right part from suitable +% ``marks''; for the even (left) pages the required information is +% extracted from the |\topmark| or |\firstmark|, while for the odd (right) +% pages they are extracted from the |\botmark|. Generally speaking, +% the even page heading refers to |\leftmark| and odd page headings +% refer to |\rightmark|; these are the two commands that extract the +% correct part from the suitable marks. But when you use the +% \Kvalue{headers} option value, you specify two brace balanced strings that +% are loaded through |\markboth| as the left and right part of the +% current mark. +%^^A +% \item The contents of the marks may be very varied; they are generally +% made up of two brace balanced strings, which in turn may contain other +% brace balanced strings that may be used in different ways by the selected page +% style and by the page style definitions of the macros |\chaptermarks|, +% |\sectionmarks|, and |\subsectionmarks| that may interfere with personal +% customisations. +%^^A +% \item Remember also that things change in an obvious way when one side +% typesetting is chosen; all pages are treated as if they were odd ones; +% therefore any customisation must take into account also this aspect. +%\end{itemize} +% +% The above list has not been written down for discouraging customisations +% of any kind: simply it recalls what must be taken care of in order to +% create one's customisation in a proper way. +% +% The above list explains why we disabled the commands tied to the +% |\indexsetup| keys \Kvalue{headings} and \Kvalue{firstpagestyle} when +% package \pack{fancydr} is being used; you may even set up these keys, +% but if the \pack{fancyhdr} package has been loaded, we disable their +% action; this implies that any fancy customisation must be done before +% starting to print any index. +% +% The \Kvalue{intoc} option must also be used with care, as well as the starred +% or unstarred sectioning commands for the \Kvalue{level} and +% \Kvalue{toclevel} option values. They must be chosen according to what the +% possible |\backmatter| declaration sets up, in order to avoid double +% entries in the table of contents; the |\backmatter| settings may also +% influence the way heading information is being used, and this makes it +% even more stringent to set up any index page style customisation +% before starting to print any index. +% +% Therefore if by chance you get double entries into the table of contents, +% eliminate the \Kvalue{intoc} option from your calls; your class, +% packages, and settings are already taking care of it. + +% The package \pack{tocbibind} should be loaded with the \Kvalue{noindex} +% option, otherwise it would interfere with our redefinition of +% \texttt{theindex}. +% +% If you redefine your \texttt{theindex} environment by means of other +% packages, pay attention that these redefine a real \texttt{theindex} +% environment with this very name; if they create an environment with +% a different name, \pack{indextools} can't take care of the indices +% production (in particular the \TeX\ system program \prog{makeindex} +% creates a sorted and formatted \texttt{.ind} file that refers +% explicitly to the \texttt{theindex} environment), and it can't take +% care of the table of contents entry and of the position of the hyper +% link anchors needed to navigate your document by means of hyper +% links. +% +% \subsection{Index location customisation} +% +% Some packages might want to use the facilities of \emph{indextools} +% to offer customised index commands, where the entry location is not +% expressed by a page number, but by an other reference value (for +% example: line number, entry number, etc.). +% +% These packages may use the low-level command \cs{indtl@wrindexentry} +% which takes three arguments: +% \begin{enumerate} +% \item The index name. +% \item The entry. +% \item The location number. +% \end{enumerate} +% For example \verb+\indtl@wrindexentry{names}{Charles}{26}+ adds to +% the index \verb+names+ the value \verb+Charles+ with the location +% reference \verb+26+. +% +% In simpler words, the new command \cs{indtl@wrindexentry} is of interest +% mainly to package and class authors; it is not to be used by the +% ``normal'' user, who, on the opposite, if interested in referencing +% the index entries on some location counter different from the page one, +% is urged to refer to the classes and packages that implement this +% facility; \pack{eledmac} should be one of these packages. Matter of +% fact this addition to the \pack{indextools} package was contributed +% by Maïeul Rouquette, the author and maintainer of \pack{eledmac}. +% +% \subsection{Using the \textsf{showidx} package} +% If you want to make use of the \pack{showidx} facilities, remember +% to load that package \emph{before} \pack{indextools}; remember also +% to disable or comment out the call to \pack{showidx} when you +% typeset the final version of your document. This constraint is due +% to the fact that \pack{showidx} redefines several internal commands, +% some of which have to receive the \pack{indextools} definition in order +% to perform as described in this documentation. + +% At the same time if the \pack{memoir} class is being used, remember that +% this class simulates the \pack{showidx} package and has its own commands +% to enable or disable the printing of the index entries into the margin +% of the document; the default setting is with the |\hideindexmarks| +% command in force; but if the user wants to write his index entries in +% the margin he has to issue the declaration |\showindexmarks| just after +% begin document, in any case before the part of the source file(s) he +% wants to be marked with the index entries in the margin. +% +% \subsection{Index List sectioning customisation} +% Use freely the options and the key values in order to reach the +% desired results, but you are advised to prepare in advance the +% styles for composing the various indices in a proper way; for +% example, if you use a titled style for the index, where the index +% sections are distinguished with a bold face title or alphabetic +% letter, you have to set up a \texttt{.ist} file, such as +% \texttt{myindexstyle.ist}, made up like this: +%\begin{verbatim} +% headings_flag 1 +% heading_prefix "\\par\\penalty-50\\textbf{" +% heading_suffix "}\\\\\*\~\\\\\*" +% symhead_positive "Symbols" +% symhead_negative "symbols" +% numhead_positive "Numbers" +% numhead_negative "numbers" +% delim_0 ",\~" +%\end{verbatim} +% where the numeric and non alphabetic entries have different +% titles. But, say, you are making also an index where the entries are +% file names, and for some names only the extension is entered; the +% extensions start with a dot, so the sorting program will sort these +% names at the beginning of the sorted index file, but you won't like +% to have a title such as ``Symbols''; you probably prefer to have a title +% such as ``Extensions''; therefore you have to prepare a different +% index style file, such as this one: +%\begin{verbatim} +% headings_flag 1 +% heading_prefix "\\par\\penalty-50\\textbf{" +% heading_suffix "}\\\\\*\~\\\\\*" +% symhead_positive "Extensions" +% symhead_negative "extensions" +% numhead_positive "Numbers" +% numhead_negative "numbers" +% delim_0 ",\~" +%\end{verbatim} +% +% This done, besides requiring the use of this package, you have to +% declare the \cs{makeindex} command with the necessary options; pay a +% particular attention to the options that involve the index symbolic +% name, the index title, the index style, the fact that the index +% titles shall appear in the table of contents, and if you are +% preparing an e-book, you probably would like to hyper link both the +% page numbers and the index titles to the proper locations. +% The typesetting program will do everything for you but be careful +% not to confuse it with illogical index entries. +% +% Especially with multiple indices it is important that you are +% consistent in putting the right information in the right index and +% with a consistent mark-up. Define yourself appropriate macros so +% that, for example, personal names are consistently typeset, say, in +% caps and small caps and are entered into a specific index; you may +% even create one command to typeset the name in the document and +% replicate the same name in the index. +% +% Of course there is no program that can decide at your place what and +% where to index each piece of information; this is a task for +% humans. Soooooo\dots +% \begin{center} HAPPY \TeX{}ING!\end{center} +% +% \StopEventually{\PrintChanges} +% \section{Implementation} +% The heading to the file is in common with the documentation file, +% and has already been taken care of. But we require the +% \pack{xkeyval} package, in order to handle the key-value lists. +% +% Notice that in order to create a specific name space so as to avoid +% possible conflicts with other packages, all the commands defined in +% this package are prefixed with the string \texttt{indtl@}. +%\iffalse +%<*package> +%\fi +% \begin{macrocode} +\RequirePackage{xkeyval} +% \end{macrocode} +% +% We define the various options and their defaults. After +% \cs{ProcessOptions}, we set anyway the \texttt{original} option if +% the document class has been given the \texttt{twocolumn} option, +% which is incompatible with \pack{multicol}. We define also an +% internal alias for |\immediate\write18|, a rudimentary check for the +% typesetting engine and a macro for modifying the command line call +% to \prog{splitindex}. The \pack{xpatch} is requested; at the moment +% none if its features are used, but it calls \pack{etoolbox}, whose +% facilities are used here; while future extensions will benefit from +% the extended patched commands, that strongly enrich the performances +% of the main package \pack{etoolbox}. +% \changes{v1.1a}{2012/09/07}{Fixed bug with possibly defined +% \cs{directlua}; now we leave the check to \pack{ifluatex}; using +% also \pack{ifxetex} for symmetry.} +% \begin{macrocode} +\DeclareOption{xindy}{\def\indtl@progdefault{texindy}} +\DeclareOption{texindy}{\def\indtl@progdefault{texindy}} +\DeclareOption{truexindy}{\def\indtl@progdefault{truexindy}} +\DeclareOption{makeindex}{\def\indtl@progdefault{makeindex}} +\newif\ifindtl@disableautomatic +\DeclareOption{noautomatic}{\indtl@disableautomatictrue} +\newif\ifindtl@nonewpage +\DeclareOption{nonewpage}{% + \indtl@nonewpagetrue\indtl@disableautomatictrue +} +\newif\ifindtl@splitindex +\DeclareOption{splitindex}{\indtl@splitindextrue} +\newif\ifindtl@original +\DeclareOption{original}{\indtl@originaltrue} +\DeclareOption{quiet}{\AtEndOfPackage{% + \let\indtl@finalmessage\@gobble + \let\indtl@splitindexmessage\relax}} +\ExecuteOptions{makeindex} +\ProcessOptions\relax + +\if@twocolumn\indtl@originaltrue\fi +\def\indtl@exec{\immediate\write18} +\def\indtl@engine{(pdf)latex} +\RequirePackage{ifxetex,ifluatex} +\ifxetex\def\indtl@engine{xelatex}\fi +\ifluatex % luatex doesn't have \(pdf)shellescape + \def\indtl@engine{lualatex} + \ifnum\luatexversion<68 + \chardef\indtl@shellescape\@ne % no way to know the value + \else + \RequirePackage{pdftexcmds} % provides \pdf@shellescape + \chardef\indtl@shellescape\pdf@shellescape + \fi + \let\indtl@exec\pdf@system +\fi +\RequirePackage{xpatch} +\edef\indtl@splitindexoptions{-m \string"\string"} +\def\splitindexoptions#1{\g@addto@macro\indtl@splitindexoptions{ #1}} +\@onlypreamble\splitindexoptions +% \end{macrocode} +% +% ^^A A - incompatibilities and emulation +% +% While experimenting we found out that some classes or packages are +% either incompatible with this one, or must be faked in order to +% pretend they have been loaded. +% +% There is a serious incompatibility with the \pack{memoir} class. In +% facts \pack{memoir} puts all index entries in the main \texttt{.aux} +% file and extracts them to the various raw index files at +% |\end{document}| time. This means that no raw index file output +% stream has been defined, and therefore this package can't close it; +% moreover it can't typeset the indices before |\end{document}| +% because they are not yet available. Therefore if \pack{memoir} is +% the active class, we will hijack its index mechanism replacing it +% with ours. +% +% On the opposite we pretend that package \pack{makeidx} or package +% \pack{multind} have been loaded, so that \pack{hyperref} can play +% with their commands, that are substantially the same as those used +% here. By so doing those packages are inhibited from being loaded +% after this one. +% We do the same with the forked original \pack{imakeidx} package +% so that if \pack{imakeidx} is loaded before, \pack{indextools} is +% not loaded, but an error message is issued; otherwise we fake the +% fact that \pack{imakeidx} has already been loaded so that it does +% not get reloaded. +% \begin{macrocode} +\@namedef{ver@makeidx.sty}{3000/12/31} +\@ifpackageloaded{multind} + {\PackageError{indextools}{Incompatible package `multind' loaded} + {This package is incompatible with multind, don't load both.% + \MessageBreak\@ehc}} + {\@namedef{ver@multind.sty}{3000/12/31}} + +\@ifpackageloaded{imakeidx} + {\PackageError{indextools}{Incompatible package `imakeidx' loaded} + {This package is incompatible with imakeidx, don't load both.% + \MessageBreak\@ehc}} + {\@namedef{ver@imakeidx.sty}{3000/12/31}} +% \end{macrocode} +% At the same time we redefine some commands defined by \pack{makeidx} +% and we define the default English names for the \cs{see} and +% \cs{seealso} commands. We use \cs{providecommand} so that, if +% \pack{makeidx} has already been loaded, we do not redefine things +% that have already been defined. +% \begin{macrocode} +\providecommand*\see[2]{\emph{\seename} #1} +\providecommand*\seealso[2]{\emph{\alsoname} #1} +\providecommand*\seename{see} +\providecommand*\alsoname{see also} +% \end{macrocode} +% +% ^^A C - \makeindex +% +% From here on, some commands are duplicated; this depends on the +% fact that the behavior must be different when using \prog{splitindex} or +% not. The memory occupied by the useless commands will be cleared at the +% end of package. +% \begin{macrocode} +\providecommand*\makeindex{} % to use \renewcommand safely +\renewcommand{\makeindex}[1][]{\indtl@makeindex{#1}} +% \@onlypreamble\makeindex % Already in latex.ltx +% \end{macrocode} +% This package implementation of \cs{makeindex} sets default values +% for the keys, then evaluates its argument (which is the optional +% argument to \cs{makeindex}) and calls two other macros. After that +% we have to reset the defaults. +% \begin{macrocode} +\def\indtl@makeindex#1{% + \edef\indtl@name{\jobname}% + \edef\indtl@jobname{\jobname}% + \def\indtl@title{\indexname}% + \edef\indtl@program{\indtl@progdefault}% + \let\indtl@options\space + \KV@indtl@noautomaticfalse\KV@indtl@intocfalse + \setkeys{indtl}{#1}% + \ifindtl@splitindex\KV@indtl@noautomaticfalse\fi + \indtl@build\indtl@name + \indtl@startidx\indtl@name + \indtl@resetdefaults +} +% \end{macrocode} +% +% Here are the keys. As usual, the \texttt{indtl@} prefix is used to +% distinguish anything that is being defined in this package, even the +% keys. +% \begin{macrocode} +\define@key{indtl}{name}{\def\indtl@name{#1}} +\define@key{indtl}{title}{\def\indtl@title{#1}} +\define@choicekey{indtl}{program}[\indtl@val\indtl@nr] + {makeindex,xindy,texindy,truexindy}{% + \ifcase\indtl@nr\relax + \def\indtl@program{makeindex}% + \or + \def\indtl@program{texindy}% + \or + \def\indtl@program{texindy}% + \or + \def\indtl@program{xindy}% + \fi} +\define@key{indtl}{options}{\def\indtl@options{ #1 }} +\define@boolkey{indtl}{noautomatic}[true]{} +\define@boolkey{indtl}{intoc}[true]{} +\define@key{indtl}{columns}{\def\indtl@columns{#1}} +\define@key{indtl}{columnsep}{\def\indtl@columnsep{#1}} +\define@boolkey{indtl}{columnseprule}[true]{} +\def\indtl@resetdefaults{% + \def\indtl@options{ }% + \def\indtl@columns{2}\def\indtl@columnsep{35\p@}% + \KV@indtl@columnseprulefalse + \KV@indtl@intocfalse\KV@indtl@noautomaticfalse} +\indtl@resetdefaults +% \end{macrocode} +% +% The control sequence \cs{indtl@build} defines a control sequence to +% hold the setup for an index to be used when the index is sorted and +% printed +% \begin{macrocode} +\def\indtl@build#1{% + \toks@{}% + \indtl@dokey\indtl@title + \indtl@dokey\indtl@program + \indtl@dokey\indtl@options + \indtl@dokey\indtl@columns + \indtl@dokey\indtl@columnsep + \ifKV@indtl@noautomatic + \addto@hook\toks@{\KV@indtl@noautomatictrue}% + \else + \addto@hook\toks@{\KV@indtl@noautomaticfalse}% + \fi + \ifKV@indtl@intoc + \addto@hook\toks@{\KV@indtl@intoctrue}% + \else + \addto@hook\toks@{\KV@indtl@intocfalse}% + \fi + \ifKV@indtl@columnseprule + \addto@hook\toks@{\KV@indtl@columnsepruletrue}% + \else + \addto@hook\toks@{\KV@indtl@columnseprulefalse}% + \fi + \expandafter\edef\csname indtl@set@#1\endcsname{\the\toks@}% +} +% \end{macrocode} +% Comand \cs{indtl@dokey} receives as argument the text of the values +% assigned to certain keys, and adds them to the options token list. +% \begin{macrocode} +\def\indtl@dokey#1{% + \expandafter\addto@hook\expandafter\toks@\expandafter{% + \expandafter\def\expandafter#1\expandafter{#1}}} +% \end{macrocode} +% +% Command \cs{indtl@startidx} defines the output stream(s); the macro +% with suffix \texttt{split} is used when \Kvalue{splitindex} is not +% enabled, the one with suffix \texttt{unique} is used otherwise. In +% the case of many indices, the symbolic name for an index named +% `pippo' is \cs{pippo@idxfile} corresponding to the file +% \texttt{pippo.idx}. When \Kvalue{splitindex} is enabled, the only +% output stream is called \cs{@indexfile} as in standard \LaTeX, +% corresponding to \cs{jobname.idx}. +% \begin{macrocode} +\def\indtl@startidxsplit#1{% + \if@filesw + \def\index{\@bsphack + \@ifnextchar [{\@index}{\@index[\indtl@jobname]}} + \expandafter\newwrite\csname #1@idxfile\endcsname + \immediate\openout \csname #1@idxfile\endcsname #1.idx\relax + \typeout{Writing index file #1.idx}% + \fi} +% \end{macrocode} +% We define a switch which is set to true when a \cs{makeindex} command is given: +% with \Kvalue{splitindex} we open only one stream. +% \begin{macrocode} +\newif\ifindtl@startedidx +\def\indtl@startidxunique#1{% + \if@filesw + \ifindtl@startedidx\else + \newwrite\@indexfile + \immediate\openout\@indexfile\indtl@jobname.idx% + \global\indtl@startedidxtrue + \fi + \def\index{\@bsphack + \@ifnextchar [{\@index}{\@index[\indtl@jobname]}} + \expandafter\let\csname #1@idxfile\endcsname\@empty + \typeout{Started index file #1}% + \fi} +% \end{macrocode} +% +% ^^A D - \index +% +% Provide a default definition for \cs{index}; when a \cs{makeindex} +% command is given and \LaTeX\ is writing on auxiliary files, +% \cs{index} will be redefined, as seen before. When index files are +% written, \cs{index} always calls \cs{@index}. Some code is borrowed +% from \pack{memoir.cls}, but heavily modified. We want \cs{@wrindex} +% to be defined with two arguments, so that \pack{hyperref} can hook +% into it just like it does with the similar commands defined by the +% old packages \pack{multind} and \pack{index}. +% \begin{macrocode} +\renewcommand{\index}[2][]{\@bsphack\@esphack} +\def\@index[#1]{% + \@ifundefined{#1@idxfile}% + {\PackageWarning{indextools}{Undefined index file `#1'}% + \begingroup + \@sanitize + \indtl@nowrindex}% + {\edef\@idxfile{#1}% + \begingroup + \@sanitize + \@wrindex\@idxfile}} +\def\indtl@nowrindex#1{\endgroup\@esphack} +% \end{macrocode} +% +% Command \cs{@wrindex} must be duplicated; we have to call it the same as +% usual in order to support \pack{hyperref}. But the real name will be given +% at the end. We have to define a switch to allow the use of the +% \pack{showidx} facilities. We define also a helper macro so as to do the +% right thing so as to show the index file name to which a certain index +% entry is going to be written; the idea is to prefix the index entry with +% the actual name of the specific index, except in the case or the default +% index, where the name is set to |\jobname|. Since the control sequence is +% a primitive command, its value cannot be directly compared in the |\ifx| +% sense to the current macro represented by argument |#1|. Therefore we need +% a further helper control sequence |\indtl@jobname| that contains the value +% assigned to |\jobname|. +% +% We must also take care of the case where the user wants to print the index +% entries in the margin while working on the document. This implies testing +% for the package \pack{showidx} being already loaded; but this is not +% sufficient, because the \pack{memoir} class simulates the \pack{showidx} +% package and the test would result to be true even if the user did not load +% that package, but uses the \pack{memoir} class. +% +% Therefore we use the same boolean used by \pack{memoir}, testing in advance +% so as not redefining it; then we use it to let the \pack{showidx} true or +% simulated macros do their job, but we also take care of resetting the switch +% default value to false at begin document time if the \pack{memoir} class is +% being used. +% +% +% \begin{macrocode} +\@ifundefined{showindexmarks}{\newif\ifshowindexmark}{} +\@ifpackageloaded{showidx}{\showindexmarktrue}{\showindexmarkfalse} +\newcommand\indtl@showidxentry[2]{% + \ifshowindexmark + \@showidx{\ifdefequal{\indtl@jobname}{#1}{}{[#1]\space}#2}% + \fi} +\newcommand\indtl@wrindexentrysplit[3]{% + \expandafter\protected@write\csname#1@idxfile\endcsname{}% + {\string\indexentry{#2}{#3}}% +} +\newcommand\indtl@wrindexentryunique[3]{% + \protected@write\@indexfile{}% + {\string\indexentry[#1]{#2}{#3}}% +} +\def\indtl@wrindexsplit#1#2{% + \indtl@wrindexentrysplit{#1}{#2}{\thepage}% + \endgroup\indtl@showidxentry{#1}{#2}% + \@esphack% +} +\def\indtl@wrindexunique#1#2{% + \indtl@wrindexentryunique{#1}{#2}{\thepage}% + \endgroup\indtl@showidxentry{#1}{#2}% + \@esphack% + } +% \end{macrocode} +% +% ^^A E - \printindex +% +% Compilation of the indices is disabled if \texttt{-shell-escape} has +% not been given or the restricted mode is not active; in this case we +% emit a warning. \XeTeX{} has \cs{shellescape} instead of +% \cs{pdfshellescape}, so we take care of this (hoping that users or +% packages don't define a \cs{shellescape} command). In any case we +% define an internal version of this command. In the case of +% \prog{luatex} we can't emit the proper messages if \prog{luatex} is +% not version 0.68 or later. The conditional +% \cs{ifKV@indtl@noautomatic} is defined by \cs{define@boolkey} above. +% +% \begin{macrocode} +\def\indtl@shellwarn{} +\ifdefined\indtl@shellescape % luatex +\else + \@ifundefined{shellescape} + {\let\indtl@shellescape\pdfshellescape} % pdftex + {\let\indtl@shellescape\shellescape} % xetex +\fi +\ifnum\indtl@shellescape=\z@ + \let\KV@indtl@noautomaticfalse\KV@indtl@noautomatictrue + \KV@indtl@noautomatictrue + \def\indtl@shellwarn{\MessageBreak or call \indtl@engine\space with + -shell-escape} +\fi +% \end{macrocode} +% Do the same if \Kvalue{noautomatic} has been given as an option. +% \begin{macrocode} +\ifindtl@disableautomatic + \let\KV@indtl@noautomaticfalse\KV@indtl@noautomatictrue + \KV@indtl@noautomatictrue +\fi +% \end{macrocode} +% +% Now we set up the \texttt{theindex} environment. If the +% \texttt{original} option is set, we simply patch the class +% definition in order to call the macro that does the work related to +% the table of contents. Otherwise we define a new \texttt{theindex} +% environment, based on the standard, but using, if the number of +% columns is greater than one, the \texttt{multicols} environment. +% Users needing a different setup can use the \cs{indexsetup} command. +% Before doing so, though, we need to disable certain features if the +% package \pack{fancyhdr} is loaded sometimes before the +% |\begin{document| statement, be it before or after loading +% \pack{indextools}. If that package is loaded we have to patch the +% definition of the environment |theindex|, because its default +% commands interfere with those defined here that work perfectly +% when \pack{fancyhdr} is not loaded. This patching could be defined +% further on, but if it remains close to what has to be patched, it's +% easier to understand it's operation. +% +% We make this redefinition at the begining of the document, to +% prevent redefinition by other packages, like \pack{bidi}. This +% point is where \pack{indextools} and \pack{imakeidx} diverge. +% \begin{macrocode} +\newif\ifindtl@fancyhdr +\AtBeginDocument{% + \@ifpackageloaded{fancyhdr}{\indtl@fancyhdrtrue}{\indtl@fancyhdrfalse}% + \ifindtl@original + \expandafter\def\expandafter\theindex\expandafter{\expandafter + \indtl@maybeaddtotoc\theindex} + \else + \renewenvironment{theindex} + {\indtl@maybeaddtotoc + \indtl@indexlevel{\indexname}% + \ifindtl@fancyhdr\else% + \indtl@indexheaders% + \thispagestyle{\indtl@firstpagestyle}% + \fi% + \ifnum\indtl@columns>\@ne + \columnsep \indtl@columnsep + \ifx\indtl@idxprologue\relax + \begin{multicols}{\indtl@columns} + \else + \begin{multicols}{\indtl@columns}[\indtl@idxprologue] + \fi + \else + \indtl@idxprologue + \fi + \global\let\indtl@idxprologue\relax + \parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \columnseprule \ifKV@indtl@columnseprule.4\p@\else\z@\fi + \raggedright + \let\item\@idxitem + \indtl@othercode} + {\ifnum\indtl@columns>\@ne\end{multicols}\fi + } +\fi +} +\ifindtl@original +\else + \global\let\indtl@idxprologue\relax + \RequirePackage{multicol} +\fi +% \end{macrocode} +% The command \cs{indexsetup} may be used to customize some aspects of +% index formatting. +% \begin{macrocode} +\def\indtl@indexlevel{% + \@ifundefined{chapter}{\section}{\chapter}*} +\define@key{indtlindex}{level}{\def\indtl@indexlevel{#1}} +\def\indtl@toclevel{% + \@ifundefined{chapter}{section}{chapter}} +\define@key{indtlindex}{toclevel}{\def\indtl@toclevel{#1}} +\define@boolkey{indtlindex}{noclearpage}[true]{\let\indtl@clearpage\relax} +\def\indtl@indexheaders{% + \@mkboth{\MakeUppercase\indexname}{\MakeUppercase\indexname}} +\define@key{indtlindex}{headers}{\def\indtl@indexheaders{\markboth#1}} +\def\indtl@firstpagestyle{plain} +\define@key{indtlindex}{firstpagestyle}{\def\indtl@firstpagestyle{#1}} +\let\indtl@othercode\relax +\define@key{indtlindex}{othercode}{\def\indtl@othercode{#1}} +\newcommand{\indexsetup}[1]{% + \ifindtl@original\else\setkeys{indtlindex}{#1}\fi} +\@onlypreamble\indexsetup +% \end{macrocode} +% +% The command \cs{indexprologue} sets the internal version which is +% always \cs{let} to \cs{relax} during |\begin{theindex}|. +% \begin{macrocode} +\newcommand{\indexprologue}[2][\bigskip]{% + \long\gdef\indtl@idxprologue{{#2\par}#1}} +% \end{macrocode} +% +% Now we provide the relevant \cs{printindex} macros by transferring +% the real job to a secondary macro \cs{indtl@putindex} after due +% checks and messages. +% \begin{macrocode} +\providecommand*{\printindex}{} +\renewcommand*{\printindex}[1][\indtl@jobname]{% + \@ifundefined{#1@idxfile}{\indtl@error{#1}}{\indtl@putindex{#1}}} + +\def\indtl@error#1{% + \def\@tempa{#1}\def\@tempb{\indtl@jobname}% + \ifx\@tempa\@tempb + \let\indtl@optarg\@empty + \else + \def\indtl@optarg{[#1]}% + \fi + \PackageError{indextools} + {Misplaced \protect\printindex\indtl@optarg} + {You are not making this index, as no appropriate + \protect\makeindex\MessageBreak + command has been issued in the preamble.}} +% \end{macrocode} +% +% We define a command to do a \cs{cleardoublepage} if the option +% \Kvalue{openright} is active (in classes where \Kvalue{twoside} is +% meaningful). In case \cs{chapter} is defined but not +% \cs{if@openright}, we assume that the class wants ``open right''. +% \begin{macrocode} +\def\indtl@clearpage{% + \@ifundefined{chapter} + {\clearpage} % article and similar classes + {\@ifundefined{if@openright} + {\cleardoublepage} + {\if@openright + \cleardoublepage + \else + \clearpage + \fi} + }} +% \end{macrocode} +% +% We need a helper macro to do a check in order to avoid a loop and +% the hook where to insert the table of contents related stuff. +% \begin{macrocode} +\def\indtl@check@indexname{\indexname} +\providecommand*\indtl@maybeaddtotoc{} +% \end{macrocode} +% Two helper macros for preparing the final messages to the user. +% \begin{macrocode} +\def\indtl@finalmessage#1{% + \expandafter\edef\csname indtl@message#1\endcsname + {\indtl@program\indtl@options#1.idx} + \AtEndDocument{\PackageWarning{indextools}{% + Remember to run \indtl@engine\space again after calling\MessageBreak + `\@nameuse{indtl@message#1}'\indtl@shellwarn\@gobble}}} +\def\indtl@splitindexmessage{% + \AtEndDocument{\PackageWarningNoLine{indextools}{% + Remember to run \indtl@engine\space again after calling\MessageBreak + `splitindex' and processing the indices\indtl@shellwarn}}} +% \end{macrocode} +% +% Here is a helper macro for deciding whether to call the external +% utility or to issue a final message. In \cs{indtl@makeindexname} we +% put the name of the only program allowed by default +% (\prog{makeindex}). If the list is updated, we can supplement the +% list here, maybe defining a list macro; for now this is +% sufficient. The temporary switch \cs{if@tempswa} is set to true if +% automatic processing is possible, so that the main macro can take +% the appropriate action. +% \begin{macrocode} +\def\indtl@makeindexname{makeindex} +\def\indtl@decide{% + \@tempswafalse + \ifindtl@splitindex % splitindex is not "safe" + \ifnum\indtl@shellescape=\@ne\@tempswatrue\fi + \else + \ifx\indtl@program\indtl@makeindexname % nor is texindy + \ifnum\indtl@shellescape=\tw@\@tempswatrue\fi + \fi + \ifnum\indtl@shellescape=\@ne\@tempswatrue\fi + \fi + \ifKV@indtl@noautomatic + \@tempswafalse + \fi} +% \end{macrocode} +% We now define the main macro that puts the specified index file into +% the document and possibly orders to add the index title to the +% table of contents. It is duplicated as usual. The argument |#1| is +% the specific symbolic name of the index. In particular if the +% \Kvalue{intoc} option has been specified, the hook +% \cs{indtl@maybeaddtotoc} is defined in such a way that the relevant +% information is added to the \texttt{toc} file. The +% \cs{phantomsection} command is necessary when using \pack{hyperref}; +% here it is hidden as argument to \cs{@nameuse}, so it is equivalent +% to \cs{relax} and does nothing if \pack{hyperref} has not been +% loaded. +% \begin{macrocode} +\def\indtl@putindexsplit#1{% + \ifindtl@nonewpage\else + \indtl@clearpage + \fi + \immediate\closeout\csname #1@idxfile\endcsname + \let\indtl@indexname\indexname % keep \indexname + \@nameuse{indtl@set@#1}\indtl@decide + \if@tempswa % we can call the external program + \indtl@exec{\indtl@program\indtl@options#1.idx}% + \else + \indtl@finalmessage{#1}% + \fi + \ifKV@indtl@intoc + \def\indtl@maybeaddtotoc{\@nameuse{phantomsection}% + \addcontentsline{toc}{\indtl@toclevel}{\indtl@title}}% + \else + \def\indtl@maybeaddtotoc{}% + \fi + \ifx\indtl@title\indtl@check@indexname\else + \def\indexname{\indtl@title}% + \fi + \@input@{#1.ind} + \let\indexname\indtl@indexname % restore \indexname +} + +\newif\ifindtl@splitdone +\def\indtl@putindexunique#1{% + \ifindtl@nonewpage\else + \indtl@clearpage + \fi + \let\indtl@indexname\indexname % keep \indexname + \@nameuse{indtl@set@#1}\indtl@decide + \if@tempswa % we can call the external program + \ifindtl@splitdone\else + \immediate\closeout\@indexfile + \indtl@exec{splitindex \indtl@splitindexoptions\space\indtl@jobname.idx}% + \global\indtl@splitdonetrue + \fi + \else + \ifindtl@splitdone\else + \indtl@splitindexmessage\global\indtl@splitdonetrue + \fi + \fi + \if@tempswa % we can call the external program + \indtl@exec{\indtl@program\indtl@options\indtl@jobname-#1.idx}% + \fi + \ifKV@indtl@intoc + \def\indtl@maybeaddtotoc{\@nameuse{phantomsection}% + \addcontentsline{toc}{\indtl@toclevel}{\indtl@title}}% + \else + \def\indtl@maybeaddtotoc{}% + \fi + \ifx\indtl@title\indtl@check@indexname\else + \def\indexname{\indtl@title}% + \fi + \@input@{\indtl@jobname-#1.ind} + \let\indexname\indtl@indexname % restore \indexname +} +% \end{macrocode} +% +% ^^A F - Final decisions +% +% At this point, we choose the meaning of the relevant commands, +% reclaiming the space occupied by the discarded ones +% \begin{macrocode} +\ifindtl@splitindex + \let\indtl@startidx\indtl@startidxunique + \let\@wrindex\indtl@wrindexunique + \let\indtl@putindex\indtl@putindexunique + \let\indtl@wrindexentry\indtl@wrindexentryunique + \let\indtl@startidxsplit\@undefined + \let\indtl@wrindexsplit\@undefined + \let\indtl@putindexsplit\@undefined +\else + \let\indtl@startidx\indtl@startidxsplit + \let\@wrindex\indtl@wrindexsplit + \let\indtl@putindex\indtl@putindexsplit + \let\indtl@wrindexentry\indtl@wrindexentrysplit + \let\indtl@startidxunique\@undefined + \let\indtl@wrindexunique\@undefined + \let\indtl@putindexunique\@undefined +\fi +% \end{macrocode} +% To end the code, we deal with \pack{memoir}: +% \begin{macrocode} +\@ifclassloaded{memoir}{\let\@wrindexm@m\@wrindex + \AtBeginDocument{\hideindexmarks}}{} +% \end{macrocode} +%\iffalse +%</package> +%\fi +% The end. +% \Finale diff --git a/Master/texmf-dist/tex/latex/indextools/indextools.sty b/Master/texmf-dist/tex/latex/indextools/indextools.sty new file mode 100644 index 00000000000..8422828155a --- /dev/null +++ b/Master/texmf-dist/tex/latex/indextools/indextools.sty @@ -0,0 +1,424 @@ +%% +%% This is file `indextools.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% indextools.dtx (with options: `package') +%% ___________________________________________________________ +%% The indextools package for LaTeX +%% Copyright (C) 2010-2013 Enrico Gregorio +%% Copyright (C) 2014-* Maïeul Roquette +%% All rights reserved +%% +%% License information appended +%% +\NeedsTeXFormat{LaTeX2e}[2005/12/01] +\ProvidesPackage{indextools}% + [2015/01/23 v1.4 Package for typesetting indices in a synchronous mode] + + + + +\RequirePackage{xkeyval} +\DeclareOption{xindy}{\def\indtl@progdefault{texindy}} +\DeclareOption{texindy}{\def\indtl@progdefault{texindy}} +\DeclareOption{truexindy}{\def\indtl@progdefault{truexindy}} +\DeclareOption{makeindex}{\def\indtl@progdefault{makeindex}} +\newif\ifindtl@disableautomatic +\DeclareOption{noautomatic}{\indtl@disableautomatictrue} +\newif\ifindtl@nonewpage +\DeclareOption{nonewpage}{% + \indtl@nonewpagetrue\indtl@disableautomatictrue +} +\newif\ifindtl@splitindex +\DeclareOption{splitindex}{\indtl@splitindextrue} +\newif\ifindtl@original +\DeclareOption{original}{\indtl@originaltrue} +\DeclareOption{quiet}{\AtEndOfPackage{% + \let\indtl@finalmessage\@gobble + \let\indtl@splitindexmessage\relax}} +\ExecuteOptions{makeindex} +\ProcessOptions\relax + +\if@twocolumn\indtl@originaltrue\fi +\def\indtl@exec{\immediate\write18} +\def\indtl@engine{(pdf)latex} +\RequirePackage{ifxetex,ifluatex} +\ifxetex\def\indtl@engine{xelatex}\fi +\ifluatex % luatex doesn't have \(pdf)shellescape + \def\indtl@engine{lualatex} + \ifnum\luatexversion<68 + \chardef\indtl@shellescape\@ne % no way to know the value + \else + \RequirePackage{pdftexcmds} % provides \pdf@shellescape + \chardef\indtl@shellescape\pdf@shellescape + \fi + \let\indtl@exec\pdf@system +\fi +\RequirePackage{xpatch} +\edef\indtl@splitindexoptions{-m \string"\string"} +\def\splitindexoptions#1{\g@addto@macro\indtl@splitindexoptions{ #1}} +\@onlypreamble\splitindexoptions +\@namedef{ver@makeidx.sty}{3000/12/31} +\@ifpackageloaded{multind} + {\PackageError{indextools}{Incompatible package `multind' loaded} + {This package is incompatible with multind, don't load both.% + \MessageBreak\@ehc}} + {\@namedef{ver@multind.sty}{3000/12/31}} + +\@ifpackageloaded{imakeidx} + {\PackageError{indextools}{Incompatible package `imakeidx' loaded} + {This package is incompatible with imakeidx, don't load both.% + \MessageBreak\@ehc}} + {\@namedef{ver@imakeidx.sty}{3000/12/31}} +\providecommand*\see[2]{\emph{\seename} #1} +\providecommand*\seealso[2]{\emph{\alsoname} #1} +\providecommand*\seename{see} +\providecommand*\alsoname{see also} +\providecommand*\makeindex{} % to use \renewcommand safely +\renewcommand{\makeindex}[1][]{\indtl@makeindex{#1}} +\def\indtl@makeindex#1{% + \edef\indtl@name{\jobname}% + \edef\indtl@jobname{\jobname}% + \def\indtl@title{\indexname}% + \edef\indtl@program{\indtl@progdefault}% + \let\indtl@options\space + \KV@indtl@noautomaticfalse\KV@indtl@intocfalse + \setkeys{indtl}{#1}% + \ifindtl@splitindex\KV@indtl@noautomaticfalse\fi + \indtl@build\indtl@name + \indtl@startidx\indtl@name + \indtl@resetdefaults +} +\define@key{indtl}{name}{\def\indtl@name{#1}} +\define@key{indtl}{title}{\def\indtl@title{#1}} +\define@choicekey{indtl}{program}[\indtl@val\indtl@nr] + {makeindex,xindy,texindy,truexindy}{% + \ifcase\indtl@nr\relax + \def\indtl@program{makeindex}% + \or + \def\indtl@program{texindy}% + \or + \def\indtl@program{texindy}% + \or + \def\indtl@program{xindy}% + \fi} +\define@key{indtl}{options}{\def\indtl@options{ #1 }} +\define@boolkey{indtl}{noautomatic}[true]{} +\define@boolkey{indtl}{intoc}[true]{} +\define@key{indtl}{columns}{\def\indtl@columns{#1}} +\define@key{indtl}{columnsep}{\def\indtl@columnsep{#1}} +\define@boolkey{indtl}{columnseprule}[true]{} +\def\indtl@resetdefaults{% + \def\indtl@options{ }% + \def\indtl@columns{2}\def\indtl@columnsep{35\p@}% + \KV@indtl@columnseprulefalse + \KV@indtl@intocfalse\KV@indtl@noautomaticfalse} +\indtl@resetdefaults +\def\indtl@build#1{% + \toks@{}% + \indtl@dokey\indtl@title + \indtl@dokey\indtl@program + \indtl@dokey\indtl@options + \indtl@dokey\indtl@columns + \indtl@dokey\indtl@columnsep + \ifKV@indtl@noautomatic + \addto@hook\toks@{\KV@indtl@noautomatictrue}% + \else + \addto@hook\toks@{\KV@indtl@noautomaticfalse}% + \fi + \ifKV@indtl@intoc + \addto@hook\toks@{\KV@indtl@intoctrue}% + \else + \addto@hook\toks@{\KV@indtl@intocfalse}% + \fi + \ifKV@indtl@columnseprule + \addto@hook\toks@{\KV@indtl@columnsepruletrue}% + \else + \addto@hook\toks@{\KV@indtl@columnseprulefalse}% + \fi + \expandafter\edef\csname indtl@set@#1\endcsname{\the\toks@}% +} +\def\indtl@dokey#1{% + \expandafter\addto@hook\expandafter\toks@\expandafter{% + \expandafter\def\expandafter#1\expandafter{#1}}} +\def\indtl@startidxsplit#1{% + \if@filesw + \def\index{\@bsphack + \@ifnextchar [{\@index}{\@index[\indtl@jobname]}} + \expandafter\newwrite\csname #1@idxfile\endcsname + \immediate\openout \csname #1@idxfile\endcsname #1.idx\relax + \typeout{Writing index file #1.idx}% + \fi} +\newif\ifindtl@startedidx +\def\indtl@startidxunique#1{% + \if@filesw + \ifindtl@startedidx\else + \newwrite\@indexfile + \immediate\openout\@indexfile\indtl@jobname.idx% + \global\indtl@startedidxtrue + \fi + \def\index{\@bsphack + \@ifnextchar [{\@index}{\@index[\indtl@jobname]}} + \expandafter\let\csname #1@idxfile\endcsname\@empty + \typeout{Started index file #1}% + \fi} +\renewcommand{\index}[2][]{\@bsphack\@esphack} +\def\@index[#1]{% + \@ifundefined{#1@idxfile}% + {\PackageWarning{indextools}{Undefined index file `#1'}% + \begingroup + \@sanitize + \indtl@nowrindex}% + {\edef\@idxfile{#1}% + \begingroup + \@sanitize + \@wrindex\@idxfile}} +\def\indtl@nowrindex#1{\endgroup\@esphack} +\@ifundefined{showindexmarks}{\newif\ifshowindexmark}{} +\@ifpackageloaded{showidx}{\showindexmarktrue}{\showindexmarkfalse} +\newcommand\indtl@showidxentry[2]{% + \ifshowindexmark + \@showidx{\ifdefequal{\indtl@jobname}{#1}{}{[#1]\space}#2}% + \fi} +\newcommand\indtl@wrindexentrysplit[3]{% + \expandafter\protected@write\csname#1@idxfile\endcsname{}% + {\string\indexentry{#2}{#3}}% +} +\newcommand\indtl@wrindexentryunique[3]{% + \protected@write\@indexfile{}% + {\string\indexentry[#1]{#2}{#3}}% +} +\def\indtl@wrindexsplit#1#2{% +\indtl@wrindexentrysplit{#1}{#2}{\thepage}% +\endgroup\indtl@showidxentry{#1}{#2}% + \@esphack% +} +\def\indtl@wrindexunique#1#2{% +\indtl@wrindexentryunique{#1}{#2}{\thepage}% +\endgroup\indtl@showidxentry{#1}{#2}% + \@esphack% + } +\def\indtl@shellwarn{} +\ifdefined\indtl@shellescape % luatex +\else + \@ifundefined{shellescape} + {\let\indtl@shellescape\pdfshellescape} % pdftex + {\let\indtl@shellescape\shellescape} % xetex +\fi +\ifnum\indtl@shellescape=\z@ + \let\KV@indtl@noautomaticfalse\KV@indtl@noautomatictrue + \KV@indtl@noautomatictrue + \def\indtl@shellwarn{\MessageBreak or call \indtl@engine\space with + -shell-escape} +\fi +\ifindtl@disableautomatic + \let\KV@indtl@noautomaticfalse\KV@indtl@noautomatictrue + \KV@indtl@noautomatictrue +\fi +\newif\ifindtl@fancyhdr +\AtBeginDocument{% + \@ifpackageloaded{fancyhdr}{\indtl@fancyhdrtrue}{\indtl@fancyhdrfalse}% + \ifindtl@original + \expandafter\def\expandafter\theindex\expandafter{\expandafter + \indtl@maybeaddtotoc\theindex} + \else + \renewenvironment{theindex} + {\indtl@maybeaddtotoc + \indtl@indexlevel{\indexname}% + \ifindtl@fancyhdr\else% + \indtl@indexheaders% + \thispagestyle{\indtl@firstpagestyle}% + \fi% + \ifnum\indtl@columns>\@ne + \columnsep \indtl@columnsep + \ifx\indtl@idxprologue\relax + \begin{multicols}{\indtl@columns} + \else + \begin{multicols}{\indtl@columns}[\indtl@idxprologue] + \fi + \else + \indtl@idxprologue + \fi + \global\let\indtl@idxprologue\relax + \parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \columnseprule \ifKV@indtl@columnseprule.4\p@\else\z@\fi + \raggedright + \let\item\@idxitem + \indtl@othercode} + {\ifnum\indtl@columns>\@ne\end{multicols}\fi + } +\fi +} +\ifindtl@original +\else + \global\let\indtl@idxprologue\relax + \RequirePackage{multicol} +\fi +\def\indtl@indexlevel{% + \@ifundefined{chapter}{\section}{\chapter}*} +\define@key{indtlindex}{level}{\def\indtl@indexlevel{#1}} +\def\indtl@toclevel{% + \@ifundefined{chapter}{section}{chapter}} +\define@key{indtlindex}{toclevel}{\def\indtl@toclevel{#1}} +\define@boolkey{indtlindex}{noclearpage}[true]{\let\indtl@clearpage\relax} +\def\indtl@indexheaders{% + \@mkboth{\MakeUppercase\indexname}{\MakeUppercase\indexname}} +\define@key{indtlindex}{headers}{\def\indtl@indexheaders{\markboth#1}} +\def\indtl@firstpagestyle{plain} +\define@key{indtlindex}{firstpagestyle}{\def\indtl@firstpagestyle{#1}} +\let\indtl@othercode\relax +\define@key{indtlindex}{othercode}{\def\indtl@othercode{#1}} +\newcommand{\indexsetup}[1]{% + \ifindtl@original\else\setkeys{indtlindex}{#1}\fi} +\@onlypreamble\indexsetup +\newcommand{\indexprologue}[2][\bigskip]{% + \long\gdef\indtl@idxprologue{{#2\par}#1}} +\providecommand*{\printindex}{} +\renewcommand*{\printindex}[1][\indtl@jobname]{% + \@ifundefined{#1@idxfile}{\indtl@error{#1}}{\indtl@putindex{#1}}} + +\def\indtl@error#1{% + \def\@tempa{#1}\def\@tempb{\indtl@jobname}% + \ifx\@tempa\@tempb + \let\indtl@optarg\@empty + \else + \def\indtl@optarg{[#1]}% + \fi + \PackageError{indextools} + {Misplaced \protect\printindex\indtl@optarg} + {You are not making this index, as no appropriate + \protect\makeindex\MessageBreak + command has been issued in the preamble.}} +\def\indtl@clearpage{% + \@ifundefined{chapter} + {\clearpage} % article and similar classes + {\@ifundefined{if@openright} + {\cleardoublepage} + {\if@openright + \cleardoublepage + \else + \clearpage + \fi} + }} +\def\indtl@check@indexname{\indexname} +\providecommand*\indtl@maybeaddtotoc{} +\def\indtl@finalmessage#1{% + \expandafter\edef\csname indtl@message#1\endcsname + {\indtl@program\indtl@options#1.idx} + \AtEndDocument{\PackageWarning{indextools}{% + Remember to run \indtl@engine\space again after calling\MessageBreak + `\@nameuse{indtl@message#1}'\indtl@shellwarn\@gobble}}} +\def\indtl@splitindexmessage{% + \AtEndDocument{\PackageWarningNoLine{indextools}{% + Remember to run \indtl@engine\space again after calling\MessageBreak + `splitindex' and processing the indices\indtl@shellwarn}}} +\def\indtl@makeindexname{makeindex} +\def\indtl@decide{% + \@tempswafalse + \ifindtl@splitindex % splitindex is not "safe" + \ifnum\indtl@shellescape=\@ne\@tempswatrue\fi + \else + \ifx\indtl@program\indtl@makeindexname % nor is texindy + \ifnum\indtl@shellescape=\tw@\@tempswatrue\fi + \fi + \ifnum\indtl@shellescape=\@ne\@tempswatrue\fi + \fi + \ifKV@indtl@noautomatic + \@tempswafalse + \fi} +\def\indtl@putindexsplit#1{% + \ifindtl@nonewpage\else + \indtl@clearpage + \fi + \immediate\closeout\csname #1@idxfile\endcsname + \let\indtl@indexname\indexname % keep \indexname + \@nameuse{indtl@set@#1}\indtl@decide + \if@tempswa % we can call the external program + \indtl@exec{\indtl@program\indtl@options#1.idx}% + \else + \indtl@finalmessage{#1}% + \fi + \ifKV@indtl@intoc + \def\indtl@maybeaddtotoc{\@nameuse{phantomsection}% + \addcontentsline{toc}{\indtl@toclevel}{\indtl@title}}% + \else + \def\indtl@maybeaddtotoc{}% + \fi + \ifx\indtl@title\indtl@check@indexname\else + \def\indexname{\indtl@title}% + \fi + \@input@{#1.ind} + \let\indexname\indtl@indexname % restore \indexname +} + +\newif\ifindtl@splitdone +\def\indtl@putindexunique#1{% + \ifindtl@nonewpage\else + \indtl@clearpage + \fi + \let\indtl@indexname\indexname % keep \indexname + \@nameuse{indtl@set@#1}\indtl@decide + \if@tempswa % we can call the external program + \ifindtl@splitdone\else + \immediate\closeout\@indexfile + \indtl@exec{splitindex \indtl@splitindexoptions\space\indtl@jobname.idx}% + \global\indtl@splitdonetrue + \fi + \else + \ifindtl@splitdone\else + \indtl@splitindexmessage\global\indtl@splitdonetrue + \fi + \fi + \if@tempswa % we can call the external program + \indtl@exec{\indtl@program\indtl@options\indtl@jobname-#1.idx}% + \fi + \ifKV@indtl@intoc + \def\indtl@maybeaddtotoc{\@nameuse{phantomsection}% + \addcontentsline{toc}{\indtl@toclevel}{\indtl@title}}% + \else + \def\indtl@maybeaddtotoc{}% + \fi + \ifx\indtl@title\indtl@check@indexname\else + \def\indexname{\indtl@title}% + \fi + \@input@{\indtl@jobname-#1.ind} + \let\indexname\indtl@indexname % restore \indexname +} +\ifindtl@splitindex + \let\indtl@startidx\indtl@startidxunique + \let\@wrindex\indtl@wrindexunique + \let\indtl@putindex\indtl@putindexunique + \let\indtl@wrindexentry\indtl@wrindexentryunique + \let\indtl@startidxsplit\@undefined + \let\indtl@wrindexsplit\@undefined + \let\indtl@putindexsplit\@undefined +\else + \let\indtl@startidx\indtl@startidxsplit + \let\@wrindex\indtl@wrindexsplit + \let\indtl@putindex\indtl@putindexsplit + \let\indtl@wrindexentry\indtl@wrindexentrysplit + \let\indtl@startidxunique\@undefined + \let\indtl@wrindexunique\@undefined + \let\indtl@putindexunique\@undefined +\fi +\@ifclassloaded{memoir}{\let\@wrindexm@m\@wrindex + \AtBeginDocument{\hideindexmarks}}{} +%% +%% Copyright 2010--2013 Enrico Gregorio <Enrico dot Gregorio at univr dot it> +%% +%% Copyright 2014 Maïeul Rouquette <maieul at maieul dot it> +%% +%% Distributable under the LaTeX Project Public License, +%% version 1.3c or higher (your choice). The latest version of +%% this license is at: http://www.latex-project.org/lppl.txt +%% +%% This work is "author-maintained" +%% +%% This work consists of this file indextools.dtx, a README file +%% and the derived files indextools.sty and indextools.pdf. +%% +%% +%% End of file `indextools.sty'. diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index c1e0c6554ce..beb2d35848b 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -262,7 +262,7 @@ my @TLP_working = qw( iitem ijmart ijqc imac image-gallery imakeidx impatient impatient-cn impatient-fr impnattypo import imsproc imtekda - incgraph inconsolata index initials inlinebib inlinedef + incgraph inconsolata index indextools initials inlinebib inlinedef inputtrc insbox installfont interactiveworkbook interfaces interpreter interval intro-scientific inversepath invoice diff --git a/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc b/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc index 795f578ac06..52666d2d658 100644 --- a/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc @@ -426,6 +426,7 @@ depend image-gallery depend imakeidx depend import depend incgraph +depend indextools depend inlinedef depend inputtrc depend interactiveworkbook diff --git a/Master/tlpkg/tlpsrc/indextools.tlpsrc b/Master/tlpkg/tlpsrc/indextools.tlpsrc new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlpsrc/indextools.tlpsrc |