%% EdCntWd0.sty--count word occurrences with ednotes.sty. \def\fileversion{0.32} \def\filedate{2005/05/01} %% TODO %% Copyright (C) 2004 Uwe L\"uck & Christian Tapp (direction) %% 2005 Uwe L\"uck. %% Munich, http://www.contact-ednotes.sty.de.vu. %% Current maintainer is Uwe L\"uck. %% This program can be redistributed and/or modified under the terms %% of the LaTeX Project Public License distributed from CTAN %% archives in directory macros/latex/base/lppl.txt; either %% version 1.3a of the License, or any later version. %% We did our best to help you, but there is NO WARRANTY. %% * USAGE: * %% % 1.) The present file is loaded by the `countoccurrences' package % option of version v0.8 (onwards) of `ednotes.sty'. %% % 2.) If your source code somewhere contains % \Anote{}{} % and produces some % % in *one* printed line, the lemma preceding the note should indicate % that the note is concerned with the *second* occurrence of . % It would be extremly tedious to implement this requirement in a % LaTeX macro package. The present package does some part of it. % If you are, in typing, not sure that the first and second % occurrence of will be printed in different lines, type % \countword{}\Anote{\countword{}}{} % The macro \countword will then check whether the occurrences of % are printed in the same line, and if this happens, the lemma % preceding the note will have an index `2'. The analogous thing % \Anote{}{} % works as well (resulting in an index `3'), and so on. % % (So the macros do not save you from looking for earlier word % occurrences, but at least from counting occurrences in the printed % lines, and you do not have to repeat the procedure when you % change the width of the printed text.) % % Of course, you only have to look for earlier occurrences in the % same paragraph. %% % 3.) Sometimes may contain tokens which must not appear in % label names, e.g., `r\^ole'. In this case, e.g., \countword{r\^ole} % will break. Then type, e.g., \countword[role]{r\^ole} instead. % To be more precise: If expands to something containing % a token which is no character token, type % \countword[]{} instead, where expands to % nothing but character tokens. (Cf. \csname on p. 203 of TeXbook.) % 4.) Customization: Index numbers appear as subscripts by default. % To change this, type % \renewcommand*{\CWtextscript}{\textsuperscript} % or \let\CWtextscript\textsuperscript . % 5.) Pagewise/running line numbering: Switching from pagewise to % running line numbering needs an extra run or deletion of % \jobname.aux. So don't be frightened by error message. %% Please send comments via http://www.contact-ednotes.sty.de.vu. %% For wizards: changes lineno.sty's \linenumberpar. \NeedsTeXFormat{LaTeX2e}[1994/12/01] %% <- \newcommand*, \providecommand* \ProvidesPackage{edcntwd0}[\filedate\space\fileversion\space ^^JCounting word occurrences with ednotes.sty (ul)] %% * IMPLEMENTATION: * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% * Main ideas: * % \countword occurrences write their order (per paragraph) and line % numbers into \jobname.aux. With these informations from % \jobname.aux, a table is created which assigns line and place % numbers to words. A second table re-orders the first one and % assigns an index to each place number. An index of 0 means that the % corresponding word appears only once in a line. A higher index % tells the order in which an occurrence follows others in the line. % When processed for the lemma tag, \countword realizes its place % number and, using this, reads the index from the former table and % prints or not prints and index accordingly. % \RequirePackage{ednotes}[2004/01/04] %% Does this work for mere version checking? %% No--had the problem with edtable. See LaTeX bug latex/3730. \newcount\c@CW@repword % \newcounter{repword} %% Don't need \the... \def\@CW@stepcnt#1{\advance#1\@ne} \def\@CW@emptylist{\@eltt} %% Need bound for table rows. \newcount\c@CW@par \newif\if@CW@pardef \global\@CW@pardeffalse \def\@CW@cntwi{% \global\let\@CW@wordlinelist\@CW@emptylist %% \@CW@wordlinelist is built as a "table", each row being %% \@elt\@elt\@eltt %% --and there is an extra leading \@eltt. %% Latter needed for determining exact matching. \global\let\@CW@placeindexlist\@CW@emptylist %% \@CW@placeindexlist has, after starting \@eltt, rows of form %% \@elt\@eltt . \global\@CW@stepcnt\c@CW@par \@ifundefined{CWp\romannumeral\c@CW@par}% {\G@refundefinedtrue \global\@CW@pardeffalse}% {% \global\@CW@pardeftrue \begingroup \count@\z@ \let\@elt\relax \let\@eltt\relax \edef\@tempa{\noexpand\@tfor \noexpand\@tempa :=% \csname CWp\romannumeral\c@CW@par\endcsname}% \@tempa\do{% \@CW@stepcnt\count@ \edef\@tempc{r@CWw@\number\c@CW@par @\number\count@}% %% 2004/07/27: hack for pagewise line numbering: \expandafter \@ifundefined \expandafter{\@tempc}% {\gdef\@gtempa{?}}%% \global: cf. below! {\ifx\c@linenumber\c@runninglinenumber \gdef\@gtempa{% \expandafter\expandafter\expandafter \@car %% Beware hyperref. \csname\@tempc\endcsname \@nil}% \else \begingroup \def\thelinenumber{% \xdef\@gtempa{\number\c@linenumber}}% %% Assumes \getpagewisenumber -> {... \thelinenumber} %% Local vs. global assignments to \c@linenumber OK according to %% Stephan. (!?) \expandafter\expandafter\expandafter \@car \csname\@tempc\endcsname \@nil \endgroup \fi}% % \typeout{G:\meaning\@gtempa}% TEST \edef\@tempb{% \noexpand\g@addto@macro \noexpand\@CW@wordlinelist{% \@tempa \@elt \@gtempa % \expandafter \@ifundefined \expandafter{\@tempc}{?}% % {\expandafter\expandafter\expandafter \@car % \csname\@tempc\endcsname \@nil}% \@elt \number\count@ \@eltt}}% \@tempb}% %% TODO: empty referring macros after use -> ednotes as well. \xdef\@CW@numberofwords{\number\count@}% \loop % \typeout{WL=\meaning\@CW@wordlinelist}%% TEST \ifx\@CW@wordlinelist\@CW@emptylist \else \global\let\@CW@nextwordlinelist\@empty \expandafter\@CW@takerow\@CW@wordlinelist\@nil \ifx\@CW@nextwordlinelist\@empty \global\let\@CW@wordlinelist\@CW@emptylist \else \global\let\@CW@wordlinelist\@CW@nextwordlinelist \fi \repeat \endgroup }% % \typeout{PI=\meaning\@CW@placeindexlist}%% TEST \global\let\countword\@CW@cntwii \@CW@cntwii } \def\@CW@takerow\@eltt#1\@elt#2\@elt#3\@eltt#4\@nil{% \count@\@ne \g@addto@macro\@CW@placeindexlist{#3\@elt}% %% \@CW@placeindexlist always closes with mostly spurios %% 0\@eltt, don't know why, but harmless for reading the list. \def\@CW@matchline##1\@eltt#1\@elt#2\@elt##2\@eltt##3\@nil{% % \typeout{WL=\meaning\@CW@wordlinelist}%% TEST \def\@tempa{##1}% % \typeout{##1}%% TEST \ifx\@tempa\@CW@emptylist \g@addto@macro\@CW@placeindexlist{0\@eltt}% \else %% \@tempcnta determines one out of four cases, %% while \count@ counts equal words in a line: \@tempcnta \ifnum\count@=\@ne \z@ \else \tw@ \fi \ifx\@nnil##2\@nnil %% No match. \let\@CW@next\relax \else %% Match. \@CW@stepcnt\@tempcnta \@CW@stepcnt\count@ \@CW@buildnextwordlinelist{##1}% \def\@CW@next{\@CW@matchline\@eltt##3\@nil}% \fi %% Cases determined. % \typeout{\number\@tempcnta}%% TEST \ifcase\@tempcnta %% \typeout{Case 0: \count@=1, no match}% \g@addto@macro\@CW@placeindexlist{0\@eltt}% \xdef\@CW@nextwordlinelist{\@eltt#4}% \or %% \typeout{Case 1: \count@=1, match}% \g@addto@macro\@CW@placeindexlist{1\@eltt##2\@elt2\@eltt}% \or %% \typeout{Case 2: \count@>1, no match}% \@CW@buildnextwordlinelist{##1}% \or %% \typeout{Case 3: \count@>1, match}% \edef\@tempc{\noexpand\g@addto@macro \noexpand\@CW@placeindexlist {##2\@elt \number\count@ \@eltt}}% \@tempc \fi \@CW@next \fi }% \@CW@matchline\@eltt#4\@eltt#1\@elt#2\@elt\@eltt\@nil %% TODO #4 void!? Cf. dummy above, \@CW@next. } %% \@CW@buildnextwordlinelist{#1} appends non-void #1 to %% \@CW@nextwordlinelist: \def\@CW@buildnextwordlinelist#1{% \ifx\@nnil#1\@nnil \else \g@addto@macro\@CW@nextwordlinelist{\@eltt#1}\fi} \@ifdefinable\countword{\global\let\countword\@CW@cntwi} \newcommand*\@CW@cntwii[2][\@nil]{% \global\@CW@stepcnt\c@CW@repword \def\@tempa{#1}% \ifx\@tempa\@nnil \g@addto@macro\@CW@wordlist{{#2}}% \else \g@addto@macro\@CW@wordlist{{#1}}% \fi \edef\@tempa{\noexpand\linelabel{% CWw@\number\c@CW@par @\number\c@CW@repword}}% \@tempa #2} \newcount\c@CW@nrepword \newcommand*\@CW@cntwl[2][]{%% First argument just gobbled, %% using place number instead. #2% \if@CW@pardef \global\@CW@stepcnt\c@CW@nrepword \ifnum\c@CW@repword>\@CW@numberofwords\relax \G@refundefinedtrue \else \edef\@tempc{% \def\noexpand\@tempb####1\noexpand\@eltt \number\c@CW@nrepword}% %% "look up". \@tempc \@elt##2\@eltt##3\@nil{\def\@tempa{##2}}% \expandafter\@tempb \@CW@placeindexlist \@nil \if 0\@tempa \else \CWtextscript{\if ?\@tempa ?\else \@tempa \fi}% \fi \fi \else \CWtextscript?% \fi} \providecommand*\textsubscript[1]{% %% Cf. LaTeX \textsuperscript: we will be in a note here! $\m@th_{\mbox{\fontsize\sf@size\z@\selectfont#1}}$} \let\CWtextscript\textsubscript \def\@EN@CWhook{\setbox\z@\hbox} %% To recognize stepping counters. %% TODO: empty referring macros after use. -> ednotes as well. \addlemmaexpands{\let\countword\@CW@cntwl \global\c@CW@nrepword\c@CW@repword} \global\let\@CW@wordlist\@empty \newcommand*\CWClosePar{% %% TODO: -> doc.!? Useful? \ifx\@CW@wordlist\@empty \else \immediate\write\@mainaux{% \gdef\expandafter\noexpand \csname CWp\romannumeral\c@CW@par\endcsname {\@CW@wordlist}}% \global\let\@CW@wordlist\@empty \global\c@CW@repword\z@ \fi \global\let\countword\@CW@cntwi \global\@CW@pardeffalse} \expandafter\def\expandafter\linenumberpar\expandafter{% \expandafter\CWClosePar\linenumberpar} \endinput VERSION HISTORY: v0.01 2004/01/05 Very first release under name `ecntw0.sty'. v0.1 2004/01/05 Changed names and documentation, new name `edcntwd0.sty'. v0.11 2004/01/05 renamed \CWnext -> \@CW@next, added main ideas of implementation. v0.12 2004/05/12 Added remark on `linenox1.sty' (load earlier); added `(C)' and Christian for copyright; L"uck -> L\"uck. \RequirePackage{ednotes}; changed doc. accordingly. 2004/07/06 Added explanation for order with `linenox1.sty' ("for wizards"). 2004/07/28 ^^J; cope with pagewise numbering; note on switching from pagewise to running. v0.12b .../08/31 Changed to LPPL v1.3, added maintenance. v0.2 2004/09/20 Removed mentions of `linenox1.sty', for `lineno.sty' v4... v0.3 2004/10/07 Usage: to be loaded by `ednotes.sty' option. 2004/10/11 Removed \RequirePackage{ednotes}; changed some TODOs. 2004/10/12 latex/3730. v0.3a 2004/11/07 LPPL v1.3a. v0.3b 2005/01/10 Contact via http. v0.31 2005/02/20 Added \@EN@first. 2005/03/08 Added Copyright 2005. v0.32 2005/05/01 Replaced \@EN@first by LaTeX's \@car. [not sent, not tested]