\def\filedate{1997/03/20} \def\docdate{1997/03/20} \def\fileversion{v1.1beta} % % \iffalse meta-comment % % Package 'xindy' to use with LaTeX2e % Copyright 1997 by Andreas 'Vignard' Schlechte, all right reserved. % % This package is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. % % IMPORTANT NOTICE: % % For error reports in case of UNCHANGED versions please email to % Andreas.Schlechte@tu-clausthal.de % % Please do not request updates from me directly. Distribution is % done through ftp-Server at TU Clausthal and ftp.dante.de. % % You are not allowed to change this file. % % You are allowed to distribute this file under the condition that % it is distributed UNCHANGED. You are NOT ALLOWED to take money for % the distribution or use of either this file or a changed version, % except for a nominal charge for copying etc. % \fi % % \CheckSum{368} %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} % % \RecordChanges % \changes{v1.1beta}{97/03/20}{First documented version} % % \MakeShortVerb{\|} % % \title{Interface to the \textsf{xindy} indexing program\thanks{This file % has version number \fileversion{}, last revised \filedate}} % \author{Andreas `Vignard' Schlechte\\Am Klepperberg 2\\ % D-38678 Clausthal-Zellerfeld\\Federal Republic of Germany} % \date{\docdate} % \maketitle % % \begin{abstract} % Are you still using \emph{MakeIndex}? Go with the future and switch now! % % The \textsf{xindy}-distribution contains a small programm called |tex2xindy|, which converts % a standard LaTeX into a rawindex, readable by \textsf{xindy}. Using this program, old % documents can be indexed using \textsf{xindy}, but you can't really use all features % in documents. Thus, I began writing a small package which provides an interface between % \LaTeX\ and xindy. This interface covers all xindy-tags and doesn't need % |tex2xindy| anymore. % \end{abstract} % % \tableofcontents % % \section{The user interface} % \subsection{How to include \texttt{xindy.sty}} % % The package is included by the command % \begin{quote} % |\usepackage{xindy}| % \end{quote} % in the preambel of your \LaTeX-document. % % \subsection{Locationstyles} % % \DescribeMacro\locationstyle % |xindy.sty| supports the use of different location-references, as you may define % them within \textsf{xindy}. A reference type is called \emph{locationstyle} in |xindy.sty|. % A locationstyle is selected by the following command: % \begin{quote} % |\locationstyle{|\meta{locationstyle}|}| % \end{quote} % The package provides the following \meta{locationstyles}: % \begin{quote} % \begin{description} % \item[\texttt{page}] The location-reference is given by the pagenumber, as usual in % \LaTeX (e.g. 47, 11). % \item[\texttt{chapter}] This one is only defined, if you use a documentclass, which % provides chapters. The location-reference is composed of the chapternumber and % the pagenumber: \meta{chapter}-\meta{page} (e.g 47-11, A-5). % \item[\texttt{section}] This one is only defined, if a documentclass providing % sections is used. The location-reference is composed of the sectionnumber and % pagenumber: \meta{section}-\meta{page} (e.g. 1-5, 2-6). In fact, the % reference uses the commands |\thesection| and |\thepage|. Thus, if you are % using e.g. |book.cls|, the reference will look like % \meta{chapter}.\meta{section}-\meta{page} (e.g. 1.1-47, A.5-6). % \end{description} % \end{quote} % % \DescribeMacro\newlocationstyle % \DescribeMacro\renewlocationstyle % You may define new locationsstyles using the commands % \begin{quote} % |\newlocationstyle{|\meta{locationstyle}|}{|\meta{what}|}|\\ % |\renewlocationstyle{|\meta{locationstyle}|}{|\meta{what}|}| % \end{quote} % If the \meta{locationstyle} is already defined, |\newlocationstyle| % leads to an error. Thus, you must use |\renewlocationstyle| for % redefining existing styles. \meta{what} is the tokenlist to be used % as location-reference. For examples take a look at the definition of % the styles in the code-section. % % \subsection{Indexing} % % \DescribeMacro\indexindy % To index a key, you must use the command % \begin{quote} % |\indexindy[|\meta{xindy-keys}|][|\meta{xref}|]{|\meta{key}|}| % \end{quote} % The Syntax isn't quite that simple, as you will see in the following. % % The main argument \meta{key} is a list of strings in a special % syntax. As you surely know, a index-entry consists of different % Layers. Additionally, per Layer a printkey---different from the sortkey---may be % specified. First of all, the \meta{key} is a semicoleon-separated list % of strings. This defines the sort keys: % \begin{quote} % |\indexindy{First;Second;Third}| % \end{quote} % Now suppose, you want |Second| to appear in small caps. This can be done % either by defining a merge-rule in the xindy-style and the typing |\textsc{Second}| % instead of |Second| or by specifiying the printkey inside the indexing command: % \begin{quote} % |\indexindy{First;Second,\textsc{Second};Third}| % \end{quote} % Now you've learned anything about the complete syntax for the \meta{key}: % \begin{quote} % |{Layer 0,printkey;Layer 1,printkey;Layer 2,printkey;....}| % \end{quote} % Note, that it's not the main philosophy of xindy, to specify the printkey. % In many cases, it is much handier to define a merge-rule inside the xindy-style. % If, in any case, you wish a semikolen or a comma to be part of a print key, % you have to surround it by brackets: |{,}| and |{;}|. % % The optional Argument \meta{xindy-keys} is a comma-separated list % of xindy-keys and their assignment. Currently the following keys % are recognized: % \begin{quote} % \begin{description} % \item[open-range] The indexentry will be the beginning of a range. % \item[close-range] The indexentry will be the end of a range. % \item[attr=\meta{attribute}] The given \meta{attribute} will be % attached to the indexentry. % \end{description} % \end{quote} % If, in any case, you wish to use a comma as an argument, you must % enclose it by brackets |{,}|. % % At least, we've to discuss the optional argument \meta{xref}. % This one can be used to define a crossreference inside the index. % Which \emph{MakeIndex} you write \verb+\index{foo|see{bar}}+. Using % \textsf{xindy}, crossreferences become more flexible. \meta{xref} % is a comma-separated list of sortkey, the entry should point to. % The input % \begin{quote} % |\indexindy[attr=see][bar]{foo}| % \end{quote} % leads (using standard xindy-styles) to the same result, generated % by \emph{MakeIndex}. But, different to \emph{MakeIndex}, you are % now able to point to other Layers: % \begin{quote} % |\indexindy{First;Second,\textsc{Second};Third}|\\ % |\indexindy[][First,Second,Third]{foo}| % \end{quote} % Note, that I didn't use either the attribute |see| nor any other % \meta{xindy-key} in the latter example. Thus, there has to be an % extra pair of brackets |[]|. % % \subsection*{Example} % % The Input % \begin{verbatim} % \documentclass{book} % \makeindex % \usepackage{xindy} % \begin{document} % \chapter{foo} % \indexindy[attr=idef]{Euler} % \indexindy[open-range,attr=idef]{Euler,\textsc{Euler}} % \indexindy[attr=see][Layer 0,Layer 1,Layer 2]{Persons;Math-related} % \indexindy{Lycos} % \chapter{bar} % \indexindy[close-range,attr=idef]{Euler,\textsc{Euler}} % \locationstyle{chapter} % \indexindy{Layer 0;Layer 1,\textsc{Layer 1};Layer 2} % \indexindy{Index a comma{,} too} % \end{document}\end{verbatim} % leads to the index % \begin{theindex} % \item Entry, \textbf{1} % \item \textsc{Euler}, \textbf{1}ff. % \indexspace % \item Index a comma{,} too, 2-3 % \indexspace % \item Layer~0,\hfill~ % \subitem \textsc{Layer~1},\hfill~ % \subsubitem Layer~2, 2-3 % \item Lycos, 2 % \indexspace % \item Persons % \subitem Math-related, \see{Layer 0, Layer 1, Layer 2} % \end{theindex} % % \section{Known bugs, problems and exceptions} % % Currently, there are no known bugs, but there are some % exceptions using |xindy.sty|: % \begin{itemize} % \item Because \textsf{xindy} uses indexes in a raw-format and |xindy.sty| % redefines |\index| for internal use, you should not use |\index| inside % your document. % \item Because |\indexindy| uses the comma and semikoleon in special manner, % you have to write |{,}| and |{;}| if you wish them to appear in a key. Thus, % you should specify a merge-rule in your xindy-style, which discards the brackets: % \begin{quote} % |(merge-rule "{,}" "," :again)|\\ % |(merge-rule "{;}" ";" :again)| % \end{quote} % \item Because |xindy| needs the backslash and the doulequote escaped, |\indexindy| % does this for the user. But if you define a shortcut, calling |\indexindy|, this % function doesn't work any more. Thus you must escape these chars by yourself: % \begin{quote} % |\newcommand{\foo}[1]{\indexindy[attr=definition]{#1}}|\\ % |\foo{Backslash (\\) and Doublequote (\")}| % \end{quote} % \end{itemize} % % \section{Code documentation}\label{sec:code} % % \subsection{The documentation driver file} % % The next bit of code contains the documentation driver file for % \TeX{}, i.e., the file that will produce the documentation you are % currently reading. It will be extracted from this file by the % \texttt{docstrip} program. Since it is the first code in the file % one can alternatively process this file directly with \LaTeXe{} to % obtain the documentation. % % \begin{macrocode} %<*driver> \documentclass[draft]{ltxdoc} \usepackage{xindy} \def\see#1{\emph{see} #1} \parindent0pt\hfuzz2pt \setlength{\textwidth}{360pt} \begin{document} \DocInput{xindy.dtx} \end{document} % % \end{macrocode} % % % \subsection{Documentation of the Macros} % % \begin{macrocode} %<*package> %% \RequirePackage{keyval} %% %% %% Allow definition of locationstyles %% %% \def\newlocationstyle#1#2{% \@ifundefined{xindy@style@#1}% {\expandafter\gdef\csname xindy@style@#1\endcsname{#2}} {\typeout{xindy: locationstyle #1 already defined}}} %% %% %% existing styles may be redefined %% %% \def\renewlocationstyle#1#2{% \expandafter\let\csname xindy@style@#1\endcsname=\undefined% \newlocationstyle{#1}{#2}} %% %% %% set up the locationstyles page, chapter and section %% %% \newlocationstyle{page}{\thepage} \ifx\@undefined\chapter\else \newlocationstyle{chapter}{\thechapter-\thepage} \fi \ifx\@undefined\section\else \newlocationstyle{section}{\thesection-\thepage} \fi %% %% %% select style %% %% \def\locationstyle#1{% \@ifundefined{xindy@style@#1} {\typeout{xindy: locationstyle #1 not defined}} {\def\xindy@style{\csname xindy@style@#1\endcsname}}} %% %% %% default is normal pagenumbering, as in LaTeX %% %% \locationstyle{page} %% %% %% The optional keys for the index (as mentioned by Bernd Raichle) %% %% \begingroup % make all punctuation chars inactive (if they can be active) \catcode`\:=12 \catcode`\"=12 \toks0={\endgroup %% \define@key{xindy}{attr}{% \def\xindy@attr{#1}% \ifx\@empty\xindy@attr% \else% \def\xindy@attr{:attr "#1"}% \fi} \define@key{xindy}{open-range}[:open-range]{\def\xindy@range{:open-range}} \define@key{xindy}{close-range}[:close-range]{\def\xindy@range{:close-range}} %% }\the\toks0\relax \def\xindy@attr{} \def\xindy@range{} \def\xindy@xref{} %% %% %% The Backslash should be doubled, the %% doublequote should be quoted (as mentioned by Bernd Raichle) %% %% \begingroup \catcode`\"=\active \catcode`\~=13 \lccode`\~=`\\ \lowercase{% \def\x#1{\endgroup \def\xindy@activatebsp{% \catcode`\\=\active \def~{#1} \catcode`\"=\active \def"{\"}}}} \catcode`\|=0 \catcode`|\=12 |x{\\} %% %% %% Various Makros %% %% \def\delspace#1 \xindy@relax{#1} \def\xindy@space{\space\space\space\space\space\space} \edef\xindy@space{\xindy@space\xindy@space} %% %% %% The indexing command (as mentioned by Bernd Raichle) %% %% \def\indexindy{% \@bsphack %% to handle `space factor' etc. \begingroup \toks@{}% \@sanitize \xindy@activatebsp \indexindy@ } \begingroup % make all punctuation chars inactive (if they can be active) \catcode`\:=12 \catcode`\"=12 \toks0={\endgroup %% %% this one parses the optional arguments, no quoting is active right now %% \newcommand{\indexindy@}[1][]{% setup keys \setkeys{xindy}{#1}% \indexindy@@} %% %% parse the key, quoting is enabled %% \newcommand{\indexindy@@}[2][]{% % setup key \xindy@checksyntax{#2}% \toks@=\expandafter{\expandafter\delspace\the\toks@\xindy@relax}% delete tailing space \expandafter\def\expandafter\xindy@tmp\expandafter{\the\toks@}% % setup xref \toks@={}% \def\xindy@@tmp{#1}% \ifx\@empty\xindy@@tmp\def\xindy@ref{} \else \xindy@@checksyntax \toks@=\expandafter{\expandafter\delspace\the\toks@\xindy@relax}% delete tailing space \expandafter\def\expandafter\xindy@xref\expandafter{\the\toks@}% \fi \index{(indexentry :tkey (\xindy@tmp)}% \ifx\@empty\xindy@attr\else \index{\xindy@space\xindy@attr} \fi \ifx\@empty\xindy@range\else \index{\xindy@space\xindy@range}% \fi \ifx\@empty\xindy@xref% \index{\xindy@space:locref "\xindy@style")}% \else% \index{\xindy@space:xref \xindy@xref)}% \fi% \endgroup \@esphack } %% %% %% convert input into :tkey form %% %% \def\xindy@checksyntax#1{% \def\xindy@tmp{#1}% \xindy@for\xindy@@tmp:=\xindy@tmp\do{\xindy@@checksyntax}} \def\xindy@@checksyntax{% \addto@hook\toks@{(}% \@for\xindy@@@tmp:=\xindy@@tmp\do{% \expandafter\addto@hook\expandafter\toks@\expandafter{\expandafter"\xindy@@@tmp" }}% \toks@=\expandafter{\expandafter\delspace\the\toks@\xindy@relax}% delete tailing space \addto@hook\toks@{) }} }\the\toks0\relax %% %% %% We need a special for-command to enable nested loops. %% %% \def\xindy@fornoop#1\@@#2#3{} \long\def\xindy@for#1:=#2\do#3{% \expandafter\def\expandafter\xindy@fortmp\expandafter{#2}% \ifx\xindy@fortmp\@empty \else \expandafter\xindy@forloop#2;\@nil;\@nil\@@#1{#3}\fi} \long\def\xindy@forloop#1;#2;#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else #5\def#4{#2}\ifx #4\@nnil \else#5\xindy@iforloop #3\@@#4{#5}\fi\fi} \long\def\xindy@iforloop#1;#2\@@#3#4{\def#3{#1}\ifx #3\@nnil \expandafter\xindy@fornoop \else #4\relax\expandafter\xindy@iforloop\fi#2\@@#3{#4}} \def\xindy@tfor#1:={\xindy@tf@r#1 } \long\def\xindy@tf@r#1#2\do#3{\def\xindy@fortmp{#2}\ifx\xindy@fortmp\space\else \xindy@tforloop#2\@nil\@nil\@@#1{#3}\fi} \long\def\xindy@tforloop#1#2\@@#3#4{\def#3{#1}\ifx #3\@nnil \expandafter\xindy@fornoop \else #4\relax\expandafter\xindy@tforloop\fi#2\@@#3{#4}} \long\def\@breakxindy@tfor#1\@@#2#3{\fi\fi} %% %% %% Now redifene \@wrindex from the kernel %% %% \def\@wrindex#1{% \protected@write\@indexfile{}% {#1}% \endgroup \@esphack} % % \end{macrocode} % % \section{Acknowledgements} % % |xindy.sty| is based on a personal idea, but there were two persons, who % helped me in many special tasks. First, I want to thank \textsc{Roger Kehr}, % who gave me hints on xindy-dependent part. Additionally, I thank \textsc{Bernd Raichle}. % He gave many hints on changing categories correctly, to achieve compability to % other styles like |german.sty|. % % \section{History} % % \GlossaryPrologue{} % \PrintChanges % % \Finale \endinput