% ====================================================================== % splitindex.tex % Copyright (c) Markus Kohm, 2002-2009 % % $Id: splitindex.tex 4 2016-02-18 10:13:32Z mjk $ % % This file is part of the SplitIndex bundle. % % This work may be distributed and/or modified under the conditions of % the LaTeX Project Public License, version 1.3c of the license. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3c or later is part of all distributions of LaTeX % version 2005/12/01 or later and of this work. % % This work has the LPPL maintenance status "author-maintained". % % The Current Maintainer and author of this work is Markus Kohm. % % The list of all files belongig to the SplitIndex bundle is given in % in the file `manifest.txt'. Files generated by means of unpacking the % distribution (using, for example, the docstrip program) or by means % of compiling them from a source file, for example, from splitindex.c % or splitindex.java may be distributed at the distributor's discretion. % However if they are distributed then a copy of the SplitIndex bundle % must be distributed together with them. % % The list of derived (unpacked or compiled) files belongig to the % distribution and covered by LPPL is defined by the unpacking scripts % (with extension .ins) and the installation script (with name % install.sh) which are part of the distribution. % % Two often ignorred clauses from LPPL 1.3c you should not ignore: % ---------------------------------------------------------------- % 2. You may distribute a complete, unmodified copy of the Work as you % received it. Distribution of only part of the Work is considered % modification of the Work, and no right to distribute such a Derived % Work may be assumed under the terms of this clause. % 3. You may distribute a Compiled Work that has been generated from a % complete, unmodified copy of the Work as distributed under Clause 2 % above, as long as that Compiled Work is distributed in such a way that % the recipients may install the Compiled Work on their system exactly % as it would have been installed if they generated a Compiled Work % directly from the Work. % ====================================================================== % Set newlinechar \newlinechar`\^^J % Tell program information \message{splitindex.tex 0.1^^J% Copyright (c) 2002 Markus Kohm ^^J^^J} % Change \catcode of At to be a letter \catcode`\@11\relax % New end processing command (one of these should do the job) \def\endprocessing{% \csname @@end\endcsname \csname end\endcsname \csname endinput\endcsname } % Check out, if we are using LaTeX or plainTeX: \let\@earlyend\relax \def\@tempa{LaTeX2e} \expandafter\ifx\csname fmtname\endcsname\@tempa \else \def\@tempa{plain} \expandafter\ifx\csname fmtname\endcsname\@tempa \def\newwrite{\alloc@7\write\chardef\sixt@@n}% not longer \outer \chardef\@inputcheck=0\relax \else \message{Unkown format \csname fmtname\endcsname^^J You have to use plainTeX or LaTeX2e to run splitindex.tex!^^J} \let\@earlyend\endprocessing \fi \fi \@earlyend % Is \idx defined to the name of the raw index file? \expandafter\ifx\csname idx\endcsname\relax % no it isn't \message{Enter the name of the idx file to be processed: }% \advance\endlinechar\@M \read\m@ne to\idx \advance\endlinechar-\@M \fi % Sorry to late for log file \def\setjobname#1.idx#2\\{\def\jobname{#1}} \expandafter\setjobname\idx.idx\\ \let\@earlyend\relax \openin\@inputcheck\idx % \ifeof\@inputcheck \ifx\jobname\idx \openin\@inputcheck\jobname.idx % \ifeof\@inputcheck \message{Error: Neither file `\idx' nor file `\jobname.idx' found!^^J}% \let\@earlyend\endprocessing \else \xdef\idx{\jobname.idx}% \fi \else \message{Error: File `\idx' not found!^^J}% \let\@earlyend\endprocessing \fi \fi \@earlyend \message{Read from file: \idx^^J% Write to files: \jobname-*.idx^^J} % We are ready to do the processing % First we have to do the tricky splitting of the input line. % We do not allow lines which don't start with \indexentry. % We do not support other index file definitions but with an % optional argument of \indexentry. % We need some catcode changes to read and split the line. So % we do this part of the processing at a group. \newtoks\verbatim@line \begingroup \catcode`\^^M\active \begingroup \catcode`\|=0 \catcode`\\=12 |gdef|splitidxline\indexentry#1{% |if #1[% |expandafter|@splitidxline% |else% |expandafter |@splitidxline |expandafter i|expandafter d% |expandafter x|expandafter ]|expandafter#1% |fi% } |endgroup \gdef\@splitidxline#1]#2^^M{% \idxwrite{#1}{\string\indexentry#2}% } \gdef\processidxline{%\message{\the\verbatim@line}% \expandafter\splitidxline\verbatim@line^^M } \endgroup % Now, we can do the main job: writing to the index files \def\idxwrite#1#2{% \expandafter\ifx\csname write@#1\endcsname\relax % We need a new file \message{New index file: \jobname-#1.idx^^J}% \expandafter\newwrite\csname write@#1\endcsname \immediate\openout\csname write@#1\endcsname \jobname-#1.idx % % FixMe: Don't close by end TeX run but use \closeout \fi \immediate\write\csname write@#1\endcsname{#2}% } % Read the file verbatim and process the lines \newif\ifnoteof \newtoks\par@tok\par@tok{\par} \def\@makeother#1{\catcode`#112\relax} \def\processidxfile{ \immediate\openin\@inputcheck \idx % \noteoftrue \loop \ifeof\@inputcheck \noteoffalse\fi \ifnoteof \begingroup \let\do\@makeother\dospecials \immediate\read\@inputcheck to \verbatim@line \if\par@tok\verbatim@line\else \processidxline \fi \endgroup \repeat } \processidxfile % Trick to end processing in TeX and LaTeX \endprocessing %%% Local Variables: %%% mode: tex %%% TeX-master: t %%% End: