%% Macro package `ednotes.sty' for LaTeX2e, %% copyright (C) 2002--2005 Uwe L\"uck & Christian Tapp (direction) %% 2006 Uwe L\"uck %% http://www.contact-ednotes.sty.de.vu %% --author-maintained, for critical editions %% (varying J. Lavagnino's and D. Wujastyk's EDMAC). %% \def\fileversion{1.3a} \def\filedate{2006/10/05} %% TODO % %% This file can be redistributed and/or modified under %% the terms of the LaTeX Project Public License; either %% version 1.3c of the License, or any later version. %% The latest version of this license is in %% %% http://www.latex-project.org/lppl.txt %% %% We did our best to help you, but there is NO WARRANTY. %% %% Please report bugs, problems, and suggestions via %% %% http://www.contact-ednotes.sty.de.vu % %% * USAGE: * % % *Overview:* % This package provides facilities for notes in (critical) editions. % `\Anote{LEMMA}{NOTE}' prints NOTE in an extra footnote apparatus, % referring to LEMMA by its line numbers (as generated by % `lineno.sty') and by repeating LEMMA in the note. By calling the % package with extra options, you can add \Bnote etc. and choose % whether notes of one apparatus appear in a single paragraph on % each page or in separate paragraphs (`manyfoot.sty'). % In LEMMA, `...\<...\>...' indicates what short version of it is to % appear in the note. There are further facilities to customize % appearance of notes. % Commands \Anotelabel{LABEL}, \donote{LABEL}{NOTE} etc. vary \Anote % etc. in admitting overlapping lemmas. % ---The package is made for those who need something like EDMAC % but who want to employ LaTeX2e at the same time. % More detailed description below is divided into % `packages required', `user commands', `package options', % `customizing', `Note on EDMAC', and `Comparison with LEDMAC'. % % *Note on "rival" package LEDMAC:* Peter R. Wilson has made a % LaTeX package LEDMAC (available on CTAN) for about the same % purpose as the present package. See `Note on EDMAC' and % `Comparison with LEDMAC' below. % % *Printed presentation:* An article on `ednotes' with user % instructions, examples, and comparisons with `[L]EDMAC' % appeared in the TUGboat volume for 2003. A version of it is % obtainable from the `ednotes' CTAN folder (`ednotugb.pdf'). % % *Packages required:* % This package will not work without the following ones % ("visible"--cf. visible.txt in CTAN ednotes folder): % o Packages `manyfoot.sty' (v1.9+) and `nccfoots.sty' by % Alexander I. Rozhenko from the `ncctools' bundle. % You needn't know anything about these % except perhaps options `para' and `para*' % choosing footnote indentation (see `package options' below). % o Package `lineno.sty' by Stephan I. B"ottcher. % We here suppose that you know and employ some of the % line numbering commands from `lineno.sty'. % However, please don't load these packages on your own. % Instead of calling them with some options, put these options % into the brackets of \usepackage[]{ednotes}. % % *Availability:* % o In case you have not received `manyfoot.sty' and `nccfoots.sty', % you find them in the CTAN folder % `macros/latex/contrib/ncctools/unpacked' . % You find PDF documentations in % `macros/latex/contrib/ncctools/doc' . % o `lineno.sty' is in CTAN folder `macros/latex/contrib/lineno'. % In the same folder, there is `lineno.pdf' for documentation. % % *Optional packages:* % o Some package options may need additional package files (for % a while). They may be in the `ednotes' or `lineno' CTAN folder. % The README files there will name them or tell where they are % named. %% TODO % % *Other useful files:* % Look at the README file in CTAN folder % `macros/latex/contrib/ednotes' for quick information on what other % files in the folder provide. %% TODO: indeed? % % *User commands:* % *Basic:* -------------------------------------------------------- % \Anote{LEMMA}{NOTE} prints LEMMA where it occurs % and sends NOTE into an extra footnote apparatus. % The lines where the command occurs must be numbered % by using commands from package `lineno.sty'. % In the footnote, NOTE is preceded by line numbers of LEMMA, % by a version of LEMMA (see below), and by some separating stuff. % Separating stuff by default is a properly spaced right bracket % according to \lemmafmt (see below). % \Anote may be nested in LEMMA. % (Overlapping lemmas may be generated by \Anotelabel etc. as % described below.) % For customizing appearance of notes, see `package options' and % `customizing' (\lemmafmt and \lemmaellipsis, e.g.) below. % For additional analogous commands \Bnote etc., see % `"optional" user commands' below. % *Short lemma substitute in note:* ------------------------------- % (The following describes a comfortable extension of % EDMAC's \lemma.) % LEMMA argument of \Anote as above may appear as `L1\L3', then % only L1 and L3 appear in the footnote with some ellipsis symbols % between them. By default, these are \textsymmdots according to % \lemmaellipsis. % (For \textsymmdots vs. ordinary \dots see `miscellaneous' below.) % L2, however, may start with `', then ELL is used instead of % \textsymmdots or whatever else \lemmaellipsis might call. % (To be sure, symbols `\<', `<', `>', `\>' work in a special way % in LEMMA. `>' might be used inside ELL if inside braces, e.g., % `\<<{$>$}>'. works as an optional argument of \< like % brackets usually do in LaTeX---we thought you might use `[' here % as a symbol to be printed in main text. Care for proper spacing in % both versions of the lemma by spaces touching \<, \>, and braces. % ---A special version of the package would be necessary for those % having no `<', `>' on their keyboards.) % *Overlapping lemmas:* ------------------------------------------- % \Anotelabel{LABEL}LEMMA\donote{LABEL}{NOTE} % works just like \Anote{LEMMA}{NOTE} above. However, by using % proper LABELs, you can indicate which of overlapping lemmas % begins and ends where. Note that the second command is only % \donote, not \Adonote. In LEMMA, \pause{LABEL} and \resume{LABEL} % act analogously to \< and \> above for lemma substitutes, and % \pause{LABEL} employs your own ELL for the ellipsis. % LEMMA may contain \Anote and the other way round (in some way). % However, \pause{LABEL} must not be hidden in braces etc. % *Commands in lemma as repeated in a note:* ---------------------- % Some commands should work in main text, but not in the lemma % text of the note, e.g. \label. With respect to some of them, % `ednotes.sty' makes an adjustment for this. Nesting of lemmas, % e.g., is enabled this way. % For other commands, you can hide code from a note % by \notinnote, e.g.: \notinnote{\footnote{...}}. % If you know about relevant (La)TeX internals, you can define % behaviour of commands in lemmas using \addlemmaexpands, e.g. % \addlemmaexpands{\let\footnote\@gobble}. % (However, the latter code is bad if \footnote should occur % with an optional argument. Moreover, in some cases % \let...\notinnote may handle spaces better than % \let...\@gobble, since \notinnote uses a variant of LaTeX's % \@bsphack and \@esphack. % ---\addlemmaexpands has only local effect inside group.) % \showlemmaexpands displays all these extra definitions % which would apply in the lemma ahead. % (A lot of commands might be changed here, we chose only few. % Cf. EDMAC's \no@expands; EDMAC, however, deals with the % problem in a different way and needs more changes % than we do.) % ---You may find % \IfLemmaTag{}{} % useful as well, perhaps more flexible than \notinnote. % % *"Optional" user commands:* ------------------------------------- % Each of \Bnote, \Bnotelabel, \Cnote, \Cnotelabel, \Dnote, % \Dnotelabel, \Enote, and \Enotelabel is defined by calling % respective package options `Bpara' or `Bplain' etc., see % `package options' below. They work like \Anote and \Anotelabel, % respectively, and nesting and overlapping of their lemmas works % as for \Anote and \Anotelabel. \donote works with each of % \Anotelabel, \Bnotelabel etc.---care for different labels. % \nopunct may help you in case of certain changes of \notefmt, see % `customizing' below (not active outside notes). % *Miscellaneous:* ------------------------------------------------ % As a byproduct, we provide \textsymmdots as an alternative to % \dots or (more specific) to LaTeX2e's \textellipsis. We feel that, % in the middle of the short version of a lemma, the text dropped % should be replaced by symmetrically spaced dots, i.e., in % L1 ... L3, the space between L1 and the dots should be the same % as the space between the dots and L3. \textellipsis obstructs this % by calling a space after the final dot which is not balanced by a % space before the first dot. \textsymmdots just closes without that % final space---that's all the difference to \textellipsis. (Cf. % TeXbook p. 73 where $\ldots$ is recommended for the same purpose.) % Of course, it is now your job to care for proper spacing on left % and right, e.g., use it this \textsymmdots\ way. % Note that with a comma following \dots is quite right while % `\textsymmdots,' is bad. %% TODO: delimiters!? e.g. [...] % -- Now (since Sep 2004) indeed there is the `ellipsis' package % by Peter J. Heslin on CTAN in the /macros/latex/contrib directory! % It deals with this problem much more thoroughly. % *Wrong placement:* ---------------------------------------------- % We do not provide helpful error messages for badly placed \<, % \pause, and the like in this version. You will just get % `undefined' errors, complaints about \mskip, or `runaway % argument' errors.---Doubling labels with \Anotelabel etc. may % work well if you know what you are doing. % % *Package options:* % 1.) Options `left', `right', `switch', `switch*', `columnwise', % `pagewise', `running', `modulo', `mathlines', `displaymath', % `edtable' (edit tabular environments), `longtable' (edit % `longtable' environments), `nolongtablepatch' are passed to % package `lineno'; cf. the latter package for information % (not yet tested all). %% TODO % `left' and `running' act by default. % Option `mathnotes' calls `lineno.sty' package option `mathrefs', % see `lineno' documentation as well. % 2.) Option `Aplain' arranges all notes for one page generated % by \Anote and \Anotelabel in a single footnote paragraph. % Option `Bplain' generates an apparatus using one footnote % paragraph for each note, with commands \Bnote, and \Bnotelabel. % Option `Bpara' does the same but arranging all notes % for one page in a single footnote paragraph. % Analogues apply to `Cplain', `Cpara', `Dplain', `Dpara', % `Eplain', and `Epara'. (There is `Apara' as well---default.) % Option `para*' suppresses indentation of footnote paragraphs % coming from options like `Apara' (cf. package `manyfoot'). %% TODO: para indent correct? % 3.) Option `edmacpara' makes up for problems with `para' % footnotes that are discussed in `EDMAC.doc' section % `Paragraphed footnotes'. See our package `mfparptc.sty' for % details (for the time being). % 4.) Option `perpage' is just passed to `manyfoot.sty'. % (This requires that the perpage package has been installed; % to be obtained from CTAN folder macros/latex/contrib/bigfoot/.) % 5.) Option `countoccurrences' provides a command \countword % for a half-way solution of the problem of lemma words that % occur more than once in a line. See our package `edcntwd0.sty'. % (With `ednotes.sty' v1.1 you need `edcntwd0.sty' v0.31.) % % *Customizing:* % Appearance of notes is directed by macros \extrafootnoterule, % \linesfmt etc. occurring in the following lines % (each starting with \renewcommand). -- More recently, customizing % footnote rules has been introduced; see below. % For customizing, copy the respective lines to your own file, % remove left hand comment mark, and change the definition in the % right hand pair of braces. (The definition you find there is our % original one; we hope you understand from these definitions how % they work in general and what the arguments are. E.g., \linesfmt % applies to printing of line numbers and, originally, renders them % bold-faced, followed by \enspace. Note that this default suppresses % hyphenation of the first word of a lemma tag.) % This controls identical behaviour in *every apparatus*. % For changing appearance of a single apparatus without changing % the remaining, see below.---Note: With v1.1, \ref has been % removed from the definition of \repeatref, and a \ref in any % customization of it will not work any longer. As well, earlier % \linewithpage used \ref and \pageref, and this will not work any % longer. \linewithpage has been replaced by \pageandline. % \renewcommand{\extrafootnoterule}{\footnoterule} % ---This is a `manyfoot.sty' command for separating each extra % apparatus from the other ones.--- % \renewcommand*{\sameline}[1]{\linesfmt{#1}} % \renewcommand*{\differentlines}[2]{\linesfmt{#1--#2}} % %% TODO: \linesfmt into \@EN@note!? % \renewcommand*{\linesfmt}[1]{\textbf{#1}\enspace} % ---E.g., for enabling hyphenation of first word of lemma tag: % % \renewcommand*{\linesfmt}[1]{\textbf{#1}\enspace % % \hspace*{0pt}} % ---Last line works like german.sty's \allowhyphens. % \renewcommand*{\pageandline}[2]{#1.#2} % #1 page, #2 line. % \renewcommand{\lemmafmt}[1]{#1\thinspace]\enskip} % \renewcommand*{\repeatref}[1]{#1} % ---E.g., for replacing repeated line numbers by non-bold slash: % % \renewcommand*{\repeatref}[1]{\textnormal{/}} % \renewcommand{\lemmaellipsis}{\textsymmdots} % \renewcommand{\notefmt}[1]{#1} % Note: \notefmt, originally, takes your note just as it is. % By redefinition % \renewcommand*{\notefmt}[1]{#1.} % you might add an automatic closing full stop to each note. % In a single note of the same apparatus, however, you might then % want to close by a question mark (e.g.) instead of the fullstop. % For this purpose, close that note by `?\nopunct'. \nopunct then % gobbles the full stop waiting ahead. (So much as to \notefmt.) % ---Customizing a *single apparatus*: % For changing appearance of the apparatus feeded by \Anote % without changing remaining apparatuses (feeded by \Bnote etc.), % take the following lines (the one with a single right brace % being the last one) to your own file and remove the left hand % column of comment marks. Remove then left hand comment marks % of single lines containing commands whose behaviour in the % apparatus you want to change. Change their definitions in % right hand braces. (It is quite important never to remove % right hand comment marks, as you may know!) % \newcommand{\Anotefmt}{% % % \renewcommand*{\sameline}[1]{\linesfmt{##1}}% % % \renewcommand*{\differentlines}[2]{\linesfmt{##1\textendash##2}}% % % \renewcommand*{\linesfmt}[1]{\textbf{##1}\enspace}% % % \renewcommand*{\pageandline}[2]{##1.##2}% ##1 page, ##2 line. % % \renewcommand*{\repeatref}[1]{##1}% E.g., ... % % % \renewcommand*{\repeatref}[1]{\textnormal{/}}% ... instead. % % \renewcommand{\lemmafmt}[1]{##1\thinspace]\enskip}% % % \renewcommand{\lemmaellipsis}{\textsymmdots}% % % \renewcommand{\notefmt}[1]{##1}% % } % For changing the \Bnote apparatus, do the same and change % \Anotefmt into \Bnotefmt. Analogues apply to \Cnote etc. % ---You can, moreover, add code in the definition of \Anotefmt etc. % for additional settings to be active throughout the note % (including line numbers and lemma reference), % e.g., for selection of a certain font type. % ---`manyfoot' v1.9 offers a command \SetFootnoteHook for % controlling the appearance of the whole paragraph of an apparatus % in `para' or `para*' style---please see the `manyfoot' % documentation for examples. `ednotes' v1.2 makes use of this % through a new command \PrecedeLevelWith{X}{CODE}. E.g., % \PrecedeLevelWith{A}{\textit{Var.:}} and % \PrecedeLevelWith{B}{\textit{Sim.:}} (once and for all) % may distinguish the variant from the similia apparatus. % CODE may also be used to contol the paragraph indent of % the apparatus (so the paragraphs may have different % indents) or to shape the paragraph more generally % (according to TeXbook chapter 14, especially pp. 101f.). % To give a general rule, \PrecedeLevelWith{X}{CODE} has % the same effect as \SetFootnoteHook{CODE} % \DeclareNewFootnote[para]{X} would have with `manyfoot'. % Without the `para' option or with the `plain' style of % notes, CODE just is executed starting each note (preceding % even the line number and the lemma). % ---*Special characters:* As is noted in EDMAC's documentation, % the en-dash for line number printing or the separating right % square bracket might be coded unusually in some special font % which has been chosen and so may escape being printed. Should you % encounter this problem indeed, you can use the previous for remedy % (e.g., change \lemmafmt). (EDMAC's solution is use of % \endashchar etc. for taking these characters from the \rm font.) % ---You may *redefine* most of the commands provided by the % package. *Exceptions* are \donote, \<, and \>. So you might % put \newcommand{\variant}{\Anote} or even (for TeXperts) % \let\variant\Anote into your file (after `ednotes.sty' has been % read). No problem about nesting will arise (as did with EDMAC). % EDMAC's suggestion to make <...> a shorthand, however, would % conflict with our lemma mechanism. (Coexistence would be possible % by suitable use of braces and repeating present definitions % after change of <'s catcode.) % ---Customizing *footnote rules*: From its version 1.5 onwards, % manyfoot has offered customizing footnote rules, as described % in section 3 of manyfoot.pdf . Only with version 1.3 onwards, % our ednotes supports this manyfoot feature. First please note % that ednotes always simply executes \newfootnote, never % \DeclareNewFootnote. This seems to suffice for scholarly % critical editions and for customizing the footnote rules. % When you read in manyfoot.pdf about customizing footnote % rules, therefore please disregard any difference between % \newfootnote and \DeclareNewFootnote.---So please read % section 3 of manyfoot.pdf . Observe the \SelectFootnoteRule % commands preceding some \DeclareFootnoteRule commands. % If such a command precedes \newfootnote{}, ednotes % produces the same effect if you precede loading ednotes % after \newcommand{\Selectnoterule}{}, % when you would want to use \SelectFootnoteRule % with mere manyfoot. (The accompanying file varnrule.tex % explains more and enables you to play with the possibilites.) % ---(Please never forget to update the ncctools MiKTeX package % when you update the ednotes package!) % % *Your shorthands:* % \Anote etc. prevent editorial notes from appearing in the % table of contents when such commands (\Anote etc., i.e.) % appear in a heading (e.g.). But when you define a shorthand macro % (using \newcommand) that has an optional parameter and \Anote % or so in the defining code, something more is needed to have % the lemma, without the note, in the table of contents (or ...) % E.g., you might \newcommand*{\variant}[1][A]{\Anote{#2}{#1}} % so \variant{res} works like \Anote{res}{A} and \variant[B]{res} % works like \Anote{res}{B}. ednotes v1.22 offers two solutions % to this problem: % 1. You can precede your shorthand with \RobustTestOpt whenever it % appears in a "moving" argument like a chapter heading -- % \RobustTestOpt\variant{res} as well as % \RobustTestOpt\variant[B]{res} , e.g. % 2. You can save yourself from caring for \RobustTestOpt by using % \NewEdnotesCommand instead of \newcommand -- % \NewEdnotesCommand*{\variant}[2][A]{\Anote{#2}{#1}} % These facilities work only when the shorthand has an *optional* % parameter and at least one *mandatory* parameter -- well, if it % doesn't have, you can use \RobustTestOpt if you put a pair of % braces after the shorthand macro name, this would work as well. % ---You may find % \IfTypesetting{}{} % more flexible. % % *Known problems:* % With run-in-paragraph footnotes (options `para' or `para*'), notes % may end too deep on the page or (with `longtable.sty') even overlap % with main text. `ednotes.sty' shares this "feature" with EDMAC and % LEDMAC. Output gets worse as the number of paragraphed-footnote % series increases. `manyfoot.sty' version 1.7 (!) accounts for this % by a command \ExtraParaSkip (as an interim solution). This command % reserves additional vertical space for the notes (so there is less % space for main text---at the expense of too large empty space on % some pages). After `ednotes.sty' (or `manyfoot.sty') has been % loaded (i.e., below \usepackage...), type `\ExtraParaSkip{}' % (still in the preamble) where may be any glue parameter. % may be a multiple of any absolute space unit (e.g., `4pt' or % `2mm'), it may even be a multiple of a space unit depending on the % font size of notes (\footnotesize)---like `em', `ex', or % `\normalbaselineskip' (e.g., `.5\normalbaselineskip'). (However, % stretch and shrink of, e.g., \normalbaselineskip are ignored.) % Experiment with choices for such that notes neither overlap % with main text nor hang too deep on the page. The most safe choice % is `\ExtraParaSkip{.5\normalbaselineskip}'. % ---Manyfoot.sty did something similar before; i.e., it reserved % .5\normalbaselineskip (with respect to \footnotesize) for the notes. % This may not be needed on some pages (on such pages there may be % too much empty vertical space). % ---For the best solution you should, when your work is ready and % only needs optimization of formatting, type % \ExtraParaSkip{-.5\normalbaselineskip} % (to remove the space that Manyfoot.sty reserves) and then insert % \pagebreak's in your main text to avoid overful pages. % ---We formerly offered a command \MFparaxbuffer in file % `mfparxsp.sty' instead. This could be used once only in the % document preamble. \ExtraParaSkip does not have this limitation. % This allows, e.g., first setting a "default" value and changing it % under certain conditions, e.g.: % \ExtraParaSkip{} ... \if... \ExtraParaSkip{} ... \fi % (Thanks to Florian Kragl who presented a similar first remedy for % the problem.) % % *The problem of oscillating page breaks:* % In typesetting critical editions, there is an increased danger % of page break oscillations, causing wrong numberings, % placements, and cross-references. Our package `lblchng1.sty' % (same CTAN directory) offers help with this. However, % `ednotes.sty' v1.1 takes over most of the job from % `lblchng1.sty'. We still recommend to *read the file* % `lblchng1.sty' on how to use the messages from `lblchng1.sty' % and `ednotes.sty' on page number changes (be sure that it is % v0.32 or higher). The warnings from ednotes.sty may suffice. % Just look at the final messages on screen or in .log. % -- You can overcome such problems using \pagebreak % (Standard LaTeX) or \warningpagebreak (from present package) % -- force the earlier page break! % \warningpagebreak works like Standard LaTeX \pagebreak, it just % adds a reminder for the case that such a manual page break % may become bad after revisions of your entire work. % % *A problem with `hyperref.sty':* % To guarantee compatibility with `hyperref', updating lineno.sty % to v4.3 is recommended. % % *Note on EDMAC:* % `edmac.doc' is a macro package by John Lavagnino and % Dominik Wujastyk made for critical editions to be used in presence % of Plain TeX only. We refer to the macros and documentation of % this package by `EDMAC'. There is an enhancement `edmacfss.sty' % for additionally employing the New Font Selection Scheme (NFSS) % from LaTeX2e. With `edmacfss.sty', some LaTeX commands work by % accident. However, it replaces LaTeX's \end by PlainTeX's \end, % so LaTeX environments don't work. Moreover, % EDMAC defines its own output routine in place of LaTeX's, % so LaTeX's page assembly and related commands (\marginpar ...) % are disabled. EDMAC still provides facilities % (columnar footnotes, endnotes, sublines) which are neither % implemented here nor in packages `manyfoot' and `lineno' % on which the present one is based. However, there are authors % who have had a desire to stay in LaTeX's paradise and to enjoy %% TODO: Hilbert translation % EDMAC features at the same time. (E.g., edition may be only part % of your document, or you want to use many LaTeX packages.) % Fortunately, Christian was led to packages `manyfoot' and `lineno' % which implement the most desirable of EDMAC's facilities for use % with LaTeX. A version of EDMAC's \text and assembly of notes % remained to be done. We even go beyond EDMAC concerning lemma % substitutes and overlapping lemmas. % ---For explanation of present solutions, we sometimes refer to % EDMAC where similar problems are dealt with in similar but % sometimes essentially differing ways. Therefore, knowledge of % EDMAC may foster your understanding commands and remarks % presented here, but it is not required. % ---Dominik maintains a homepage for EDMAC and related software: % http://www.homepages.ucl.ac.uk/~ucgadkw/edmac/ % % *Comparison with LEDMAC:* % (Cf. http://ednotes.sty.de.vu and `ednotugb.pdf'.) % Peter Wilson's LEDMAC ports EDMAC to LaTeX, i.e., you get % almost exactly EDMAC *functionality* and same *user interface* % as in good old EDMAC (some slight changes of command names % were necessary). Thus it offers a very easy switch to LaTeX % for EDMAC addicts and is superior in functionality to `ednotes.sty' % where EDMAC is (columnar footnotes, endnotes, sublines, etc.? % --first two might change over the years). `ednotes.sty' might % be favoured if you really need overlapping lemmas, and we tried % to offer further user-friendly features as spelled out above. % --Some users want to edit tables. For EDMAC there is the % TABMAC package providing special commands for this. A TABMAC % port is part of LEDMAC. This is nice for EDMAC/TABMAC addicts. % Our additional package `edtable.sty' allows for lemmas in (some) % LaTeX tabular environments and numbers their rows as if they were % lines. This is nice for those who only know the LaTeX tabular % environments. However, TABMAC and its mirror in LEDMAC offer % facilities which are not provided by LaTeX/ednotes/edtable. % --LEDMAC *implementation* is very close to EDMAC's as well, % differing very much from `ednotes.sty', especially concerning % use of auxiliary files. However, this seems to have no practical % effects. On very old machines, EDMAC/LEDMAC might be slower, while % Ednotes might cause memory overflow with small TeX versions and % many notes. Peter Wilson [3/3 2004] estimates that rather % EDMAC's/LEDMAC's typesetting everything twice might be a % disadvantage in comparison with `ednotes.sty'. % ---In 2004 LEDMAC has been enhanced considerably beyond the % functionality of EDMAC and `ednotes.sty'. % It now also includes indexing by line as well as by page, % a port of Wayne Sullivan's EDSTANZA, new options for line % numbering, a minipage-like environment (which may break across % pages) such that remarks are printed immediately after some piece % of edited text (a letter, e.g.), and "sidenotes". % Finally an extension package `ledpar' adds parallel typsetting. % --At least for some time LEDMAC will be more user-friendly % in providing all functions in a single file with *one* % *printable* documentation file. %% TODO % On the other hand, packages we build on are still being enhanced % in functionality by their authors. % % %% Acknowledgements % % Christian saved me from most of the work by having found % packages `lineno.sty' by Stephan I. B"ottcher and `manyfoot.sty' % by Alexander I. Rozhenko which do the output stuff. Thanks to % Christian, Stephan and Alex! I appreciate their work (especially % Stephan's approach to adding and remembering line numbers), and I % admire John Lavagnino's and Dominik Wujastyk's work on EDMAC. % I am also grateful for their encouragement. U.L. % % Moreover I am much indebted to Stephan B"ottcher and Alex % Rozhenko for their co-operation in reducing the number of % package files that `ednotes.sty' needs. (This was 2004, % version v1.0.) % % For pointing out errors and problems, we are grateful to test % users Robert Alessi, Sergei Mariev---see version history. % Florian Kragl contributed to now `manyfoot.sty's \ExtraParaSkip % as described above. v1.1 and v1.23c are due to problems that % Roy Flechner reported. v1.12 is due to Hillel Chayim Yisraeli's % discovery of spurious footnote marks. % \NeedsTeXFormat{LaTeX2e}[1994/12/01] % 1994/12/01: \newcommand* etc. %% TODO: more recent needed? \ProvidesPackage{ednotes} [\filedate\space v\fileversion, for critical editions] %%%(ul)]%%%by Uwe L\string\"uck.] % %% Our warnings: \def\@EN@warning{\PackageWarning{ednotes}} % %% Package Options: % % Own options % (must appear before `para*' so this can override `para'): %% TODO: true!? %% TODO: Something to make use of Alex' \SplitNote!? \let\if@EN@Apara\iftrue % Makes option `Apara' default. \DeclareOption{Apara}{% Redundant, just in case ... \@EN@warning{Package Option `Apara' is redundant} % \PassOptionsToPackage{para}{manyfoot}% % \AtEndOfPackage{% % \newfootnote[para]{A}% % \newcommand{\Anote}{\@EN@note A}% % \newcommand{\Anotelabel}{\@EN@notelabel A}% % }} } \DeclareOption{Aplain}{% \let\if@EN@Apara\iffalse % \AtEndOfPackage{% % \newfootnote{A}% % \newcommand{\Anote}{\@EN@note A}% % \newcommand{\Anotelabel}{\@EN@notelabel A}% % }} } \DeclareOption{Bpara}{% \PassOptionsToPackage{para}{manyfoot}% \AtEndOfPackage{% \SetFootnoteHook{\@EN@MF@hook@B}% \let\@EN@MF@hook@B\@empty \@ifundefined{SelectBnoteRule}{}{% \expandafter\SelectFootnoteRule\SelectBnoteRule \let\SelectBnoteRule\relax}% \newfootnote[para]{B}% \newcommand{\Bnote}{\@EN@note B}% \newcommand{\Bnotelabel}{\@EN@notelabel B}% }} \DeclareOption{Bplain}{% \AtEndOfPackage{% \SetFootnoteHook{\@EN@MF@hook@B}% \let\@EN@MF@hook@B\@empty \@ifundefined{SelectBnoteRule}{}{% \expandafter\SelectFootnoteRule\SelectBnoteRule \let\SelectBnoteRule\relax}% \newfootnote{B}% \newcommand{\Bnote}{\@EN@note B}% \newcommand{\Bnotelabel}{\@EN@notelabel B}% }} \DeclareOption{Cpara}{% \PassOptionsToPackage{para}{manyfoot}% \AtEndOfPackage{% \SetFootnoteHook{\@EN@MF@hook@C}% \let\@EN@MF@hook@C\@empty \@ifundefined{SelectCnoteRule}{}{% \expandafter\SelectFootnoteRule\SelectCnoteRule \let\SelectCnoteRule\relax}% \newfootnote[para]{C}% \newcommand{\Cnote}{\@EN@note C}% \newcommand{\Cnotelabel}{\@EN@notelabel C}% }} \DeclareOption{Cplain}{% \AtEndOfPackage{% \SetFootnoteHook{\@EN@MF@hook@C}% \let\@EN@MF@hook@C\@empty \@ifundefined{SelectCnoteRule}{}{% \expandafter\SelectFootnoteRule\SelectCnoteRule \let\SelectCnoteRule\relax}% \newfootnote{C}% \newcommand{\Cnote}{\@EN@note C}% \newcommand{\Cnotelabel}{\@EN@notelabel C}% }} \DeclareOption{Dpara}{% \PassOptionsToPackage{para}{manyfoot}% \AtEndOfPackage{% \SetFootnoteHook{\@EN@MF@hook@D}% \let\@EN@MF@hook@D\@empty \@ifundefined{SelectDnoteRule}{}{% \expandafter\SelectFootnoteRule\SelectDnoteRule \let\SelectDnoteRule\relax}% \newfootnote[para]{D}% \newcommand{\Dnote}{\@EN@note D}% \newcommand{\Dnotelabel}{\@EN@notelabel D}% }} \DeclareOption{Dplain}{% \AtEndOfPackage{% \SetFootnoteHook{\@EN@MF@hook@D}% \let\@EN@MF@hook@D\@empty \@ifundefined{SelectDnoteRule}{}{% \expandafter\SelectFootnoteRule\SelectDnoteRule \let\SelectDnoteRule\relax}% \newfootnote{D}% \newcommand{\Dnote}{\@EN@note D}% \newcommand{\Dnotelabel}{\@EN@notelabel D}% }} \DeclareOption{Epara}{% \PassOptionsToPackage{para}{manyfoot}% \AtEndOfPackage{% \SetFootnoteHook{\@EN@MF@hook@E}% \let\@EN@MF@hook@E\@empty \@ifundefined{SelectEnoteRule}{}{% \expandafter\SelectFootnoteRule\SelectEnoteRule \let\SelectEnoteRule\relax}% \newfootnote[para]{E}% \newcommand{\Enote}{\@EN@note E}% \newcommand{\Enotelabel}{\@EN@notelabel E}% }} \DeclareOption{Eplain}{% \AtEndOfPackage{% \SetFootnoteHook{\@EN@MF@hook@E}% \let\@EN@MF@hook@E\@empty \@ifundefined{SelectEnoteRule}{}{% \expandafter\SelectFootnoteRule\SelectEnoteRule \let\SelectEnoteRule\relax}% \newfootnote{E}% \newcommand{\Enote}{\@EN@note E}% \newcommand{\Enotelabel}{\@EN@notelabel E}% }} % This is as much as EDMAC provides. %% TODO: efficiency!? %% TODO: shorten previous by temporary defining macro %% \@EN@tempa!? (dangerous) % % Load `mfparptc.sty' after `manyfoot.sty': \DeclareOption{edmacpara}{% \AtEndOfPackage{% % \RequirePackage{afterpackage}\AfterPackage{% TODO \RequirePackage{mfparptc}[2006/06/26]}% % <- nccfoots v1.2. % }% } % %% TODO \afterpackage: % Load `edcntwd0.sty' after `lineno.sty': \DeclareOption{countoccurrences}{% \AtEndOfPackage{\RequirePackage{edcntwd0}[2006/06/16]}} % <- first occurrence bug fix. % % `edtable' options remain "unknown" and thus are passed to % `lineno.sty'. % % Options for package `manyfoot': % Calling option `ruled' or `para' for `ednotes' is redundant, % but in case ... \DeclareOption{ruled}{\@EN@warning% {Package Option `ruled' is redundant}} \DeclareOption{para}{\@EN@warning% {Package Option `para' is redundant}} \DeclareOption{para*}{\PassOptionsToPackage{para*}{manyfoot}} % Suppresses footnote indentation. % Overrides `para' as called from own options. \DeclareOption{perpage}{\PassOptionsToPackage{perpage}{manyfoot}} % % Options for package `lineno': \DeclareOption{mathnotes}{\PassOptionsToPackage{mathrefs}{lineno}} \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{lineno}} % % %% TODO: Really load lineno.sty here!? Otherwise remove options. % %% TODO: Interfaces for alternative auxiliary packages. % \ExecuteOptions{Apara} % \newcommand... bad for opposite option. \ProcessOptions % %% Load required packages: \RequirePackage[ruled\if@EN@Apara,para\fi]{manyfoot}[2005/05/11] %% <- \SetFootnoteHook %% todo: Leave choice to user!? -> `unruled' -- \Select... suffices. %% TODO: ruled -> \Execute...!? \RequirePackage{lineno}[2004/10/11] % Hack for `lineno.sty' version. If \@LN@postlabel is defined, assume % `lineno' version 4 has been loaded. %% TODO \@ifundefined{@LN@postlabel}{% \@EN@warning{We urge you to use `lineno.sty' version 4!} \RequirePackage{linenox0}[2004/08/12]%% No page break after heading %% (left to `linenox1.sty'). }\relax % %% Execute option concerning first apparatus: \SetFootnoteHook{\@EN@MF@hook@A} \let\@EN@MF@hook@A\@empty \@ifundefined{SelectAnoteRule}{}{% \expandafter\SelectFootnoteRule\SelectAnoteRule \let\SelectAnoteRule\relax}% \if@EN@Apara \newfootnote[para]{A}% Needs `manyfoot.sty'. \newcommand{\Anote}{\@EN@note A}% \newcommand{\Anotelabel}{\@EN@notelabel A}% \else \newfootnote{A}% \newcommand{\Anote}{\@EN@note A}% \newcommand{\Anotelabel}{\@EN@notelabel A}% \fi % %% User commands (if not defined in option code etc.): \newcommand{\addlemmaexpands}{\@EN@addtomacro\@EN@lemmaexpands} %% <- local; cf. using LaTeX's \g@addto@macro: %% TODO: decide \newcommand{\showlemmaexpands}{% \typeout{\string\@EN@lemmaexpands=\meaning\@EN@lemmaexpands}% } % \DeclareTextCommandDefault{\textsymmdots}{% .\kern\fontdimen3\font.\kern\fontdimen3\font.\@% } % % %% Customizable commands: % \newcommand*{\sameline}[1]{\linesfmt{#1}} \newcommand*{\differentlines}[2]{\linesfmt{#1\textendash#2}} %% TODO: \linesfmt into \@EN@note!? \newcommand*{\linesfmt}[1]{\textbf{#1}\enspace} \newcommand*{\pageandline}[2]{#1.#2} \newcommand*{\repeatref}[1]{#1} % \newcommand*{\repeatref}[1]{\textnormal{/}} \newcommand{\lemmafmt}[1]{#1\thinspace]\enskip} %% TODO: \long!? \newcommand{\lemmaellipsis}{\textsymmdots} \newcommand{\notefmt}[1]{#1} \let\notefmt\@firstofone %% <- TODO: \long!? % \newcommand{\notefmt}[1]{#1.} % %% Core code: % Interface for manyfoot's \SetFootnoteHook facility: \newcommand{\PrecedeLevelWith}[2]{% \expandafter \renewcommand \csname @EN@MF@hook@#1\endcsname{#2}} % \renewcommand might help when an level is addressed that % has not been called through an option. % Auxiliary needed before calling \addlemmaexpands below: \long\def\@EN@addtomacro#1#2{% #1 cs, #2 new. % Local, cf. LaTeX's \g@addto@macro. \expandafter\def\expandafter#1\expandafter{#1#2}% } % %% TODO: \long!? see building of lemmaarg and lemmatag. %% TODO: \tok@ so no doubling of `#'!? % % Our sphack for going around control sequences in text: \def\@EN@sphack{\relax \ifhmode\ifdim\lastskip>\z@ \ignorespaces \fi\fi } % For ellipsis commands in moving arguments: \def\IfTypesetting{% \ifx\protect\@typeset@protect \expandafter \@firstoftwo \else \expandafter \@secondoftwo \fi } % A nice shortcut (v1.23): \def\@EN@xpxpxp{\expandafter\expandafter\expandafter} % Basic handling of \Anote etc.: \long\def\@EN@note#1#2{% #1 note family, #2 lemma. \IfTypesetting{% \def\@EN@notefam{#1}\@EN@process #2\<\>\@nil }{\@EN@robust@process #2\<\>\@nil}% } % % Lemma versions and preparing label: \long\def\@EN@process#1\<#2\>#3\@nil{% % Usage: \@EN@process #k\<\>\@nil. %% TODO: simplify using LaTeX's \in@!? % Implementation: don't leave control to user's input unless \<, \> % have been processed. <...> is postponed in main text. \def\@EN@lemmaarg{\ignorespaces#1}% % \ifx\@EN@lemmaarg\@empty %% \fi %% TODO: complain!? % \let\@EN@lemmatag\@EN@lemmaarg %% Would be overridden. \ifx\@nnil#2#3\@nnil % No ellipsis, #1 all of user's input, dummy \<\> gobbled. \@EN@addtomacro\@EN@lemmaarg\unskip \@EN@simplelemmatag \@EN@mathlemmatag \else \@EN@simplelemmatag \ifx\@nnil#3\@nnil % \<, but no \> from user. % #2 ends on \<, \>\@nil gobbled. \@EN@gobble@pause#2\@nil\@nil \else % #3 ends on dummy \<\>. \@EN@gobble@resume\@EN@gobble@pause#2\@EN@sphack\@nil % This \@EN@sphack replacing \> in main text. #3\@nil\@nil \fi \fi \IfLemmaTag % v1.3 {\@EN@lemmaarg\@gobble}% %% TODO: \...process might otherwise be redirected to %% \...robust@process immediately. %% ??? {\stepcounter{EN@label}% % Much must be expanded, especially for storing the note in a % hook (some tables): \edef\@EN@tempa{\noexpand\@EN@putdown{EN@l\number\c@EN@label}}% \@EN@xpxpxp \@EN@tempa \expandafter \@EN@notefam \expandafter {\@EN@lemmatag}}% } \long\def\@EN@gobble@pause#1\<\@nil{% \futurelet\@let@token %% <- TODO \@EN@finishlemma like \@EN@gobble@opt@till!? \@EN@finishlemma #1\@nil} % #1 contains \@nil separating arguments. % Variant of LaTeX's \@ifnextchar---don't gobble spaces: \def\@EN@finishlemma{% \ifx\@let@token<% \let\@EN@next\@EN@xfinlem \else \def\@EN@next{\@EN@xfinlem<\lemmaellipsis>}% \fi \@EN@next } \long\def\@EN@xfinlem<#1>#2\@nil#3\@nil{% \@EN@addtomacro\@EN@lemmaarg{\@EN@sphack#2#3\unskip}% \@EN@addtomacro\@EN@lemmatag{#1\@EN@CWhook{#2}#3\unskip}% \@EN@mathlemmatag % %% TODO: doc.: final \unskip -> space properly! } % Brackets might have been used instead of ; however, % I am afraid that the user might use brackets at symbols to be % printed right here. Alternative (but needs extra code to test % for \extraellipsis): \extraellipsis{ELL}. %% TODO: decide % Think of keyboards without `<', `>'? \long\def\@EN@gobble@resume#1\>\@nil{#1} \let\@EN@CWhook\@gobble %% For counting words package. \def\@EN@simplelemmatag{\let\@EN@lemmatag\@EN@lemmaarg} % Useful for math mode extension as well. \let\@EN@mathlemmatag\relax %% Hook for math mode. % % \newcounter{EN@label} % % <- for \includeonly, v1.23; sufficient v1.3: \newcount\c@EN@label \@addtoreset{EN@label}{@ckpt} % % New mechanism for ellipsis in lemma -- supporting nested lemmas % or at least lemmas shared by apparatuses exceeding one % (v1.22b 2006/01/13): \def\@EN@ltag@ellipsis{% \futurelet\@let@token\@EN@make@nested@lemmaellipsis}% \def\@EN@make@nested@lemmaellipsis{% \ifx\@let@token<% \expandafter \@EN@ellipsis@only \else \expandafter \@EN@ellipsis@only \expandafter <\expandafter \lemmaellipsis \expandafter >% \fi} \long\def\@EN@ellipsis@only<#1>#2\>{#1} % % .aux entries, note, and lemma in main text: % (v1.1: much changes. I just remove what was before, see stored % older version.) \long\def\@EN@putdown#1#2#3#4{% % #1 label, #2 note family, #3 lemma tag, #4 note. % %% TODO: \long!? \linelabel{-#1}% Ensures hmode. % Insert footnote: \@EN@hookfn{% \csname Footnotetext#2\endcsname\@empty{% % \@empty v1.12, due to HCY's report of spurious footnote marks. \csname#2notefmt\endcsname \let\@currentlabel\@empty \label{#1}% Need page number of note. \let\nopunct\@gobble % or by \if... % Print line numbers: \@ifundefined{r@#1}% %%% ...unknown + ...incomplete@ref v1.23: %%% {\differentlines\@EN@unknown\@EN@unknown}% {\let\@EN@incomplete@ref\relax \@EN@xpxpxp \@EN@extract\csname r@#1\endcsname \@EN@incomplete@ref\@EN@incomplete@ref \@EN@incomplete@ref\@EN@incomplete@ref \ifx\@EN@elemp\@EN@Incomplete \G@refundefinedtrue \let\@EN@incomplete@ref\@EN@unknown \fi \@tempswatrue \ifx\@EN@bleml\@EN@eleml \else \@tempswafalse \fi % Restart of line numbers / different page!? \ifx\@EN@blemp\@EN@elemp \else \@tempswafalse \fi \if@tempswa \sameline{\@EN@plref\@EN@blemp\@EN@bleml}% \else \@EN@lastline@z@ \differentlines{\@EN@plref\@EN@blemp\@EN@bleml}% {\ifx\@EN@blemp\@EN@elemp % v1.23 \@EN@eleml \else \pageandline\@EN@elemp\@EN@eleml \fi}% % {\@EN@plref\@EN@elemp\@EN@eleml}% \@EN@lastline@z@ \fi}% % \strut % Redundant (\rule\z@\footnotesep TODO: CHECK) % \expandafter \let \csname r@#1\endcsname \relax %% v1.1. %% <- 2005/02/21: No, need label for testing. \lemmafmt{{\@EN@lemmaexpands#3}}% \notefmt{#4}% }% }% % Lemma in main text: \nobreak \hskip\z@skip %% 2006/01/12 cf. german.sty: \allowhyphens \@EN@lemmaarg %% Should not end with space so \linelabel... %% \allowhyphens not needed here (tested) 2006/01/12 \linelabel{+#1}% % \csname #1rightmark\endcsname %% Suggested. } \let\@EN@hookfn\@firstofone \def\@EN@extract#1#2#3#4#5{% % #1 note page, #2 first lemma line, #3 first lemma page, % #4 last lemma line #5 last lemma page. \def\@EN@tempa{#1}% \def\@EN@bleml{#2}\def\@EN@blemp{#3}% \def\@EN@eleml{#4}\def\@EN@elemp{#5}% } \def\@EN@unknown{\textnormal{\bfseries ??}} % v1.23 \def\@EN@Incomplete{\@EN@incomplete@ref} % v1.23 \def\@EN@lastline@z@{\global\let\@EN@lastline\z@} \@EN@lastline@z@ % Next line number in note explicitly. \def\@EN@plref#1#2{% #1 page, #2 line. % \@EN@tempa is note page from \@EN@extract. \ifx#1\@EN@tempa %% Note and lemma part on same page. \ifx#2\@EN@lastline %% Same line as before. \repeatref#2% %% v1.1: changed use! \else #2\global\let\@EN@lastline#2% \fi \else \pageandline#1#2% %% v1.1: new! \fi } % % Expanding in note version of lemma: \let\@EN@lemmaexpands\@empty \long\def\@EN@gobble{\@EN@sphack\@gobble} \long\def\@EN@gobbletwo{\@EN@sphack\@gobbletwo} \long\def\@EN@secondofthree#1#2#3{\@EN@sphack#2} \let\IfLemmaTag\@secondoftwo % v1.3 % <- Had thought I would use it more than once ... % ... maybe for replacing some \addlemmaexpands entries: \addlemmaexpands{% \let\IfLemmaTag\@firstoftwo \let\notinnote\@EN@gobble \let\@EN@note\@EN@secondofthree \let\@EN@notelabel\@EN@gobbletwo % \let\resume\notinnote \let\pause\notinnote % <- v1.23c -- Thanks to Roy Flechner. % \let\pause\@EN@pause@ltag % v1.3 % \let\donote\@EN@gobbletwo \let\label\notinnote \let\linelabel\notinnote \let\<\@EN@ltag@ellipsis } %% <- TODO: user commands only!? (no \let) %% TODO: cf. EDMAC's tag (fonts? accents? -- lineno.sty commands?) \let\notinnote\@firstofone % % Variant of \@EN@process when moving: (v1.21/1.22) \long\def\@EN@robust@process#1\<#2\>#3\@nil#4{% #1% \ifx\@nnil#2#3\@nnil % No ellipsis, #1 all of user's input, dummy \<\> gobbled. \else \@EN@sphack@aux{}% for ensuing space in .aux, v1.3 \ifx\@nnil#3\@nnil % \<, but no \> from user. % #2 ends on \<, \>\@nil gobbled. \@EN@robust@gobble@pause#2\@nil \else % #3 ends on dummy \<\>. \@EN@gobble@resume \@EN@robust@gobble@pause#2\@EN@sphack@aux{}#3\@nil\@nil \fi \fi } \DeclareRobustCommand{\@EN@sphack@aux}{\@EN@sphack\@gobble} \long\def\@EN@robust@gobble@pause#1\<\@nil{% \@EN@gobble@opt@till#1<>\@nil} \long\def\@EN@gobble@opt@till#1<#2>#3\@nil{% \ifx\@nnil#3\@nnil #1\ifx\@nnil#2\@nnil \else <\@EN@gobble@less#2\@nil \fi % v1.3 \else \ifx\@nnil#1\@nnil\else#1<#2>\fi \@EN@gobble@diamond #3\@nil \fi} % <- TODO weak against aggressive expansion \long\def\@EN@gobble@less#1<\@nil{} \long\def\@EN@gobble@diamond#1<>\@nil{#1} % % Shorthand macros for lemma in moving argument: \newcommand\RobustTestOpt{% \ifx\protect\@typeset@protect \else \expandafter \@EN@robust@test@opt \fi } \long\def\@EN@robust@test@opt#1#2#{% \ifx\@nnil#2\@nnil \@EN@xpxpxp \@EN@expand@with@default \else \@EN@xpxpxp \@EN@expand@with@option \fi #1#2} \newcommand\@EN@expand@with@default[4]{#3[{#4}]} \newcommand\@EN@expand@with@option[4]{#3} \newcommand\NewEdnotesCommand{% \@ifstar{\@EN@newcommand*}{\@EN@newcommand{}}} \def\@EN@newcommand#1#2[#3][#4]{% \expandafter \newcommand \expandafter #2\expandafter {% \expandafter \RobustTestOpt \csname \string #2\endcsname} \def\@tempa{\newcommand#1}% \expandafter \@tempa \csname \string #2\endcsname[#3][#4]} % Handling \Anotelabel etc.: % \@EN@lemmaarg is to become the LEMMA argument for \@EN@process. % A first version is obtained by reading unto the \donote % bearing the same label. \@EN@lemmaarg is then rebuilt, % replacing \pause and \resume by \< and \>. \def\@EN@notelabel#1#2{% #1 note family, #2 label. \IfTypesetting{% v1.3 \def\@EN@notefam{#1}% \def\@EN@laplabel{#2}% \let\@EN@lemmaarg\@empty \let\@EN@next\@EN@firstnext \@EN@next }\relax % Second argument: otherwise do nothing. % The following removed braces urgently needed: % \@EN@getlabel\donote % {\@EN@laplabel % \expandafter\def\expandafter\@EN@next\expandafter % {\expandafter\@EN@replacepause % \@EN@lemmaarg\pause\@nil\resume\@nil}% % \else % \@EN@appendwrong % }% } \long\def\@EN@firstnext#1\donote#2#3{% \def\@EN@tempa{#2}% \ifx \@EN@tempa \@EN@laplabel \@EN@addtomacro\@EN@lemmaarg{#1}% \expandafter \def \expandafter \@EN@next \expandafter {% \expandafter \@EN@replacepause \@EN@lemmaarg \pause\@nil\resume\@nil{#3}}% \else \@EN@addtomacro\@EN@lemmaarg{#1\donote{#2}{#3}}% \fi \@EN@next }% \def\@EN@getlabel#1#2{% % jump to cs #1, #2: on \@EN@tempa=... % \let#2\@empty \def\@EN@appendwrong{% \expandafter\@EN@addtomacro \expandafter\@EN@lemmaarg \expandafter {\expandafter#1\expandafter{\@EN@tempa}}% }% \long\def\@EN@next##1#1##2{% % %% TODO: \let [pre-defined] for efficiency!? \@EN@addtomacro\@EN@lemmaarg{##1}% \def\@EN@tempa{##2}% \ifx\@EN@tempa#2\fi \@EN@next }% \@EN@next } \def\@EN@replacepause{% \let\@EN@lemmaarg\@empty \@EN@getlabel\pause {\@nnil \def\@EN@next\resume\@nil{\@EN@donote}% \else \ifx\@EN@tempa\@EN@laplabel \@EN@addtomacro\@EN@lemmaarg\<% \let\@EN@next\@EN@replaceresume \else \@EN@appendwrong \fi }% } \long\def\@EN@replaceresume#1\pause\@nil{% \@EN@getlabel\resume {\@nnil \let\@EN@next\@EN@donote \else \ifx\@EN@tempa\@EN@laplabel \long\def\@EN@next####1\resume\@nil % %% TODO: \let [pre-defined] for efficiency!? {\@EN@addtomacro\@EN@lemmaarg{\>####1}\@EN@donote}% \else \@EN@appendwrong \fi }% #1% \resume\@nil ahead. } \def\@EN@donote{\expandafter\@EN@process\@EN@lemmaarg \<\>\@nil} % % Variants for \@EN@notelabel in lemma tag or when moving: % (v1.3) \def\@EN@notelabel@cmd#1#2#3{% \IfLemmaTag{#2}{% \IfTypesetting{% \PackageError{ednotes}{Misplaced \string#1}{% Missing ...notelabel; cf. package documentation.}% }{\@EN@sphack@aux{}#3}}} % \newcommand\pause{% \@EN@notelabel@cmd\pause {\futurelet\@let@token\@EN@pause@ltag}\@EN@pause@aux} \def\@EN@pause@ltag#1{% \@EN@sphack\ifx\@let@token<\expandafter\@EN@gobble@opt\fi} \def\@EN@gobble@opt<#1>{} \long\def\@EN@pause@aux#1#2\resume{% \@EN@gobble@opt@till #2<>\@nil\resume} % \newcommand\resume{% \@EN@notelabel@cmd\resume\@EN@gobble\@gobble} \newcommand\donote{% \@EN@notelabel@cmd\donote\@EN@gobbletwo\@gobbletwo} % v1.1: reduce number of control strings from \newlabel. % We keep using \linelabel and \label for kind of simplicity and % because modifying them would hardly save time or save us from % the difficulties that we face here. Instead we modify % \newlabel to prevent it from dealing with labels coming from % annotations in the usual way. % % Storing and restoring of \newlabel and `lineno.sty's % \getpagewiselinenumber: %% TODO: do without the latter anyway? \let\@EN@newlabel\newlabel \let\@EN@getpagewiselno\getpagewiselinenumber \let\getpagewiselinenumber\relax \AtBeginDocument{\let\getpagewiselinenumber\@EN@getpagewiselno} % % For each lemma and note, there will be one macro carrying the % corresponding line and page numbers. Below, \@EN@tempa will % carry the name of that macro. \@EN@bleml will be the line % number, \@EN@blemp the page number from the \newlabel arguments. % \@EN@extractcslp will do the assignments for \@EN@tempa, % \@EN@bleml, and \@EN@blemp. Three \newlabel's will come to % deliver the numbers for one note, each will add to the % expansion code of the corresponding macro. The page number of % the note is attached to the left; ensuring that it is on the % same place in each case. (Indeed, usually the .aux entry from % the note comes .aux after the final entry from the lemma, but % when a page break happens within the latter, this order may % reverse.) \@EN@addtolabeldef will do this. It will at first % look as if \@EN@extractcslp and \@EN@addtolabeldef should % better have been merged into one single macro; however, we % need them for the final testing function below, where they % appear in different contexts. % TODO: The format of the numbers list is % {}{}{}{}{} % This is LaTeX-like, cf. storing of the numbers for a usual % \ref. It is easy to read the second or so term. Yet it wastes % a lot of memory with critical editions. It might be better to % use a single token as separator, as (L)EDMAC do. % \def\@EN@addtolabeldef#1#2{% add #1 left, #2 right. \expandafter \protected@xdef \@EN@tempa{% #1\@EN@tempa#2}} \def\@EN@fornotelabel#1#2#3{% #1 sign, #2 label, #3 def. \in@{\@@#1EN@l}{\@@#2}% LaTeX's \in@, \ifin@. \ifin@ \@EN@extractcslp#2\@nil#3\@nil % Now, in one step, \@EN@tempa expands to the name of the macro % that \newlabel defines at \begin{document}. % The \newlabel with `-' will always come first, so this macro % has not been defined yet: \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi} \def\newlabel#1#2{% % It should be possible to read #2 later, but it's difficult. % ...extractcslp might be split into parts of ...fornotelabel % and some other macro doing more. [TODO] \@EN@fornotelabel-{#1}{#2}{% \@EN@addtolabeldef\@gobble{{\@EN@bleml}{\@EN@blemp}}% % \typeout{\expandafter\string\@EN@tempa \space % (-) \expandafter\meaning\@EN@tempa}% }{\@EN@fornotelabel+{#1}{#2}{% \@EN@addtolabeldef{}{{\@EN@bleml}{\@EN@blemp}}% % \typeout{\expandafter\string\@EN@tempa \space % (+) \expandafter\meaning\@EN@tempa}% }{\@EN@fornotelabel{}{#1}{#2}{% \@EN@addtolabeldef{{\@EN@blemp}}{}% % \typeout{\expandafter\string\@EN@tempa \space % (p) \expandafter\meaning\@EN@tempa}% }{\@EN@newlabel{#1}{#2}}% }% + }% - } \@onlypreamble\newlabel % Unlike LaTeX, but get rid of all of % % this. A new version comes \AtEnd... % \def\@EN@extractcslp#1E#2\@nil#3#4#5\@nil{% % #1 "sign", #2 label after `E'; #5 for `hyperref.sty'. % The `E' is needed when neither - nor + ... \expandafter \def \expandafter \@EN@tempa \expandafter{% \csname r@E#2\endcsname}% % Use `r@' for \ref, cf. \@EN@putdown. \def\@EN@bleml{#3}\def\@EN@blemp{#4}} % <- Just avoid additional control strings. % No \@onlypreamble, use it in the final run as well. % % v1.1: final testing of label changes with the compressed % definitions (cf. `lblchng1.sty'). % We use the compression mechanism from the beginning to % determine the definitions for the next run. To compare them % with the present definitions, the latter must be stored % before. With nesting or overlapping lemmas, other notes may % send their information before the new definition for one note % has been finished. And when we receive data from these other % notes, we must store their previous data as well. So we cannot % use one single control string to \let it be the string that % carries the previous data corresponding to a note. Yet we % don't want to double the number of strings corresponding to % notes here. So we store the definitions in one single list, % yet only for as long as the comparison has not been completed. % % To tell to the third \newlabel that it is the third indeed, % the second \newlabel adds \@EN@ready together with number(s): \def\@EN@test@addtolabeldef#1#2{% \expandafter \ifx \@EN@tempa \relax \else % Test whether this is the third \newlabel for the note: \@EN@xpxpxp \in@ \expandafter\expandafter\expandafter \@EN@ready \expandafter\expandafter\expandafter {\@EN@tempa}% \ifin@ \let\@EN@ready\@empty \fi \@EN@addtolabeldef{#1}{#2}% Warning: should not use \in@! \ifin@ \let\@EN@ready\relax \expandafter\@EN@prepare@fromtl\@EN@tempa\@nil \expandafter\@tempa\@EN@testinglist\@nil \expandafter \ifx \@EN@tempa \@tempa \else \@tempswatrue \ifx\@tempa\relax \else \expandafter\@EN@takepagesto\@tempa\@tempa \@EN@xpxpxp \@EN@takepagesto\@EN@tempa\@EN@tempa % The message may come when line numbers have changed, not page % numbers. This may puzzle some users, but should be harmless. \typeout{^^JPackage `ednotes.sty':^^J% *** A lemma or note moved. Page numbers \@tempa\space turned into \@EN@tempa.^^J*** Rerun and watch whether they come to rest and references get right.^^J*** If they don't, use \string\pagebreak\space or \string\warningpagebreak\space to force^^J*** the earlier of oscillating page breaks.^^J*** (Cf. package documentation on `oscillating page breaks'.)}% \let\newlabel\@EN@newlabel \def\@newl@bel{\@gobblefour\relax}% Cf. `lblchng1.sty'. \fi \fi \fi \fi }% \let\@EN@ready\relax \let\@EN@testinglist\@empty \def\@EN@testlabel#1#2{% Don't change \@testdef -- `lblchng1.sty'. % Cf. our \newlabel for details. \@EN@testlabel is an extension % of it. % \typeout{testinglist: \meaning\@EN@testinglist}% \@EN@fornotelabel-{#1}{#2}{% \expandafter \ifx \@EN@tempa \relax % Label #1 not used in previous run. \@tempswatrue % Just to behave like LaTeX's \@testdef. \else % Only otherwise delicate procedure is required. % Put to testing list: \protected@edef \@EN@testinglist{\@EN@testinglist \expandafter \protect \@EN@tempa{\@EN@tempa}}% % First contribution to ...: \@EN@addtolabeldef\@gobble{{\@EN@bleml}{\@EN@blemp}}% \fi % \typeout{\expandafter\string\@EN@tempa \space % (-) \expandafter\meaning\@EN@tempa}% }{\@EN@fornotelabel+{#1}{#2}{% \@EN@test@addtolabeldef\@EN@ready{% {\@EN@bleml}{\@EN@blemp}}% % \typeout{\expandafter\string\@EN@tempa \space % (+) \expandafter\meaning\@EN@tempa}% }{\@EN@fornotelabel{}{#1}{#2}{% \@EN@test@addtolabeldef{{\@EN@blemp}}\@EN@ready % \typeout{\expandafter\string\@EN@tempa \space % (p) \expandafter\meaning\@EN@tempa}% }{\@EN@newlabel{#1}{#2}}% }% + }% - } % \def\@EN@prepare@fromtl#1\@nil{% \def\@tempa##1\protect#1##2##3\@nil{% \def\@tempa{##2}\def\@EN@testinglist{##1##3}}} \def\@EN@takepagesto#1#2#3#4#5#6{\def#6{#1, #3, #5}} \AtEndDocument{\let\newlabel\@EN@testlabel \let\getpagewiselinenumber\relax} %% TODO without!? % % v1.23: \warningpagebreak: \AtEndDocument{\@EN@pagebreaks@finalwarn} \let\@EN@pagebreaks@finalwarn\relax \def\@EN@pagebreaksfinalwarn{% \typeout{^^J% Package ednotes: There have been \string\warningpagebreak\space occurrences.^^JFor your final version, we recommend checking whether they still are^^Jappropriate.^^J}% } \def\warningpagebreak{% \@EN@warning{Page break (\string\warningpagebreak) from user^^J-- still appropriate in final version!? --}% \global\let\@EN@pagebreaks@finalwarn\@EN@pagebreaksfinalwarn \pagebreak} %% TODO: \afterassignment possible anywhere? %% TODO: remove testing \typeout's. %% Reminder about `mfparxsp.sty': \AtBeginDocument{% \@ifpackageloaded{mfparxsp}{% \PackageWarningNoLine{ednotes}{% %% TODO: \PackageError? You have loaded `mfparxsp.sty',\MessageBreak which defines \string\MFparaxbuffer.\MessageBreak We recommend, instead, \string\ExtraParaSkip\space \MessageBreak from `manyfoot.sty' version 1.7\MessageBreak (CTAN:macros/latex/ncctools).\MessageBreak Cf. ednotes package documentation% }% }\relax } \endinput %% TODO: \newcommand whenever possible!? %% TODO: with v1.1: warn about \label{[-+]EN@l...}. Maybe make %% \label and \linelabel internal, new user versions check %% the argument. %% TODO: warn about \usepackage{foo} where foo is loaded by option!? %% TODO: .dtx %% TODO: license for *bundle* %% TODO: ... or cf. the brief and clear conditions in Eurofont %% (Rowland McDonnell) %% TODO: Bigfoot/e-TeX (Kastrup) %% TODO: compatibility with Parallel.sty -- Sergei Mariev 2003/06/19. %% (hopeless, I'm afraid) -- 2005/02/19: Cf. Peter Wilson's %% ledpar. %% VERSION HISTORY: v0.36 2003/01/13 First version sent around. v0.37 2003/01/22 Added version history and reference to `mfparptc.sty'. v0.38 2003/01/27 Improved copyright notice. v0.39 2003/02/06 Documentation: output + splitting problem, explanations of recommended packages. v0.4 2003/03/03 Splitting problem remedied by linenox0. v0.41 2003/03/03 our owns -> ourselves. + !? v0.42 2003/03/04 Some remarks/TODOs, especially concerning \SplitNote, changed lppl hint. v0.43 2003/03/23 Doc.: "may" -> "must" [not be hidden]. v0.44 2003/03/24 Took e-mail addresses list from edtab; added comparison with LEDMAC. TODOs for reading `MFPartPtc.sty'; \Require...{linenox0}[2003/03/23]; changed acknowledgements: still remains? Stephan's approach, encouragement, U.L.; minor changes in `overview'; point to EDMAC homepage; TODO: ruled user's choice? ---Sent to Peter and Dominik. v0.45 2003/03/28 LEDMAC hint: replaced `Correct me ...' by "single printable file" + "enhanced"; Version History: 04 -> 03 at v0.44; MFParPtc ToDo below: !! -> !? ---Sent to Peter. v0.46 2003/04/15 \renewcommand -> \newcommand in \Anotefmt customization---thanks to Robert Alessi! added bug report acknowledgement. v0.47 2003/05/01 Added \@ in \textsymmdots. v0.48 2003/06/22 Replaced \@secondoftwo by \@EN@second (Hyperref); placed \let\@EN@lastline correctly---both thanks to Sergei Mariev! 2003/07/09 Added note on `hyperref.sty'. v0.49 2003/09/03 Added documentation to evade the \donote bug. 2003/11/06 Require corrected `linenox0.sty'. 2003/11/13 Require corrected `lineno.sty'. v0.5b 2003/12/30 Added \@EN@first and \@EN@gtempa for \repeatref. 2003/12/31 Removed argument redundancy in \addlemmaexpands. v0.5 2004/01/04 Added \@EN@CWhook for counting words package. v0.51 2004/01/06 Require corrected `linenox0.sty'. v0.6 2004/03/01 Removed two lines from preamble and mention of \donote bug (v0.49), fixed the latter. v0.61 2004/04/15 Changed `Comparison with LEDMAC' concerning TABMAC and implementation, reformulated `acknowledgements'. Unified quotation marks with `....sty'. 2004/04/22 Removed `wait vor Alex...' and `CTAN soon' concerning LEDMAC. 2004/04/28 Removed `New with v0.4'. 2004/05/12 Removed `few weeks' before `similar' in doc., changed doc. concerning effects of different implementations. Mentioned indexing, `Edstanza', "minipage", and sidenotes concerning LEDMAC. Included Florian Kragl in acknowledgements. Added `A problem' (notes height estimation). Sent around. Added Christian to copyright, L"uck -> L\"uck. `edtab02' -> `edtable'. 2004/07/20 Suggested \csname #2leftmark etc. 2004/07/22 Used \DeclareOption*, removed `BETA TEST RELEASE'. v0.62 2004/08/16 \RequirePackage{linenox0}[2004/08/12], LPPL v1.3; \@EN@shortlemmatag, \@EN@initlemmatag, \@EN@finmathlemmatag. v0.63 2004/08/16 Replaced previous by \@EN@simplelemmatag and \@EN@mathlemmatag. v0.64 2004/08/19 Removed stars from ...newcommands of macros that have no parameter, added some with parameters (undid this?), however made \lemmafmt and \notefmt long (star). 2004/08/22 Changed `Packages required'. 2004/08/31 Rearranged preamble concerning maintenance. v0.7 2004/09/19 \Req...{linenox0}... etc. only with lineno v<4. 2004/09/20 Adjustment of instructions to bundle changes; `I.' after `Alexander'. v0.71 2004/09/21 Took explanation for \ExtraP... from `mfparxsp.sty' and removed mention of the latter; removed a comment mark from a documentation line. Changed lineno.sty/tex into ...pdf. v1.0 2004/10/07 Changed documentation for additional options for `edtable', `edmacpara', `countoccurrences'; hint at TUGboat article; removed mention of `linenox0.sty'. 2004/10/08 Replaced \newif\if@EN@Apara@; replaced redundant option passes redundancy warnings; options `edmacpara' and `countoccurences'; removed TODOs concerning `mfparptc.sty'. 2004/10/11 `perpage' option; acknowledgements for co-operation. 2004/10/13 Require debugged `mfparptc.sty' and `edcntwd0.sty' as well as `lineno.sty' equipped with new options. 2004/10/18 Reminder on `mfparxsp.sty', changed TODOs. v1.0a 2004/11/07 LPPL v1.3a. v1.0b 2005/01/10 Contact via http. 2005/01/19 Mentioned `ellipsis' package. v1.01 2005/02/05 \Packagewarning -> \PackageWarning. v1.1b 2005/02/20 Documentation: `ledpar', `ednotugb.pdf', implementation. Only one cs per note -> much different! Require new `edcntwd0,sty'. With v1.1b, testing (`lblchng1.sty') is disabled. v1.1c 2005/02/20 Deleted \tracingmacros, earlier kept erroneously. v1.1d 2005/02/21 Final testing of label changes. Moved v1.1 macros towards end. 2005/03/06 Reimplemented compression (v1.1b) and final testing (v1.1d) very much + minor changes. v1.1 2005/03/08 Notes on \repeatref, \pageandline, and new `edcntwd0.sty' version. Top: `editory notes' -> `critical editions'. Acknowledgement to Roy Flechner. v1.11 2005/04/07 Doc typo with ...plref. 2005/04/09 \Provides...: `editory notes' -> `critical editions'. Sent to Ednotes.news . v1.12 2005/04/09 \@empty with Footnotetext... v1.12a /04/09 Acknowl. Hillel Chayim Yisraeli. 2005/04/10 Supplied LPPL URL, corrected \file... Sent to CTAN and Ednotes.news . v1.12b /04/11 address -> URL . 2005/05/01 Due to removing \@EN@first, older version of edcntwd0.sty suffices. 2005/05/12 Remark on hyperref changed due to lineno.sty v4.3 . [not sent, not tested] v1.12c /09/21 Doubled some hash marks in explanation of customization, adapted doc. to \@EN@sphack. [not sent] v1.2b 2005/09/22 Updated doc. wrt. availability of manyfoot.sty; \PrecedeLevelWith . 2005/09/24 \let\notthislemma\@firstofone (was bug without). v1.2 2005/10/01 \notthislemma -> \notinnote; explained \Precede... Sent to CTAN. v1.2a 2005/10/02 supplied mention of HCY for v1.12. [not sent] v1.21 2005/10/12 \@EN@process tests #3 on empty without \@EN@tempa; withdummy -> gobble@pause, killresume -> gobble@resume; \@EN@robust@process. v1.22b /11/21 \if@EN@in@note; \@EN@firstnext. 2005/11/28 @EN@in@note -> LemmaTag; \@EN@gobble[two] 2006/01/12 \allowhyphens in \@EN@putdown. 2006/01/13 New \<<...>...\>. [to Lekhtman] 2006/01/15 \long with \@EN@lemma@ellipsis; removed general definition of \< . v1.22 2006/01/16 \@EN@robust@process now really gobbles note, removed wrong \@empty from \@EN@gobble@diamond; \RobustTestOpt, \NewEdnotesCommand. v1.23 2006/01/23 Example on \NewEdnotesCommand: default "B" -> "A". 2006/06/07 Changed page-line algorithm with \differentlines; edcntwd0.sty v0.32 required; \c@EN@label LaTeX counter; \expandafter\expandafter\expandafter -> \@EN@xpxpxp 2006/06/15 \@EN@warning; edcntwd0.sty v0.32a required. 2006/06/16 Additional screen advice with oscillating page breaks + explanation in manual (\warningpagebreak). v1.23a /06/20 Corrected \RequirePackage{edcntwd0}-date. v1.23b /06/22 Require manyfoot v1.9. /06/26 LPPL v1.3c; require mfparptc v4.1; remarks on hyphenation of first word in lemma tag. v1.23c /06/27 Fix for \pause/\resume in lemma tag (Roy Flechner, a few day later Christian Tapp as well). v1.3 2006/06/27 affirmed \long's (were TODOs); simplified \@EN@gobble@pause. 2006/06/28 \@EN@robust@process refined; gobble \>\@nil etc.; \@EN@sphack@aux. 2006/06/29 \ifLemmaTag -> \IfLemmaTag (-> doc.); lemma@ellipsis -> ltag@ellipsis; \IfTypesetting; \@EN@notelabel@cmd, \@EN@pause@ltag, \@EN@pause@aux. 2006/07/05 \SelectAnoteRule etc. supporting manyfoot's \SelectFootnoteRule. 2006/07/06 \includeonly just with \@addtoreset{@ckpt}. [Sent to CTAN, Christian, Sergei] v1.3a 2006/07/20 Blank screen line above/below final warning. 2006/10/05 News about perpage.