diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/eledmac/eledmac.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/eledmac/eledmac.dtx | 11773 |
1 files changed, 11773 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/eledmac/eledmac.dtx b/Master/texmf-dist/source/latex/eledmac/eledmac.dtx new file mode 100644 index 00000000000..b327f5ee304 --- /dev/null +++ b/Master/texmf-dist/source/latex/eledmac/eledmac.dtx @@ -0,0 +1,11773 @@ +% \iffalse meta-comment +% +% eledmac.dtx +% Author: Peter Wilson (Herries Press) herries dot press at earthlink dot net +% Maintainer:Maïeul Rouquette maieul at maieul dot net +% Copyright 2003 -- 2005 Peter R. Wilson / 2011-.. Maïeul Rouquette +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either +% version 1.3 of this license or (at your option) any +% later version. +% The latest version of the license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of +% LaTeX version 2003/06/01 or later. +% +% This work has the LPPL maintenance status "maintained". +% +% This work consists of the files listed in the README file. +% +% +%<*driver> +\documentclass[twoside]{ltxdoc} +\usepackage{url} + \usepackage[draft=false, + plainpages=false, + pdfpagelabels, + bookmarksnumbered, +% hyperindex=true + hyperindex=false + ]{hyperref} +\usepackage[utf8]{inputenc} +\providecommand{\phantomsection}{} % just in case hyperref is not used +\usepackage{graphicx} +\makeatletter + \@mparswitchfalse +\makeatother +\EnableCrossrefs +\RecordChanges +\CodelineIndex +%%\OnlyDescription +\renewcommand{\MakeUppercase}[1]{#1} +\pagestyle{headings} +\setcounter{StandardModuleDepth}{1} +\setcounter{IndexColumns}{2} +\begin{document} + \raggedbottom + \DocInput{eledmac.dtx} +\end{document} +%</driver> +% +% \fi +% +% \CheckSum{7418} +% +% \makeatletter +% \newcommand*{\DescribeIt}{\leavevmode\@bsphack\begingroup\MakePrivateLetters +% \Describe@It} +% \newcommand*{\Describe@It}[1]{\endgroup +% \marginpar{\raggedleft\PrintDescribeEnv{#1}}% +% \SpecialItIndex{#1}\@esphack\ignorespaces} +% \newcommand*{\SpecialItIndex}[1]{\@bsphack +% \index{#1\actualchar{\protect\ttfamily#1}\encapchar usage}\@esphack} +% +% \DoNotIndex{\@,\@@par,\@beginparpenalty,\@empty} +% \DoNotIndex{\@flushglue,\@input} +% \DoNotIndex{\@makefnmark,\@makeother,\@maketitle} +% \DoNotIndex{\@namedef,\@ne,\@spaces,\@tempa} +% \DoNotIndex{\@tempb,\@tempswafalse,\@tempswatrue} +% \DoNotIndex{\@thanks,\@thefnmark,\@topnum} +% \DoNotIndex{\@@,\@elt,\@forloop,\@fortmp,\@gtempa,\@totalleftmargin} +% \DoNotIndex{\",\/,\@ifundefined,\@nil,\@verbatim,\@vobeyspaces} +% \DoNotIndex{\|,\~,\ ,\active,\advance,\aftergroup,\begingroup,\bgroup} +% \DoNotIndex{\mathcal,\csname,\def,\documentstyle,\dospecials,\edef} +% \DoNotIndex{\egroup} +% \DoNotIndex{\else,\endcsname,\endgroup,\endinput,\endtrivlist} +% \DoNotIndex{\expandafter,\fi,\fnsymbol,\futurelet,\gdef,\global} +% \DoNotIndex{\hbox,\hss,\if,\if@inlabel,\if@tempswa,\if@twocolumn} +% \DoNotIndex{\ifcase} +% \DoNotIndex{\ifcat,\iffalse,\ifx,\ignorespaces,\index,\input,\item} +% \DoNotIndex{\jobname,\kern,\leavevmode,\leftskip,\let,\llap,\lower} +% \DoNotIndex{\m@ne,\next,\newpage,\nobreak,\noexpand,\nonfrenchspacing} +% \DoNotIndex{\obeylines,\or,\protect,\raggedleft,\rightskip,\rm,\sc} +% \DoNotIndex{\setbox,\setcounter,\small,\space,\string,\strut} +% \DoNotIndex{\strutbox} +% \DoNotIndex{\thefootnote,\thispagestyle,\topmargin,\trivlist,\tt} +% \DoNotIndex{\twocolumn,\typeout,\vss,\vtop,\xdef,\z@} +% \DoNotIndex{\,,\@bsphack,\@esphack,\@noligs,\@vobeyspaces,\@xverbatim} +% \DoNotIndex{\`,\catcode,\end,\escapechar,\frenchspacing,\glossary} +% \DoNotIndex{\hangindent,\hfil,\hfill,\hskip,\hspace,\ht,\it,\langle} +% \DoNotIndex{\leaders,\long,\makelabel,\marginpar,\markboth,\mathcode} +% \DoNotIndex{\mathsurround,\mbox,\newcount,\newdimen,\newskip} +% \DoNotIndex{\nopagebreak} +% \DoNotIndex{\parfillskip,\parindent,\parskip,\penalty,\raise,\rangle} +% \DoNotIndex{\section,\setlength,\TeX,\topsep,\underline,\unskip,\verb} +% \DoNotIndex{\vskip,\vspace,\widetilde,\\,\%,\@date,\@defpar} +% \DoNotIndex{\[,\{,\},\]} +% \DoNotIndex{\count@,\ifnum,\loop,\today,\uppercase,\uccode} +% \DoNotIndex{\baselineskip,\begin,\tw@} +% \DoNotIndex{\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k,\l,\m,\n,\o,\p,\q} +% \DoNotIndex{\r,\s,\t,\u,\v,\w,\x,\y,\z,\A,\B,\C,\D,\E,\F,\G,\H} +% \DoNotIndex{\I,\J,\K,\L,\M,\N,\O,\P,\Q,\R,\S,\T,\U,\V,\W,\X,\Y,\Z} +% \DoNotIndex{\1,\2,\3,\4,\5,\6,\7,\8,\9,\0} +% \DoNotIndex{\!,\#,\$,\&,\',\(,\),\+,\.,\:,\;,\<,\=,\>,\?,\_} +% \DoNotIndex{\discretionary,\immediate,\makeatletter,\makeatother} +% \DoNotIndex{\meaning,\newenvironment,\par,\relax,\renewenvironment} +% \DoNotIndex{\repeat,\scriptsize,\selectfont,\the,\undefined} +% \DoNotIndex{\arabic,\do,\makeindex,\null,\number,\show,\write,\@ehc} +% \DoNotIndex{\@author,\@ehc,\@ifstar,\@sanitize,\@title,\everypar} +% \DoNotIndex{\if@minipage,\if@restonecol,\ifeof,\ifmmode} +% \DoNotIndex{\lccode,\newtoks,\onecolumn,\openin,\p@,\SelfDocumenting} +% \DoNotIndex{\settowidth,\@resetonecoltrue,\@resetonecolfalse,\bf} +% \DoNotIndex{\clearpage,\closein,\lowercase,\@inlabelfalse} +% \DoNotIndex{\selectfont,\mathcode,\newmathalphabet,\rmdefault} +% \DoNotIndex{\bfdefault} +% \DoNotIndex{\newcommand,\renewcommand,\providecommand} +% \DoNotIndex{\ ,\to,\hsize,\multiply,\textit} +% +% \newcommand{\dtxfilename}{\texttt{eledmac.dtx}} +% \def\fileversion{v0.1} \def\filedate{2003/03/25} +% \def\fileversion{v0.2} \def\filedate{2003/08/16} +% \def\fileversion{v0.2.1} \def\filedate{2003/09/13} +% \def\fileversion{v0.2.2} \def\filedate{2003/11/09} +% \def\fileversion{v0.3} \def\filedate{2004/02/14} +% \def\fileversion{v0.3.1} \def\filedate{2004/02/18} ^^A never released +% \def\fileversion{v0.4} \def\filedate{2004/02/29} +% \def\fileversion{v0.5} \def\filedate{2004/04/04} +% \def\fileversion{v0.5.1} \def\filedate{2004/04/10} +% \def\fileversion{v0.6} \def\filedate{2004/12/10} +% \def\fileversion{v0.7} \def\filedate{2005/03/24} +% \def\fileversion{v0.8} \def\filedate{2011/07/11} +% \def\fileversion{v0.8.1} \def\filedate{2011/07/14} +% \def\fileversion{v0.9} \def\filedate{2011/08/03} +% \def\fileversion{v0.9.1} \def\filedate{2011/08/08} +% \def\fileversion{v0.10} \def\filedate{2011/08/22} +% \def\fileversion{v0.11} \def\filedate{2011/09/16} +% \def\fileversion{v0.12} \def\filedate{2011/10/01} +% \def\fileversion{v0.12.1} \def\filedate{2011/10/02} +% \def\fileversion{v0.13} \def\filedate{2011/11/08} +% \def\fileversion{v0.13.1} \def\filedate{2011/11/18} +% \def\fileversion{v0.14} \def\filedate{2012/04/04} +% \def\fileversion{v0.15} \def\filedate{2012/06/11} +% \def\fileversion{v0.16} \def\filedate{2012/06/21} +% \def\fileversion{v0.17} \def\filedate{2012/08/03} +% \def\fileversion{v1.0}\def\filedate{2012/09/15} +% \def\fileversion{v1.0.1}\def\filedate{2012/09/16} +% \changes{v0.1}{2003/03/25}{First public release} +% \changes{v0.2}{2003/08/16}{Added tabmac code, and extended indexing} +% \changes{v0.2.1}{2003/09/13}{Bug fixes and match with mempatch v1.8} +% \changes{v0.2.2}{2003/11/09}{Improved paragraph footnotes} +% \changes{v0.2.2}{2003/11/09}{New Dekker example} +% \changes{v0.3}{2004/02/14}{Includes edstanza and more} +% \changes{v0.3.1}{2004/02/18}{Not released. Added remarks about the parallel package} +% \changes{v0.4}{2004/02/29}{Added minipage, etc., support} +% \changes{v0.4.1}{2004/03/28}{Not released. Minor editorial improvements and code tweaks} +% \changes{v0.5}{2004/04/04}{Added sidenotes, familiar footnotes in numbered text} +% \changes{v0.5.1}{2004/04/10}{Fixed right line numbers killed in v0.5} +% \changes{v0.6}{2004/11/16}{Fixed long paragraphs looping} +% \changes{v0.6}{2004/11/16}{Prepared for eledpar package} +% \changes{v0.6}{2004/12/10}{Fixed minor typos} +% \changes{v0.7}{2005/02/18}{Tidying up for eledpar and ledarab packages} +% \changes{v0.7}{2005/02/18}{Replaced all \cs{interAfootnotelinepenalty}, etc., +% by just \cs{interfootnotelinepenalty}} +% \changes{v0.7}{2005/03/02}{eledmac having been available for 2 years, +% deleted the commented out original edmac texts} +% \changes{v0.7}{2011/06/17}{Ma\"ieul Rouquette new maintainer} +% \changes{v0.8}{2011/17/06}{Bug on endnotes fixed: in a // text, all endnotes will print and be placed at the ends of columns (!)} +% \changes{v0.8.1}{2011/07/14}{Bug on \cs{edtext} ; \cs{critex} ; \cs{lemma} fixed: we can now us non switching commands} +% \changes{v0.9}{2011/08/03}{No more ledpatch. All patches are now in the main file.} +% \changes{v0.9.1}{2011/08/08}{Fix some bugs linked to integrating ledpatch on the main file.} +% \changes{v0.10}{2011/08/22}{Corrections to \cs{section} and other titles in numbered sections} +% \changes{v0.11}{2011/09/16}{Makes it possible to add a symbol on each verse's hanging, as in French typography. Redefines the command \cs{hangingsymbol} to define the character.} +% \changes{v0.12}{2011/10/01}{Possibility to number the pstart with the commands \cs{numberpstarttrue}.} +% \changes{v0.12}{2011/10/01}{For compatibility with eledpar, possibility to use \cs{autopar} on the right side.} +% \changes{v0.12.1}{2011/10/02}{The numbering of \cs{pstarts} restarts on each \cs{beginnumbering}.} +% \changes{v0.12.1}{2011/10/02}{Don't number \cs{pstarts} of stanza.} +%\changes{v0.13}{2011/11/08}{New stanzaindentsrepetition counter to repeat stanza indents every \emph{n} verses.} +% \changes{v0.13.1}{2011/11/18}{\cs{thepstartL} and \cs{thepstartR} use now \cs{bfseries} and not \cs{bf}, which is deprecated and makes conflicts with memoir class.} +% \changes{v0.14}{2012/04/04}{Tweaked \cs{edlabel} to get correct line number if the command is first element of a paragraph.} +% \changes{v1.0}{2012/09/15}{Some compatibility break with eledmac. Change of name: eledmac.} +% \hyphenation{man-u-script man-u-scripts} +% +% \newcommand{\Lpack}[1]{\textsf{#1}} +% \newcommand{\Lclass}[1]{\textsf{#1}} +% \newcommand{\file}[1]{\texttt{#1}} +% \newcommand{\eledmac}{eledmac} +% \newcommand{\Eledmac}{\Lpack{\eledmac}} +% \newcommand{\edmac}{\texttt{EDMAC}} +% \newcommand{\tabmac}{\texttt{TABMAC}} +% \newcommand{\edstanza}{\texttt{EDSTANZA}} +% \newcommand{\texbook}{\textit{TeXbook}} +% \newcommand{\thetexbook}{\textit{The TeXbook}} +% +% ^^A PW added following as the definitions are at some unknown elsewhere +% \newcommand{\egstart}{} +% \newcommand{\egmid}{} +% \newcommand{\egend}{} +% +% \renewcommand{\egstart}{% +% \par +% \begingroup +% \centering +% \begin{minipage}{0.45\textwidth}} +% \renewcommand{\egmid}{% +% \end{minipage}\hfill\begin{minipage}{0.45\textwidth}} +% \renewcommand{\egend}{% +% \end{minipage}\par\endgroup} +% +% \title{\Lpack{\eledmac} \\ +% A presumptuous attempt to port \\ +% \edmac, \tabmac{} and \edstanza{} to LaTeX\thanks{This file (\dtxfilename) +% has version number \fileversion, last revised \filedate.}} +% +% \author{% +% Peter Wilson \\ +% Herries Press\thanks{% +% \texttt{herries dot press at earthlink dot net}} \\ +% Ma\"ieul Rouquette\thanks{\texttt{maieul at maieul dot net}} \\ +% {\small based on the original work by} \\ +% John Lavagnino, Dominik Wujastyk, Herbert Breger and Wayne Sullivan +% } +% +% \date{} +% +% \iffalse This is a METACOMMENT +% This METACOMMENT is part of the original EDMAC +% Everything up to the next `\ fi' (without a blank) will +% be ignored. This is necessary because `%' may no longer +% be a comment mark when this file is read in. +% +% The original EDMAC was written by: +% \author{John Lavagnino\thanks{% +% Department of English and American Literature, +% Brandeis University, +% 415 South Street, +% Waltham, MA 02254--9110, USA. +% Internet: {\tt lav@binah.cc.brandeis.edu}, +% Bitnet: {\tt lav@brandeis}.} +% \and Dominik Wujastyk\thanks{% +% Wellcome Institute for the History of Medicine, +% 183 Euston Road, +% London NW1 2BE, UK. +% Internet: {\tt D.Wujastyk@ucl.ac.uk}, +% Bitnet: {\tt dow@harvunxw}.}} +% \date{} +% +% +% Macro file `EDMAC' for use with Plain TeX. +% Copyright (C) 1990, 1991, 1992, 1993, 1994 John Lavagnino and Dominik +% Wujastyk, all rights reserved. +% +% Copying of this file is authorized only if either +% (1) you make absolutely no changes to your copy, including name, or +% (2) if you do make changes, you name it something other than +% edmac.tex or edmac.doc +% This restriction helps to ensure that the macro development is orderly. +% +% \fi +% +% \maketitle +% +% +% \begin{abstract} +% \edmac, a set of \PlainTeX\ macros, was made at the begining of 90's +% for typesetting critical editions in the traditional +% way, i.e., similar to the Oxford Classical Texts, Teubner, Arden +% Shakespeare and other series. A separate set of \PlainTeX\ macros, +% \tabmac, provides for tabular material. Another set of \PlainTeX\ +% macros, \edstanza, assists in typesetting verse. +% +% The \Eledmac{} package makes the +% \edmac, \tabmac{} and \edstanza{} facilities available to authors +% who would prefer +% to use LaTeX. The principal functions provided by the package +% are marginal line numbering and multiple series of +% footnotes and endnotes keyed to line numbers. +% +% In addition to the \edmac, \tabmac{} and \edstanza{} functions the package +% also provides for index entries keyed to both page and line numbers. +% Multiple series of the familiar numbered footnotes are also available. +% +% Other LaTeX packages for critical editions include EDNOTES, and +% \Lpack{poemscol} for poetical works. +% +% To report bugs, please go to ledmac's GitHub page and click "New Issue": \url{https://github.com/maieul/ledmac/issues/}. You must open an account with github.com to access my page (maieul/ledmac). GitHub accounts are free for open-source users. +% +% You can subscribe to the eledmac mail list in:\\ \url{https://lists.berlios.de/pipermail/ledmac-users/} +% \end{abstract} +% +% \tableofcontents +% +% \listoffigures +% +% +% \section{Introduction} +% +% The \edmac{} macros \cite{EDMACTUG} for typesetting critical editions of texts +% have been available for use with TeX since 90's. Since \edmac{} +% was introduced there has been a small but constant demand for a +% version of \edmac{} that could be used with LaTeX. The \Lpack{eledmac} +% package is an attempt to satisfy that request. +% +% +% \Eledmac{} would not have been possible without the amazing work by +% John Lavagnino\index{Lavagnino, John} +% and Dominik Wujastyk\index{Wujastyk, Dominik}, +% the original authors of \edmac. +% I, Peter Wilson, am very grateful for their encouragement and permission to use +% \edmac{} as a base. +% The majority of both the code and this manual are by these two. +% The tabular material is based on the +% \tabmac{} code~\cite{TABMAC}, by permission of its author, +% Herbert Breger\index{Breger, Herbert}. +% The verse-related code is by courtesy of Wayne Sullivan, the author +% of \edstanza~\cite{EDSTANZA}, who has kindly supplied more than +% his original macros. +% +% Since 2011's Maïeul Rouquette begun to maintain and extend \eledmac{}. As plain \TeX{} is used by little people, and \LaTeX{} by more people \Eledmac{} and original \edmac{} are more and more distant. +% +% +% +% +% \subsection{Overview} +% +% +% The \Eledmac{} package, together with LaTeX, provides several +% important facilities for formatting critical editions of texts in +% a traditional manner. Major features include: +% \begin{itemize}\addtolength{\itemsep}{-1ex} +% \item automatic stepped line numbering, by page or by section; +% \item sub-lineation within the main series of line numbers; +% \item variant readings automatically keyed to line numbers; +% \item caters for both prose and verse; +% \item multiple series of the footnotes and endnotes; +% \item block or columnar formatting of the footnotes; +% \item simple tabular material may be line numbered; +% \item indexing keyed to page and line numbers. +% \end{itemize} +% +% +% \Eledmac{} allows the scholar engaged in preparing a critical +% edition to focus attention wholly on the task of creating the +% critical text and evaluating the variant readings, text-critical +% notes and testimonia. \LaTeX{} and \Eledmac{} will take care of +% the formatting and visual correlation of all the disparate types +% of information. +% +% +% +% +% +% The original \edmac{} can be used as a `stand alone' processor +% or as part of a process. One example is its use as the formatting +% engine or `back end' for the output of an automatic manuscript +% collation program. \texttt{COLLATE}, written by +% Peter\index{Robinson, Peter} Robinson, +% runs on the Apple Macintosh, can collate simultaneously up to a +% hundred manuscripts of any length, and provides facilities for +% the scholar to tailor the collation interactively. For further +% details of this and other related work, visit the \edmac{} home page +% at \url{http://www.homepages.ucl.ac.uk/~ucgadkw/edmac/index.html}. +% +% Apart from \Eledmac{} there are some other LaTeX packages for +% critical edition typesetting. As Peter Wilson is not an author, or even a +% prospective one, of any critical +% edition work he could not provide any opinions on what authors in this +% area might feel comfortable with or how well any of the packages +% meet their needs. +% +% \texttt{EDNOTES}~\cite{EDNOTES}, by Uwe L\"{u}ck\index{L\"uck, Uwe} and +% Christian Tapp\index{Tapp, Christian}, is another +% LaTeX package being developed for critical editions. Unlike \Eledmac{} +% which is based on \edmac, \texttt{EDNOTES} takes a different (internal) +% approach and provides a different set of features. For example it +% provides additional facilities for overlapping lemmas and for +% handling tables. For more information there is a web site at +% \url{http://ednotes.sty.de.vu} or +% email to \url{ednotes.sty@web.de}. +% +% The \Lpack{poemscol} package~\cite{POEMSCOLTUG} by John Burt\index{Burt, John} +% is designed for typesetting +% critical editions of collections of poems. I do not know how, or whether, +% \Lpack{poemscol} and \Eledmac{} will work together. +% +% Critical authors may find it useful +% to look at \edmac, \texttt{EDNOTES}, \Eledmac, and \Lpack{poemscol} to +% see which best meets their needs. +% +% At the time of writing Peter Wilson knows of two web sites, apart from the \edmac{} +% home page, that have information on \Eledmac, and other programs. +% \begin{itemize} +% \item Jer\'{o}nimo Leal\index{Leal, Jeronimo@Leal, Jer\'{o}nimo} +% pointed me to \url{http://www.guit.sssup.it/latex/critical.html}. This +% also mentions another package for critical editions called +% \Lpack{MauroTeX} (\url{http://www.maurolico.unipi.it/mtex/mtex.htm}). +% These sites are both in Italian. +% \item Dirk-Jan Dekker\index{Dekker, Dirk-Jan} maintains +% \url{http://www.djdekker.net/eledmac} +% which is a FAQ for typesetting critical editions and \Eledmac. +% \end{itemize} +% +% +% This manual contains a general description of how to use the LaTeX version of \edmac, namely \Eledmac +% (in sections~\ref{howto} through~\ref{sec:lastuser}); +% the complete source code for the package, +% with extensive documentation (in sections~\ref{overview} and following) +% ; and an Index to the +% source code. We do not suggest that you need to +% read the source code for this package in order to use it; we +% provide this code primarily for reference, and many of our +% comments on it repeat material that is also found in +% the earlier sections. But no documentation, however +% thorough, can cover every question that comes up, and many can be +% answered quickly by consultation of the code. On a first reading, +% we suggest that you should read only the general documentation in +% sections~\ref{howto}, unless you are particularly interested in the innards of \Eledmac. +% +% \subsection{History} +% +% \subsubsection{EDMAC} +% +% The original version of \edmac{} was \texttt{TEXTED.TEX}, written +% by John Lavagnino\index{Lavagnino, John} +% in late 1987 and early 1988 for formatting +% critical editions of English plays. +% +% John passed these macros on to Dominik Wujastyk\index{Wujastyk, Dominik} +% who, in +% September--October 1988, added the footnote paragraphing mechanism, +% margin swapping and other changes to suit his own purposes, making the +% style more like that traditionally used for classical texts in Latin and +% Greek (e.g., the Oxford Classical Texts series). He also wrote some +% extra documentation and sent the files out to several people. This +% version of the macros was the first to be called \edmac. +% +% The present version was developed in the summer of 1990, with the +% intent of adding necessary features, streamlining and documenting +% the code, and further generalizing it to make it easily adaptable +% to the needs of editors in different disciplines. John did most +% of the general reworking and documentation, with the financial +% assistance of the Division of the Humanities and Social Sciences, +% California Institute of Technology. Dominik adapted the code to +% the conventions of Frank Mittelbach's\index{Mittelbach, Frank} +% \verb"doc" option, and added some documentation, multiple-column +% footnotes, cross-references, and crop marks.\footnote{This version of +% the macros was used to format the Sanskrit text in volume I of {\em +% Metarules of P\=a\d ninian Grammar\/} by Dominik Wujastyk (Groningen: +% Forsten, 1993).} A description by John and Dominik of this version of +% \edmac{} was published as `An overview of \edmac: a \PlainTeX\ +% format for critical editions', \emph{TUGboat} \textit{11} (1990), +% pp.\,623--643. +% +% From 1991 through 1994, the macros continued +% to evolve, and were tested at a +% number of sites. We are very grateful to all the members of the +% (now defunct) +% \verb"edmac@mailbase.ac.uk" discussion group who helped us with +% smoothing out bugs and infelicities in the macros. +% Ron Whitney\index{Whitney, Ron} and our anonymous reviewer at +% the TUG were both of great help in ironing out last-minute +% wrinkles, while Ron made some important suggestions which may help +% to make future versions of \edmac{} even more efficient. +% Wayne +% Sullivan,\index{Sullivan, Wayne} in particular, provided several +% important fixes and contributions, including adapting the +% Mittelbach\slash +% Sch\"opf\index{Sch\"opf, Rainer}\index{Mittelbach, Frank} `New +% Font Selection Scheme' for use with \PlainTeX\ and \edmac. +% Another project Wayne has worked +% on is a \verb"DVI" post-processor which works with an \edmac{} +% that has been slightly modified to output \cs{special}s. This +% combination enables you to recover to some extent the text of +% each line, as {\sc ascii} code, facilitating the creation of +% concordances, an {\em index verborum}, etc. +% +% At the time of writing (1994), we are pleased to be able to say that \edmac{} is +% being used for real-life book production of several interesting +% editions, such as the Latin texts of Euclid's {\sl +% Elements},\footnote{Gerhard Brey\index{Brey, Gerhard} used \edmac{} in +% the production of Hubert L. L. Busard\index{Busard, Hubert L. L.} and +% Menso Folkerts,\index{Folkerts, Menso} {\em Robert of Chester's +% (?)\index{Chester, Robert of} Redaction of Euclid's\index{Euclid} {\em +% Elements}, the so-called Adelard II\index{Adelard II} Version}, 2 vols., +% (Basel, Boston, Berlin: Birkh\"auser, 1992).} an edition of the letters +% of Nicolaus Copernicus,\footnote{Being prepared at the German Copernicus +% Research Institute, Munich.}\index{Copernicus, Nicolaus} Simon +% Bredon's\index{Bredon, Simon} {\em Arithmetica},\footnote{Being prepared +% by Menso Folkerts {\em et al.}, at the Institut f\"ur Geschichte der +% Naturwissenschaften in Munich.} a Latin translation by Plato of +% Tivoli\index{Plato of Tivoli} of an Arabic astrolabe +% text,\footnote{Richard Lorch,\index{Lorch, Richard} Gerhard +% Brey\index{Brey, Gerhard} {\em et al.}, at the same Institute.} a Latin +% translation of part II of the Arabic {\em Algebra\/} by Ab\=u K\=amil +% Shuj\=a' b. Aslam,\index{Abu Kamil Shuja' b. Aslam}\footnote{Richard +% Lorch, `Ab\=u K\=amil on the Pentagon and Decagon' in {\em Vestigia +% Mathematica}, ed.\ M. Folkerts and J. P. Hogendijk (Amsterdam, Atlanta: +% Rodopi, 1993).} the Latin {\em Rithmachia\/} of Werinher von +% Tegernsee,\footnote{Menso Folkerts, `Die {\em Rithmachia\/} des Werinher +% von Tegernsee', ibid.} a middle-Dutch romance epic on the +% Crusades,\footnote{Geert H. M. Claassens,\index{Claassens, Geert H. M.} +% {\em De Middelnederlandse Kruisvaartromans}, (Amsterdam: Schiphower en +% Brinkman, 1993).} a seventeenth-century Hungarian politico-philosophical +% tract,\footnote{Emil Hargittay, {\em Cs\'aky Istv\'an: Politica +% philosophiai Okoskod\'as-szerint val\'o rendes \'eletnek p\'eld\'aja +% (1664--1674)\/} (Budapest: Argumentum Kiad\'o, 1992).} an anonymous +% Latin compilation from Hungary entitled {\em Sermones Compilati in +% Studio Gererali Quinqeecclesiensi in Regno Ungarie},\footnote{Being +% produced, as was the previous book, by Gyula Mayer\index{Mayer, Gyula} +% in Budapest.} the collected letters and papers of +% Leibniz,\index{Leibniz}\footnote{Leibniz, {\em S\"amtliche Schriften und +% Briefe}, series {\sc I, III, VII,} being edited by Dr.\ H. +% Breger\index{Breger, Herbert}, Dr. N. G\"adeke\index{G\"adeke, Nora} and +% others, +% at the Leibniz-Archiv, Nieders\"achsische Landesbibliothek, Hannover. +% (see \url{http://www.nlb-hannover.de/Leibniz})} +% Theodosius's\index{Theodosius} {\em Spherics}, the German {\em +% Algorismus} of Sacrobosco,\index{Sacrobosco} the Sanskrit text of the +% {\em K\={a}\'{s}ik\={a}\-v\d{r}tti\/} of V\={a}mana\index{Vamana} and +% Jay\={a}ditya\index{Jayaditya},\footnote{Being prepared at Poona and +% Lausanne Universities.} and the English texts of Thomas +% Middleton's\index{Middleton, Thomas} collected works. +% +% \subsubsection{eledmac} +% +% +% +% Version 1.0 of \tabmac{} was released by +% Herbert Breger\index{Breger, Herbert} in October +% 1996. This added the capability for typesetting tabular material. +% +% Version 0.01 of \edstanza{} was released by +% Wayne Sullivan~\index{Sullivan, Wayne} +% in June 1992, to help a colleague with typesetting Irish verse. +% +% In March 2003 Peter Wilson started an attempt to port \edmac{} +% from TeX to LaTeX. The starting point was \edmac{} version 3.16 +% as documented on 19 July 1994 (available from CTAN). In August 2003 +% the \tabmac{} functions were added; the starting point for these +% being version 1.0 of Ocober 1996. The \edstanza{} (v0.01) functions were +% added in February 2004. Sidenotes and regular footnotes in numbered +% text were added in April 2004. +% +% This port was called \emph{ledmac}. +% +% Since July~2011, ledmac is maintained by Ma\"ieul Rouquette. +% +% Important changes were put in version 1.0, to make eledmac more easily extensible (see \ref{displayoptions} p.\pageref{displayoptions}). +% They can make some little troubles with old customization. +% That is why a new name was selected: \emph{eledmac}. To migrate from ledmac to eledmac, please read Appendix \ref{migration} (p.\pageref{migration}). +% +% +% \section{The \Eledmac{} package}\label{howto} +% +% +% \Eledmac{} is a three-pass package like +% LaTeX itself. +% Although your textual apparatus and line +% numbers will be printed even on the first run, it takes two more +% passes through LaTeX to be sure that everything gets to its right +% place. Any changes you make to the input file may similarly +% require three passes to get everything to the right place, if the +% changes alter the number of lines or notes. \Eledmac{} will tell +% you that you need to make more runs, when it notices, but it does +% not expend the labor to check this thoroughly. If you have +% problems with a line or two misnumbered at the top of a page, try +% running LaTeX once or twice more. +% +% A file may mix \emph{numbered} and \emph{unnumbered} text. +% Numbered text is printed with marginal line numbers and can include +% footnotes and endnotes that are referenced to those line numbers: +% this is how you'll want to print the text that you're editing. +% Unnumbered text is not printed with line numbers, and you can't +% use \eledmac's note commands with it: this is appropriate for +% introductions and other material added by the editor around the +% edited text. +% +% +% \section{Numbering text lines and paragraphs} +% +% \DescribeMacro{\beginnumbering} +% \DescribeMacro{\endnumbering} +% Each section of numbered text must be preceded by +% \cs{beginnumbering} and followed by \cs{endnumbering}, like: \\ +% \cs{beginnumbering} \\ +% \meta{text} \\ +% \cs{endnumbering} +% +% The \cs{beginnumbering} macro resets the line number to zero, +% reads an auxiliary file called \meta{jobname}.\file{nn} (where +% \meta{jobname} is the name of the main input file for this job, +% and \file{nn} is 1 for the first numbered section, 2 for +% the second section, and so on), and then creates a new version of +% this auxiliary file to collect information during this run. The +% first instance of \cs{beginnumbering} also opens a file called +% \meta{jobname}\file{.end} to receive the text of the endnotes. +% \cs{endnumbering} closes the \meta{jobname}.\file{nn} file. +% +% If the line numbering of a text is to be continuous from start to end, +% then the whole text will be typed between one pair of +% \cs{beginnumbering} and \cs{endnumbering} commands. But your text +% will most often contain chapter or other divisions marking sections +% that should be independently numbered, and these will be appropriate +% places to begin new numbered sections. \Eledmac{} has to read and store +% in memory +% a certain amount of information about the entire section when it +% encounters a \cs{beginnumbering} command, so it speeds up the +% processing and reduces memory use when a text is divided into a larger +% number of sections (at the expense of multiplying the number of +% external files that are generated). +% +% \DescribeMacro{\pstart} +% \DescribeMacro{\pend} +% Within a numbered section, each paragraph of numbered text must +% be marked using the \cs{pstart} and \cs{pend} commands: \\ +% \cs{pstart} \\ +% \meta{paragraph of text} \\ +% \cs{pend} +% +% Text that appears within a numbered section but isn't marked with +% \cs{pstart} and \cs{pend} will not be numbered. +% +% The following example shows the proper section and paragraph +% markup, and the kind of output that would typically be generated: +% \egstart +% \begin{verbatim} +% \beginnumbering +% \pstart +% This is a sample paragraph, with +% lines numbered automatically. +% \pend +% +% \pstart +% This paragraph too has its +% lines automatically numbered. +% \pend +% +% The lines of this paragraph are +% not numbered. +% +% \pstart +% And here the numbering begins +% again. +% \pend +% \endnumbering +% \end{verbatim} +% \egmid +% {\parskip0pt \count255=0 +% \everypar={\advance \count255 by 1 \hbox to 1.5em{\the\count255\hfil}} +% This is a sample paragraph\par +% with lines numbered\par +% automatically.\smallskip +% +% This paragraph too\par +% has its lines automatically\par +% numbered.\smallskip +% +% \everypar={\hbox to 1.5em{\hfil}} +% The lines of this paragraph\par +% are not numbered.\smallskip +% +% \everypar={\advance \count255 by 1 \hbox to 1.5em{\the\count255\hfil}} +% And here the numbering\par +% begins again.\par} +% \egend +% +% \DescribeMacro{\autopar} +% You can use \cs{autopar} to avoid the nuisance of this paragraph markup +% and still have every paragraph automatically numbered. The scope of the +% \cs{autopar} command needs to be limited by keeping it within a group, as +% follows: +% \egstart +% \begin{verbatim} +% \begingroup +% \beginnumbering +% \autopar +% +% A paragraph of numbered text. +% +% Another paragraph of numbered +% text. +% +% \endnumbering +% \endgroup +% \end{verbatim} +% \egmid +% {\parskip0pt \count255=0 +% \everypar={\advance \count255 by 1 \hbox to 1.5em{\the\count255\hfil}} +% A paragraph of numbered\par +% text.\smallskip +% +% Another paragraph of\par +% numbered text.\par} +% \egend +% +% \cs{autopar} fails, however, on paragraphs that start with a +% \verb"{" or with any other command that starts a new group before it +% generates any text. Such paragraphs need to be started explicitly, +% before the new group is opened, +% using \cs{indent}, \cs{noindent}, or \cs{leavevmode}, or using +% \cs{pstart} itself.\footnote{For a detailed study of the +% reasons for this restriction, see Barbara Beeton, `Initiation +% rites', \textit{TUGboat} \textbf{12} (1991), +% pp.\,257--258.\protect\index{Beeton, Barbara Ann Neuhaus Friend}} +% +% \DescribeMacro{\firstlinenum} +% \DescribeMacro{\linenumincrement} +% By default, \Eledmac{} numbers every 5th line. There are two counters, +% \verb?firstlinenum? and \verb?linenumincrement?, that control this +% behaviour; they can be changed using \cs{firstlinenum}\marg{num} and +% \cs{linenumincrement}\marg{num}. \cs{firstlinenum} specifies the first +% line that will have a printed number, and \cs{linenumincrement} is +% the difference between succesive +% numbered lines. For example, to start printing numbers at the first line +% and to have every other line numbered: \\ +% \verb?\firstlinenum{1} \linenumincrement{2}? +% +% \DescribeMacro{\firstsublinenum} +% \DescribeMacro{\sublinenumincrement} +% There are similar commands, \cs{firstsublinenum}\marg{num} and +% \cs{sublinenumincrement}\marg{num} for controlling sub-line numbering. +% +% +% \DescribeMacro{\pausenumbering} +% \DescribeMacro{\resumenumbering} +% \phantomsection\label{pause}\relax +% \Eledmac{} stores a lot of information about line numbers and +% footnotes in memory as it goes through a numbered section. But +% at the end of such a section, it empties its memory out, so to +% speak. If your text has a very long numbered section it is +% possible that your LaTeX may reach its memory limit. There are +% two solutions to this. The first is to get a larger LaTeX with +% increased memory. +% The second solution is to +% split your long section into several smaller ones. The trouble +% with this is that your line numbering will start again at zero +% with each new section. To avoid this problem, we provide +% \cs{pausenumbering} and \cs{resumenumbering} which are just +% like \cs{endnumbering} \ldots \cs{beginnumbering}, except that +% they arrange for your line numbering to continue across the break. +% Use \cs{pausenumbering} only between numbered paragraphs: +% \egstart +% \begin{verbatim} +% \beginnumbering +% \pstart +% Paragraph of text. +% \pend +% \pausenumbering +% +% \resumenumbering +% \pstart +% Another paragraph. +% \pend +% \endnumbering +% \end{verbatim} +% \egmid +% {\parskip0pt \count255=0 +% \everypar={\advance \count255 by 1 \hbox to 1.5em{\the\count255\hfil}} +% Paragraph of\par +% text.\medskip +% +% Another paragraph.\par} +% \egend +% +% We have +% defined these commands as two macros, in case you find it necessary +% to insert text between numbered sections without disturbing the +% line numbering. But if you are really just using these macros to +% save memory, you might as well say +% \begin{verbatim} +% \newcommand{\memorybreak}{\pausenumbering\resumenumbering} +% \end{verbatim} +% and say \cs{memorybreak} between the relevant \cs{pend} and +% \cs{pstart}. +% +%\changes{v0.12}{2011/10/01}{Possibilty to number \cs{pstart}.} +% It's possible to insert a number at every \cs{pstart} command. You must use the \DescribeMacro{\numberpstarttrue}\cs{numberpstarttrue} command to have it. You can stop the numbering with \DescribeMacro{\numberpstartfalse}\cs{numberpstartfalse}. You can redefine the command \DescribeMacro{\thepstart}\cs{thepstart} to change style. On each \cs{beginnumbering} the numbering restarts. +% \changes{v0.15}{2012/06/11}{Possibilty to print \cs{pstart} number in side.} +% With the \cs{sidepstartnumtrue} command, the number of \cs{pstart} will be printed in side. In this case, the line number will be not printed. +% \subsection{Lineation commands} +% \DescribeMacro{\numberlinefalse} \DescribeMacro{\numberlinetrue} +% Line numbering can be disabled with \cs{numberlinefalse}. It can be enabled again with \cs{numberlinetrue}. +% \DescribeMacro{\lineation} +% \changes{v1.0}{2012/09/15}{Debug in lineation command} +% Lines can be numbered either by page, by pstart or by section; you specify +% this using the \cs{lineation}\marg{arg} +% macro, where \meta{arg} is either +% \texttt{page}, \texttt{pstart} or \texttt{section}. You may only use this command at places +% where numbering is not in effect; you can't change the lineation system +% within a section. You can change it between sections: they don't all +% have to use the same lineation system. +% The package's standard setting is \verb"\lineation{section}". If the lineation is by pstart, the pstart number will be printed before the line number in the notes. +% +% \DescribeMacro{\linenummargin} +% The command \cs{linenummargin}\meta{location} specifies the margin +% where the line (or pstart) numbers will be printed. The permissable value +% for \meta{location} is one out of the list \texttt{left}, \texttt{right}, +% \texttt{inner}, or \texttt{outer}, +% for example \verb"\linenummargin{inner}". +% The package's default setting is \\ +% \verb"\linenummargin{left}" \\ +% to typeset the numbers in the left hand margin. +% You can change this whenever you're not in the middle of +% making a paragraph. +% +% More precisely, the value of +% \cs{linenummargin} used is that in effect at the \cs{pend} +% of a numbered paragraph. Apart from an initial setting for +% \cs{linenummargin}, only change it after a \cs{pend}, whereupon +% it will apply to all following numbered paragraphs, until +% changed again (changing it between a \cs{pstart} and \cs{pend} +% pair will apply the change to all the current paragraph). +% +% +% +% \DescribeMacro{\firstlinenum} +% \DescribeMacro{\linenumincrement} +% \DescribeMacro{\firstsublinenum} +% \DescribeMacro{\sublinenumincrement} +% In most cases, you will not want a number printed for every +% single line of the text. Four \LaTeX{} \verb"counters" control +% the printing of marginal numbers and they can be set by the +% macros \cs{firstlinenum}\marg{num}, etc. +% \cs{firstlinenum} specifies the number of the first line in a +% section to number, and \cs{linenumincrement} is the increment +% between numbered lines. \cs{firstsublinenum} and +% \cs{sublinenumincrement} do the same for +% sub-lines. Initially, all these are set to $5$ (e.g., +% \verb?\firstlinenum{5}?. +% +% \DescribeMacro{\linenumberlist} +% You can define \cs{linenumberlist} to specify a non-uniform distribution +% of printed line numbers. For example: \\ +% \verb?\def\linenumberlist{1,2,3,5,7,11,13,17,19,23,29}? \\ +% to have numbers printed on prime-numbered lines only. There must be +% no spaces within the definition which consists of comma-separated decimal +% numbers. The numbers can be in any order but it is easier to read if you +% put them in numerical order. Either omitting the definition of +% \cs{linenumberlist} or following the vacuous definition \\ +% \verb?\def\linenumberlist{}? \\ +% the standard numbering sequence is applied. The standard sequence +% is that specified by the combination of the \texttt{firstlinenum}, +% \texttt{linenumincrement}, \texttt{firstsublinenum} and +% \texttt{linenumincrement} counter values. +% +% \DescribeMacro{\leftlinenum} +% \DescribeMacro{\rightlinenum} +% \DescribeMacro{\linenumsep} +% When a marginal line number is to be printed, there are a +% lot of ways to display it. +% You can redefine \cs{leftlinenum} and \cs{rightlinenum} to +% change the way marginal line numbers are printed in the +% left and right margins respectively; the initial +% versions print the number in font \cs{numlabfont} (described +% below) at a distance \cs{linenumsep} (initially set to one pica) +% from the text. +% +% \subsection{Changing the line numbers} +% +% Normally the line numbering starts at 1 for the first line of +% a section and steps up by one for each line thereafter. There +% are various common modifications of this system, however; the +% commands described here allow you to put such modifications +% into effect. +% +% \DescribeMacro{\startsub} +% \DescribeMacro{\endsub} +% You insert the \cs{startsub} and \cs{endsub} commands in your text +% to turn sub-lineation on and off. In plays, for +% example, stage directions are often numbered with sub-line +% numbers: as line $10.1$, $10.2$, +% $10.3$, rather than as $11$, $12$, and $13$. +% Titles and headings are sometimes numbered with sub-line numbers +% as well. +% +% When sub-lineation is in effect, the line number counter is +% frozen and the sub-line counter advances instead. If one of these +% commands appears in the middle of a line, it doesn't take effect +% until the next line; in other words, a line is counted as a line +% or sub-line depending on what it started out as, even if that +% changes in the middle. +% +% \DescribeMacro{\startlock} +% \DescribeMacro{\endlock} +% The \cs{startlock} command, used in running text, locks the +% line number at its current value, until you say \cs{endlock}. +% It can tell for itself whether you are in a patch of line or +% sub-line numbering. One use for line-number locking is in printing +% poetry: there the line numbers should be those of verse lines +% rather than of printed lines, even when a verse line requires several +% printed lines. +% +% \DescribeMacro{\lockdisp} +% When line-number locking is used, +% several printed lines may have the same line number, and you have to +% specify whether you want the number attached to the first printed +% line or the last, or whether you just want the number printed by +% them all. (This assumes that, on the basis of the settings of +% the previous parameters, it is necessary to display a line number for +% this line.) You specify your preference using \cs{lockdisp}\marg{arg}; its +% argument is a word, either \texttt{first}, \texttt{last}, or \texttt{all}. +% The package initially sets this as \verb"\lockdisp{first}". +% +% \DescribeMacro{\setline} +% \DescribeMacro{\advanceline} +% In some cases you may want to modify the line numbers that are +% automatically calculated: if you are printing only fragments +% of a work but want to print line numbers appropriate to a complete +% version, for example. The \cs{setline}\marg{num} and +% \cs{advanceline}\marg{num} commands +% may be used to change the current line's number (or the sub-line +% number, if sub-lineation is currently on). They change both the +% marginal line numbers and the line numbers passed to the notes. +% \cs{setline} takes one argument, the value to which you want +% the line number set; it must be $0$ or greater. \cs{advanceline} +% takes one argument, an amount that should be added to the current +% line number; it may be positive or negative. +% +% \DescribeMacro{\setlinenum} +% The \verb?\setline? and \verb?\advanceline? macros should only be used +% within a \verb?\pstart...\pend? group. The \cs{setlinenum}\marg{num} +% command can be used outside such a group, for example between +% a \verb?pend? and a \verb?\pstart?. It sets the line number +% to \meta{num}. +% It has no effect if used within a \verb?\pstart...\pend? group +% +% \DescribeMacro{\linenumberstyle} +% \DescribeMacro{\sublinenumberstyle} +% Line numbers are nomally printed as arabic numbers. You can +% use \cs{linenumberstyle}\marg{style} to change the numbering style. +% \meta{style} must be one of: +% \begin{itemize} +% \item[\texttt{Alph}] Uppercase letters (A\ldots Z). +% \item[\texttt{alph}] Lowercase letters (a\ldots z). +% \item[\texttt{arabic}] Arabic numerals (1, 2, \ldots) +% \item[\texttt{Roman}] Uppercase Roman numerals (I, II, \ldots) +% \item[\texttt{roman}] Lowercase Roman numerals (i, ii, \ldots) +% \end{itemize} +% Note that with the \texttt{Alph} or \texttt{alph} styles, `numbers' +% must be between 1 and 26 inclusive. +% +% Similarly \cs{sublinenumberstyle}\marg{style} can be used to change +% the numbering style of sub-line numbers, which is normally arabic numerals. +% +% \DescribeMacro{\skipnumbering} +% When inserted into a numbered line the macro \cs{skipnumbering} causes +% the numbering of that particular line to be skipped; that is, the line +% number is unchanged and no line number will be printed. +% +% +% \section{The apparatus} +% +% \subsection{Commands} +% \DescribeMacro{\edtext} +% Within numbered paragraphs, all footnotes and endnotes are generated +% by the \cs{edtext} macro: +% \begin{verse} +% \cs{edtext}\marg{lemma}\marg{commands} +% \end{verse} +% +% +% The \meta{lemma} argument is the lemma in the main text: \cs{edtext} +% both prints this as part of the text, and makes it available to the +% \meta{commands} you specify to generate notes. +% +% For example: +% \egstart +% \begin{verbatim} +% I saw my friend \edtext{Smith}{ +% \Afootnote{Jones C, D.}} +% on Tuesday. +% \end{verbatim} +% \egmid +% 1\enspace I saw my friend\\ +% 2\enspace Smith on Tuesday.\smallskip +% \hrule width 1.5cm +% \strut {\bf 2} Smith] Jones C, D. +% \egend +% +% The lemma \verb?Smith? is printed as part of this sentence in +% the text, and is also made available to the footnote +% that specifies a variant, \verb?Jones C, D?. The footnote macro +% is supplied with the line number at which the lemma appears +% in the main text. +% +% The \meta{lemma} may contain further \cs{edtext} commands. +% Nesting makes +% it possible to print an explanatory note on a long passage together with +% notes on variants for individual words within the passage. For +% example: +% \egstart +% \begin{verbatim} +% \edtext{I saw my friend +% \edtext{Smith}{\Afootnote{Jones +% C, D.}} on Tuesday.}{ +% \Bfootnote{The date was +% July 16, 1954.} +% } +% \end{verbatim} +% \egmid +% 1\enspace I saw my friend\\ +% 2\enspace Smith on Tuesday.\smallskip +% \hrule width 1.5cm +% \strut {\bf 2} Smith] Jones C, D.\smallskip +% \hrule width 1.5cm +% \strut {\bf 1--2} I saw my friend \\ +% Smith on Tuesday.] The\\ date was +% July 16, 1954. +% \egend +% +% However, \cs{edtext} cannot handle overlapping but unnested +% notes---for example, one note covering lines 10--15, and another +% covering 12--18; a \cs{edtext} that starts in the \meta{lemma} +% argument of another \cs{edtext} must end there, too. (The +% \cs{lemma} and \cs{linenum} commands may be used to +% generate overlapping notes if necessary.) +% +% \paragraph{Commands used in {\tt\protect\bslash edtext}'s second argument} +% +% The second argument of the \cs{edtext} macro, \meta{commands}, +% may contain a series of subsidiary commands that generate +% various kinds of notes. +% +% \DescribeMacro{\Afootnote} +% \DescribeMacro{\Bfootnote} +% \DescribeMacro{\Cfootnote} +% \DescribeMacro{\Dfootnote} +% \DescribeMacro{\Efootnote} +% Five separate series of the footnotes are maintained; each macro +% taking one argument like \cs{Afootnote}\marg{text}. When all five +% are used, the \texttt{A} notes appear in a layer just below the main +% text, followed by the rest in turn, down to the \texttt{E} notes at +% the bottom. These are the main macros that you will use to construct +% the critical apparatus of your text. The package provides five +% layers of notes in the belief that this will be adequate for +% the most demanding editions. But it is not hard to add further +% layers of notes should they be required. +% +%\changes{v1.0}{2012/09/15}{Options nonum and nosep in \cs{Xfootnote}.}\label{Xfootnoteopt} +%An optional argument can be added before the text of the footnote. Its value is a comma separated list of options. +% The available options are: +% \begin{itemize} +% \item \verb|nonum| to disable line numbering for this note. +% \item \verb|nosep| to disable the lemma separator for this note. +% \end{itemize} +% +% Example: \cs{Afootnote}\verb|[nonum]|\marg{text}. +% +% \DescribeMacro{\Aendnote} +% \DescribeMacro{\Bendnote} +% \DescribeMacro{\Cendnote} +% \DescribeMacro{\Dendnote} +% \DescribeMacro{\Eendnote} +% The package also maintains five separate series of endnotes. +% Like footnotes each macro takes a single argument like +% \cs{Aendnote}\marg{text}. +% Normally, none of them are printed: you must use the +% \cs{doendnotes} macro described below +% (p.\,\pageref{doendnotes}) to call for their +% output at the appropriate point in your document. +% +% \DescribeMacro{\lemma} +% \changes{v1.0}{2012/09/15}{\cs{lemma} can contain commands.} +% If you want to change the lemma that gets passed to the notes, you +% can do this by using \cs{lemma}\marg{alternative} within the +% second argument to \cs{edtext}, before the note commands. +% The most common use of this command is to abbreviate the lemma that's +% printed in the notes. For example: +% \egstart +% \begin{verbatim} +% \edtext{I saw my friend +% \edtext{Smith}{\Afootnote{Jones +% C, D.}} on Tuesday.} +% {\lemma{I \dots\ Tuesday.} +% \Bfootnote{The date was +% July 16, 1954.} +% } +% \end{verbatim} +% \egmid +% 1\enspace I saw my friend\\ +% 2\enspace Smith on Tuesday.\smallskip +% \hrule width 1.5cm +% \strut {\bf 2} Smith] Jones C, D.\smallskip +% \hrule width 1.5cm +% \strut {\bf 1--2} I \dots\ Tuesday.] \\ +% The date was July 16, 1954. +% \egend +% +% \DescribeMacro{\linenum} +% \phantomsection\label{linenum}\relax +% You can use \cs{linenum}\marg{arg} to change the line numbers passed to +% the notes. The notes are actually given seven parameters: the page, +% line, and sub-line number for the start of the lemma; the same +% three numbers for the end of the lemma; and the font specifier +% for the lemma. As the argument to \cs{linenum}, you specify +% those seven parameters in that order, separated by vertical bars +% (the \verb"|" character). However, you can retain the value +% computed by \eledmac{} for any number by simply omitting it; and +% you can omit a sequence of vertical bars at the end of the +% argument. For example, \verb"\linenum{|||23}" changes one number, +% the ending page number of the current lemma. +% +% This command doesn't change the marginal line numbers in any way; +% it just changes the numbers passed to the footnotes. Its use comes in +% situations that \cs{edtext} has trouble dealing with for +% whatever reason. If you need notes for overlapping passages that +% aren't nested, for instance, you can use \cs{lemma} and +% \cs{linenum} to generate such notes despite the limitations of +% \cs{edtext}. If the \meta{lemma} argument to \cs{edtext} is +% extremely long, you may run out of memory; here again you can +% specify a note with an abbreviated lemma using \cs{lemma} and +% \cs{linenum}. The numbers used in \cs{linenum} need not be +% entered manually; you can use the `\texttt{x-}' symbolic cross-referencing +% commands below (p.\,\pageref{crossref}) to compute them +% automatically. +% +% Similarly, being able to manually change the lemma's font specifier +% in the notes might be important if you were using multiple scripts or +% languages. The form of the font specifier is three +% separate codes separated by \verb"/" characters, giving the family, +% series, and shape codes as defined within NFSS. +% +% \paragraph{Changing the names of these commands} +% +% The commands for generating the apparatus have been given +% rather bland names, because editors in different fields have +% widely divergent notions of what sort of notes are required, where +% they should be printed, and what they should be called. But this +% doesn't mean you have to type \cs{Afootnote} when you'd rather +% say something you find more meaningful, like \cs{variant}. We +% recommend that you create a series of such aliases and use them +% instead of the names chosen here; all you have to do is put commands +% of this form at the start of your file: +% \begin{verbatim} +% \let\variant=\Afootnote +% \let\explanatory=\Bfootnote +% \let\trivial=\Aendnote +% \let\testimonia=\Cfootnote +% \end{verbatim} +% +% +% \subsection{Alternate footnote formatting} +% If you just launch into \Eledmac{} using the commands outlined +% above, you will get a standard layout for your text and notes. You +% may be happy to accept this at the very beginning, while you +% get the hang of things, but the standard layout is not particularly +% pretty, and you will certainly want to modify it in due course. +% The package provides ways of changing the fonts and layout of +% your text, but these are not aimed at being totally comprehensive. +% They are enough to deal with simple variations from the norm, and +% to exemplify how you might go on to make more signifiant changes. +% +% \DescribeMacro{\footparagraph} +% \DescribeMacro{\foottwocol} +% \DescribeMacro{\footthreecol} +% By default, all footnotes are formatted as a series of separate +% paragraphs in one column. Three other formats are also +% available for notes, and using these macros you can select a +% different format for a series of notes. +% \begin{itemize} +% \item \cs{footparagraph} formats +% all the footnotes of a series as a single paragraph; +% \item \cs{foottwocol} formats them as separate paragraphs, +% but in two columns; +% \item \cs{footthreecol}, in three columns. +% \end{itemize} +% Each of these macros +% takes one argument: a letter (between \verb"A" and \verb"E") for +% the series of notes you want changed. +% So a text with three layers of notes might begin thus: +% \begin{verbatim} +% \footnormal{A} +% \footthreecol{B} +% \footparagraph{C} +% \end{verbatim} +% This would make the A-notes ordinary, B-notes would be in three +% columns, and the bottom layer of notes would be formed into +% a paragraph on each page. + +% +% \subsection{Display options} +% \label{displayoptions} +% \changes{v1.0}{2012/09/15}{New generic commands to customize footnote display.} +% Since version 1.0, some commands can be used to change the display of the footnotes. All can have an optional argument \oarg{s}, which is the letter of the series --- or a list of letters separated by comma --- depending on which option is applied. +% +% When a length, noted \meta{l}, is used, it can be stretchable: \verb|a minus b minus c|. The final length |m| is calculated by \LaTeX{} to have: $b-a \leq m \leq b+c$. If you use relative unity\footnote{Like \verb|em| which is the width of a M.}, it will be relative to fontsize of the footnote. +% +% \subsubsection{Control line number printing} +% \DescribeMacro{\numberonlyfirstinline} +% \changes{v1.0.1}{2012/09/16}{Correction on \cs{numberonlyfirstinline} with lineation by pstart or by page.} +% By default, the line number is printed in every note. If you want to print it only the first time for a value (i.e one time for line 1, one time for line 2 etc.), you can use \cs{numberonlyfirstinline}\oarg{s}. Use \cs{numberonlyfirstinline}\oarg{s}\oarg{false} to cancel it (\verb|<s>| can be empty if you want to disable it for every series). +% +% \DescribeMacro{\symlinenum} +% For setting a particular symbol in place of the line number, you can use \cs{symlinenum}\oarg{s}\marg{symbol} in combination with \cs{numberonlyfirstinline}\oarg{s}. From the second lemma of the same line, the symbol will be used instead of line number. +% +% \DescribeMacro{\nonumberinfootnote} +% You can use \cs{nonumberinfootnote}\oarg{s} if you don't want to have the line number in a footnote. To cancel it, use \cs{nonumberinfootnote}\oarg{s}\oarg{false}. +% +% \DescribeMacro{\beforenumberinfootnote} +% With \cs{beforenumberinfootnote}\oarg{s}\marg{l}, you can add some space before the line number in a footnote. If the line number is not printed, the space is not either. The default value is 0~pt. +% +% \DescribeMacro{\afternumberinfootnote} +% With \cs{afternumberinfootnote}\oarg{s}\marg{l} you can add some space after the line number in a footnote. If the line number is not printed, the space is not either. The default value is 0.5~em. +% +% \DescribeMacro{\beforesymlinenum} +% With \cs{beforesymlinenum}\oarg{s}\marg{l} you can add some space before the line symbol in a footnote. The default value is value set by \cs{beforenumberinfootnote}. +% +% \DescribeMacro{\aftersymlinenum} +% With \cs{aftersymlinenum}\oarg{s}\marg{l} you can add some space before the line symbol in a footnote. The default value is value set by \cs{afternumberinfootnote}. +% +% \DescribeMacro{\inplaceofnumber} +% If no number or symbolic line number is printed, you can add a space, with \cs{inplaceofnumber}\oarg{s}\marg{l}. The default value is 1~em. +% +% \DescribeMacro{\boxlinenum} +% It could be useful to put the line number inside a fixed box: the content of the note will be printed after this box. +% You can use \cs{boxlinenum}\oarg{s}\marg{l} to do that. +% To subsequently disable this feature, use \cs{boxlinenum} with length equal to 0~pt. +% One use of this feature is to print line number in a column, and the note in an other column: +% \begin{verbatim} +%\Xhangindent{1em} +%\afternumberinfootnote{0em} +%\boxlinenum{1em} +% \end{verbatim} +% +% \DescribeMacro{\boxsymlinenum} +% \cs{boxsymlinenum}\oarg{s}\marg{l} is the same as \cs{boxlinenum} but for the line number symbol. +% +%\subsubsection{Separator between the lemma and the note content} +% \DescribeMacro{\lemmaseparator} +% By default, in a footnote, the separator between the lemma and thenote is a right bracket (\cs{rbracket}). You can use \cs{lemmaseparator}\oarg{s}\marg{lemmaseparator} to change it. The optional argument can be used to specify in which series it is applied. Note that there is a non-breakable space between lemma and separator, but \textbf{breakable} space between separator and lemma. +% +% \DescribeMacro{\beforelemmaseparator} +% Using \cs{beforelemmaseparator}\oarg{s}\marg{l} you can add some space between lemma and separator. If your lemma separator is empty, this space won't be printed. The default value is 0~em. +% +% \DescribeMacro{\afterlemmaseparator} +% Using \cs{afterlemmaseparator}\oarg{s}\marg{l} you can add some space between separator and note. If your lemma separator is empty, this space won't be printed. The default value is 0.5~em. +% +% \DescribeMacro{\nolemmaseparator} +% You can suppress the lemma separator, using \cs{nolemmaseparator}\oarg{s}, which is simply a alias of \cs{lemmaseparator}\oarg{s}\verb|{}|. +% +% \DescribeMacro{\inplaceoflemmaseparator} +% With \cs{inplaceoflemmaseparator}\oarg{s}\marg{l} you can add a space if no lemma separator is printed. The default value is 1~em. +% +% \subsubsection{Font style} +% \DescribeMacro{Xnotenumfont} +% \cs{Xnotenumfont}\oarg{s}\marg{command} is used to change the font style for line numbers in critical footnotes ; +% \meta{command} must be one (or more) switching command, like \cs{bfseries}. +% +% \DescribeMacro{Xendnotenumfont} +% \cs{Xendnotenumfont}\oarg{s}\marg{command} is used to change the font style for line numbers in critical footnotes. +% \meta{command} must be one (or more) switching command, like \cs{bfseries}. +% +% \DescribeMacro{notenumfontX} +% \cs{notenumfontX}\oarg{s}\marg{command} is used to change the font style for note numbers in familiar footnotes. +% \meta{command} must be one (or more) switching command, like \cs{bfseries}. +% +% \DescribeMacro{\Xnotefontsize} +% \cs{Xnotefontsize}\oarg{s}\marg{command} is used to define the font size of critical footnotes of the series. The default value is \cs{footnotesize}. +% The \meta{command} must not be a size in pt, but a standard LaTeX size, like \cs{small}. +% +% \DescribeMacro{\notefontsizeX} +% \cs{notefontsizeX}\oarg{s}\marg{command} is used to define the font size of critical footnotes of the series. The default value is \cs{footnotesize}. +% The \meta{command} must not be a size in pt, but a standard LaTeX size, like \cs{small}. +% +% \DescribeMacro{\Xendnotefontsize} +% \cs{Xendnotefontsize}\oarg{s}\marg{l} is used to define the font size of end critical footnotes of the series. The default value is \cs{footnotesize}. +% The \meta{command} must not be a size in pt, but a standard LaTeX size, like \cs{small}. +% +% \subsubsection{Styles of notes content} +% +% \DescribeMacro{\Xhangindent} +% For critical notes NOT paragraphed you can define an indent with \cs{Xhangindent}\oarg{s}\marg{l}, which will be applied in the second line of notes. It can help to make distinction between a new note and a break in a note. The default value is 0~pt. +% +% \DescribeMacro{\hangindentX} +% For familiar notes NOT paragraphed you can define an indent with \cs{Xhangindent}\oarg{s}\marg{l}, which will be applied in the second line of notes. It can help to make a distinction between a new note and a break in anote. +% +% \subsubsection{Options for notes in columns} +% For the following four macros, be careful that the columns are made from right to left. +% +% \DescribeMacro{\hsizetwocol} +% \cs{hsizetwocol}\oarg{s}\marg{l} is used to change width of a column when critical notes are displaying in two columns. Defaut value is \verb+.45 \hsize+. +% +% \DescribeMacro{\hsizethreecol} +% \cs{hsizethreecol}\oarg{s}\marg{l} is used to change width of a column when critical notes are displaying in three columns. Defaut value is \verb+.3 \hsize+. +% +% \DescribeMacro{\hsizetwocolX} +% \cs{hsizetwocol}\oarg{s}\marg{l} is used to change width of a column when familiar notes are displaying in two columns. Defaut value is \verb+.45 \hsize+. +% +% \DescribeMacro{\hsizethreecolX} +% \cs{hsizethreecolX}\oarg{s}\marg{l} is used to change width of a column when familiar notes are displaying in three columns. Defaut value is \verb+.3 \hsize+. +% +% \subsubsection{Options for paragraphed footnotes} +% \DescribeMacro{\afternote} +% You can add some space after a note by using \cs{afternote}\oarg{s}\marg{l}. The default value is \verb|1em plus.4em minus.4em|. +% +% \DescribeMacro{\parafootsep} +% For paragraphed footnotes (see below), you can chooce the separator between each note by \cs{parafootsep}\oarg{s}\marg{l}. A common separator is double pipe (\verb+$||$+), which you can set by \cs{parafootsep}\verb+$||$+. +% +%\subsection{Page layout} +% You should set up the page layout parameters, and in particular the +% \cs{baselineskip} of the footnotes (this is done for you if you +% use the standard \cs{notefontsetup}), before you call any +% of these macros because their action depends on these; +% too much or too little space will be allotted for the notes on +% the page if these macros use the wrong +% values.\footnote{\phantomsection\label{nobreaks}There +% is one tiny proviso about using paragraphed notes: you shouldn't +% force any explicit line-breaks inside such notes: do not use +% {\tt \bslash par}, +% {\tt \bslash break}, or {\tt \bslash penalty=-10000}. If +% you must have a line-break for some obscure reason, just suggest +% the break very strongly: {\tt \bslash penalty=-9999} will do +% the trick. Page \pageref{nobreak} explains why this restriction +% is necessary.} +% +% +% \subsection{Fonts}\label{fonts} +% One of the most important features of the appearance of the notes, +% and indeed of your whole document, will be the fonts used. We will +% first describe the commands that give you control over the +% use of fonts in the different structural elements of the document, +% especially within the notes, and then in +% subsequent sections specify how these commands are used. +% +% For those who are setting up for a large job, here is +% a list of the complete set of \Eledmac{} macros relating to fonts that +% are intended for manipulation by the user: +% \cs{endashchar}, +% \cs{fullstop}, +% \cs{numlabfont}, and +% \cs{rbracket}. +% +% +% \DescribeMacro{\numlabfont} +% Line numbers for the main text +% are usually printed in a smaller font in the margin. +% The \cs{numlabfont} macro is provided as a standard name for +% that font: it is initially defined as \\ +% \verb"\newcommand{\numlabfont}{\normalfont\scriptsize}" \\ +% You might wish to use a different font if, for example, +% you preferred to have these line numbers printed using +% old-style numerals. +% +% +% +% \DescribeMacro{\endashchar} +% \DescribeMacro{\fullstop} +% \DescribeMacro{\rbracket} +% \font\teni=cmmi10 +% A relatively trivial matter relates to punctuation. In your +% footnotes, there will sometimes be spans of line numbers like +% this: 12--34, or lines with sub-line numbers like this: 55.6. The +% en-dash and the full stop are taken from the same font as the +% numbers, and it all works nicely. But what if you wanted to use +% old-style numbers, like {\teni12} and {\teni34}? These look nice +% in an edition, but when you use the fonts provided by \PlainTeX\ +% they are taken from a math font which does not +% have the en-dash or full stop in the same places as a text font. +% If you (or your macros) just typed \verb"$\oldstyle 12--34$" or +% \verb"$\oldstyle 55.6$" you would get `{\teni12--34}'and +% `{\teni55.6}'. So we define \cs{endashchar} and +% \cs{fullstop}, which produce an en-dash and a full stop +% respectively from the normal document font, whatever font you are using +% for the numbers. These two macros are used in the +% macros which format the line numbers in the margins and +% footnotes, instead of explicit punctuation. +% We also define an \cs{rbracket} macro for the +% right square bracket printed at the end of the lemma in many +% styles of textual notes (including \Eledmac's standard style). +% +% +% +% \DescribeMacro{\select@lemmafont} +% We will briefly discuss \cs{select@lemmafont} +% here because it is important to know about +% it now, although it is not one of the macros you would expect to +% change in the course of a simple job. Hence it is `protected' +% by having the @-sign in its name. +% +% When you use the \cs{edtext} macro to mark a word in your text +% as a lemma, that word will normally be printed again in your +% apparatus. If the word in the text happens to be in a font such +% as italic or bold you would probably expect it to appear in the +% apparatus in the same font. This becomes an absolute necessity +% if the font is actually a different script, such as Arabic or +% Cyrillic. \cs{select@lemmafont} does the work of +% decoding \Eledmac's data about the fonts used to print the lemma in +% the main text and calling up those fonts for printing the lemma in +% the note. +% +% \cs{select@lemmafont} is a macro that takes one long +% argument---the cluster of line numbers passed to the note +% commands. This cluster ends with a code indicating what +% fonts were in use at the start of the lemma. +% \cs{select@lemmafont} selects the appropriate font for the +% note using that font specifier. +% +% \Eledmac{} uses \cs{select@lemmafont} in a standard footnote +% format macro called \cs{normalfootfmt}. The footnote formats +% for each of the layers \texttt{A} to \texttt{E} are \cs{let} equal +% to \cs{normalfootfmt}. So all the layers of the footnotes are +% formatted in the same way. +% +% +% +% \subsection{Create a new series}\label{newseries} +% +% If you need more than 5 series of critical footnotes you can +% create extra series, using \cs{newseries} command. For example to create G and H series \cs{newseries}\verb+G,H+. +% +% \section{Verse} +% +% +% In 1992 Wayne Sullivan\footnote{Department of Mathematics, +% University College, +% Dublin 4, Ireland} +% wrote the \edstanza{} macros~\cite{EDSTANZA} +% for typesetting verse in a critical edition. More specifically +% they were for handling poetry stanzas which use indentation to +% indicate rhyme or metre. +% +% With Wayne Sullivan's\index{Sullivan, Wayne} permission the majority +% of this section has +% been taken from~\cite{EDSTANZA}. I have made a few changes to enable his +% macros to be used in the LaTeX \Lpack{eledmac} +% package. +% +% +% \DescribeMacro{\stanza} +% \DescribeMacro{\&} +% Use \verb?\stanza? at the start of a stanza. Each line in a stanza +% is ended by an ampersand (\&), and the stanza itself is ended +% by putting \verb?\&? at the end of the last line. +% +% \DescribeMacro{\stanzaindentbase} +% Lines within a stanza may be indented. The indents are integer multiples +% of the length \verb?\stanzaindentbase?, whose default value is 20pt. +% +% \DescribeMacro{\setstanzaindents} +% In order to use the stanza macros, one must set the indentation values. +% First the value of \verb+\stanzaindentbase+ should be set, +% unless the default value 20pt is desired. +% Every stanza line indentation is a multiple of this. +% +% To specify these +% multiples one invokes, for example \\ +% \verb+\setstanzaindents{3,1,2,1,2}+. \\ +% +% The numerical entries must be whole numbers, 0 or greater, separated by +% commas without embedded spaces. The first entry +% gives the hanging indentation to be used if the stanza line requires more +% than one print line. If it is known that each stanza line will fit on +% a single print line, then this first entry should be 0; \TeX\ does less +% work in this case, but no harm ensues if the hanging indentation is not +% 0 but is never used. Enumeration is by stanza lines, not by print lines. +% In the above example the lines are indented one unit, two units, one unit, +% two units, with 3 units of hanging indentation in case a stanza line is too +% long to fit on one print line. +% +%\changes{v0.13}{2011/11/08}{New stanzaindentsrepetition counter to repeat stanza indents every \emph{n} verses.} +% Since version 0.13, if the indentation is repeated every \emph{n} verses of the stanza, you can define only the \emph{n} first indentations, and say they are repeated, defining the value of the \verb+stanzaindentsrepetition+ counter at \emph{n}. For example: +%\begin{verbatim} +%\setstanzaindents{0,1,0} +%\setcounter{stanzaindentsrepetition}{2} +% \end{verbatim} +% +% is like +%\begin{verbatim} +%\setstanzaindents{0,1,0,1,0,1,0,1,0,1,0?} +% \end{verbatim} +% +%If you don't use the \verb+stanzaindentsrepetition+ counter,make sure you have at least one more numerical +% entry in \verb+\setstanzavalues+ than the number of lines in the stanza. +% The macros make no restriction on the number of lines in a stanza. +% Stanza indentation values (and penalty values) obey \TeX's grouping +% conventions, so if one stanza among several has a different structure, +% its indentations (penalties) may be set within a group; the prior values +% will be restored when the group ends. +% +% \DescribeMacro{\setstanzapenalties} +% When the stanzas run over several pages, often it is +% desirable that page breaks should arise between certain lines in the +% stanza, so a facility for including penalties after stanza lines is +% provided. If you are satisfied with the page breaks, you need not set the +% penalty values. +% +% The command \\ +% \verb+\setstanzapenalties{1,5000,10100,5000,0}+ \\ +% results in a penalty of +% 5000 being placed after the first and third lines of the stanza, and a +% penalty of ${-100}$ after the second. +% +% The first entry ``1'' is a control +% value. If it is zero, then no penalties are passed on to \TeX, +% which is the default. Values between 0 and 10000 are penalty +% values; values between 10001 and 20000 have 10000 subtracted and the result +% is given as a negative penalty. The mechanism used for indentations and +% penalties requires unsigned values less than 32768. No penalty is placed +% after the last line, so the final \verb+,0+ in then example above could +% be omitted. The control sequence \verb+\endstanzaextra+ can be defined to +% include a penalty. A penalty of 10000 will prevent a page break; such a +% penalty is included automatically where there is stanza hanging indentation. +% A penalty of ${-10000}$ (corresponding to the entry value 20000 in this +% context) forces a page break. Values in between act as suggestions as to the +% desirability of a page break at a given line. There is a subtle interaction +% between penalties and \textit{glue}, so it may take some adjustment of skips +% and penalties to achieve the best results. +% +% \DescribeMacro{\ampersand} +% If you need to print an \& symbol in a stanza, use the \verb?\ampersand? +% macro, not \verb?\&? which will end the stanza. +% +% \DescribeMacro{\endstanzaextra} +% The macro \verb?\endstanzaextra?, if it is defined, is +% called at the end of a stanza. You could define this, for example, +% to add extra space between stanzas (by default there is no extra +% space between stanzas); if you are using the \Lpack{memoir} class, +% it provides a length \verb?\stanzaskip? which may come in handy. +% +% \DescribeMacro{\startstanzahook} +% Similarly, if \verb?\startstanzahook? is defined, it is called by +% \verb?\stanza? at the +% start. This can be defined to do something. +% +% \DescribeMacro{\flagstanza} +% Putting \cs{flagstanza}\oarg{len}\marg{text} at the start of a line +% in a stanza (or elsewhere) will typeset \meta{text} at a +% distance \meta{len} before +% the line. The default \meta{len} is \verb?\stanzaindentbase?. +% +% For example, to put a verse number before the first line of a stanza +% you could proceed along the lines: +% \begin{verbatim} +% \newcounter{stanzanum} +% \setcounter{stanzanum}{0} +% \newcommand*{\startstanzahook}{\refstepcounter{stanzanum}} +% \newcommand{\numberit}{\flagstanza{\thestanzanum}} +% ... +% \stanza +% \numberit First line...& +% rest of stanza\& +% +% \stanza +% \numberit First line, second stanza... +% \end{verbatim} +% \subsection{Hanging symbol} +%It's possible to insert a symbol on each line of verse's hanging, as in French typography for `['. To insert in eledmac, redefine macro \DescribeMacro{\hangingsymbol}\cmd{\hangingsymbol} with this code: +%\begin{verbatim} +%\renewcommand{\hangingsymbol}{[\,} +%\end{verbatim} +% \section{Grouping} +% In a \verb?minipage? environment LaTeX changes \verb?\footnote? numbering from +% arabic to alphabetic and puts the footnotes at the end of the minipage. +% +% \DescribeEnv{minipage} +% You can put numbered text with critical footnotes in a minipage and +% the footnotes are set at the end of the minipage. +% +% You can also put familiar footnotes (see section~\ref{sec:desc:familiar}) +% in a minipage but unlike with \verb?\footnote? the numbering scheme is +% unaltered. +% +% \DescribeEnv{ledgroup} +% Minipages, of course, aren't broken across pages. Footnotes in a \verb?ledgroup? +% environment are typeset at the end of the environment, as with minipages, +% but the environment includes normal page breaks. The environment makes no +% change to the textwidth so it appears as normal text; it just might be that +% footnotes appear in the middle of a page, with text above and below. +% +% \DescribeEnv{ledgroupsized} +% The \verb?ledgroupsized? environment is similar to \verb?ledroup? except that +% you must specify a width for the environment, as with a minipage. \\ +% \verb?\begin{ledgroupsized}?\oarg{pos}\marg{width}. +% +% The required \meta{width} argument is the text width for the environment. The +% optional \meta{pos} argument is for positioning numbered text within +% the normal textwidth. It may be one of the characters: +% \begin{itemize} +% \item[l] (left) numbered text is flush left with respect to the normal +% textwidth. This is the default. +% \item[c] (center) numbered text is in the center of the textwidth. +% \item[r] (right) numbered text is flush right with respect to the +% normal textwidth. +% \end{itemize} +% Note that normal text, footnotes, and so forth are all flush left. +% +% \verb?\begin{ledgroupsized}{\textwidth}? is effectively the same as +% \verb?\begin{ledgroup}? +% +% +% +% \section{Crop marks} +% +% The \Lpack{\eledmac} package does not provide crop marks. These are +% available with either the \Lclass{memoir} class~\cite{MEMOIR} or the \Lpack{crop} +% package. +% +% +% \section{Endnotes} +% +% \DescribeMacro{\doendnotes} +% \DescribeMacro{\endprint} +% \DescribeMacro{\printnpnum} +% \phantomsection\label{doendnotes}\relax +% \cs{doendnotes}\marg{letter} closes the \file{.end} file that contains +% the text of the endnotes, if it's open, and +% prints one series of endnotes, as specifed by a series-letter +% argument, e.g., \verb"\doendnotes{A}". \cs{endprint} is the +% macro that's called to print each note. It uses +% \cs{select@lemmafont} +% to select fonts, just as the footnote +% macros do (see p.\,\pageref{notefonts} above). +% +% As endnotes may be printed at any point in the document they always +% start with the page number of where they were specified. The +% macro \cs{printnpnum}\marg{num} is used to print these numbers. +% Its default definition is: \\ +% \verb?\newcommand*{\printnpnum}[1]{p.#1) }? +% +% \DescribeMacro{\noendnotes} +% If you aren't going to have any endnotes, you can say \cs{noendnotes} +% in your file, before the first \cs{beginnumbering}, to suppress the +% generation of an unneeded \file{.end} file. +% +% \section{Cross referencing} +% \label{crossref}\relax +% The package provides a simple cross-referencing facility that allows +% you to mark places in the text with labels, and generate page and +% line number references to those places elsewhere +% using those labels. +% +% +% +% \DescribeMacro{\edlabel} +% First you place a label in the text using the command +% \cs{edlabel}\marg{lab}. \meta{lab} can be almost anything you like, including +% letters, numbers, punctuation, or a combination---anything but spaces; +% you might say \verb"\edlabel{toves-3}", for example.\footnote{More precisely, +% you should stick to characters in the \TeX\ categories of `letter' +% and `other'.} +% +% \DescribeMacro{\edpageref} +% \DescribeMacro{\lineref} +% \DescribeMacro{\sublineref} +% Elsewhere in the text, either before or after the \cs{edlabel}, +% you can refer to its location via \cs{edpageref}\marg{lab}, or +% \cs{lineref}\marg{lab}, or \cs{sublineref}\marg{lab}. These commands +% will produce, respectively, the page, line and sub-line on which +% the \cs{edlabel}\marg{lab} command occurred. +% +% An \cs{edlabel} command may appear in the main text, or in the +% first argument of \cs{edtext}, but not in the apparatus itself. But +% \cs{edpageref}, \cs{lineref} and \cs{sublineref} commands can also be used in +% the apparatus to refer to \cs{edlabel}'s in the text. +% +% The \cs{edlabel} command works by writing macros to the LaTeX +% \file{.aux} file. You will need to process +% your document through LaTeX twice in order for the references to +% be resolved. +% +% You will be warned if you say \verb"\edlabel{foo}" and \verb"foo" +% has been used as a label before. The \verb"ref" commands will +% return references to the last place in the file marked with this +% label. You will also be warned if a reference is made to an +% undefined label. (This will also happen the first time you +% process a document after adding a new \cs{edlabel} command: the +% auxiliary file will not have been updated yet.) +% +% If you want to refer to a word inside an +% \verb"\edtext{...}{...}" command, the \cs{edlabel} should be defined inside +% the first argument, e.g., +% \begin{verbatim} +% The \edtext{creature\edlabel{elephant} was quite +% unafraid}{\Afootnote{Of the mouse, that is.}} +% \end{verbatim} +% +% \DescribeMacro{\xpageref} +% \DescribeMacro{\xlineref} +% \DescribeMacro{\xsublineref} +% However, there are situations in which you'll want \Eledmac{} to +% return a number without displaying any +% warning messages about undefined labels or the like: if you want to +% use the reference in a context where \LaTeX{} is looking for a +% number, such a warning will lead to a complaint that the number +% is missing. This is the case for references used within the +% argument to \cs{linenum}, for example. For this situation, +% three variants of the reference commands, with the \verb"x" +% prefix, are supplied: \cs{xpageref}, \cs{xlineref}, and \cs{xsublineref}. +% They have these limitations: +% they will not tell you if the label is undefined, and they must +% be preceded in the file by at least one of the four other +% cross-reference commands---e.g., a \verb"\edlabel{foo}" command, +% even if you never refer to that label---since those commands can all +% do the necessary processing of the \file{.aux} file, and the \cs{x...} +% ones cannot. +% +% \DescribeMacro{\xxref} +% The macros \cs{xxref} and +% \cs{edmakelabel} let you manipulate numbers +% and labels in ways which you may find helpful in tricky +% situations. +% +% The \cs{xxref}\marg{lab1}\marg{lab2} command generates a reference to a sequence of +% lines, for use in the second argument of \cs{edtext}. +% It takes two arguments, both of which are +% labels: e.g., \verb"\xxref{mouse}{elephant}". It calls \cs{linenum} +% (q.v., p.\,\pageref{linenum} above) and sets the beginning page, +% line, and sub-line numbers to those of the place where +% \verb"\edlabel{mouse}" was placed, and the ending numbers to those where +% \verb"\edlabel{elephant}" occurs. +% +% \DescribeMacro{\edmakelabel} +% Sometimes the \cs{edlabel} command cannot be used to specify exactly +% the page and line desired---for example, if you want to refer to a +% page and line number in another volume of your edition. In such +% cases, you can use the \cs{edmakelabel}\marg{lab}\marg{numbers} +% macro so that you can `roll your own' label. +% For example, if you say `\verb"\edmakelabel{elephant}{10|25|0}"' +% you will create a new +% label, and a later call to \verb"\edpageref{elephant}" would print +% `10' and \verb"\lineref{elephant}" would print `25'. The sub-line +% number here is zero. It is usually best to collect your +% \cs{edmakelabel} statements near the top of your document, so that +% you can see them at a glance. +% +% \DescribeMacro{\label} +% \DescribeMacro{\ref} +% \DescribeMacro{\pageref} +% \changes{v0.2.1}{2003/08/25}{Added text about normal labeling} +% The normal \cs{label}, \cs{ref} and \cs{pageref} macros may be used +% within numbered text, and operate in the familiar fashion. As an example, +% here is one way of numbering paragraphs in numbered text, and then being +% able to refer to the paragraph numbers, in addition to line and page numbers. +% \begin{verbatim} +% \newcounter{para} \setcounter{para}{0} +% \newcommand{\newpara}{% +% \refstepcounter{para}% +% \noindent\llap{\thepar. }\quad} +% \newcommand{\oldpara}[1]{% +% \noindent\llap{\ref{#1}. }\quad} +% \end{verbatim} +% The definitions of \cs{newpara} and \cs{oldpara} put the numbers in the left +% margin and the first line of the paragraph is indented. You can now +% write things like: +% \begin{verbatim} +% \linenummargin{right} +% \beginnumbering +% \pstart +% \newpara\label{P1} A paragraph about \ldots +% \pend +% In paragraph~\ref{P1} the author \ldots +% \pstart +% \oldpara{P1} This has the same +% \edtext{number}{\Afootnote{\ref{P1} is the paragraph, not line}} +% as the first paragraph. +% \pend +% \endnumbering +% \end{verbatim} +% +% +% \section{Side notes} +% +% The \cs{marginpar} command does not work in numbered text. Instead +% the package provides for non-floating sidenotes in either margin. +% +% \DescribeMacro{\ledleftnote} +% \DescribeMacro{\ledrightnote} +% \cs{ledleftnote}\marg{text} will put \meta{text} into the left margin level +% with where the command was issued. Similarly, \cs{ledrightnote}\marg{text} +% puts \meta{text} in the right margin. +% \changes{v1.0}{2012/09/15}{Possibility to have commands in sidenotes.} +% \DescribeMacro{\ledsidenote} +% \DescribeMacro{\sidenotemargin} +% \cs{ledsidenote}\marg{text} will put \meta{text} into the margin specified +% by the current setting of \cs{sidenotemargin}\marg{location}. The +% permissable value for \meta{location} is one out of the list +% \texttt{left}, \texttt{right}, \texttt{inner}, or \texttt{outer}, for +% example \verb?\sidenotemargin{outer}?. The package's default setting +% is \\ +% \verb?\sidenotemargin{right}? \\ +% to typeset \cs{ledsidenote}s in the right hand margin. This is the opposite +% to the default margin for line numbers. The style for a \cs{ledsidenote} +% follows that for a \cs{ledleftnote} or a \cs{ledrightnote} depending +% on the margin it is put in. +% +% If two, say, \cs{ledleftnote}, commands are called in the same line the +% second \meta{text} will obliterate the first. There is no problem though with +% having both a left and a right sidenote on the same line. +% +% \DescribeMacro{\ledlsnotewidth} +% \DescribeMacro{\ledrsnotewidth} +% The left sidenote text is put into a box of width \cs{ledlsnotewidth} +% and the right text into a box of width \cs{ledrsnotewidth}. These +% are initially set to the value of \cs{marginparwidth}. +% +% \DescribeMacro{\ledlsnotesep} +% \DescribeMacro{\ledrsnotesep} +% The texts are put a distance \cs{ledlsnotesep} (or \cs{ledrsnotesep}) +% into the left (or right) margin. These lengths are initially set to +% the value of \cs{linenumsep}. +% +% \DescribeMacro{\ledlsnotefontsetup} +% \DescribeMacro{\ledrsnotefontsetup} +% These macros specify how the sidenote texts are to be typeset. The +% initial definitions are: +% \begin{verbatim} +% \newcommand*{\ledlsnotefontsetup}{\raggedleft\footnotesize}% left +% \newcommand*{\ledrsnotefontsetup}{\raggedright\footnotesize}% right +% \end{verbatim} +% These can of course be changed to suit. +% +% +% \section{Familiar footnotes} \label{sec:desc:familiar} +% +% +% The \Lpack{footmisc} package~\cite{FOOTMISC} by Robin +% Fairbairns\index{Fairbairns, Robin} has an option whereby +% sequential footnote +% marks in the text can be separated by +% commas\textsuperscript{3,4} like so. +% As a convenience \Eledmac{} provides this automatically. +% +% \DescribeMacro{\multfootsep} +% \cs{multfootsep} is used as the separator between footnote markers. +% Its default definition is: \\ +% \verb?\providecommand*{\multfootsep}{\textsuperscript{\normalfont,}}? \\ +% and can be changed if necessary. +% +% \DescribeMacro{\footnoteA} +% \DescribeMacro{\footnoteB} +% \DescribeMacro{\footnoteC} +% \DescribeMacro{\footnoteD} +% \DescribeMacro{\footnoteE} +% As well as the standard LaTeX footnotes generated via \cs{footnote}, +% the package also provides +% three series of additional footnotes called \cs{footnoteA} through +% \cs{footnoteE}. These have the familiar marker in the text, and +% the marked text at the foot of the page can be formated using +% any of the styles described for the critical footnotes. Note that +% the `regular' footnotes have the series letter at the end of the macro +% name whereas the critical footnotes have the series letter at the start +% of the name. +% +% \DescribeMacro{\footnormalX} +% \DescribeMacro{\footparagraphX} +% \DescribeMacro{\foottwocolX} +% \DescribeMacro{\footthreecolX} +% Each of the \verb?\foot...X? macros takes one argument which is the +% series letter (e.g., \texttt{B}). \cs{footnormalX} is the typical +% footnote format. With \cs{footparagraphX} the series is typeset a one +% paragraph, with \cs{foottwocolX} the notes are in two columns, and are in +% three columns with \cs{foothreecolX}. +% +% \DescribeMacro{\thefootnoteA} +% \DescribeMacro{\bodyfootmarkA} +% \DescribeMacro{\footfootmarkA} +% As well as using the \verb?\foot...X? macros to specify the general +% footnote arrangement for a series, each series uses a set of macros for +% styling the marks. The mark numbering scheme is defined by the +% \cs{thefootnoteA} macro; the default is: \\ +% \verb?\renewcommand*{\thefootnoteA}{\arabic{footnoteA}}?\\ +% The appearance of the mark in the text is controlled by \cs{bodyfootmarkA} +% which is defined as: \\ +% \verb?\newcommand*{\bodyfootmarkA}{%? \\ +% \verb? \hbox{\textsuperscript{\normalfont\thefootnoteA}}}? \\ +% The command \cs{footfootmarkA} controls the appearance of the mark at the +% start of the footnote text. It is defined as: \\ +% \verb?\newcommand*{\footfootmarkA}{\textsuperscript{\thefootnoteA}}? +% +% There are similar command triples for the other series. +% +% Additional footnote series can be easily defined: you just have to use \cs{newseries}, defined above (see \ref{newseries} p.\pageref{newseries}). +% +% \section{Indexing} +% +% \DescribeMacro{\edindex} +% LaTeX provides the |\index|\marg{item} command for specifying that \meta{item} +% and the current page number should be added to the raw index (\file{idx}) file. +% The |\edindex|\marg{item} macro can be used in numbered text to specify +% that \meta{item} and the current page \& linenumber should be added to +% the raw index file. +% +% If the \Lclass{memoir} class is used then the macro takes an optional +% argument, which is the name of a raw index file. For example +% |\edindex[line]{item}| will use |line.idx| as the raw file instead of +% |\jobname.idx|. +% +% \DescribeMacro{\pagelinesep} +% The page \& linenumber combination is written as |page\pagelinesep line|, +% where the default definition is |\newcommand{\pagelinesep}{-}| so that +% an item on page 3, line 5 will be noted as being at |3-5|. You can +% renew |\pagelinesep| to get a different separator (but it just so happens +% that |-| is the default +% separator used by the \textsc{MakeIndex} program). +% +% \DescribeMacro{\edindexlab} +% The |\edindex| process uses a |\label|/|\ref| mechanism to get +% the correct line number. It automatically generates labels +% of the form |\label{\edindexlab N}|, where N is a number, and +% the default definition of |\edindexlab| is: \\ +% |\newcommand*{\edindexlab}{$&}| \\ +% in the hopes that this will not be used by any other labels +% (|\edindex|'s labels are like |\label{$&27}|). +% You can change |\edindexlab| to something else if you need to. +% +% \section{Tabular material} +% +% LaTeX's normal |tabular| and |array| environments cannot be used where +% line numbering is being done; more precisely, they can be used but with +% odd results, so don't use them. However, \eledmac{} provides some simple +% tabulation environments that can be line numbered. The environments +% can also be used in normal unnumbered text. +% +% \DescribeEnv{edarrayl} +% \DescribeEnv{edarrayc} +% \DescribeEnv{edarrayr} +% \DescribeEnv{edtabularl} +% \DescribeEnv{edtabularc} +% \DescribeEnv{edtabularr} +% There are six environments; the |edarray*| environments are for math +% and |edtabular*| for text entries. The final |l|, |c|, or |r| +% in the environment names indicate that the entries will be flushleft (|l|), +% centered (|c|) or flushright (|r|). There is no means of specifying +% different formats for each column, nor for specifying a fixed width for +% a column. The environments are centered with respect to the surrounding text. +% +% \egstart +% \begin{verbatim} +% \begin{edtabularc} +% 1 & 2 & 3 \\ +% a & bb & ccc \\ +% AAA & BB & C +% \end{edtabularc} +% \end{verbatim} +% \egmid +% \centering +% \begin{tabular}{ccc} +% 1 & 2 & 3 \\ +% a & bb & ccc \\ +% AAA & BB & C +% \end{tabular}\par +% \egend +% +% Entries in the environments are the same as for the normal +% |array| and |tabular| environments but there must be no ending +% \verb?\\? at the end of the last row. +% \emph{There must be the same number of column designators (the \&) +% in each row.} There is no equivalent +% to any line drawing commands (such as \cs{hline}). +% However, unlike the normal environments, the |ed...| environments +% can cross page breaks. +% +% Macros like \cs{edtext} can be used as part of an entry. +% +% For example: +% \begin{verbatim} +% \beginnumbering +% \pstart +% \begin{edtabularl} +% \textbf{\Large I} & wish I was a little bug\edindex{bug} & +% \textbf{\Large I} & eat my peas with honey\edindex{honey} \\ +% & With whiskers \edtext{round}{\Afootnote{around}} my tummy & +% & I've done it all my life. \\ +% & I'd climb into a honey\edindex{honey} pot & +% & It makes the peas taste funny \\ +% & And get my tummy gummy.\edindex{gummy} & +% & But it keeps them on the knife. +% \end{edtabularr} +% \pend +% \endnumbering +% \end{verbatim} +% produces the following parallel pair of verses. +% +% \begin{center} +% \setlength{\tabcolsep}{2pt} +% \begin{tabular}{p{4em}rlrl} +% {\footnotesize 1} & \textbf{\Large I} & wish I was a little bug & +% \textbf{\Large I} & eat my peas with honey \\ +% {\footnotesize 2} & & With whiskers round my tummy & +% & I've done it all my life. \\ +% {\footnotesize 3} & & I'd climb into a honey pot & +% & It makes the peas taste funny \\ +% {\footnotesize 4} & & And get my tummy gummy. & +% & But it keeps them on the knife. +% \end{tabular} +% \end{center} +% +% +% +% +% +% \DescribeMacro{\edtabcolsep} +% The distance between the columns is controlled by the length |\edtabcolsep|. +% +% \DescribeMacro{\spreadmath} +% \DescribeMacro{\spreadtext} +% |\spreadmath|\marg{math} typesets \marg{math} but the \marg{math} has +% no effect on the calculation of column widths. +% |\spreadtext|\marg{text} is the analagous command for use in |edtabular| +% environments. +% +% \egstart +% \begin{verbatim} +% \begin{edarrayl} +% 1 & 2 & 3 & 4 \\ +% & \spreadmath{F+G+C} & & \\ +% a & bb & ccc & dddd +% \end{edarrayl} +% \end{verbatim} +% \egmid +% \begin{displaymath} +% \begin{array}{llll} +% 1 & 2 & 3 & 4 \\ +% & \multicolumn{3}{l}{F+G+C} \\ +% a & bb & ccc & dddd +% \end{array} +% \end{displaymath} +% \egend +% +% \DescribeMacro{\edrowfill} +% The macro |\edrowfill|\marg{start}\marg{end}\marg{fill} +% fills columns number \meta{start} to \meta{end} inclusive with +% \meta{fill}. The \meta{fill} argument can be any horizontal `fill'. +% For example |\hrulefill| or |\upbracefill|. +% +% Note that every row must have the same number of columns, even if +% some would not appear to be necessary. +% +% The |\edrowfill| macro can be used in both tabular and array environments. +% The typeset appearance of the following code is shown below. +% \begin{verbatim} +% \begin{edtabularr} +% 1 & 2 & 3 & 4 & 5 \\ +% Q & & fd & h & qwertziohg \\ +% v & wptz & x & y & vb \\ +% g & nnn & \edrowfill{3}{5}{\upbracefill} & & \\ +% \edrowfill{1}{3}{\downbracefill} & & & pq & dgh \\ +% k & & l & co & ghweropjklmnbvcxys \\ +% 1 & 2 & 3 & \edrowfill{4}{5}{\hrulefill} & +% \end{tabularr} +% \end{verbatim} +% +% \begin{center} +% \begin{tabular}{rrrrr} +% 1 & 2 & 3 & 4 & 5 \\ +% Q & & fd & h & qwertziohg \\ +% v & wptz & x & y & vb \\ +% g & nnn & \multicolumn{3}{c}{\upbracefill} \\ +% \multicolumn{3}{c}{\downbracefill} & pq & dgh \\ +% k & & l & co & ghweropjklmnbvcxys \\ +% 1 & 2 & 3 & \multicolumn{2}{c}{\hrulefill} +% \end{tabular} +% \end{center} +% +% You can also define your own `fill'. For example: +% \begin{verbatim} +% \newcommand*{\upbracketfill}{% +% \vrule height 4pt depth 0pt\hrulefill\vrule height 4pt depth 0pt} +% \end{verbatim} +% is a fill like |\upbracefill| except it has the appearance of a +% (horizontal) bracket instead of a brace. It can be used like +% this: +% +% \newcommand*{\upbracketfill}{% +% \vrule height 4pt depth 0pt\hrulefill\vrule height 4pt depth 0pt} +% +% \begin{verbatim} +% \begin{edarrayc} +% 1 & 2 & 3 & 4 \\ +% a & \edrowfill{2}{3}{\upbracketfill} & & d \\ +% A & B & C & D +% \end{edarrayc} +% \end{verbatim} +% +% \begin{displaymath} +% \begin{array}{cccc} +% 1 & 2 & 3 & 4 \\ +% a & \multicolumn{2}{c}{\upbracketfill} & d \\ +% A & B & C & D +% \end{array} +% \end{displaymath} +% +% +% +% \DescribeMacro{\edatleft} +% \DescribeMacro{\edatright} +% |\edatleft|\oarg{math}\marg{symbol}\marg{halfheight} typesets the math +% \meta{symbol} as |\left<symbol>| +% with the optional \meta{math} centered before it. The \meta{symbol} is +% twice \meta{halfheight} tall. The |\edatright| macro is similar +% and it typesets |\right<symbol>| with \meta{math} centered after it. +% +% \begin{verbatim} +% \begin{edarrayc} +% & 1 & 2 & 3 & \\ +% & 4 & 5 & 6 & \\ +% \edatleft[left =]{\{}{1.5\baselineskip} +% & 7 & 8 & 9 & +% \edatright[= right]{)}{1.5\baselineskip} +% \end{edarrayc} +% \end{verbatim} +% +% \begin{displaymath} +% left = \left\{ +% \begin{array}{ccc} +% 1 & 2 & 3 \\ +% 4 & 5 & 6 \\ +% 7 & 8 & 9 +% \end{array} +% \right) = right +% \end{displaymath} +% +% +% +% \DescribeMacro{\edbeforetab} +% \DescribeMacro{\edaftertab} +% |\edbeforetab|\marg{text}\marg{entry}, where \meta{entry} is an entry in the +% leftmost column, typesets \meta{text} left justified before the \meta{entry}. +% Similarly |\edaftertab|\marg{entry}\marg{text}, where \meta{entry} is an entry +% in the rightmost column, typesets \meta{text} right justified after the +% \meta{entry}. +% +% For example: +% \begin{verbatim} +% \begin{edarrayl} +% A & 1 & 2 & 3 \\ +% \edbeforetab{Before}{B} & 1 & 3 & 6 \\ +% C & 1 & 4 & \edaftertab{8}{After} \\ +% D & 1 & 5 & 0 +% \end{edarrayl} +% \end{verbatim} +% +% +% \begin{displaymath} +% \begin{array}{p{0.4\textwidth}llp{0.4\textwidth}} +% \mbox{} \hfill $A$ & 1 & 2 & $3$ \\ +% Before \hfill $B$ & 1 & 3 & $6$ \\ +% \mbox{} \hfill $C$ & 1 & 4 & $8$ \hfill After \\ +% \mbox{} \hfill $D$ & 1 & 5 & $0$ +% \end{array} +% \end{displaymath} +% +% \DescribeMacro{\edvertline} +% \DescribeMacro{\edvertdots} +% The macro |\edvertline|\marg{height} draws a vertical line \meta{height} high +% (contrast this with |\edatright| where the size argument is half the desired +% height). +% \begin{verbatim} +% \begin{edarrayr} +% a & b & C & d & \\ +% v & w & x & y & \\ +% m & n & o & p & \\ +% k & & L & cvb & \edvertline{4pc} +% \end{edarrayr} +% \end{verbatim} +% +% \DeleteShortVerb{\|} +% \begin{displaymath} +% \left. +% \begin{array}{rrrr} +% a & b & C & d \\ +% v & w & x & y \\ +% m & n & o & p \\ +% k & & L & cvb +% \end{array} +% \right| +% \end{displaymath} +% \MakeShortVerb{\|} +% +% The |\edvertdots| macro is similar to |\edvertline| except that it +% produces a vertical dotted instead of a solid line. +% +% +% \section{Miscellaneous} +% +% +% \DescribeMacro{\extensionchars} +% When the package assembles the name of the auxiliary file for a +% section, it prefixes \cs{extensionchars} to the section number. +% This is initially defined to be empty, but you can add some characters to +% help distinguish these files if you like; what you use is likely +% to be system-dependent. If, for example, you said +% \verb"\renewcommand{\extensionchars}{!}", then you would get temporary +% files called \file{jobname.!1}, \file{jobname.!2}, etc. +% +% \DescribeMacro{\ifledfinal} +% The package can take options. The option `final', which is the default +% is for final typesetting; this sets \verb?\ifledfinal? to TRUE. The other +% option, `draft', may be useful during earlier stages and sets +% \verb?\ifledfinal? to FALSE. +% +% \DescribeMacro{\showlemma} +% The lemma within the text is printed via \verb?\showlemma{lemma}?. +% Normally, or with the `final' option, the definition of \verb?\showlemma? +% is: \\ +% \verb?\newcommand*{\showlemma}[1]{#1}? \\ +% so it just produces its argument. +% With the `draft' option it is defined as \\ +% \verb?\newcommand*{\showlemma}[1]{\textit{#1}}? \\ +% so that its argument is typeset in an italic font, which may make it +% easier to check that all lemmas have been treated. +% +% If you would prefer some other style, you could put something like this +% in the preamble: +% \begin{verbatim} +% \ifledfinal\else +% \renewcommand{\showlemma}[1]{\textbf{#1}}% or simply ...[1]{#1} +% \fi +% \end{verbatim} +% +% +% \subsection{Known and suspected limitations} +% +% In general, \Eledmac's system for adding marginal line numbers +% breaks anything that makes direct use of the LaTeX insert system, +% which includes marginpars, footnotes and floats. +% +% However, you can use both \cs{footnote} and the familiar footnote +% series notes in numbered text. A \cs{marginpar} in numbered text +% will throw away its contents and send a warning message to the terminal +% and log file, but will do no harm. +% +% \cs{parshape} cannot be used within numbered text, except in a +% very restricted way. +% +% \DescribeMacro{\ballast} +% \phantomsection\label{ballastdesc}\relax +% LaTeX is a three-pass system, but even after a document has +% been processed three times, there are some tricky situations in +% which the page breaks decided by \TeX\ never settle down. At +% each successive run, \Eledmac{} may oscillate between two +% different sets of page decisions. To stop this happening, should +% it arise, Wayne Sullivan\index{Sullivan, Wayne} suggested the +% inclusion of the quantity \cs{ballast}. The amount of \cs{ballast} +% will be subtracted from the penalties which apply to the page +% breaks calculated on the \emph{previous} run through \TeX, thus +% reinforcing these breaks. So if you find your page breaks +% oscillating, say \\ +% \verb"\setcounter{ballast}{100}" \\ +% or some such figure, and with any +% luck the page breaks will settle down. Luckily, this problem +% doesn't crop up at all often. +% +% The restriction on explicit line-breaking in paragraphed footnotes, +% mentioned in a footnote \ref{nobreaks}, p.\,\pageref{nobreaks}, and +% described in more detail on p.\,\pageref{nobreaks-detail}, really is a +% nuisance if that's something you need to do. There are some possible +% solutions, described by Michael Downes\index{Downes, Michael}, +% but this area remains unsatisfactory. +% +% +% LaTeX has a reputation for putting things in the wrong margin after +% a page break. The \Eledmac{} package does nothing to improve the situation +% --- in fact it just makes it more obvious if numbered text crosses a +% page (or column) boundary and the numbers are meant to flip from side +% to side. Try and keep the numbers in the same margin all the time. +% Another aspect of TeX's page breaking mechanism is that when numbering +% lines by the page, the first few numbers after a page break may continue +% as though the lines were still on the previous page. +% +% \DescribeMacro{\pageparbreak} +% If you can't resist flipping the numbers or numbering by the page, +% then you might find that +% judicious use of \cs{pageparbreak} may help if numbering goes awry +% across a page (or column) break. It tries to force TeX into partitioning +% the current paragraph into two invisibly joined paragraphs with a page +% break between them. Insert the command between the last word on one page +% and the first word on the next page. If later you change something earlier +% in the document the natural page break may be in a different place, and you +% will have to adjust the location of \cs{pageparbreak} accordingly. +% +% \DescribeMacro{\footfudgefiddle} +% For paragraphed footnotes \TeX{} has to estimate the amount of space +% required. If it underestimates this then the notes may get too long and +% run off the bottom of the text block. \cs{footfudgefiddle} can be increased +% from its default 64 (say to 68) to increase the estimate. You have to use +% \cs{renewcommand} for this, like: \\ +% \verb?\renewcommand{\footfudgefiddle}{68}? +% +% +% +% Help, suggestions and corrections will be gratefully received. +% +% \subsection{Use with other packages} +% +% +% Because of \Eledmac's complexity it may not play well with other +% packages. In particular \Eledmac{} is sensitive to commands in the +% arguments to the \cs{edtext} and \cs{*footnote} macros (this is +% discussed in more detail in section~\ref{text}, and in particular +% the discussion about \cs{no@expands} and \cs{morenoexpands}). You +% will have to see what works or doesn't work in your particular case. +% +% +% It is possible that \Eledmac{} and the \Lpack{hyperref} package may +% work together. I have not tried this combination but past experience +% with \Lpack{hyperref} suggests that cooperation is unlikely; \Lpack{hyperref} +% changes many LaTeX internals and \Lpack{eledmac} does things that are +% not normaly seen in LaTeX. +% +% \DescribeMacro{\morenoexpands} +% You can define the macro \cs{morenoexpands} to modify macros that you +% call within \cs{edtext}. Because of the way \Eledmac{} numbers the lines +% the arguments to \cs{edtext} can be processed more than once and in some +% cases a macro should only be processed once. One example is the \cs{colorbox} +% macro from the \Lpack{color} package, which you might use like this: +% \begin{verbatim} +% ... \edtext{\colorbox{mycolor}{lemma}}{\Afootnote{...\colorbox...}} +% \end{verbatim} +% If you actually try +% this\footnote{Reported by Dirk-Jan Dekker\index{Dekker, Dirk-Jan} +% in the CTT thread `Incompatibility +% of ``color'' package' on 2003/08/28.} +% you will find LaTeX whinging +% `\texttt{Missing \{ inserted}', and then things start to fall apart. +% The trick in this case is to specify either: +% \begin{verbatim} +% \newcommand{\morenoexpands}{\let\colorbox=0} +% \end{verbatim} +% or +% \begin{verbatim} +% \makeatletter +% \newcommand{\morenoexpands}{\let\colorbox\@secondoftwo} +% \makeatother +% \end{verbatim} +% (\cs{@secondoftwo} is an internal LaTeX macro that takes two arguments and +% thows away the first one.) +% The first incantation lets color show in both the main text and footnotes +% whereas the second one shows color in the main text but kills it +% in the lemma and footnotes. On the other hand if you use +% \cs{textcolor} instead, like +% \begin{verbatim} +% ... \edtext{\textcolor{mycolor}{lemma}}{\Afootnote{...\textcolor...}} +% \end{verbatim} +% there is no need to fiddle with \cs{morenoexpands} as the color will +% naturally be displayed in both the text and footnotes. To kill the color +% in the lemma and footnotes, though, you can do: +% \begin{verbatim} +% \makeatletter +% \newcommand{\morenoexpands}{\let\textcolor\@secondoftwo} +% \makeatother +% \end{verbatim} +% It took me a little while to discover all this. If you run into this sort +% of problem you may have to spend some time experimenting before hitting +% on a solution. +% +% +% \subsection{Parallel typesetting} +% +% +% Peter Wilson have developed the Ledpar package +% as an adjunct to \Eledmac{} specifically for parallel typesetting +% of critical texts. This also cooperates with the \Lpack{babel} +% package for typesetting in multiple languages. The package is called \emph{eledpar} since september 2012. + +% He also developed +% the \Lpack{ledarab} package for +% handling parallel arabic text in critical editions. +% Howerer, this package is not maintened by Maïeul Rouquette. +% You should use the possibility of modern TeX processor, like Xe(La)TeX +% +% +% +% \subsection{Notes for EDMAC users} \label{sec:lastuser} +% +% If you have never used \edmac, ignore this section. If you have used +% \edmac{} and are starting on a completely new document, ignore this section. +% Only read this section if you are converting an original \edmac{} +% document to use \eledmac. +% +% The package still provides the original \cs{text} command, but it is +% (a) deprecated, and +% (b) its name has been changed\footnote{A name like \cs{text} is likely to be defined by +% other LaTeX packages (it certainly is by the AMS packages) and it +% seems sensible to try and avoid clashes with other definitions.} +% to \cs{critext}; +% use the \cs{edtext} macro instead. However, if you do +% use \cs{critext} (the new name for \cs{text}), the following is a reminder. +% +% +% \DescribeMacro{\critext} +% Within numbered paragraphs, footnotes and endnotes are generated +% by forms of the \cs{critext} macro: +% \begin{verse} +% \cs{critext}\marg{lemma}\meta{commands}\verb"/" +% \end{verse} +% +% +% The \meta{lemma} argument is the lemma in the main text: \cs{critext} +% both prints this as part of the text, and makes it available to the +% \meta{commands} you specify to generate notes. The \verb"/" at the +% end terminates the command; it is part of the macro's definition so +% that spaces after the macro will be treated as significant. +% +% For example: +% \egstart +% \begin{verbatim} +% I saw my friend \critext{Smith} +% \Afootnote{Jones C, D.}/ +% on Tuesday. +% \end{verbatim} +% \egmid +% 1\enspace I saw my friend\\ +% 2\enspace Smith on Tuesday.\smallskip +% \hrule width 1.5cm +% \strut {\bf 2} Smith] Jones C, D. +% \egend +% +% The lemma \verb"Smith" is printed as part of this sentence in +% the text, and is also made available to the footnote +% that specifies a variant, \verb"Jones C, D". The footnote macro +% is supplied with the line number at which the lemma appears +% in the main text. +% +% The \meta{lemma} may contain further \cs{critext} commands. +% Nesting makes +% it possible to print an explanatory note on a long passage together with +% notes on variants for individual words within the passage. For +% example: +% \egstart +% \begin{verbatim} +% \critext{I saw my friend +% \critext{Smith}{\Afootnote{Jones +% C, D.}/ on Tuesday.} +% \Bfootnote{The date was +% July 16, 1954.} +% / +% \end{verbatim} +% \egmid +% 1\enspace I saw my friend\\ +% 2\enspace Smith on Tuesday.\smallskip +% \hrule width 1.5cm +% \strut {\bf 2} Smith] Jones C, D.\smallskip +% \hrule width 1.5cm +% \strut {\bf 1--2} I saw my friend \\ +% Smith on Tuesday.] The\\ date was +% July 16, 1954. +% \egend +% +% However, \cs{critext} cannot handle overlapping but unnested +% notes---for example, one note covering lines 10--15, and another +% covering 12--18; a \cs{critext} that starts in the \meta{lemma} +% argument of another \cs{critext} must end there, too. (The +% \cs{lemma} and \cs{linenum} commands may be used to +% generate overlapping notes if necessary.) +% +% The second argument of the \cs{critext} macro, \meta{commands}, +% is the same as the second argument to the \cs{edtext} macro. +% +% +% It is possible to define aliases for \cs{critext}, which +% can be easier to type. You can make a single character substitute +% for \cs{critext} by saying this: +% \begin{verbatim} +% \catcode`\<=\active +% \let<=\critext +% \end{verbatim} +% +% Then you might say \verb"<{Smith}\variant{Jones}/". This of course +% destroys the ability to use \verb"<" in any new macro definitions, so +% long as it remains in effect; hence it should be used with care. +% +% Changing the character at the end of the command requires more work: +% \begin{verbatim} +% \catcode`\<=\active +% \def\xtext#1#2>{\critext{#1}{#2}/} +% \let<=\xtext +% \end{verbatim} +% This allows you to say \verb"<{Smith}\Afootnote{Jones}>". +% +% Aliases for \cs{critext} +% of the first kind shown here also can't be nested---that is, +% you can't use the alias in the text that forms the first argument +% to \cs{critext}. (See section~\ref{text} to find out why.) Aliases of +% the second kind may be nested without any problem. +% +% +% If you really have to use |\critext| in any of the tabular or +% array environments, then |\edtext| must not be used in the same +% environment. If you use |\critext| in one of these environments +% then you have to issue the declaration |\usingcritext| beforehand. +% The declaration |\usingedtext| must be issued to revert to the +% default assumption that |\edtext| will be used. +% +% +% \StopEventually{} +% +% \clearpage +% \section{Implementation overview}\label{overview} +% +% +% We present the \Eledmac{} code in roughly the order in which it's used +% during a run of \TeX. The order is \emph{exactly} that in which +% it's read when you load The \Eledmac{} package, because the same file +% is used to generate this manual and to generate the LaTeX package file. +% Most of what follows consists of macro definitions, but there +% are some commands that are executed immediately---especially +% at the start of the code. The documentation generally describes the +% code from the point of view of what happens when the macros are +% executed, though. As each macro is introduced, its name is printed +% in the margin. +% +% We begin with the commands you use to start and +% stop line numbering in a section of text (Section~\ref{preliminaries}). +% Next comes the machinery for writing and reading the auxiliary file for +% each section that helps us count lines, and for creating list macros +% encoding the information from that file (Section~\ref{lineation}); this +% auxiliary file will be read at the start of each section, to create +% those list macros, and a new version of the file will be started to +% collect information from the body of the section. +% +% Next are commands for marking sections of +% the text for footnotes (Section~\ref{text}), followed by the macros +% that take each paragraph apart, attach the line numbers and insertions, +% and send the result to the vertical list (Section~\ref{paragraph}). The +% footnote commands (Section~\ref{footnotes}) and output routine +% (Section~\ref{output}) finish the main part of the processing; +% cross-referencing (Section~\ref{xref}) and endnotes +% (Section~\ref{endnotes}) complete the story. +% +% In what follows, macros with an @ in their name are more internal +% to the workings of \Eledmac{} than those made up just of +% ordinary letters, just as in \PlainTeX\ (see \thetexbook, +% p.\,344). You are meant to be able to make free with +% ordinary macros, but the `@' ones should be treated with more +% respect, and changed only if you are pretty sure of what you are +% doing. +% +% +% \section{Preliminaries} +% \label{preliminaries}\relax +% +% We try and use \texttt{l@d} in macro names to help avoid +% name clashes, but this is not a hard and fast rule. For example, +% if an original \edmac{} macro includes \texttt{edmac} We will simply +% change that to \texttt{eledmac}. +% +% Announce the name and version of the package, which is +% targetted for LaTeX2e. +% +% \begin{macrocode} +%<*code> +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{eledmac}[2012/09/16 v1.0.1 LaTeX port of EDMAC] + +% \end{macrocode} +% +% In general there is the following modifications to the original +% \edmac{} code: +% \begin{itemize} +% \item Replace as many \cs{def}'s by \cs{newcommand}'s as possible +% to avoid overwriting LaTeX macros. +% +% \item Replace user-level TeX counts by LaTeX counters. +% +% \item Use the LaTeX font handling mechanisms. +% +% \item Use LaTeX messaging and file facilities. +% +% \end{itemize} +% +% +% \begin{macro}{\ifledfinal} +% Use this to remember which option is used, set and execute the options +% with final as the default. +% \changes{v0.4}{2004/02/29}{Added final/draft options} +% \begin{macrocode} +\newif\ifledfinal +\DeclareOption{final}{\ledfinaltrue} +\DeclareOption{draft}{\ledfinalfalse} +\ExecuteOptions{final} +% \end{macrocode} +% Use the starred form of \verb?\ProcessOptions? which executes options in +% the order listed in the source file: class options, then listed package +% options, so a package option can override a class option with the same name. +% This was suggested by Dan Luecking\index{Luecking, Dan} in the \texttt{ctt} +% thread \textit{Class/package option processing}, on 27 February 2004. +% \begin{macrocode} +\ProcessOptions*\relax + +% \end{macrocode} +% \end{macro} +% +% Loading package \emph{xargs} to declare commands with optional arguments. \emph{Etoolbox} is also used for more clear code, for example in dynamic command names (it could remplace \cs{csname} etc.) +% \begin{macrocode} +\RequirePackage{xargs} +\RequirePackage{etoolbox} +% \end{macrocode} +% \begin{macro}{\showlemma} +% \verb?\showlemma?\marg{lemma} typesets the lemma text in the body. +% It depends on the option. +% \changes{v0.4}{2004/02/29}{Added \cs{showlemma}} +% \begin{macrocode} +\ifledfinal + \newcommand*{\showlemma}[1]{#1} +\else + \newcommand*{\showlemma}[1]{\underline{#1}} +\fi + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\linenumberlist} +% The code for the \verb?\linenumberlist? mechanism was given to Peter Wilson by Wayne +% Sullivan\index{Sullivan, Wayne} on 2004/02/11. +% +% Initialize it as \verb?\empty? +% \changes{v0.3}{2004/02/14}{Added \cs{linenumberlist} mechanism} +% \begin{macrocode} +\let\linenumberlist=\empty + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@l@dtempcnta} +% \begin{macro}{\@l@dtempcntb} +% In imitation of \LaTeX, we create a couple of scratch counters. +% +% LaTeX already defines \cs{@tempcnta} and \cs{@tempcntb} but Peter Wilson have +% found in the past that it can be dangerous to use these (for example +% one of the AMS packages did something nasty to the \Lpack{ccaption} +% package's use of one of these). +% \begin{macrocode} +\newcount\@l@dtempcnta \newcount\@l@dtempcntb +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\ifl@dmemoir} +% Define a flag for if the \Lpack{memoir} class has been used. +% \changes{v0.2}{2003/07/25}{Added \cs{ifl@dmemoir} for memoir class having been used} +% \begin{macrocode} +\newif\ifl@dmemoir +\@ifclassloaded{memoir}{\l@dmemoirtrue}{\l@dmemoirfalse} + +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Messages} +% +% All the messages are grouped here as macros. This saves TeX's memory +% when the same message is repeated and also lets them be edited easily. +% \changes{v0.7}{2005/02/21}{Made macros of all messages} +% +% \begin{macro}{\eledmac@warning} +% Write a warning message. +% \begin{macrocode} +\newcommand{\eledmac@warning}[1]{\PackageWarning{eledmac}{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\eledmac@error} +% Write an error message. +% \changes{v0.2}{2003/07/25}{Added \cs{eledmac@error} and replaced error messages} +% \begin{macrocode} +\newcommand{\eledmac@error}[2]{\PackageError{eledmac}{#1}{#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\led@err@NumberingStarted} +% \begin{macro}{\led@err@NumberingNotStarted} +% \begin{macro}{\led@err@NumberingShouldHaveStarted} +% \begin{macrocode} +\newcommand*{\led@err@NumberingStarted}{% + \eledmac@error{Numbering has already been started}{\@ehc}} +\newcommand*{\led@err@NumberingNotStarted}{% + \eledmac@error{Numbering was not started}{\@ehc}} +\newcommand*{\led@err@NumberingShouldHaveStarted}{% + \eledmac@error{Numbering should already have been started}{\@ehc}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\led@mess@NotesChanged} +% \begin{macrocode} +\newcommand*{\led@mess@NotesChanged}{% + \typeout{eledmac reminder: }% + \typeout{ The number of the footnotes in this section + has changed since the last run.}% + \typeout{ You will need to run LaTeX two more times + before the footnote placement}% + \typeout{ and line numbering in this section are + correct.}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\led@mess@SectionContinued} +% \begin{macrocode} +\newcommand*{\led@mess@SectionContinued}[1]{% + \message{Section #1 (continuing the previous section)}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\led@err@LineationInNumbered} +% \begin{macrocode} +\newcommand*{\led@err@LineationInNumbered}{% + \eledmac@error{You can't use \string\lineation\space within + a numbered section}{\@ehc}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\led@warn@BadLineation} +% \begin{macro}{\led@warn@BadLinenummargin} +% \begin{macro}{\led@warn@BadLockdisp} +% \begin{macro}{\led@warn@BadSublockdisp} +% \begin{macrocode} +\newcommand*{\led@warn@BadLineation}{% + \eledmac@warning{Bad \string\lineation\space argument}} +\newcommand*{\led@warn@BadLinenummargin}{% + \eledmac@warning{Bad \string\linenummargin\space argument}} +\newcommand*{\led@warn@BadLockdisp}{% + \eledmac@warning{Bad \string\lockdisp\space argument}} +\newcommand*{\led@warn@BadSublockdisp}{% + \eledmac@warning{Bad \string\sublockdisp\space argument}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\led@warn@NoLineFile} +% \begin{macrocode} +\newcommand*{\led@warn@NoLineFile}[1]{% + \eledmac@warning{Can't find line-list file #1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\led@warn@BadAdvancelineSubline} +% \begin{macro}{\led@warn@BadAdvancelineLine} +% \begin{macrocode} +\newcommand*{\led@warn@BadAdvancelineSubline}{% + \eledmac@warning{\string\advanceline\space produced a sub-line + number less than zero.}} +\newcommand*{\led@warn@BadAdvancelineLine}{% + \eledmac@warning{\string\advanceline\space produced a line + number less than zero.}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\led@warn@BadSetline} +% \begin{macro}{\led@warn@BadSetlinenum} +% \begin{macrocode} +\newcommand*{\led@warn@BadSetline}{% + \eledmac@warning{Bad \string\setline\space argument}} +\newcommand*{\led@warn@BadSetlinenum}{% + \eledmac@warning{Bad \string\setlinenum\space argument}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\led@err@PstartNotNumbered} +% \begin{macro}{\led@err@PstartInPstart} +% \begin{macro}{\led@err@PendNotNumbered} +% \begin{macro}{\led@err@PendNoPstart} +% \begin{macro}{\led@err@AutoparNotNumbered} +% \begin{macrocode} +\newcommand*{\led@err@PstartNotNumbered}{% + \eledmac@error{\string\pstart\space must be used within a + numbered section}{\@ehc}} +\newcommand*{\led@err@PstartInPstart}{% + \eledmac@error{\string\pstart\space encountered while another + \string\pstart\space was in effect}{\@ehc}} +\newcommand*{\led@err@PendNotNumbered}{% + \eledmac@error{\string\pend\space must be used within a + numbered section}{\@ehc}} +\newcommand*{\led@err@PendNoPstart}{% + \eledmac@error{\string\pend\space must follow a \string\pstart}{\@ehc}} +\newcommand*{\led@err@AutoparNotNumbered}{% + \eledmac@error{\string\autopar\space must be used within a + numbered section}{\@ehc}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\led@warn@BadAction} +% \begin{macrocode} +\newcommand*{\led@warn@BadAction}{% + \eledmac@warning{Bad action code, value \next@action.}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\led@warn@DuplicateLabel} +% \begin{macro}{\led@warn@RefUndefined} +% \begin{macrocode} +\newcommand*{\led@warn@DuplicateLabel}[1]{% + \eledmac@warning{Duplicate definition of label `#1' on page \the\pageno.}} +\newcommand*{\led@warn@RefUndefined}[1]{% + \eledmac@warning{Reference `#1' on page \the\pageno\space undefined. + Using `000'.}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\led@warn@NoMarginpars} +% \begin{macrocode} +\newcommand*{\led@warn@NoMarginpars}{% + \eledmac@warning{You can't use \string\marginpar\space in numbered text}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\led@warn@BadSidenotemargin} +% \begin{macrocode} +\newcommand*{\led@warn@BadSidenotemargin}{% + \eledmac@warning{Bad \string\sidenotemmargin\space argument}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\led@warn@NoIndexFile} +% \begin{macrocode} +\newcommand*{\led@warn@NoIndexFile}[1]{% + \eledmac@warning{Undefined index file #1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\led@err@TooManyColumns} +% \begin{macro}{\led@err@UnequalColumns} +% \begin{macro}{\led@err@LowStartColumn} +% \begin{macro}{\led@err@HighEndColumn} +% \begin{macro}{\led@err@ReverseColumns} +% \begin{macrocode} +\newcommand*{\led@err@TooManyColumns}{% + \eledmac@error{Too many columns}{\@ehc}} +\newcommand*{\led@err@UnequalColumns}{% + \eledmac@error{Number of columns is not equal to the number + in the previous row (or \protect\\ \space forgotten?)}{\@ehc}} +\newcommand*{\led@err@LowStartColumn}{% + \eledmac@error{Start column is too low}{\@ehc}} +\newcommand*{\led@err@HighEndColumn}{% + \eledmac@error{End column is too high}{\@ehc}} +\newcommand*{\led@err@ReverseColumns}{% + \eledmac@error{Start column is greater than end column}{\@ehc}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% +% \section{Sectioning commands} +% +% \begin{macro}{\section@num} +% You use \cs{beginnumbering} and \cs{endnumbering} to begin +% and end a line-numbered section of the text; the pair of commands may +% be used as many times as you like within one document to start +% and end multiple, separately line-numbered sections. LaTeX will +% maintain and display +% a `section number' as a count named +% \cs{section@num} that counts how many +% \cs{beginnumbering} and \cs{resumenumbering} +% commands have appeared; it needn't be +% related to the logical divisions of your text. +% +% \begin{macro}{\extensionchars} +% Each section will read and write an associated `line-list +% file', containing information used to do the numbering; the file +% will be called \meta{jobname}\file{.nn}, where \file{nn} is the +% section number. However, you may direct that +% an extra string be added before the +% \file{nn} in that filename, in order to distinguish these +% temporary files from others: that string is called +% \cs{extensionchars}. Initially it's empty, since different +% operating systems have greatly varying ideas about what +% characters are permitted in file names. So +% \verb"\renewcommand{\extensionchars}{-}" gives temporary files called +% \file{jobname.-1}, \file{jobname.-2}, etc. +% \begin{macrocode} +\newcount\section@num +\section@num=0 +\let\extensionchars=\empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ifnumbering} +% \begin{macro}{\numberingtrue} +% \begin{macro}{\numberingfalse} +% The \cs{ifnumbering} flag is +% set to \verb"true" if we're within a numbered section (that is, between +% \cs{beginnumbering} and \cs{endnumbering}). You can use \cs{ifnumbering} +% in your own code to check whether you're in a numbered section, but +% don't change the flag's value. +% \begin{macrocode} +\newif\ifnumbering +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ifnumberingR} +% \begin{macro}{\ifl@dpairing} +% \begin{macro}{\l@dpairingtrue} +% \begin{macro}{\l@dpairingfalse} +% \begin{macro}{\ifpst@rtedL} +% \begin{macro}{\pst@rtedLtrue} +% \begin{macro}{\pst@rtedLfalse} +% \begin{macro}{\l@dnumpstartsL} +% \begin{macro}{\ifledRcol} +% In preparation for the \Lpack{eledpar} package, these are related to +% the `left' text of parallel texts (when \cs{ifl@dpairing} is TRUE). +% They are explained in the \Lpack{eledpar} +% manual. +% \changes{v0.7}{2005/02/24}{Added \cs{l@dnumpstartsL}, \cs{ifl@dpairing} +% and \cs{ifpst@rted} for/from eledpar} +% \changes{v0.12}{2005/10/01}{Added \cs{ifledRcol} and \cs{ifnumberingR} for/from eledpar} +% \begin{macrocode} +\newif\ifl@dpairing + \l@dpairingfalse +\newif\ifpst@rtedL + \pst@rtedLfalse +\newcount\l@dnumpstartsL +\newif\ifledRcol +% \end{macrocode} +% The \cs{ifnumberingR} flag is +% set to \verb"true" if we're within a right text numbered section. +% \begin{macrocode} +\newif\ifnumberingR +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\beginnumbering} +% \begin{macro}{\initnumbering@reg} +% \cs{beginnumbering} begins a section of numbered text. +% When it's executed we increment the section number, +% initialize our counters, send a message to your terminal, and +% call macros to start the lineation machinery and endnote files. +% +% The initializations here are trickier than they look. +% \cs{line@list@stuff} will use all of the counters +% that are zeroed here when it assembles +% the line-list and other lists of information about the lineation. +% But it will do all of this locally and +% within a group, and when it's done the +% lists will remain but the counters will return to zero. Those same +% counters will then be used as we process the text of this section, +% but the assignments will be made globally. These initializations +% actually apply to both uses, though in all other respects there +% should be no direct interaction between the use of these counters +% and variables in the two processing steps. +% \changes{v0.7}{2005/02/24}{Added \cs{initnumbering@reg}} +% \begin{macrocode} +\newcommand*{\beginnumbering}{% + \ifnumbering + \led@err@NumberingStarted + \endnumbering + \fi + \global\numberingtrue + \global\advance\section@num \@ne + \initnumbering@reg + \message{Section \the\section@num }% + \line@list@stuff{\jobname.\extensionchars\the\section@num}% + \l@dend@stuff + \setcounter{pstart}{1} +} +\newcommand*{\initnumbering@reg}{% + \global\pst@rtedLfalse + \global\l@dnumpstartsL \z@ + \global\absline@num \z@ + \global\line@num \z@ + \global\subline@num \z@ + \global\@lock \z@ + \global\sub@lock \z@ + \global\sublines@false + \global\let\next@page@num=\relax + \global\let\sub@change=\relax + \resetprevline@ + } + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\endnumbering} +% \cs{endnumbering} must follow the last text for a numbered section. +% It takes care of notifying you when changes have been noted in the +% input that require running the file through again to move everything +% to the right place. +% \changes{v0.7}{2005/02/24}{Changed \cs{endnumbering} for eledpar} +% \begin{macrocode} +\def\endnumbering{% + \ifnumbering + \global\numberingfalse + \normal@pars + \ifl@dpairing + \global\pst@rtedLfalse + \else + \ifx\insertlines@list\empty\else + \global\noteschanged@true + \fi + \ifx\line@list\empty\else + \global\noteschanged@true + \fi + \fi + \ifnoteschanged@ + \led@mess@NotesChanged + \fi + \else + \led@err@NumberingNotStarted + \fi + \autoparfalse} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pausenumbering} +% \begin{macro}{\resumenumbering} +% The \cs{pausenumbering} macro is just the same as +% \cs{endnumbering}, but with the \cs{ifnumbering} flag set to \verb"true", to +% show that numbering continues across the gap.\footnote{Our thanks +% to Wayne Sullivan,\index{Sullivan, Wayne} who suggested the idea +% behind these macros.} +% \begin{macrocode} +\newcommand{\pausenumbering}{% + \endnumbering\global\numberingtrue} +% \end{macrocode} +% The \cs{resumenumbering} macro is a bit more involved, but not much. +% It does most of the same things as \cs{beginnumbering}, but +% without resetting the various counters. Note that no check is made +% by \cs{resumenumbering} to ensure that \cs{pausenumbering} was actually +% invoked. +% \changes{v0.7}{2005/02/24}{Changed \cs{resumenumbering} for eledpar} +% \begin{macrocode} +\newcommand*{\resumenumbering}{% + \ifnumbering + \global\pst@rtedLtrue + \global\advance\section@num \@ne + \led@mess@SectionContinued{\the\section@num}% + \line@list@stuff{\jobname.\extensionchars\the\section@num}% + \l@dend@stuff + \else + \led@err@NumberingShouldHaveStarted + \endnumbering + \beginnumbering + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \section{Line counting} +% \label{lineation}\relax +% +% \subsection{Choosing the system of lineation} +% \changes{v0.15}{2012/06/11}{Line numbering can be reset at each pstart.} +% Sometimes you want line numbers that start at $1$ at the top of each +% page; sometimes you want line numbers that start at $1$ at each \cs{pstart}; other times you want line numbers that start at $1$ at the start +% of each section and increase regardless of page breaks. +% \Eledmac{} can do it either way, and you can switch from one to the +% other within one work. +% But you have to choose one or the other for all line numbers and +% line references within each section. Here we will define +% internal codes for these systems and the macros you use to select them. +% +% \begin{macro}{\ifbypstart@} +% \begin{macro}{\bypstart@true} +% \begin{macro}{\bypstart@false} +% \begin{macro}{\ifbypage@} +% \begin{macro}{\bypage@true} +% \begin{macro}{\bypage@false} +% The \cs{ifbypage@} and \cs{ifbypstart@} flag specifie the current lineation +% system: \begin{itemize} +% \item line-of-page: \verb|bypstart@ = false| and \verb|bypage@ = true|. +% \item line-of-pstart: \verb|bypstart@ = true| and \verb|bypage@ = false|. +% \end{itemize} +% \Eledmac{} will use the line-of-section system unless instructed otherwise. +% \begin{macrocode} +\newif\ifbypage@ +\newif\ifbypstart@ +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lineation} +% \cs{lineation}\marg{word} is the macro you use to select the +% lineation system. +% Its argument is a string: either \texttt{page} or \texttt{section} or \texttt{pstart}. +% \begin{macrocode} +\newcommand*{\lineation}[1]{{% + \ifnumbering + \led@err@LineationInNumbered + \else + \def\@tempa{#1}\def\@tempb{page}% + \ifx\@tempa\@tempb + \global\bypage@true + \global\bypstart@false + \else + \def\@tempb{pstart}% + \ifx\@tempa\@tempb + \global\bypage@false + \global\bypstart@true + \else + \def\@tempb{section} + \ifx\@tempa\@tempb + \global\bypage@false + \global\bypstart@false + \else + \led@warn@BadLineation + \fi + \fi + \fi + \fi}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\linenummargin} +% \begin{macro}{\line@margin} +% \begin{macro}{\l@dgetline@margin} +% You call \cs{linenummargin}\marg{word} to specify which margin you want your +% line numbers in; it takes one argument, a string. +% You can put the line numbers in the same margin on every page using +% \texttt{left} or \texttt{right}; or you can use \texttt{inner} or +% \texttt{outer} to get them in the inner or outer margins. (These last +% two options assume that even-numbered pages will be on the +% left-hand side of every opening in your book.) +% You can change this within a numbered section, but the +% change may not take effect just when you'd like; if it's done between +% paragraphs nothing surprising should happen. +% +% The selection is recorded in the count \cs{line@margin}: +% $0$ for left, $1$ for right, $2$ for outer, and $3$ for inner. +% \changes{v0.7}{2005/02/23}{Added \cs{l@dgetline@margin}} +% \begin{macrocode} +\newcount\line@margin +\newcommand*{\linenummargin}[1]{{% + \l@dgetline@margin{#1}% + \ifnum\@l@dtempcntb>\m@ne + \global\line@margin=\@l@dtempcntb + \fi}} +\newcommand*{\l@dgetline@margin}[1]{% + \def\@tempa{#1}\def\@tempb{left}% + \ifx\@tempa\@tempb + \@l@dtempcntb \z@ + \else + \def\@tempb{right}% + \ifx\@tempa\@tempb + \@l@dtempcntb \@ne + \else + \def\@tempb{outer}% + \ifx\@tempa\@tempb + \@l@dtempcntb \tw@ + \else + \def\@tempb{inner}% + \ifx\@tempa\@tempb + \@l@dtempcntb \thr@@ + \else + \led@warn@BadLinenummargin + \@l@dtempcntb \m@ne + \fi + \fi + \fi + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\c@firstlinenum} +% \begin{macro}{\c@linenumincrement} +% The following counters tell \Eledmac{} which lines should be +% printed with line numbers. \texttt{firstlinenum} is the number of the +% first line in each section that gets a number; +% \texttt{linenumincrement} +% is the difference between successive numbered lines. The initial +% values of these counters produce labels on lines $5$, $10$, $15$, etc. +% \texttt{linenumincrement} must be at least $1$. +% +% \begin{macrocode} +\newcounter{firstlinenum} + \setcounter{firstlinenum}{5} +\newcounter{linenumincrement} + \setcounter{linenumincrement}{5} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\c@firstsublinenum} +% \begin{macro}{\c@sublinenumincrement} +% The following parameters are just like \texttt{firstlinenum} and +% \texttt{linenumincrement}, but for sub-line numbers. +% \texttt{sublinenumincrement} must be at least $1$. +% +% \begin{macrocode} +\newcounter{firstsublinenum} + \setcounter{firstsublinenum}{5} +\newcounter{sublinenumincrement} + \setcounter{sublinenumincrement}{5} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\firstlinenum} +% \begin{macro}{\linenumincrement} +% \begin{macro}{\firstsublinenum} +% \begin{macro}{\sublinenumincrement} +% These macros can be used to set the corresponding counters. +% \changes{v0.7}{2005/02/18}{Added \cs{firstlinenum}, \cs{linenumincrement}, +% \cs{firstsublinenum} and \cs{linenumincrement}} +% \begin{macrocode} +\newcommand*{\firstlinenum}[1]{\setcounter{firstlinenum}{#1}} +\newcommand*{\linenumincrement}[1]{\setcounter{linenumincrement}{#1}} +\newcommand*{\firstsublinenum}[1]{\setcounter{firstsublinenum}{#1}} +\newcommand*{\sublinenumincrement}[1]{\setcounter{sublinenumincrement}{#1}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lockdisp} +% \begin{macro}{\lock@disp} +% \begin{macro}{\l@dgetlock@disp} +% When line locking is being used, the \cs{lockdisp}\marg{word} macro +% specifies whether a line number---if one is due to +% appear---should be printed on the first printed line or on the +% last, or by all of them. Its argument is a word, either +% \texttt{first}, \texttt{last}, or \texttt{all}. +% Initially, it is set to \texttt{first}. +% +% \cs{lock@disp} encodes the selection: $0$ for first, $1$ for last, +% $2$ for all. +% \changes{v0.7}{2005/02/23}{Added \cs{l@dgetlock@disp}} +% \begin{macrocode} +\newcount\lock@disp +\newcommand{\lockdisp}[1]{{% + \l@dgetlock@disp{#1}% + \ifnum\@l@dtempcntb>\m@ne + \global\lock@disp=\@l@dtempcntb + \else + \led@warn@BadLockdisp + \fi}} +\newcommand*{\l@dgetlock@disp}[1]{ + \def\@tempa{#1}\def\@tempb{first}% + \ifx\@tempa\@tempb + \@l@dtempcntb \z@ + \else + \def\@tempb{last}% + \ifx\@tempa\@tempb + \@l@dtempcntb \@ne + \else + \def\@tempb{all}% + \ifx\@tempa\@tempb + \@l@dtempcntb \tw@ + \else + \@l@dtempcntb \m@ne + \fi + \fi + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\sublockdisp} +% \begin{macro}{\sublock@disp} +% The same questions about where to print the line number apply to +% sub-lines, and these are the analogous macros for dealing with +% the problem. +% \begin{macrocode} +\newcount\sublock@disp +\newcommand{\sublockdisp}[1]{{% + \l@dgetlock@disp{#1}% + \ifnum\@l@dtempcntb>\m@ne + \global\sublock@disp=\@l@dtempcntb + \else + \led@warn@BadSublockdisp + \fi}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\linenumberstyle} +% \begin{macro}{\linenumrep} +% \begin{macro}{\linenumr@p} +% \begin{macro}{\sublinenumberstyle} +% \begin{macro}{\sublinenumrep} +% \begin{macro}{\sublinenumr@p} +% We provide a mechanism for using different representations of the +% line numbers, not just the normal arabic. +% +% NOTE: In v0.7 \cs{linenumrep} and \cs{sublinenumrep} replaced +% the internal \cs{linenumr@p} and \cs{sublinenumr@p}. +% +% \verb?\linenumberstyle? and \verb?\sublinenumberstyle? are user level +% macros for setting the number represention (\verb?\linenumrep? +% and \verb?\sublinenumrep?) for line and sub-line numbers. +% \changes{v0.3}{2004/02/14}{Added \cs{linenumberstyle} and \cs{sublinenumberstyle}} +% \changes{v0.7}{2005/02/18}{Using \cs{linenumrep} instead of \cs{linenumr@p}} +% \changes{v0.7}{2005/02/18}{Using \cs{sublinenumrep} instead of \cs{sublinenumr@p}} +% \begin{macrocode} +\newcommand*{\linenumberstyle}[1]{% + \def\linenumrep##1{\@nameuse{@#1}{##1}}} +\newcommand*{\sublinenumberstyle}[1]{% + \def\sublinenumrep##1{\@nameuse{@#1}{##1}}} +% \end{macrocode} +% Initialise the number styles to arabic. +% \begin{macrocode} +\linenumberstyle{arabic} + \let\linenumr@p\linenumrep +\sublinenumberstyle{arabic} + \let\sublinenumr@p\sublinenumrep + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\leftlinenum} +% \begin{macro}{\rightlinenum} +% \begin{macro}{\linenumsep} +% \begin{macro}{\numlabfont} +% \begin{macro}{\ledlinenum} +% \cs{leftlinenum} and \cs{rightlinenum} are the macros that are +% called to print marginal line numbers on +% a page, for left- and right-hand margins respectively. +% They're made easy to access and change, since you may +% often want to change the styling in some way. These standard versions +% illustrate the general sort of thing that will be needed; they're +% based on the \cs{leftheadline} macro in \thetexbook, p.\,416. +% +% Whatever these macros output gets printed in a box that will be +% put into the appropriate margin without any space between it and the +% line of text. You'll generally want a kern between a line number and +% the text, and \cs{linenumsep} is provided as a standard way of +% storing its size. Line numbers are usually printed in a smaller +% font, and \cs{numlabfont} is provided as a standard name for that +% font. When called, these macros +% will be executed within a group, so font changes and the like will +% remain local. +% +% \cs{ledlinenum} typesets the line (and subline) number. +% +% The original \cs{numlabfont} specification is equivalent to +% the LaTeX \cs{scriptsize} for a 10pt document. +% \changes{v0.3}{2004/02/14}{Added \cs{linenumr@p} and \cs{sublinenum@rep} +% to \cs{leftlinenum} and \cs{rightlinenum}} +% \changes{v0.7}{2005/02/18}{Added \cs{ledlinenum} for use by +% \cs{leftlinenum} and \cs{rightlinenum}} +% \begin{macrocode} +\newlength{\linenumsep} + \setlength{\linenumsep}{1pc} +\newcommand*{\numlabfont}{\normalfont\scriptsize} +\newcommand*{\ledlinenum}{% + \numlabfont\linenumrep{\line@num}% + \ifsublines@ + \ifnum\subline@num>0\relax + \unskip\fullstop\sublinenumrep{\subline@num}% + \fi + \fi} +\newcommand*{\leftlinenum}{% + \ledlinenum + \kern\linenumsep} +\newcommand*{\rightlinenum}{% + \kern\linenumsep + \ledlinenum} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{List macros} +% +% Reminder: compare these with the LaTeX list macros in case they +% would be suitable instead. +% +% We will make heavy use of lists of information, which will be built +% up and taken apart by the following macros; they are +% adapted from \thetexbook, pp.\,378--379, which discusses +% their use in more detail. +% +% These macros consume a large amount of the run-time of this code. +% We intend to replace them in a future version, and in anticipation +% of doing so have defined their interface in such a way that it is +% not sensitive to details of the underlying code. +% +% \begin{macro}{\list@create} +% The \cs{list@create} macro creates a new list. In this version of +% \Eledmac{} this macro doesn't do anything beyond initializing an empty +% list macro, but in future versions it may do more. +% \begin{macrocode} +\newcommand*{\list@create}[1]{\global\let#1=\empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\list@clear} +% The \cs{list@clear} macro just initializes a list to the empty list; +% in this version of \Eledmac{} it is no different from +% \cs{list@create}. +% \begin{macrocode} +\newcommand*{\list@clear}[1]{\global\let#1=\empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\xright@appenditem} +% \begin{macro}{\@toksa} +% \begin{macro}{\@toksb} +% \cs{xright@appenditem} expands an item and appends it to the right +% end of a list macro. We want the expansion because we'll often +% be using this to store the current value of a counter. +% It creates global control sequences, like \cs{xdef}, and uses two +% temporary token-list registers, \cs{@toksa} and \cs{@toksb}. +% \begin{macrocode} +\newtoks\@toksa \newtoks\@toksb +\global\@toksa={\\} +\long\def\xright@appenditem#1\to#2{% + \global\@toksb=\expandafter{#2}% + \xdef#2{\the\@toksb\the\@toksa\expandafter{#1}}% + \global\@toksb={}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\xleft@appenditem} +% \cs{xleft@appenditem} expands an item and appends it to the left +% end of a list macro; it is otherwise identical to +% \cs{xright@appenditem}. +% \begin{macrocode} +\long\def\xleft@appenditem#1\to#2{% + \global\@toksb=\expandafter{#2}% + \xdef#2{\the\@toksa\expandafter{#1}\the\@toksb}% + \global\@toksb={}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\gl@p} +% The \cs{gl@p} macro removes the leftmost +% item from a list and places it in a +% control sequence. You say \verb"\gl@p\l\to\z" +% (where \verb"\l" is the list macro, and +% \verb"\z" receives the left item). \verb"\l" is assumed nonempty: say +% \verb"\ifx\l\empty" to test for an empty \verb"\l". The control +% sequences created by \cs{gl@p} are all global. +% \begin{macrocode} +\def\gl@p#1\to#2{\expandafter\gl@poff#1\gl@poff#1#2} +\long\def\gl@poff\\#1#2\gl@poff#3#4{\gdef#4{#1}\gdef#3{#2}} + +% \end{macrocode} +% \end{macro} +% +% \subsection{Line-number counters and lists} +% +% Footnote references using line numbers rather than symbols can't be +% generated in one pass, because we don't know the line numbers till we +% ship out the pages. It would be possible if footnotes were never keyed +% to more than one line; but some footnotes gloss passages that may run +% for several lines, and they must be tied to the first line of the +% passage glossed. And even one-line passages require two passes if we +% want line-per-page numbering rather than line-per-section numbering. +% +% So we run LaTeX over the text several times, and each time save +% information about page and line numbers in a `line-list file' to +% be used during the next pass. At the start of each section---whenever +% \cs{beginnumbering} is executed---the line-list file +% for that section +% is read, and the information from it is encoded into a few list +% macros. +% +% We need first to define the different line numbers that are involved +% in these macros, and the associated counters. +% +% \begin{macro}{\line@num} +% The count \cs{line@num} stores the line number that's used in +% marginal line numbering and in notes: counting either from the start of +% the page or from the start of the section, depending on your +% choice for this section. This may be qualified by \cs{subline@num}. +% \begin{macrocode} +\newcount\line@num +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\subline@num} +% The count \cs{subline@num} stores +% a sub-line number that qualifies \cs{line@num}. For example, +% line $10$ might have sub-line numbers $1$, $2$ and $3$, which might be +% printed as lines $10.1$, $10.2$, $10.3$. +% \begin{macrocode} +\newcount\subline@num +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifsublines@} +% \begin{macro}{\sublines@true} +% \begin{macro}{\sublines@false} +% We maintain an associated flag, \cs{ifsublines@}, +% to tell us whether we're within +% a sub-line range or not. +% +% You may wonder why we don't just use the value of \cs{subline@num} +% to determine this---treating anything greater than $0$ as an +% indication that sub-lineation is on. We need a separate flag because +% sub-lineation can be used together with line-number locking in odd +% ways: several pieces of a logical line might be interrupted by +% pieces of sub-lineated text, and those sub-line numbers should not +% return to zero until the next change in the major line number. This +% is common in the typesetting of English Renaissance verse +% drama\index{Middleton, Thomas}, in which stage directions are +% given sub-line numbers: a single line of verse may be +% interrupted by several stage directions. +% \begin{macrocode} +\newif\ifsublines@ +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\absline@num} +% The count \cs{absline@num} stores the +% absolute number of lines since the start +% of the section: that is, the number we've actually printed, no matter +% what numbers we attached to them. +% This value is never printed on an output page, though +% \cs{line@num} will often be equal to it. It is used internally to +% keep track of where notes are to appear and where new +% pages start: using this value rather than \cs{line@num} is a lot +% simpler, because it doesn't depend on the lineation system in use. +% \begin{macrocode} +\newcount\absline@num +% \end{macrocode} +% \end{macro} +% +% We'll be calling \cs{absline@num} numbers `absolute' numbers, and +% \cs{line@num} and \cs{subline@num} numbers `visible' numbers. +% +% \begin{macro}{\@lock} +% \begin{macro}{\sub@lock} +% The counts \cs{@lock} and \cs{sub@lock} +% tell us the state of line-number +% and sub-line-number locking. $0$ means we're not within a locked set of +% lines; $1$ means we're at the first line in the set; $2$, at some +% intermediate line; and $3$, at the last line. +% \begin{macrocode} +\newcount\@lock +\newcount\sub@lock +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\line@list} +% \begin{macro}{\insertlines@list} +% \begin{macro}{\actionlines@list} +% \begin{macro}{\actions@list} +% Now we can define the list macros that will be created from the +% line-list file. We will maintain the following lists: +% \begin{itemize}\addtolength{\itemsep}{-1ex} +% \item \cs{line@list}: the page and line numbers for every +% lemma marked by \cs{edtext}. +% There are seven pieces of information, separated by vertical bars: +% \phantomsection\label{linenumbers} +% \begin{enumerate}\addtolength{\itemsep}{-1ex} +% \item the starting page, +% \item line, and +% \item sub-line numbers, followed by the +% \item ending page, +% \item line, and +% \item sub-line numbers, and then the +% \item font specifier for the lemma. +% \end{enumerate} +% +% +% These line numbers are all visible numbers. +% The font specifier is a set of four codes for font encoding, +% family, series, and shape, separated by \verb"/" characters. +% Thus a lemma that +% started on page $23$, line $35$ and +% went on until page $24$, line $3$ +% (with no sub-line numbering), and was typeset in a normal roman font +% would have a line list entry like this: \\ +% \verb"23|35|0|24|3|0|OT1/cmr/m/n". +% +% There is one item in this list for every lemma marked by +% \cs{edtext}, even if there are several notes to that lemma, or no +% notes at all. \cs{edtext} reads the data in this list, making it +% available for use in the text of notes. +% +% \item \cs{insertlines@list}: the line numbers of lines that have +% footnotes or other insertions. +% These are the absolute numbers where the corresponding +% lemmas begin. This list contains one entry for every footnote in the +% section; one lemma may contribute no footnotes or many footnotes. +% This list is used by \cs{add@inserts} within \cs{do@line}, to tell +% it where to insert notes. +% +% \item \cs{actionlines@list}: a list of absolute line numbers at +% which we are to perform special +% actions; these actions are specified by the \cs{actions@list} list +% defined below. +% +% \item \cs{actions@list}: action codes corresponding to the line +% numbers in \cs{actionlines@list}. These codes tell \Eledmac{} what action +% it's supposed to take at each of these lines. One action, the +% page-start action, is generated behind the scenes by \Eledmac{} itself; +% the others, for specifying sub-lineation, line-number locking, and +% line-number alteration, are generated only by explicit commands in +% your input file. The page-start and line-number-alteration actions +% require arguments, to specify the new values for the page or line +% numbers; instead of storing those arguments in another list, we have +% chosen the action-code values so that they can encode both the action +% and the argument in these cases. Action codes greater than $-1000$ +% are page-start actions, and the code value is the page number; action +% codes less than $-5000$ specify line numbers, and the code value is +% a transformed version of the line number; action codes between these +% two values specify other actions which require no argument. +% +% Here is the full list of action codes and their meanings: +% +% Any number greater than $-1000$ is a page-start action: the line number +% associated with it is the first line on a page, and the action number is +% the page number. (The cutoff of $-1000$ is chosen because negative +% page-number values are used by some macro packages; we assume that +% page-number values less than $-1000$ are not common.) +% Page-start action codes are added to the list by +% the \cs{page@action} macro, which is (indirectly) triggered by the +% workings of the \cs{page@start} macro; that macro should always be +% called in the output routine, just before the page contents are +% assembled. \Eledmac{} calls it in \cs{pagecontents}. +% +% The action code $-1001$ specifies the start of sub-lineation: meaning +% that, starting with the next line, we should be advancing +% \cs{subline@num} at each start-of-line command, rather than +% \cs{line@num}. +% +% The action code $-1002$ specifies the end of sub-lineation. At the +% next start-of-line, we should clear the sub-line counter and start +% advancing the line number. The action codes for starting and ending +% sub-lineation are added to the list by the \cs{sub@action} macro, as +% called to implement the \cs{startsub} and \cs{endsub} macros. +% +% The action code $-1003$ specifies the start of line number locking. +% After the number for the current line is computed, it will remain +% at that value through the next line that has an action code to end +% locking. +% +% The action code $-1004$ specifies the end of line number locking. +% +% The action code $-1005$ specifies the start of sub-line number locking. +% After the number for the current sub-line is computed, it will remain +% at that value through the next sub-line that has an action code to end +% locking. +% +% The action code $-1006$ specifies the end of sub-line number locking. +% +% The four action codes for line and sub-line number locking are added +% to the list by the \cs{do@lockon} and \cs{do@lockoff} macros, as called +% to implement the \cs{startlock} and \cs{endlock} macros. +% +% An action code of $-5000$ or less sets the current visible line +% number (either the line number or the sub-line number, whichever is +% currently being advanced) to a specific positive value. The value of +% the code is $-(5000+n)$, where $n$ is the value (always $\ge 0$) +% assigned to the current line number. Action codes of this type are +% added to the list by the \cs{set@line@action} macro, as called to +% implement the \cs{advanceline} and \cs{setline} macros: this action only +% occurs when the user has specified some change to the line numbers +% using those macros. Normally \Eledmac{} computes the visible line numbers +% from the absolute line numbers with reference to the other +% action codes and the settings they invoke; it doesn't require an +% entry in the action-code list for every line. +% +% Here are the commands to create these lists: +% +% \begin{macrocode} +\list@create{\line@list} +\list@create{\insertlines@list} +\list@create{\actionlines@list} +\list@create{\actions@list} + +% \end{macrocode} +% +% \end{itemize} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\page@num} +% \begin{macro}{\endpage@num} +% \begin{macro}{\endline@num} +% \begin{macro}{\endsubline@num} +% We'll need some counts while we read the line-list, +% for the page number and the ending page, line, and sub-line numbers. +% Some of these will be used again later on, when we are acting on the +% data in our list macros. +% \begin{macrocode} +\newcount\page@num +\newcount\endpage@num +\newcount\endline@num +\newcount\endsubline@num +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ifnoteschanged@} +% \begin{macro}{\noteschanged@true} +% \begin{macro}{\noteschanged@false} +% If the number of the footnotes in a section is different from what it was +% during the last run, or if this is the very first time you've run +% LaTeX, +% on this file, the information from the line-list used to place the +% notes will be wrong, and some notes will probably be misplaced. +% When this happens, we prefer +% to give a single error message for the whole section rather than +% messages at every point where we notice the problem, because +% we don't really know where in the section notes were added or removed, +% and the solution in any case is simply to run LaTeX two more times; +% there's no fix needed to the document. The +% \cs{ifnoteschanged@} flag is set if such +% a change in the number of notes is discovered at any point. +% \begin{macrocode} +\newif\ifnoteschanged@ +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \DescribeMacro{\resetprevline@} +% Inside the apparatus, at each note, the line number is memorized in a macro called \cs{prevlineX}, +% where X is the letter of the current series. +% This macro is called when using \cs{numberonlyfirstinline}. +% This maco must be reset at the same time as the line number. +% The \cs{resetprevline@} does this resetting for every series. +% \begin{macro}{\resetprevline@} +% \begin{macrocode} +\newcommand*{\resetprevline@}{% + \renewcommand{\do}[1]{\global\csundef{prevline##1}}% + \dolistloop{\@series}% +} +% \end{macrocode} +% \end{macro} +% \subsection{Reading the line-list file} +% +% +% \begin{macro}{\read@linelist} +% \cs{read@linelist}\marg{file} is the control sequence +% that's called by \cs{beginnumbering} +% (via \cs{line@list@stuff}) to open and process a +% line-list file; its argument is the name of the file. +% \phantomsection\label{readlinelist} +% \begin{macrocode} +\newread\@inputcheck +\newcommand*{\read@linelist}[1]{% + \list@clearing@reg +% \end{macrocode} +% +% When the file is there we start a new group and make some special +% definitions we'll need to process it: it's a sequence of \TeX\ +% commands, but they require a few special settings. We make [ and +% ] become grouping characters: they're used that way in the +% line-list file, because we need to write them out one at a time +% rather than in balanced pairs, and it's easier to just use +% something other than real braces. @ must become a letter, since +% this is run in the ordinary LaTeX context. We ignore carriage +% returns, since if we're in horizontal mode they can get +% interpreted as spaces to be printed. +% +% +% Our line, page, and line-locking counters were already zeroed +% by \cs{line@list@stuff} if this is being called from within +% \cs{beginnumbering}; sub-lineation will be turned off as well +% in that case. On the other hand, +% if this is being called from \cs{resumenumbering}, those things +% should still have the values they had when \cs{pausenumbering} +% was executed. +% +% If the file is not there, we print an informative message. +% +% Now, after these preliminaries, we start interpreting the file. +% +% +% \begin{macrocode} + \get@linelistfile{#1}% + \endgroup + +% \end{macrocode} +% +% When the reading is done, we're all through with the +% line-list file. All the information we needed +% from it will now be encoded in our list macros. +% +% Finally, we +% initialize the \cs{next@actionline} and \cs{next@action} macros, +% which specify where and what the next action to be taken is. +% \begin{macrocode} + \global\page@num=\m@ne + \ifx\actionlines@list\empty + \gdef\next@actionline{1000000}% + \else + \gl@p\actionlines@list\to\next@actionline + \gl@p\actions@list\to\next@action + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\list@clearing@reg} +% Clears the lists for \cs{read@linelist} +% \changes{v0.7}{2005/02/22}{Added \cs{list@clearing@reg}} +% \begin{macrocode} +\newcommand*{\list@clearing@reg}{% + \list@clear{\line@list}% + \list@clear{\insertlines@list}% + \list@clear{\actionlines@list}% + \list@clear{\actions@list}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\get@linelistfile} +% \Eledmac{} can take advantage of the LaTeX `safe file input' macros +% to get the line-list file. +% \changes{v0.7}{2005/02/22}{Added \cs{get@linelistfile}} +% \begin{macrocode} +\newcommand*{\get@linelistfile}[1]{% + \InputIfFileExists{#1}{% + \global\noteschanged@false + \begingroup + \catcode`\[=1 \catcode`\]=2 + \makeatletter \catcode`\^^M=9}{% + \led@warn@NoLineFile{#1}% + \global\noteschanged@true + \begingroup}% +} + +% \end{macrocode} +% \end{macro} +% +% This version of \cs{read@linelist} creates list macros +% containing data for the entire section, so they could get rather +% large. It would be no more difficult to read the line-list file +% incrementally rather than all at once: we could read, at the +% start of each paragraph, only the commands relating to that +% paragraph. But this would require that we +% have two line-lists open at once, one for reading, one for +% writing, and on systems without version numbers we'd have to do +% some file renaming outside of LaTeX for that to work. We've +% retained this slower approach to avoid that sort of hacking +% about, but have provided the \cs{pausenumbering} and +% \cs{resumenumbering} macros to help you if you run into +% macro memory limitations (see p.\,\pageref{pause} above). +% +% \subsection{Commands within the line-list file} +% +% This section defines the commands that can appear within a +% line-list file. They all have very short names because we are +% likely to be writing very large numbers of them out. One macro, +% \cs{@l}, is especially short, since it will be written to the +% line-list file once for every line of text in a numbered section. +% (Another of these commands, \cs{@lab}, will be introduced in a +% later section, among the cross-referencing commands it is +% associated with.) +% +% When these commands modify the various page and line counters, +% they deliberately do not say \cs{global}. This is because we +% want them to affect only the counter values within the current +% group when nested calls of \cs{@ref} occur. (The code assumes +% throughout that the value of \cs{globaldefs} is zero.) +% +% The macros with \verb"action" in their names contain all the code +% that modifies the action-code list: again, this is so that they +% can be turned off easily for nested calls of \cs{@ref}. +% +% \begin{macro}{\@l} +% \begin{macro}{\@l@reg} +% \cs{@l} does everything related to the start of a +% new line of numbered text. +% +% In order to get the \verb?\setlinenum? to work Peter Wilson had to slip in some new +% code at the start of the macro, to get the timing of the actions +% correct. The problem was that his original naive implementation +% of \verb?\setlinenum? had a unfortunate tendency to change the +% number of the last line of the \emph{preceding} paragraph. +% The new code is sort of based on the page number handling and +% \verb?\setline? It seems +% that a lot of fiddling with the line number internals is required. +% +% In November 2004 in order to accurately determine page numbers Peter Wilson added +% these to the macro. It is now: \\ +% \cs{@l}\marg{page counter number}\marg{printed page number} \\ +% I don't (yet) use the printed number (i.e., the \verb?\thepage?) but +% it may come in handy later. The macro \cs{fix@page} checks if a new +% page has started. +% +% \changes{v0.3}{2004/02/14}{Added a bunch of code to \cs{@l} for handling +% \cs{setlinenum}} +% \changes{v0.6}{2004/11/16}{Extended \cs{@l} to include the page number} +% \changes{v0.6}{2004/11/16}{Added \cs{fix@page} to \cs{@l}} +% \changes{v0.7}{2005/02/22}{Added \cs{@l@reg}} +% \begin{macrocode} +\newcommand{\@l}[2]{% + \fix@page{#1}% + \@l@reg} +\newcommand*{\@l@reg}{% + \ifx\l@dchset@num\relax \else + \advance\absline@num \@ne + \set@line@action + \let\l@dchset@num=\relax + \advance\absline@num \m@ne + \advance\line@num \m@ne + \fi +% \end{macrocode} +% +% First increment the absolute line-number, and perform +% deferred actions relating to page starts and sub-lines. +% \begin{macrocode} + \advance\absline@num \@ne + \ifx\next@page@num\relax \else + \page@action + \let\next@page@num=\relax + \fi + \ifx\sub@change\relax \else + \ifnum\sub@change>\z@ + \sublines@true + \else + \sublines@false + \fi + \sub@action + \let\sub@change=\relax + \fi +% \end{macrocode} +% +% Fix the lock counters, if necessary. A value of $1$ is advanced to +% $2$; $3$ advances to $0$; other values are unchanged. +% \begin{macrocode} + \ifcase\@lock + \or + \@lock \tw@ + \or \or + \@lock \z@ + \fi + \ifcase\sub@lock + \or + \sub@lock \tw@ + \or \or + \sub@lock \z@ + \fi +% \end{macrocode} +% +% Now advance the visible line number, unless it's been locked. +% \begin{macrocode} + \ifsublines@ + \ifnum\sub@lock<\tw@ + \advance\subline@num \@ne + \fi + \else + \ifnum\@lock<\tw@ + \advance\line@num \@ne \subline@num \z@ + \fi + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@page} +% \cs{@page}\marg{num} marks the start of a new output page; its argument is +% the number of that page. +% +% First we reset the visible line numbers, if we're numbering by page, +% and store the page number itself in a count. +% \begin{macrocode} +\newcommand*{\@page}[1]{% + \ifbypage@ + \line@num \z@ \subline@num \z@ + \fi + \page@num=#1\relax +% \end{macrocode} +% +% And we set a flag that tells \cs{@l} that a new page number is +% to be set, because other associated actions shouldn't occur until the +% next line-start occurs. +% \begin{macrocode} + \def\next@page@num{#1}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\last@page@num} +% \begin{macro}{\fix@page} +% \cs{fix@page} basically replaces \cs{@page}. It determines whether or not +% a new page has been started, based on the page values held by \cs{@l}. +% \changes{v0.6}{2004/11/16}{Added \cs{last@page@num} and \cs{fix@page}} +% \begin{macrocode} +\newcount\last@page@num + \last@page@num=-10000 +\newcommand*{\fix@page}[1]{% + \ifnum #1=\last@page@num + \else + \ifbypage@ + \line@num=\z@ \subline@num=\z@ + \fi + \page@num=#1\relax + \last@page@num=#1\relax + \def\next@page@num{#1}% + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@pend} +% \begin{macro}{\@pendR} +% \begin{macro}{\@lopL} +% \begin{macro}{\@lopR} +% These don't do anything at this point, but will have been added to the +% auxiliary file(s) if the \Lpack{eledpar} package has been used. They +% are just here to stop \Lpack{\eledmac} from moaning if the \Lpack{eledpar} +% is used for one run and then not for the following one. +% \changes{v0.6}{2004/11/16}{Added \cs{@pend},\cs{@pendR}, \cs{@lopL} and +% \cs{@lopR} in anticipation of parallel processing} +% \begin{macrocode} +\newcommand*{\@pend}[1]{} +\newcommand*{\@pendR}[1]{} +\newcommand*{\@lopL}[1]{} +\newcommand*{\@lopR}[1]{} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\sub@on} +% \begin{macro}{\sub@off} +% The \cs{sub@on} and \cs{sub@off} macros +% turn sub-lineation on and off\/: but not directly, since such changes +% don't really take effect until the next line of text. Instead +% they set a flag that notifies \cs{@l} of the necessary action. +% \begin{macrocode} +\newcommand*{\sub@on}{\ifsublines@ + \let\sub@change=\relax + \else + \def\sub@change{1}% + \fi} +\newcommand*{\sub@off}{\ifsublines@ + \def\sub@change{-1}% + \else + \let\sub@change=\relax + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@adv} +% The \cs{@adv}\marg{num} macro advances +% the current visible line number by the amount specified as +% its argument. This is used to implement \cs{advanceline}. +% \begin{macrocode} +\newcommand*{\@adv}[1]{\ifsublines@ + \advance\subline@num by #1\relax + \ifnum\subline@num<\z@ + \led@warn@BadAdvancelineSubline + \subline@num \z@ + \fi + \else + \advance\line@num by #1\relax + \ifnum\line@num<\z@ + \led@warn@BadAdvancelineLine + \line@num \z@ + \fi + \fi + \set@line@action} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@set} +% The \cs{@set}\marg{num} macro sets +% the current visible line number to the value specified as +% its argument. This is used to implement \cs{setline}. +% \begin{macrocode} +\newcommand*{\@set}[1]{\ifsublines@ + \subline@num=#1\relax + \else + \line@num=#1\relax + \fi + \set@line@action} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@d@set} +% \begin{macro}{\l@dchset@num} +% The \cs{l@d@set}\marg{num} macro sets +% the line number for the next \verb?\pstart...? to the value specified as +% its argument. This is used to implement \cs{setlinenum}. +% +% \verb?\l@dchset@num? is a flag to the \verb?\@l? macro. If it is not +% \verb?\relax? then a linenumber change is to be done. +% \begin{macrocode} +\newcommand*{\l@d@set}[1]{% + \line@num=#1\relax + \advance\line@num \@ne + \def\l@dchset@num{#1}} +\let\l@dchset@num\relax + +% \end{macrocode} +% \end{macro} +% \end{macro} + +% +% \begin{macro}{\page@action} +% \cs{page@action} +% adds an entry to the action-code list to change the page number. +% \begin{macrocode} +\newcommand*{\page@action}{% + \xright@appenditem{\the\absline@num}\to\actionlines@list + \xright@appenditem{\next@page@num}\to\actions@list} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\set@line@action} +% \cs{set@line@action} adds an entry to the action-code +% list to change the visible line number. +% \begin{macrocode} +\newcommand*{\set@line@action}{% + \xright@appenditem{\the\absline@num}\to\actionlines@list + \ifsublines@ + \@l@dtempcnta=-\subline@num + \else + \@l@dtempcnta=-\line@num + \fi + \advance\@l@dtempcnta by -5000 + \xright@appenditem{\the\@l@dtempcnta}\to\actions@list} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\sub@action} +% \cs{sub@action} +% adds an entry to the action-code list to turn sub-lineation on or +% off, according to the current value of the \cs{ifsublines@} flag. +% \begin{macrocode} +\newcommand*{\sub@action}{% + \xright@appenditem{\the\absline@num}\to\actionlines@list + \ifsublines@ + \xright@appenditem{-1001}\to\actions@list + \else + \xright@appenditem{-1002}\to\actions@list + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lock@on} +% \begin{macro}{\do@lockon} +% \begin{macro}{\do@lockonL} +% \cs{lock@on} +% adds an entry to the action-code list to turn line number +% locking on. The current setting of the sub-lineation flag tells us +% whether this applies to line numbers or sub-line numbers. +% +% Adding commands to the action list is slow, and it's very often the +% case that a lock-on command is immediately followed by a lock-off +% command in the line-list file, and therefore really does nothing. +% We use a look-ahead scheme here to detect such pairs, and add nothing +% to the line-list in those cases. +% \begin{macrocode} +\newcommand*{\lock@on}{\futurelet\next\do@lockon} +\newcommand*{\do@lockon}{% + \ifx\next\lock@off + \global\let\lock@off=\skip@lockoff + \else + \do@lockonL + \fi} +\newcommand*{\do@lockonL}{% + \xright@appenditem{\the\absline@num}\to\actionlines@list + \ifsublines@ + \xright@appenditem{-1005}\to\actions@list + \ifnum\sub@lock=\z@ + \sub@lock \@ne + \else + \ifnum\sub@lock=\thr@@ + \sub@lock \@ne + \fi + \fi + \else + \xright@appenditem{-1003}\to\actions@list + \ifnum\@lock=\z@ + \@lock \@ne + \else + \ifnum\@lock=\thr@@ + \@lock \@ne + \fi + \fi + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lock@off} +% \begin{macro}{\do@lockoff} +% \begin{macro}{\do@lockoffL} +% \begin{macro}{\skip@lockoff} +% \cs{lock@off} adds an entry to the action-code list +% to turn line number locking off. +% \begin{macrocode} +\newcommand*{\do@lockoffL}{% + \xright@appenditem{\the\absline@num}\to\actionlines@list + \ifsublines@ + \xright@appenditem{-1006}\to\actions@list + \ifnum\sub@lock=\tw@ + \sub@lock \thr@@ + \else + \sub@lock \z@ + \fi + \else + \xright@appenditem{-1004}\to\actions@list + \ifnum\@lock=\tw@ + \@lock \thr@@ + \else + \@lock \z@ + \fi + \fi} +\newcommand*{\do@lockoff}{\do@lockoffL} +\newcommand*{\skip@lockoff}{\global\let\lock@off=\do@lockoff} +\global\let\lock@off=\do@lockoff + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\n@num} +% \begin{macro}{\n@num@reg} +% This macro implements the \cs{skipnumbering} command. It uses +% a new action code, namely 1007. +% \changes{v0.7}{2005/02/22}{Added \cs{n@num}} +% \begin{macrocode} +\newcommand*{\n@num}{\n@num@reg} +\newcommand*{\n@num@reg}{% + \xright@appenditem{\the\absline@num}\to\actionlines@list + \xright@appenditem{-1007}\to\actions@list} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@ref} +% \begin{macro}{\insert@count} +% \cs{@ref} +% marks the start of a passage, for creation of a footnote reference. +% It takes two arguments: +% \begin{itemize}\addtolength{\itemsep}{-1ex} +% \item \verb"#1", the number of entries to add to \cs{insertlines@list} +% for this reference. \SpecialMainIndex{\insert@count} +% This value, here and within \cs{edtext}, +% which computes it and writes it to the line-list file, +% will be stored in the count \cs{insert@count}. +% \begin{macrocode} +\newcount\insert@count +% \end{macrocode} +% +% \item \verb"#2", a sequence of other line-list-file commands, executed to +% determine the ending line-number. (This may also include other +% \cs{@ref} commands, corresponding to uses of \cs{edtext} +% within the first argument of another instance of \cs{edtext}.) +% \end{itemize} +% +% \begin{macro}{\dummy@ref} +% When nesting of \cs{@ref} commands does occur, it's necessary to +% temporarily redefine \cs{@ref} within \cs{@ref}, so that we're only +% doing one of these at a time. +% \begin{macrocode} +\newcommand*{\dummy@ref}[2]{#2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ref@reg} +% The first thing \cs{@ref} (i.e. \cs{@ref@reg}) itself does is to add +% the specified number +% of items to the \cs{insertlines@list} list. +% \changes{v0.7}{2005/02/22}{Added \cs{@ref@reg}} +% \begin{macrocode} +\newcommand*{\@ref}[2]{% + \@ref@reg{#1}{#2}} +\newcommand*{\@ref@reg}[2]{% + \global\insert@count=#1\relax + \loop\ifnum\insert@count>\z@ + \xright@appenditem{\the\absline@num}\to\insertlines@list + \global\advance\insert@count \m@ne + \repeat +% \end{macrocode} +% +% Next, process the second argument to determine the page +% and line numbers for the end of this lemma. +% We temporarily equate \cs{@ref} to a different macro that just executes +% its argument, so that nested \cs{@ref} commands are just skipped +% this time. Some other macros need to be temporarily redefined to +% suppress their action. +% \begin{macrocode} + \begingroup + \let\@ref=\dummy@ref + \let\page@action=\relax + \let\sub@action=\relax + \let\set@line@action=\relax + \let\@lab=\relax + #2 + \global\endpage@num=\page@num + \global\endline@num=\line@num + \global\endsubline@num=\subline@num + \endgroup +% \end{macrocode} +% +% Now store all the information about the location of the lemma's +% start and end in \cs{line@list}. +% \begin{macrocode} + \xright@appenditem% + {\the\page@num|\the\line@num|% + \ifsublines@ \the\subline@num \else 0\fi|% + \the\endpage@num|\the\endline@num|% + \ifsublines@ \the\endsubline@num \else 0\fi}\to\line@list +% \end{macrocode} +% +% Finally, execute the second argument of \cs{@ref} again, +% to perform for real all the commands within it. +% \begin{macrocode} + #2} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Writing to the line-list file} +% +% We've now defined all the counters, lists, and commands involved in +% reading the line-list file at the start of a section. Now we'll +% cover the commands that \Eledmac{} uses within the text of a +% section to write commands out to the line-list. +% +% \begin{macro}{\linenum@out} +% The file will be opened on output stream \cs{linenum@out}. +% \begin{macrocode} +\newwrite\linenum@out +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\iffirst@linenum@out@} +% \begin{macro}{\first@linenum@out@true} +% \begin{macro}{\first@linenum@out@false} +% Once any file is opened on this stream, we keep it open forever, or +% else switch to another file that we keep open. The reason is that +% we want the output routine to write the page number for every page +% to this file; otherwise we'd have to write it at the start of +% every line. +% But it's not very easy for the output routine to tell whether an +% output stream is open or not. There's no way to test the status of +% a particular output stream directly, and +% the asynchronous nature of output routines makes the +% status hard to determine by other means. +% +% We can manage pretty well by means of the \cs{iffirst@linenum@out@} +% flag; its inelegant name suggests the nature of the problem that +% made its creation necessary. It's set +% to be \verb"true" before any \cs{linenum@out} file is opened. When such a file +% is opened for the first time, it's done using \cs{immediate}, so that +% it will at once be safe for the output routine to write to it; we then +% set this flag to \verb"false". +% \begin{macrocode} +\newif\iffirst@linenum@out@ + \first@linenum@out@true +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\line@list@stuff} +% The \cs{line@list@stuff}\marg{file} macro, which +% is called by \cs{beginnumbering}, performs +% all the line-list operations needed at the start of a section. +% Its argument is the name of the line-list file. +% \begin{macrocode} +\newcommand*{\line@list@stuff}[1]{% +% \end{macrocode} +% +% First, use the commands of the previous section to interpret the +% line-list file from the last run. +% \begin{macrocode} + \read@linelist{#1}% +% \end{macrocode} +% +% Now close the current output line-list file, if any, and open a new one. +% The first time we open a line-list file for output, we do it using +% \cs{immediate}, and clear the \cs{iffirst@linenum@out@} flag. +% \changes{v0.2.2}{2003/11/09}{Added initial write of page number in +% \cs{line@list@stuff}} +% \changes{v0.7}{2005/02/25}{Deleted \cs{page@start} from \cs{line@list@stuff}} +% \begin{macrocode} + \iffirst@linenum@out@ + \immediate\closeout\linenum@out + \global\first@linenum@out@false + \immediate\openout\linenum@out=#1\relax + \else +% \end{macrocode} +% If we get here, then this is +% not the first line-list we've seen, so we +% don't open or close the files immediately. +% \begin{macrocode} + \closeout\linenum@out + \openout\linenum@out=#1\relax + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\new@line} +% The \cs{new@line} macro sends the \cs{@l} command to the line-list +% file, to mark the start of a new text line, and its page number. +% \changes{v0.6}{2004/11/16}{Extended \cs{new@line} to output page numbers} +% \begin{macrocode} +\newcommand*{\new@line}{\write\linenum@out{\string\@l[\the\c@page][\thepage]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\flag@start} +% \begin{macro}{\flag@end} +% We enclose a lemma marked by \cs{edtext} in +% \cs{flag@start} and \cs{flag@end}: these send the \cs{@ref} +% command to the line-list file. \cs{edtext} is responsible for +% setting the value of \cs{insert@count} appropriately; it +% actually gets done by the various footnote macros. +% \begin{macrocode} +\newcommand*{\flag@start}{% + \edef\next{\write\linenum@out{% + \string\@ref[\the\insert@count][}}% + \next} +\newcommand*{\flag@end}{\write\linenum@out{]}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\page@start} +% Originally the commentary was: \cs{page@start} writes a command to the line-list +% file noting the current page number; +% when used within an output routine, this should be called so as to place +% its \cs{write} within the box that gets shipped out, and as close to +% the top of that box as possible. +% +% However, in October 2004 Alexej Krukov\index{Krukov, Alexej} discovered that +% when processing long paragraphs that included Russian, Greek and Latin texts +% \Eledmac{} would go into an infinite loop, emitting thousands of blank pages. +% This was caused by being unable to find an appropriate place in the +% output routine. A different algorithm is now used for getting page numbers. +% \changes{v0.6}{2004/11/16}{Made \cs{page@start} a no-op} +% \begin{macrocode} +\newcommand*{\page@start}{} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\startsub} +% \begin{macro}{\endsub} +% \cs{startsub} and \cs{endsub} +% turn sub-lineation on and off, by writing +% appropriate instructions to the line-list file. When +% sub-lineation is in effect, the line number counter is frozen and +% the sub-line counter advances instead. If one of these commands +% appears in the middle of a line, it doesn't take effect until the +% next line; in other words, a line is counted as a line or +% sub-line depending on what it started out as, even if that +% changes in the middle. +% +% We tinker with \cs{lastskip} because a command of either sort +% really needs to be attached to the last word preceding the change, not +% the first word that follows the change. This is because sub-lineation +% will often turn on and off in mid-line---stage directions, for example, +% often are mixed with dialogue in that way---and when a line is mixed +% we want to label it using the system that was in effect at its start. +% But when sub-lineation begins at the very start of a line we have a +% problem, if we don't put in this code. +% \begin{macrocode} +\newcommand*{\startsub}{\dimen0\lastskip + \ifdim\dimen0>0pt \unskip \fi + \write\linenum@out{\string\sub@on}% + \ifdim\dimen0>0pt \hskip\dimen0 \fi} +\def\endsub{\dimen0\lastskip + \ifdim\dimen0>0pt \unskip \fi + \write\linenum@out{\string\sub@off}% + \ifdim\dimen0>0pt \hskip\dimen0 \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\advanceline} +% You can use \cs{advanceline}\marg{num} +% in running text to advance the current visible +% line-number by a specified value, positive or negative. +% \begin{macrocode} +\newcommand*{\advanceline}[1]{\write\linenum@out{\string\@adv[#1]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setline} +% You can use \cs{setline}\marg{num} +% in running text (i.e., within \verb?\pstart...\pend?) to set the +% current visible +% line-number to a specified positive value. +% \begin{macrocode} +\newcommand*{\setline}[1]{% + \ifnum#1<\z@ + \led@warn@BadSetline + \else + \write\linenum@out{\string\@set[#1]}% + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setlinenum} +% You can use \cs{setlinenum}\marg{num} +% before a \verb?\pstart? to set the visible line-number to a specified +% positive value. It writes a \verb?\l@d@set? command to the line-list file. +% \begin{macrocode} +\newcommand*{\setlinenum}[1]{% + \ifnum#1<\z@ + \led@warn@BadSetlinenum + \else + \write\linenum@out{\string\l@d@set[#1]}% + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\startlock} +% \begin{macro}{\endlock} +% You can use \cs{startlock} or \cs{endlock} +% in running text to start or end line number locking at +% the current line. They decide whether line numbers or sub-line numbers +% are affected, depending on the current state of the sub-lineation flags. +% \begin{macrocode} +\newcommand*{\startlock}{\write\linenum@out{\string\lock@on}} +\def\endlock{\write\linenum@out{\string\lock@off}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ifl@dskipnumber} +% \begin{macro}{\l@dskipnumbertrue} +% \begin{macro}{\l@dskipnumberfalse} +% \begin{macro}{\skipnumbering} +% \begin{macro}{\skipnumbering@reg} +% In numbered text \cs{skipnumbering} will suspend the numbering +% for that particular line. +% \changes{v0.7}{2005/02/22}{Added \cs{skipnumbering} and supports} +% \begin{macrocode} +\newif\ifl@dskipnumber + \l@dskipnumberfalse +\newcommand*{\skipnumbering}{\skipnumbering@reg} +\newcommand*{\skipnumbering@reg}{% + \write\linenum@out{\string\n@num}% + \advanceline{-1}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \section{Marking text for notes} +% \label{text}\relax +% +% The \cs{edtext} (or \cs{critext}) macro is used to create all +% footnotes and endnotes, +% as well as to print the portion of the main text to which a given note +% or notes is keyed. The idea is to have that lemma appear only once in +% the \file{.tex} file: all instances of it in the main text and in the +% notes are copied from that one appearance. +% +% For convenience, I will use \cs{*text} when I do not need to distinguish +% between \cs{edtext} and \cs{critext}. +% The \cs{*text} macros take two arguments, the only difference between +% \cs{edtext} and \cs{critext} is how the second argument is delineated. +% +% \cs{critext} requires two arguments. At any point within numbered +% text, you use it by saying: +% \begin{verbatim} +% \critext{#1}#2/ +% \end{verbatim} +% Similarly \cs{edtext} requires the same two arguments +% but you use it by saying: +% \begin{verbatim} +% \edtext{#1}{#2} +% \end{verbatim} +% +% \begin{itemize}\addtolength{\itemsep}{-1ex} +% \item \verb"#1" is the piece of the main text being glossed; +% it gets added to the +% main text, and is also used as a lemma for notes to it. +% +% \item \verb"#2" is a series of subsidiary macros that generate +% various kinds of notes. With \cs{critext} the \verb"/" after \verb"#2" \emph{must} appear: +% it marks the end of the macro. (\thetexbook, +% p.\,204, points out that when +% additional text to be matched follows the arguments like this, spaces +% following the macro are not skipped, which is very desirable since +% this macro will never be used except within text. Having an +% explicit terminator also helps keep things straight when nested +% calls to \cs{critext} are used.) Braces around +% \verb"#2" are optional with \cs{critext} and required for \cs{edtext}. +% \end{itemize} +% +% The \cs{*text} macro may be used (somewhat) recursively; that +% is, \cs{*text} may be used within its own first argument. The +% code would be much simpler without this feature, but nested notes +% will commonly be necessary: it's quite likely that we'll have an +% explanatory note for a long passage and notes on variants for +% individual words within that passage. The situation we can't +% handle is overlapping notes that aren't nested: for example, one +% note covering lines 10--15, and another covering 12--18. You can +% handle such cases by using the \cs{lemma} and \cs{linenum} +% macros within \verb"#2": they alter the copy of the lemma and the +% line numbers that are passed to the notes, and hence allow you to +% overcome any limitations of this system, albeit with extra +% effort. +% +% The recursive operation of \cs{*text} will fail if you try to use a copy +% that is called something other than \cs{*text}. In order to handle +% recursion, \cs{*text} needs to redefine its own definition temporarily +% at one point, and that doesn't work if the macro you are calling is +% not actually named \cs{*text}. There's no problem as long as \cs{*text} +% is not invoked in the first argument. If you want to call \cs{*text} +% something else, it is best to create instead a macro that expands +% to an invocation of \cs{*text}, rather than copying \cs{*text} and giving +% it a new name; otherwise you will need to add an appropriate +% definition for your new macro to \cs{morenoexpands}. +% +% Side effects of our line-numbering code make it impossible to use +% the usual footnote macros directly within a paragraph whose lines are +% numbered (see comments to +% \cs{do@line}, p.\,\pageref{doline}). +% Instead, the appropriate note-generating command +% is appended to the list macro \cs{inserts@list}, and when \cs{pend} +% completes the paragraph it inserts all the notes at the proper places. +% +% Note that we don't provide previous-note information, although it's +% often wanted; your own macros must handle that. We can't do it +% correctly without keeping track of what kind of notes have gone past: +% it's not just a matter of remembering the line numbers associated with +% the previous invocation of \cs{*text}, because that might have been for +% a different kind of note. It is preferable for your footnote macros +% to store and recall this kind of information if they need it. +% +% \phantomsection\label{parallel}An example where some `memory' of line numbers +% might be required is where there are several variant readings +% per line of text, and you do not wish the line number to be repeated +% for each lemma in the notes. After the first occurrence of the line +% number, you might want the symbol `$\parallel$' instead of further +% occurrences, for instance. This can easily be done by a macro like +% \cs{printlines}, if it saves the last value of \cs{l@d@nums} that \emph{it} +% saw, and then performs a simple conditional test to see whether to print +% a number or a~`$\parallel$'. +% +% \subsection{{\tt \protect\bslash edtext} and {\tt \protect\bslash critext} +% themselves} +% +% The various note-generating macros might want to request that +% commands be executed not at once, but in close connection with the +% start or end of the lemma. For example, footnote numbers in the text +% should be connected to the end of the lemma; or, instead of a single +% macro to create a note listing variants, you might want to use +% several macros in series to create individual variants, which would +% each add information to a private macro or token register, which in +% turn would be formatted and output when all of \verb"#2" for the lemma +% has been read. +% +% \begin{macro}{\end@lemmas} +% To accomodate this, we provide a list macro +% to which macros may add commands that should subsequently +% be executed at the end of the lemma when that lemma is added +% to the text of the paragraph. A macro should add its contribution to +% \cs{end@lemmas} by using \cs{xleft@appenditem}. +% (Anything that needs to be done at +% the \emph{start} of the lemma may be handled using \cs{aftergroup}, since +% the commands specified within \cs{critext}'s second argument are +% executed within a group that ends just before the lemma is added to +% the main text.) +% +% \cs{end@lemmas} is intended for the few things that need to be +% associated with the end of the lemma, like footnote numbers. Such +% numbers are not implemented in the current version, and indeed +% no use is currently made of \cs{end@lemmas} or of the \cs{aftergroup} +% trick. The general +% approach would be to define a macro to be used within the second +% argument of \cs{critext} that would add the appropriate command to +% \cs{end@lemmas}. +% +% Commands that are added to this list should always take care +% not to do anything that adds possible line-breaks to the output; +% otherwise line numbering could be thrown off. +% \begin{macrocode} +\list@create{\end@lemmas} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dummy@text} +% We now need to define a number of macros that allow us to weed out +% nested instances of \cs{critext}, and other problematic macros, from +% our lemma. This is similar to what we did in reading the line-list +% file using \cs{dummy@ref} and various redefinitions---and that's +% because nested \cs{critext} macros create nested \cs{@ref} entries +% in the line-list file. +% +% Here's a macro that takes the same arguments as +% \cs{critext} but merely returns the first argument and ignores +% the second. +% \begin{macrocode} +\long\def\dummy@text#1#2/{#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dummy@edtext} +% LaTeX users are not used to delimited arguments, so I provide +% a \cs{edtext} macro as well. +% \begin{macrocode} +\newcommand{\dummy@edtext}[2]{#1} +% \end{macrocode} +% \end{macro} +% +% +% We're going to need another macro that takes one argument and ignores +% it entirely. This is supplied by the LaTeX \cs{@gobble}\marg{arg}. +% +% \begin{macro}{\no@expands} +% \begin{macro}{\morenoexpands} +% We need to turn off macro expansion for certain sorts of macros we're +% likely to see within the lemma and within the notes. +% +% The first class is font-changing macros. We suppress expansion for +% them by letting them become equal to zero.\footnote{Since `control +% sequences equivalent to characters are not expandable'---\thetexbook, +% answer to Exercise 20.14.} This is done because we want to +% pass into our notes the generic commands to change to roman or +% whatever, and not their expansions that will ask for a particular style at +% a specified size. The notes may well be in a smaller font, so the +% command should be expanded later, when the note's environment is in +% effect. +% +% A second sort to turn off includes a few of the accent macros. +% Most are not a problem: an accent that's expanded to an \cs{accent} +% command may be harder to read but it works just the same. The +% ones that cause problems are: those that use alignments---\TeX\ +% seems to get confused about the difference between alignment +% parameters and macro parameters; those that use temporary control +% sequences; and those that look carefully at what the current font +% is. +% +% (The \cs{copyright} macro defined in \PlainTeX\ has this sort of +% problem as well, but isn't used enough to bother with. That macro, +% and any other that causes trouble, will get by all right if you put +% a \cs{protect} in front of it in your file.) +% +% We also need to eliminate all \Eledmac{} macros like \cs{edlabel} and +% \cs{setline} that write things to auxiliary files: that writing +% should be done only once. And we make +% \cs{critext} itself, if it appears within its own +% argument, do nothing but copy its first argument. +% +% Finally, we execute \cs{morenoexpands}. The version of +% \cs{morenoexpands} defined here does nothing; but you may define +% a version of your own when you need to add more expansion +% suppressions as needed with your macros. That makes it possible +% to make such additions without needing to copy or modify the +% standard \Eledmac{} code. If you define your own +% \cs{morenoexpands}, you must be very careful about spaces: if the +% macro adds any spaces to the text when it runs, extra space +% will appear in the main text when \cs{critext} is used. +% +% (A related problem, not addressed by these two macros, +% is that of characters whose category code is changed by any +% the macros used in the arguments to \cs{critext}. Since the +% category codes are set when the arguments are scanned, macros +% that depend on changing them will not work. We have most often +% encountered this with characters that are made `active' within +% text in some, but not all, of the languages used within the document. +% One way around the problem, if it takes this form, +% is to ensure that those characters are \emph{always} active; within +% languages that make no special use of them, their associated +% control sequences should simply return the proper character.) +% \changes{v0.2}{2003/07/25}{Added \cs{l@dtabnoexpands} to \cs{no@expands}} +% \changes{v0.2.1}{203/08/25}{Removed some \cs{let}s from \cs{no@expands}. +% These were in \edmac{} but I feel that they should not have been as they +% disabled page/line refs in a footnotes} +% \changes{v1.0}{2012/09/15}{Change to be compatible with new features} +% \begin{macrocode} +\newcommand*{\no@expands}{% + \let\select@@lemmafont=0% + \let\startsub=\relax \let\endsub=\relax + \let\startlock=\relax \let\endlock=\relax + \let\edlabel=\@gobble + \let\setline=\@gobble \let\advanceline=\@gobble + \let\critext=\dummy@text + \let\edtext=\dummy@edtext + \l@dtabnoexpands + \morenoexpands} +\let\morenoexpands=\relax + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@tag} +% Now, we define an empty \cs{@tag} command. It will be redefine by \cs{edtext}: its value is the first args. It will be used by the \cs{Xfootnote} commands. +% \begin{macrocode} +\newcommand{\@tag}{} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\critext} +% Now we begin \cs{critext} itself. The definition requires a \verb"/" after +% the arguments: this eliminates the possibility of problems about +% knowing where \verb"#2" ends. This also changes the handling of spaces +% following an invocation of the macro: normally such spaces are +% skipped, but in this case they're significant because \verb"#2" is +% a `delimited parameter'. Since \cs{critext} is always used in running +% text, it seems more appropriate to pay attention to spaces than to +% skip them. +% +% When executed, \cs{critext} first ensures that we're in +% horizontal mode. +% \begin{macrocode} +\long\def\critext#1#2/{\leavevmode +% \end{macrocode} +% +% \begin{macro}{\@tag} +% Our normal lemma is just argument \verb"#1"; but that argument could have +% further invocations of \cs{critext} within it. We get a copy of the +% lemma without any \cs{critext} macros within it by temporarily redefining +% \cs{critext} to just copy its first argument and ignore the other, +% and then expand \verb"#1" into \cs{@tag}, our lemma. +% +% This is done within a group that starts here, in order to get the +% original \cs{critext} restored; within this group we've also turned +% off the expansion of those control sequences commonly found within text +% that can cause trouble for us. +% \begin{macrocode} + \begingroup + \global\renewcommand{\@tag}{\no@expands #1}%% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@d@nums} +% \phantomsection\label{nums} +% Prepare more data for the benefit of note-generating macros: the line +% references and font specifier for this lemma go to \cs{l@d@nums}. +% \begin{macrocode} + \set@line +% \end{macrocode} +% \end{macro} +% +% \cs{insert@count} will be altered by the note-generating macros: +% it counts the number of deferred footnotes or other insertions +% generated by this instance of \cs{critext}. +% \begin{macrocode} + \global\insert@count=0 +% \end{macrocode} +% +% Now process the note-generating macros in argument \verb"#2" +% (i.e., \cs{Afootnote}, \cs{lemma}, etc.). \cs{ignorespaces} is here to +% skip over any spaces that might appear at the start of \verb"#2"; +% otherwise they wind up in the main text. Footnote and other +% macros that are used within \verb"#2" should all end with +% \cs{ignorespaces} as well, to skip any spaces between macros when +% several are used in series. +% \begin{macrocode} + \ignorespaces #2\relax +% \end{macrocode} +% +% Finally, we're ready to admit the first argument into the current +% paragraph. +% +% It's important that we generate and output all the notes for this +% chunk of text \emph{before} putting the text into the paragraph: notes +% that are referenced by line number should generally be tied to the +% start of the passage they gloss, not the end. That should all be done +% within the expansion of \verb"#2" above, or in \cs{aftergroup} +% commands within that expansion. +% \begin{macrocode} + \flag@start + \endgroup + \showlemma{#1}% +% \end{macrocode} +% +% Finally, we add any insertions that are +% associated with the \emph{end} of +% the lemma. Footnotes that are identified by symbols rather than by +% where the lemma begins in the main text need to be done here, and +% not above. +% +% \begin{macrocode} + \ifx\end@lemmas\empty \else + \gl@p\end@lemmas\to\x@lemma + \x@lemma + \global\let\x@lemma=\relax + \fi + \flag@end} +% \end{macrocode} +% \end{macro} +% +% \changes{v0.4}{2004/02/29}{Added \cs{showlemma} to \cs{edtext} (and \cs{critext})} +% \begin{macro}{\edtext} +% \begin{macrocode} +\newcommand{\edtext}[2]{\leavevmode + \begingroup + \global\renewcommand{\@tag}{\no@expands #1}%% + \set@line + \global\insert@count=0 + \ignorespaces #2\relax + \flag@start + \endgroup + \showlemma{#1}% + \ifx\end@lemmas\empty \else + \gl@p\end@lemmas\to\x@lemma + \x@lemma + \global\let\x@lemma=\relax + \fi + \flag@end} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\ifnumberline} +% The \cs{ifnumberline} option can be set to FALSE to disable line numbering. +% \begin{macrocode} +\newif\ifnumberline +\numberlinetrue +% \end{macrocode} +% \end{macro} +% \begin{macro}{\set@line} +% The \cs{set@line} macro +% is called by \cs{critext} to put the line-reference field and +% font specifier for the current block of text into \cs{l@d@nums}. +% +% One instance of \cs{critext} may generate several notes, or it +% may generate none---it's legitimate for argument \verb"#2" to \cs{critext} to +% be empty. But \cs{flag@start} and \cs{flag@end} induce the generation of +% a single entry in \cs{line@list} during the next run, and it's vital +% to also remove one and only one \cs{line@list} entry here. +% \begin{macrocode} +\newcommand*{\set@line}{% +% \end{macrocode} +% +% If no more lines are listed in \cs{line@list}, something's +% wrong---probably just some change in the input. We set all the numbers +% to zeros, following an old publishing convention for numerical +% references that haven't yet been resolved. +% \begin{macrocode} + \ifx\line@list\empty + \global\noteschanged@true + \xdef\l@d@nums{000|000|000|000|000|000|\edfont@info}% + \else + \gl@p\line@list\to\@tempb + \xdef\l@d@nums{\@tempb|\edfont@info}% + \global\let\@tempb=\undefined + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\edfont@info} +% The macro \cs{edfont@info} returns coded information about the +% current font. +% +% \begin{macrocode} +\newcommand*{\edfont@info}{\f@encoding/\f@family/\f@series/\f@shape} + +% \end{macrocode} +% \end{macro} +% +% \subsection{Substitute lemma} +% +% \begin{macro}{\lemma} +% The \cs{lemma}\marg{text} macro allows you to change the lemma +% that's passed on to the notes. +% \begin{macrocode} +\newcommand*{\lemma}[1]{\global\renewcommand{\@tag}{\no@expands #1}} +% \end{macrocode} +% \end{macro} +% +% \subsection{Substitute line numbers} +% +% \begin{macro}{\linenum} +% \phantomsection\label{linenumdef}\relax +% The \cs{linenum} macro can change any or all of +% the page and line numbers that are +% passed on to the notes. +% +% As argument \cs{linenum} takes a set of seven parameters +% separated by vertical bars, in the format used internally for +% \cs{l@d@nums} (see p.\,\pageref{linenumbers}): the starting page, +% line, and sub-line numbers, followed by the ending page, line, and +% sub-line numbers, and then the font specifier for the lemma. +% However, you can omit any parameters you don't want to change, and +% you can omit a string of vertical bars at the end of the +% argument. Hence \verb"\linenum{18|4|0|18|7|1|0}" is an invocation +% that changes all the parameters, but \verb"\linenum{|3}" only +% changes the starting line number, and leaves the rest unaltered. +% +% We use \verb"\\" as an internal separator for the macro parameters. +% \begin{macrocode} +\newcommand*{\linenum}[1]{% + \xdef\@tempa{#1|||||||\noexpand\\\l@d@nums}% + \global\let\l@d@nums=\empty + \expandafter\line@set\@tempa|\\\ignorespaces} +% \end{macrocode} +% +% \begin{macro}{\line@set} +% \cs{linenum} calls \cs{line@set} to do the actual work; it +% looks at the first number in the argument to \cs{linenum}, +% sets the corresponding value in \cs{l@d@nums}, and then calls +% itself to process the next number in the \cs{linenum} +% argument, if there are more numbers in \cs{l@d@nums} to process. +% \begin{macrocode} +\def\line@set#1|#2\\#3|#4\\{% + \gdef\@tempb{#1}% + \ifx\@tempb\empty + \l@d@add{#3}% + \else + \l@d@add{#1}% + \fi + \gdef\@tempb{#4}% + \ifx\@tempb\empty\else + \l@d@add{|}\line@set#2\\#4\\% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@d@add} +% \cs{line@set} uses \cs{l@d@add} to tack numbers or vertical bars +% onto the right hand end of \cs{l@d@nums}. +% \begin{macrocode} +\newcommand{\l@d@add}[1]{\xdef\l@d@nums{\l@d@nums#1}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \section{Paragraph decomposition and reassembly} +% \label{paragraph}\relax +% +% In order to be able to count the lines of text and affix line +% numbers, we add an extra stage of processing for each paragraph. +% We send the paragraph into a box +% register, rather than straight onto the vertical list, and when +% the paragraph ends we +% slice the paragraph into its component lines; to each line we +% add any notes or line numbers, add a command to write to the +% line-list, and then at last send the line to the vertical list. +% This section contains all the code for this processing. +% +% \subsection{Boxes, counters, {\tt\protect\bslash pstart} +% and {\tt\protect\bslash pend}} +% +% \begin{macro}{\raw@text} +% \begin{macro}{\ifnumberedpar@} +% \begin{macro}{\numberedpar@true} +% \begin{macro}{\numberedpar@false} +% \begin{macro}{\num@lines} +% \begin{macro}{\one@line} +% \begin{macro}{\par@line} +% Here are numbers and flags that are used internally in the course +% of the paragraph decomposition. +% +% When we first form the paragraph, it goes into a box register, +% \cs{raw@text}, instead of onto the current vertical list. +% The \cs{ifnumberedpar@} flag will be \verb"true" while a paragraph is +% being processed in that way. +% \cs{num@lines} will store the number of lines in the paragraph +% when it's complete. When we chop it up into lines, each line +% in turn goes into the +% \cs{one@line} register, and \cs{par@line} will be the number +% of that line within the paragraph. +% \begin{macrocode} +\newbox\raw@text +\newif\ifnumberedpar@ +\newcount\num@lines +\newbox\one@line +\newcount\par@line +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\pstart} +% \begin{macro}{\numberpstarttrue} +% \begin{macro}{\numberpstartfalse} +% \begin{macro}{thepstart} +% \cs{pstart} starts the paragraph by +% clearing the \cs{inserts@list} list and other +% relevant variables, and then arranges for the +% subsequent text to go into the +% \cs{raw@text} box. \cs{pstart} needs to appear at the start of +% every paragraph that's to be numbered; the \cs{autopar} command below +% may be used to insert these commands automatically. +% +% Beware: everything that occurs between \cs{pstart} and \cs{pend} +% is happening within a group; definitions must be global if you want +% them to survive past the end of the paragraph. +% +%You can use the command \cs{numberpstarttrue} to insert a number on every \cs{pstart}. To stop the numbering, you must use \cs{numberpstartfalse}. To reset the numebering of \cs{pstarts}, insert +% \begin{verbatim} +%\setcounter{pstart}{0} +% \end{verbatim} +% +% \begin{macrocode} + +\newcounter{pstart} +\renewcommand{\thepstart}{{\bfseries\@arabic\c@pstart}. } +\newif\ifnumberpstart +\numberpstartfalse +\newcommand*{\pstart}{ +\if@nobreak +\let\@oldnobreak\@nobreaktrue +\else +\let\@oldnobreak\@nobreakfalse +\fi +\@nobreaktrue +\ifnumbering \else + \led@err@PstartNotNumbered + \beginnumbering + \fi + \ifnumberedpar@ + \led@err@PstartInPstart + \pend + \fi + \list@clear{\inserts@list}% + \global\let\next@insert=\empty + \begingroup\normal@pars + \global\setbox\raw@text=\vbox\bgroup\ifautopar\else\ifnumberpstart\ifinstanza\else\ifsidepstartnum\else\thepstart\fi\fi\fi\fi + \numberedpar@true} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\pend} +% \cs{pend} must be used to end a numbered paragraph. +% +% \begin{macrocode} +\newcommand*{\pend}{\ifnumbering \else + \led@err@PendNotNumbered + \fi + \ifnumberedpar@ \else + \led@err@PendNoPstart + \fi +% \end{macrocode} +% We set all the usual interline penalties to zero and then immediately +% call \cs{endgraf} to end the paragraph; this ensures that there'll +% be no large interline penalties to prevent us from slicing the +% paragraph into pieces. These penalties revert to the values +% that you set when the group for the \cs{vbox} ends. Then we call +% \cs{do@line} to slice a line off the top of the +% paragraph, add a line number and footnotes, and restore it to the page; +% we keep doing this until there aren't any more lines left. +% \begin{macrocode} + \l@dzeropenalties + \endgraf\global\num@lines=\prevgraf\egroup + \global\par@line=0 +% \end{macrocode} +% We check if lineation is by pstart: in this case, we reset line number, but only in the second line of the pstart, to prevent some trouble. We can't reset line number at the begining of \cs{pstart} \cs{setline} is parsed at the end of previous \cs{pend}, and so, we must do it at the end of first line of pstart. +% \begin{macrocode} + \csnumdef{pstartline}{0} + \loop\ifvbox\raw@text + \csnumdef{pstartline}{\pstartline+1}% + \do@line + \ifbypstart@% + \ifnumequal{\pstartline}{1}{\setline{1}\resetprevline@}{}% + \fi + \repeat +% \end{macrocode} +% Deal with any leftover notes, and then end the group that was begun +% in the \cs{pstart}. +% \begin{macrocode} + \flush@notes + \endgroup + \ignorespaces + \ifnumberpstart + \pstartnumtrue + \fi + \@oldnobreak + \addtocounter{pstart}{1}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@dzeropenalties} +% A macro to zero penalties for \cs{pend}. +% \changes{v0.7}{2005/02/22}{Added \cs{l@dzeropenalties}} +% \begin{macrocode} +\newcommand*{\l@dzeropenalties}{% + \brokenpenalty \z@ \clubpenalty \z@ + \displaywidowpenalty \z@ \interlinepenalty \z@ \predisplaypenalty \z@ + \postdisplaypenalty \z@ \widowpenalty \z@} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\autopar} +% In most cases it's only an annoyance to have to label the paragraphs +% to be numbered with \cs{pstart} and \cs{pend}. \cs{autopar} will +% do that automatically, allowing you to start a paragraph with its +% first word and no other preliminaries, and to end it with a blank line +% or a \verb"\par" command. The command should be issued within a +% group, after \cs{beginnumbering} has been used to start the +% numbering; all paragraphs within the group will be affected. +% +% A few situations can cause problems. One is a paragraph that begins with +% a begin-group character or command: \cs{pstart} will not get invoked +% until after such a group beginning is processed; as a result the +% character that ends the group will be mistaken for the end of the +% \cs{vbox} that \cs{pstart} creates, and the rest of the paragraph +% will not be numbered. Such paragraphs need to be started explicitly +% using \cs{indent}, \cs{noindent}, or \cs{leavevmode}---or \cs{pstart}, since +% you can still include your own \cs{pstart} and \cs{pend} +% commands even with \cs{autopar} on. +% +% Prematurely ending the group within which \cs{autopar} is in +% effect will cause a similar problem. You must either leave a +% blank line or use \verb"\par" to end the last paragraph before +% you end the group. +% +% The functioning of this macro is more tricky than the usual +% \cs{everypar}: we don't want anything to go onto the vertical +% list at all, so we have to end the paragraph, erase any evidence +% that it ever existed, and start it again using \cs{pstart}. +% We remove the paragraph-indentation box using \cs{lastbox} and +% save the width, and then skip backwards over the \cs{parskip} +% that's been added for this paragraph. Then we start again with +% \cs{pstart}, restoring the indentation that we saved, and +% locally change \verb"\par" so that it'll do our \cs{pend} for us. +% \begin{macrocode} +\newif\ifautopar +\autoparfalse +\newcommand*{\autopar}{ + \ifledRcol + \ifnumberingR \else + \led@err@AutoparNotNumbered + \beginnumberingR + \fi + \else + \ifnumbering \else + \led@err@AutoparNotNumbered + \beginnumbering + \fi + \fi + \autopartrue + \everypar={\setbox0=\lastbox + \endgraf \vskip-\parskip + \pstart \noindent \kern\wd0 \ifnumberpstart\ifinstanza\else\thepstart\fi\fi + \let\par=\pend}% + \ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\normal@pars} +% We also define a macro which we can rely on to turn off the +% \cs{autopar} definitions at various important places, if they +% are in force. We'll want to do this within a footnotes, for +% example. +% \begin{macrocode} +\newcommand*{\normal@pars}{\everypar={}\let\par\endgraf} + +% \end{macrocode} +% \end{macro} +% +% \subsection{Processing one line} +% +% \begin{macro}{\do@line}\label{doline} +% \begin{macro}{\l@dunhbox@line} +% The \cs{do@line} macro is called by \cs{pend} to +% do all the processing for a single line of text. +% \begin{macrocode} + \newcommand*{\l@dunhbox@line}[1]{\unhbox #1} + \newcommand*{\do@line}{% + {\vbadness=10000 + \splittopskip=\z@ + \do@linehook +\l@demptyd@ta + \global\setbox\one@line=\vsplit\raw@text to\baselineskip}% + \unvbox\one@line \global\setbox\one@line=\lastbox + \getline@num + \ifnum\@lock>\@ne + \inserthangingsymboltrue + \else + \inserthangingsymbolfalse + \fi + \affixline@num + \affixpstart@num + \hb@xt@ \linewidth{\inserthangingsymbol\l@dld@ta\add@inserts\affixside@note + \l@dlsn@te + {\ledllfill\hb@xt@ \wd\one@line{\new@line\l@dunhbox@line{\one@line}}\ledrlfill\l@drd@ta% + \l@drsn@te + }}}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\do@linehook} +% A hook into \cs{do@line}. +% \changes{v0.7}{2005/02/18}{Added \cs{do@linehook} for use in \cs{do@line}} +% \begin{macrocode} +\newcommand*{\do@linehook}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@demptyd@ta} +% \begin{macro}{\l@dld@ta} +% \begin{macro}{\l@drd@ta} +% \begin{macro}{\l@dcsnotetext} +% Nulls the \cs{...d@ta}, which may later hold line numbers. +% Similarly for \cs{l@dcsnotetext} for the text of a sidenote. +% \changes{v0.7}{2005/02/18}{Added \cs{l@demptyd@ta}} +% \begin{macrocode} +\newcommand*{\l@demptyd@ta}{% + \gdef\l@dld@ta{}% + \gdef\l@drd@ta{}% + \gdef\l@dcsnotetext{}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@dlsn@te} +% \begin{macro}{\l@drsn@te} +% Zero width boxes of the left and right side notes, together with their kerns. +% \changes{v0.7}{2005/02/18}{Added \cs{l@dlsn@te} and \cs{l@drsn@te} +% for use in \cs{do@line}} +% \begin{macrocode} +\newcommand{\l@dlsn@te}{% + \hb@xt@ \z@{\hss\box\l@dlp@rbox\kern\ledlsnotesep}} +\newcommand{\l@drsn@te}{% + \hb@xt@ \z@{\kern\ledrsnotesep\box\l@drp@rbox\hss}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\ledllfill} +% \begin{macro}{\ledrlfill} +% These macros are called at the left (\verb?\ledllfill?) and the right +% (\verb?\ledllfill?) of each numbered line. The initial definitions +% correspond to the original code for \verb?\do@line?. +% \begin{macrocode} +\newcommand*{\ledllfill}{\hfil} +\newcommand*{\ledrlfill}{} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Line and page number computation} +% +% \begin{macro}{\getline@num} +% The \cs{getline@num} macro +% determines the page and line numbers for the line we're about to +% send to the vertical list. +% \begin{macrocode} +\newcommand*{\getline@num}{% + \global\advance\absline@num \@ne + \do@actions + \do@ballast + \ifnumberline + \ifsublines@ + \ifnum\sub@lock<\tw@ + \global\advance\subline@num \@ne + \fi + \else + \ifnum\@lock<\tw@ + \global\advance\line@num \@ne + \global\subline@num \z@ + \fi + \fi + \fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\do@ballast} +% \phantomsection\label{do@ballast}\relax +% The real work in the macro above is done in \cs{do@actions}, but +% before we plunge into that, let's get \cs{do@ballast} out of the +% way. This macro looks to see if there is an action to be +% performed on the \emph{next} line, and if it is going to be a +% page break action, \cs{do@ballast} decreases the count \cs{ballast@count} +% counter +% by the amount of \verb"ballast". This means, in practice, that when +% \cs{add@penalties} assigns penalties at this point, \TeX\ will be +% given extra encouragement to break the page here (see +% p.\,\pageref{add@penalties}). +% +% \begin{macro}{\ballast@count} +% \begin{macro}{\c@ballast} +% First we set up the required counters; they are initially +% set to zero, and will remain so unless you say +% \verb"\setcounter{ballast}"\marg{some figure} in your document. +% \begin{macrocode} +\newcount\ballast@count +\newcounter{ballast} + \setcounter{ballast}{0} +% \end{macrocode} +% \end{macro} +% \end{macro} +% And here is \cs{do@ballast} itself. It advances \cs{absline@num} +% within the protection of a group to make its check for what +% happens on the next line. +% \begin{macrocode} +\newcommand*{\do@ballast}{\global\ballast@count \z@ + \begingroup + \advance\absline@num \@ne + \ifnum\next@actionline=\absline@num + \ifnum\next@action>-1001\relax + \global\advance\ballast@count by -\c@ballast + \fi + \fi + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\do@actions} +% \begin{macro}{\do@actions@next} +% +% The \cs{do@actions} macro +% looks at the list of actions to take at particular absolute line +% numbers, and does everything that's specified for the current line. +% +% It may call itself recursively, and to do this efficiently (using +% \TeX's optimization for tail recursion), we define a control-sequence +% called \cs{do@actions@next} that is always the last thing that +% \cs{do@actions} does. If there could be more actions to process for +% this line, \cs{do@actions@next} is set equal to \cs{do@actions}; +% otherwise it's just \cs{relax}. +% \changes{v0.7}{2005/02/22}{Added number skipping to \cs{do@actions}} +% \begin{macrocode} +\newcommand*{\do@actions}{% + \global\let\do@actions@next=\relax + \ifnum\absline@num<\next@actionline\else +% \end{macrocode} +% +% First, page number changes, which will generally be the most common +% actions. If we're restarting lineation on each page, this is where it +% happens. +% \begin{macrocode} + \ifnum\next@action>-1001 + \global\page@num=\next@action + \ifbypage@ + \global\line@num=\z@ \global\subline@num=\z@ + \resetprevline@ + \fi +% \end{macrocode} +% +% Next, we handle +% commands that change the line-number values. (We subtract $5001$ rather +% than $5000$ here because the line number is going to be incremented +% automatically in \cs{getline@num}.) +% \begin{macrocode} + \else + \ifnum\next@action<-4999 + \@l@dtempcnta=-\next@action + \advance\@l@dtempcnta by -5001 + \ifsublines@ + \global\subline@num=\@l@dtempcnta + \else + \global\line@num=\@l@dtempcnta + \fi +% \end{macrocode} +% +% It's one of the fixed codes. We rescale the value in +% \cs{@l@dtempcnta} so that we can use a case statement. +% \begin{macrocode} + \else + \@l@dtempcnta=-\next@action + \advance\@l@dtempcnta by -1000 + \do@actions@fixedcode + \fi + \fi +% \end{macrocode} +% +% Now we get information about the next action off the list, +% and then set \cs{do@actions@next} so that we'll +% call ourself recursively: the next action might also be for this +% line. +% +% There's no warning if we find \cs{actionlines@list} empty, +% since that will always happen near the end of the section. +% +% \begin{macrocode} + \ifx\actionlines@list\empty + \gdef\next@actionline{1000000}% + \else + \gl@p\actionlines@list\to\next@actionline + \gl@p\actions@list\to\next@action + \global\let\do@actions@next=\do@actions + \fi + \fi +% \end{macrocode} +% +% Make the recursive call, if necessary. +% +% \begin{macrocode} +\do@actions@next} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\do@actions@fixedcode} +% This macro handles the fixed codes for \cs{do@actions}. It is +% one big case statement. +% \changes{v0.7}{2005/02/24}{Added \cs{do@actions@fixedcode}} +% \begin{macrocode} +\newcommand*{\do@actions@fixedcode}{% + \ifcase\@l@dtempcnta + \or% % 1001 + \global\sublines@true + \or% % 1002 + \global\sublines@false + \or% % 1003 + \global\@lock=\@ne + \or% % 1004 + \ifnum\@lock=\tw@ + \global\@lock=\thr@@ + \else + \global\@lock=\z@ + \fi + \or% % 1005 + \global\sub@lock=\@ne + \or% % 1006 + \ifnum\sub@lock=\tw@ + \global\sub@lock=\thr@@ + \else + \global\sub@lock=\z@ + \fi + \or% % 1007 + \l@dskipnumbertrue + \else + \led@warn@BadAction + \fi} + + +% \end{macrocode} +% \end{macro} +% \subsection{Line number printing} +% +% \begin{macro}{\affixline@num} +% \cs{affixline@num} originally took a single argument, a series of +% commands for printing the line just split off by \cs{do@line}; it +% put that line back on the vertical list, and added a line number if +% necessary. It now just puts a left line number into \cs{l@dld@ta} +% or a right line number into \cs{l@drd@ta} if required. +% +% To determine whether we need to affix a line number to this line, +% we compute the following: +% \begin{tabbing} +% \quad $m$ \= \kill +% $n$ \> $= \mbox{\it int\/} ( ( \mbox{\it linenum\/} - +% \mbox{\it firstlinenum\/} ) / +% \mbox{\it linenumincrement\/} )$ \\ +% $m$ \> $= \mbox{\it firstlinenum\/} + +% ( n \times \mbox{\it linenumincrement\/})$ +% \end{tabbing} +% (where {\it int\/} truncates a real number to an integer). +% $m$ will be equal to {\it linenum\/} only +% if we're to paste a number on here. +% However, the formula breaks down for the first line to number (and any +% before that), so we check that case separately: if \cs{line@num} $\le$ +% \cs{firstlinenum}, we compare the two directly instead of making these +% calculations. +% +% We compute, in the scratch counter \cs{@l@dtempcnta}, the number +% of the next line that should be printed with a number ($m$ in the +% above discussion), and move the current line number into the +% counter \cs{@l@dtempcntb} for comparison. +% +% +% First, the case when we're within a sub-line range. +% \changes{v0.5.1}{2004/04/10}{Changed \cs{affixline@num} to cater for sidenotes} +% \changes{v0.7}{2005/02/22}{Added skipnumering to \cs{affixline@num}} +% \begin{macrocode} +\newcommand*{\affixline@num}{% +% \end{macrocode} +% No number is attached if \cs{ifl@dskipnumber} is TRUE (and then it +% is set to its normal FALSE value). +% No number is attached if \cs{ifnumberline} is FALSE (the normal value is TRUE). +% \changes{v0.15}{2012/06/11}{Line numbering can be disabled.} +% \begin{macrocode} +\ifnumberline +\ifl@dskipnumber + \global\l@dskipnumberfalse +\else + \ifsublines@ + \@l@dtempcntb=\subline@num + \ifnum\subline@num>\c@firstsublinenum + \@l@dtempcnta=\subline@num + \advance\@l@dtempcnta by-\c@firstsublinenum + \divide\@l@dtempcnta by\c@sublinenumincrement + \multiply\@l@dtempcnta by\c@sublinenumincrement + \advance\@l@dtempcnta by\c@firstsublinenum + \else + \@l@dtempcnta=\c@firstsublinenum + \fi +% \end{macrocode} +% +% That takes care of computing the values for comparison, but if line +% number locking is in effect we have to make a further check. If this +% check fails, then we disable the line-number display by setting the +% counters to arbitrary but unequal values. +% \begin{macrocode} + \ch@cksub@l@ck +% \end{macrocode} +% +% Now the line number case, which works the same way. +% \begin{macrocode} + \else + \@l@dtempcntb=\line@num +% \end{macrocode} +% Check on the \verb?\linenumberlist? If it's \verb?\empty? use the standard +% algorithm. +% \begin{macrocode} + \ifx\linenumberlist\empty + \ifnum\line@num>\c@firstlinenum + \@l@dtempcnta=\line@num + \advance\@l@dtempcnta by-\c@firstlinenum + \divide\@l@dtempcnta by\c@linenumincrement + \multiply\@l@dtempcnta by\c@linenumincrement + \advance\@l@dtempcnta by\c@firstlinenum + \else + \@l@dtempcnta=\c@firstlinenum + \fi + \else +% \end{macrocode} +% The \verb?\linenumberlist? wasn't \verb?\empty?, so here's Wayne's +% numbering mechanism. This takes place in TeX's mouth. +% \begin{macrocode} + \@l@dtempcnta=\line@num + \edef\rem@inder{,\linenumberlist,\number\line@num,}% + \edef\sc@n@list{\def\noexpand\sc@n@list + ####1,\number\@l@dtempcnta,####2|{\def\noexpand\rem@inder{####2}}}% + \sc@n@list\expandafter\sc@n@list\rem@inder|% + \ifx\rem@inder\empty\advance\@l@dtempcnta\@ne\fi + \fi +% \end{macrocode} +% +% +% A locking check for lines, just like the version for sub-line +% numbers above. +% \begin{macrocode} + \ch@ck@l@ck + \fi +% \end{macrocode} +% +% The following test is true if we need to print a line number. +% \begin{macrocode} + \ifnum\@l@dtempcnta=\@l@dtempcntb +% \end{macrocode} +% +% If we got here, +% we're going to print a line number; so now we need to +% calculate a number that will tell us which side of the page will get +% the line number. We start from \cs{line@margin}, which asks for +% one side always if it's less than $2$; and then if the side does +% depend on the page number, we simply add the page number to this +% side code---because the values of \cs{line@margin} have been devised so +% that this produces a number that's even for left-margin numbers and +% odd for right-margin numbers. +% +% For LaTeX we have to consider two column documents as well. In this case +% I think we need to put the numbers at the outside of the column --- +% the left of the first column and the right of the second. Do the twocolumn +% stuff before going on with the original code. +% \begin{macro}{\l@dld@ta} +% \begin{macro}{\l@drd@ta} +% A left line number is stored in \cs{l@dld@ta} and a right one in +% \cs{l@drd@ta}. +% +% \begin{macrocode} + \if@twocolumn + \if@firstcolumn + \gdef\l@dld@ta{\llap{{\leftlinenum}}}% + \else + \gdef\l@drd@ta{\rlap{{\rightlinenum}}}% + \fi + \else +% \end{macrocode} +% Continuing the original code \ldots +% \begin{macrocode} + \@l@dtempcntb=\line@margin + \ifnum\@l@dtempcntb>\@ne + \advance\@l@dtempcntb \page@num + \fi +% \end{macrocode} +% +% Now print the line (\verb"#1") with its page number. +% \begin{macrocode} + \ifodd\@l@dtempcntb + \gdef\l@drd@ta{\rlap{{\rightlinenum}}}% + \else + \gdef\l@dld@ta{\llap{{\leftlinenum}}}% + \fi + \fi + \else +% \end{macrocode} +% +% As no line number is to be appended, we just print the line as is. +% \begin{macrocode} +%% #1% + \fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% Now fix the lock counters, if necessary. +% A value of $1$ is advanced to +% $2$; $3$ advances to $0$; other values are unchanged. +% \begin{macrocode} + \f@x@l@cks +\fi +\fi +} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ch@cksub@l@ck} +% \begin{macro}{\ch@ck@l@ck} +% \begin{macro}{\f@x@l@cks} +% These macros handle line number locking for \cs{affixline@num}. +% \changes{v0.7}{2005/02/24}{Added \cs{ch@cksub@l@ck}, \cs{ch@ck@l@ck} +% and \cs{f@x@l@cks}} +% \cs{ch@cksub@l@ck} checks subline locking. If it fails, then we disable +% the line-number display by setting the counters to arbitrary but unequal +% values. +% \begin{macrocode} +\newcommand*{\ch@cksub@l@ck}{% + \ifcase\sub@lock + \or + \ifnum\sublock@disp=\@ne + \@l@dtempcntb=\z@ \@l@dtempcnta=\@ne + \fi + \or + \ifnum\sublock@disp=\tw@ \else + \@l@dtempcntb=\z@ \@l@dtempcnta=\@ne + \fi + \or + \ifnum\sublock@disp=\z@ + \@l@dtempcntb=\z@ \@l@dtempcnta=\@ne + \fi + \fi} +% \end{macrocode} +% Similarly for line numbers. +% \begin{macrocode} +\newcommand*{\ch@ck@l@ck}{% + \ifcase\@lock + \or + \ifnum\lock@disp=\@ne + \@l@dtempcntb=\z@ \@l@dtempcnta=\@ne + \fi + \or + \ifnum\lock@disp=\tw@ \else + \@l@dtempcntb=\z@ \@l@dtempcnta=\@ne + \fi + \or + \ifnum\lock@disp=\z@ + \@l@dtempcntb=\z@ \@l@dtempcnta=\@ne + \fi + \fi} +% \end{macrocode} +% Fix the lock counters. +% A value of $1$ is advanced to +% $2$; $3$ advances to $0$; other values are unchanged. +% \begin{macrocode} +\newcommand*{\f@x@l@cks}{% + \ifcase\@lock + \or + \global\@lock=\tw@ + \or \or + \global\@lock=\z@ + \fi + \ifcase\sub@lock + \or + \global\sub@lock=\tw@ + \or \or + \global\sub@lock=\z@ + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% +% +% \begin{macro}{\pageparbreak} +% Because of TeX's asynchronous page breaking mechanism we can never be +% sure juust where it will make a break and, naturally, it has already decided +% exactly how it will typeset any remainder of a paragraph that crosses +% the break. This is disconcerting when trying to number lines by the page +% or put line numbers in different margins. This macro tries to force an invisible +% paragraph break and a page break. +% \begin{macrocode} +\newcommand{\pageparbreak}{\pend\newpage\pstart\noindent} + +% \end{macrocode} +% \end{macro} +% +% \subsection{Pstart number printing in side} +% In side, the printing of pstart number is running like the printing of line number. There is only some differences: +% \begin{macro}{\affixpstart@num} +% \begin{macro}{\pstartnum} +% \begin{itemize} +% \item The pstarts counter is upgrade in the \cs{pend} command. Consequently, the \cs{affixpstart@num} command has not to upgrade it, unlike the \cs{affixline@num} which upgrades the lines counter. +% \item To print the pstart number only at the begining of a pstart, and not in every line, a boolean test is made. The \cs{pstartnum} boolean is set to TRUE at every \cs{pend}. It's tried in the \cs{leftpstartnum} and \cs{rightstartnum} commands. After the try, it is set to FALSE. +% \end{itemize} +% \begin{macro}{\leftpstartnum} +% \begin{macro}{\rightstartnum} +% \begin{macro}{\ifsidepstartnum} +% \begin{macrocode} + +\newif\ifsidepstartnum +\newcommand*{\affixpstart@num}{% + \ifsidepstartnum + \if@twocolumn + \if@firstcolumn + \gdef\l@dld@ta{\llap{{\leftpstartnum}}}% + \else + \gdef\l@drd@ta{\rlap{{\rightpstartnum}}}% + \fi + \else + \@l@dtempcntb=\line@margin + \ifnum\@l@dtempcntb>\@ne + \advance\@l@dtempcntb \page@num + \fi + \ifodd\@l@dtempcntb + \gdef\l@drd@ta{\rlap{{\rightpstartnum}}}% + \else + \gdef\l@dld@ta{\llap{{\leftpstartnum}}}% + \fi + \fi + \fi + +} +% + +\newif\ifpstartnum +\pstartnumtrue +\newcommand*{\leftpstartnum}{ + \ifpstartnum\thepstart + \kern\linenumsep\fi + \global\pstartnumfalse +} +\newcommand*{\rightpstartnum}{ + \ifpstartnum + \kern\linenumsep + \thepstart + \fi + \global\pstartnumfalse +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \subsection{Add insertions to the vertical list} +% +% \begin{macro}{\inserts@list} +% \cs{inserts@list} is the list macro that contains the inserts that +% we save up for one paragraph. +% +% \begin{macrocode} +\list@create{\inserts@list} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\add@inserts} +% \begin{macro}{\add@inserts@next} +% \cs{add@inserts} +% is the penultimate macro used by \cs{do@line}; it takes +% insertions saved in a list macro and sends them onto the vertical list. +% +% It may call itself recursively, and to do this efficiently (using +% \TeX's optimization for tail recursion), we define a control-sequence +% called \cs{add@inserts@next} that is always the last thing that +% \cs{add@inserts} does. If there could be more inserts to process for +% this line, \cs{add@inserts@next} is set equal to \cs{add@inserts}; +% otherwise it's just \cs{relax}. +% +% \begin{macrocode} +\newcommand*{\add@inserts}{% + \global\let\add@inserts@next=\relax +% \end{macrocode} +% +% If \cs{inserts@list} is empty, there aren't any more notes or insertions +% for this paragraph, and we needn't waste our time. +% \begin{macrocode} + \ifx\inserts@list\empty \else +% \end{macrocode} +% +% The \cs{next@insert} macro records the number of the line that +% receives the next footnote or other insert; it's empty when we start +% out, and just after we've affixed a note or insert. +% \begin{macrocode} + \ifx\next@insert\empty + \ifx\insertlines@list\empty + \global\noteschanged@true + \gdef\next@insert{100000}% + \else + \gl@p\insertlines@list\to\next@insert + \fi + \fi +% \end{macrocode} +% +% If the next insert's for this line, tack it on (and then erase the +% contents of the insert macro, as it could be quite large). +% In that case, we also set \cs{add@inserts@next} so that we'll +% call ourself recursively: there might be another insert for this same +% line. +% +% \begin{macrocode} + \ifnum\next@insert=\absline@num + \gl@p\inserts@list\to\@insert + \@insert + \global\let\@insert=\undefined + \global\let\next@insert=\empty + \global\let\add@inserts@next=\add@inserts + \fi +\fi +% \end{macrocode} +% +% Make the recursive call, if necessary. +% +% \begin{macrocode} +\add@inserts@next} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Penalties} +% +% \begin{macro}{\add@penalties} +% \cs{add@penalties} is +% the last macro used by \cs{do@line}. It adds up the club, +% widow, and interline penalties, and puts a single penalty +% of the appropriate size +% back into the paragraph; these penalties get +% removed by the \cs{vsplit} operation. \cs{displaywidowpenalty} and +% \cs{brokenpenalty} are not restored, since we have no easy way to +% find out where we should insert them. +% +% \phantomsection\label{add@penalties} +% In this code, \cs{num@lines} is the number of lines in the whole +% paragraph, and \cs{par@line} is the line we're working on at the +% moment. The count \cs{@l@dtempcnta} is used to calculate and +% accumulate the penalty; it is initially set to the value of +% \cs{ballast@count}, which has been worked out in \cs{do@ballast} +% above (p.\,\pageref{do@ballast}). Finally, the penalty is +% checked to see that it doesn't go below $-10000$. +% \begin{macrocode} +\newcommand*{\add@penalties}{\@l@dtempcnta=\ballast@count + \ifnum\num@lines>\@ne + \global\advance\par@line \@ne + \ifnum\par@line=\@ne + \advance\@l@dtempcnta \clubpenalty + \fi + \@l@dtempcntb=\par@line \advance\@l@dtempcntb \@ne + \ifnum\@l@dtempcntb=\num@lines + \advance\@l@dtempcnta \widowpenalty + \fi + \ifnum\par@line<\num@lines + \advance\@l@dtempcnta \interlinepenalty + \fi + \fi + \ifnum\@l@dtempcnta=\z@ + \relax + \else + \ifnum\@l@dtempcnta>-10000 + \penalty\@l@dtempcnta + \else + \penalty -10000 + \fi + \fi} + +% \end{macrocode} +% \end{macro} +% +% \subsection{Printing leftover notes} +% +% \begin{macro}{\flush@notes} +% The \cs{flush@notes} +% macro is called after the entire paragraph has been sliced up +% and sent on to the vertical list. +% If the number of notes to this paragraph has increased since the last +% run of \TeX, then there can be leftover notes that haven't yet been +% printed. An appropriate error message will be printed elsewhere; but +% it's best to go ahead and +% print these notes somewhere, even if it's not in quite the +% right place. What we do is dump them all out here, so that they should +% be printed on the same page as the last line +% of the paragraph. We can hope that's not +% too far from the proper location, to which they'll move on the next +% run. +% \begin{macrocode} +\newcommand*{\flush@notes}{% + \@xloop + \ifx\inserts@list\empty \else + \gl@p\inserts@list\to\@insert + \@insert + \global\let\@insert=\undefined + \repeat} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xloop} +% \cs{@xloop} is +% a variant of the \PlainTeX\ \cs{loop} macro, useful when it's +% hard to construct a positive test using the \TeX\ \verb"\if" commands---as +% in \cs{flush@notes} above. One says \cs{@xloop} \verb"..." \verb"\if" \verb"..." \verb"\else" +% \verb"..." \verb"\repeat", and the action following \verb"\else" is repeated as long +% as the \verb"\if" test fails. (This macro will work wherever the \PlainTeX\ +% \cs{loop} is used, too, so we could just call it \cs{loop}; +% but it seems preferable not to change the definitions of any of +% the standard macros.) +% +% This variant of \cs{loop} was introduced by +% Alois Kabelschacht\index{Kabelschacht, Alois} in +% \textit{TUGboat} \textbf{8} (1987), pp.\,184--5. +% +% \begin{macrocode} +\def\@xloop#1\repeat{% + \def\body{#1\expandafter\body\fi}% + \body} + +% \end{macrocode} +% \end{macro} +% +% \section{Footnotes} +% \label{footnotes}\relax +% +% The footnote macros are adapted from those in \PlainTeX, but they +% differ in these respects: the outer-level commands must add other +% commands to a list macro rather than doing insertions immediately; +% there are five separate levels of the footnotes, not just one; and there +% are options to reformat footnotes into paragraphs or into multiple +% columns. +% +% \subsection{Fonts} +% \label{fontcode}\relax +% Before getting into the details of formatting the notes, we set +% up some font macros. It is the notes that present the greatest +% challenge for our font-handling mechanism, because we need to be +% able to take fragments of our main text and print them in +% different forms: it is common to reduce the size, +% for example, without otherwise changing the fonts used. +% +% +% \begin{macro}{\select@lemmafont}\label{notefonts} +% \begin{macro}{\select@@lemmafont} +% \cs{select@lemmafont} is provided to set the right font for +% the lemma in a note. This macro extracts the font specifier +% from the line and page number cluster, and issues the associated +% font-changing command, so that the lemma is printed in its +% original font. +% \begin{macrocode} + \def\select@lemmafont#1|#2|#3|#4|#5|#6|#7|{\select@@lemmafont#7|} + \def\select@@lemmafont#1/#2/#3/#4|% + {\fontencoding{#1}\fontfamily{#2}\fontseries{#3}\fontshape{#4}% + \selectfont} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{Outer-level footnote commands} +% \changes{v1.0}{2012/09/15}{Options of \cs{Xfootnote}s.} +% \begin{macro}{\footnoteoptions@} +% The \cs{footnoteoption@}\oarg{side}\marg{options}\marg{value} change the value of on options of Xfootnote, to switch between true and false. +% \begin{macrocode} +\newcommandx*{\footnoteoptions@}[3][1=L,usedefault]{% + \renewcommand{\do}[1]{% + \ifstrequal{#1}{L}{% In Leftside + \xright@appenditem{\global\noexpand\settoggle{##1@}{#3}}\to\inserts@list% Switch toogle, in all case + \global\advance\insert@count \@ne% Increment the left insert counter. + }% + {% + \xright@appenditem{\global\noexpand\settoggle{##1@}{#3}}\to\inserts@listR% Switch toogle, in all case + \global\advance\insert@countR \@ne% Increment the right insert counter insert. + }% + }% + \notblank{#2}{\docsvlist{#2}}{}% Parsing all options +} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Normal footnote formatting} \label{sec:nfootformat} +% +% The processing of each note is done +% by four principal macros: the \cs{vfootnote} macro takes the text +% of the footnote and does the \cs{insert}; it calls on the +% \cs{footfmt} macro to select the right fonts, print the line +% number and lemma, and do any other formatting needed for that individual +% note. Within the output routine, the two other macros, \cs{footstart} +% and \cs{footgroup}, are called; the first prints extra vertical +% space and a footnote rule, if desired; the second does any reformatting +% of the whole set of the footnotes in this series for this page---such +% as paragraphing or division into columns---and then sends them to the +% page. +% +% These four macros, and the other macros and parameters shown +% here, are distinguished by the `series letter' +% that indicates which set of the footnotes +% we're dealing with---\texttt{A}, \texttt{B}, \texttt{C}, \texttt{D}, or \texttt{E}. +% The series letter always precedes the string \verb"foot" in macro +% and parameter names. Hence, for the \texttt{A} series, the four macros +% are called \cs{vAfootnote}, \cs{Afootfmt}, \cs{Afootstart}, +% and \cs{Afootgroup}. +% +% \begin{macro}{\normalvfootnote} +% We now begin a series of commands that do `normal' footnote +% formatting: a format much like that implemented +% in \PlainTeX{}, in which each footnote +% is a separate paragraph. +% +% \cs{normalvfootnote} takes the series letter as \verb"#1", +% and the entire text of the footnote is \verb"#2". It does the +% \cs{insert} for this note, calling on the \cs{footfmt} macro for +% this note series to format the text of the note. +% \begin{macrocode} +\newcommand*{\normalvfootnote}[2]{% + \insert\csname #1footins\endcsname\bgroup + \csuse{Xnotefontsize@#1} + \footsplitskips + \spaceskip=\z@skip \xspaceskip=\z@skip + \csname #1footfmt\endcsname #2[#1]\egroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footsplitskips} +% Some setup code that is common for a variety of the footnotes. +% \changes{v0.7}{2005/02/18}{Added \cs{footsplitskips} for use in many +% footnote styles} +% \begin{macrocode} +\newcommand*{\footsplitskips}{% + \interlinepenalty=\interfootnotelinepenalty + \floatingpenalty=\@MM + \splittopskip=\ht\strutbox \splitmaxdepth=\dp\strutbox + \leftskip=\z@skip \rightskip=\z@skip} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mpnormalvfootnote} +% And a somewhat different version for minipages. +% \changes{v0.4}{2004/02/29}{Added \cs{mpnormalvfootnote}} +% \begin{macrocode} +\newcommand*{\mpnormalvfootnote}[2]{% + \global\setbox\@nameuse{mp#1footins}\vbox{% + \unvbox\@nameuse{mp#1footins} + \csuse{Xnotefontsize@#1} + \hsize\columnwidth + \@parboxrestore + \color@begingroup + \csname #1footfmt\endcsname #2[#1]\color@endgroup}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ledsetnormalparstuff} +% \begin{macro}{\normalfootfmt} +% \phantomsection\label{normalfootfmt}\relax +% \cs{normalfootfmt} is a `normal' macro +% to take the footnote line and page +% number information (see p.\,\pageref{linenumbers}), and the +% desired text, and output what's to be printed. +% Argument \verb"#1" contains the line and page number information +% and lemma font specifier; +% \verb"#2" is the lemma; +% \verb"#3" is the note's text. This version is very +% rudimentary---it uses \cs{printlines} +% to print just the range of line numbers, +% followed by a square bracket, the lemma, and the note text; +% it's intended to be copied and modified as necessary. +% +% \verb"\par" should always be redefined to \verb"\endgraf" within +% the format macro (this is what \cs{normal@pars} does), +% to override any tricky stuff which might be done in the main text +% to get the lines numbered automatically (as set up by +% \cs{autopar}, for example). +% \begin{macrocode} +\newcommand*{\ledsetnormalparstuff}{% + \normal@pars + \parindent \z@ \parfillskip \z@ \@plus 1fil} +\newcommandx*{\normalfootfmt}[4][4=Z]{% 4th arg is optional, for backward compatibility + \ledsetnormalparstuff% + \hangindent=\csuse{Xhangindent@#4} + \strut{\printlinefootnote{#1}{#4}}% + {\select@lemmafont#1|#2}% + \iftoggle{nosep@}{\hskip\csuse{inplaceoflemmaseparator@#4}}{\ifcsempty{lemmaseparator@#4}% + {\hskip\csuse{inplaceoflemmaseparator@#4}}% + {\nobreak\hskip\csuse{beforelemmaseparator@#4}\csuse{lemmaseparator@#4}\hskip\csuse{afterlemmaseparator@#4}% + }}% + #3\strut\par} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\endashchar} +% \begin{macro}{\fullstop} +% \begin{macro}{\rbracket} +% The fonts that are used for printing notes might not have the +% character mapping we expect: for example, the Computer Modern font +% that contains old-style numerals does not contain an en-dash or +% square brackets, and its period and comma are in odd locations. +% To allow use of the standard footnote macros with such fonts, we use +% the following macros for certain characters. +% +% The \cs{endashchar} macro is simply an en-dash from the +% normal font and is immune to changes in the surrounding +% font. The same goes for the full stop. These two are used in +% \cs{printlines}. The right bracket macro is the same again; +% it crops up in \cs{normalfootfmt} and the other footnote +% macros for controlling the format of the footnotes. +% \begin{macrocode} +\def\endashchar{\textnormal{--}} +\newcommand*{\fullstop}{\textnormal{.}} +\newcommand*{\rbracket}{\textnormal{\thinspace]}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% The \cs{printlines} macro prints the line +% numbers for a note---which, in the +% general case, is a rather complicated task. +% The seven parameters of the +% argument are the line numbers as stored in \cs{l@d@nums}, in the +% form described on page \pageref{linenumbers}: the starting +% page, line, and sub-line numbers, followed by the ending page, +% line, and sub-line numbers, and then the font specifier for +% the lemma. +% +% The original \edmac{} code used several counters at this point, +% saying: +% \begin{quote} +% To simplify the logic, we use a lot of counters to tell us which +% numbers need to get printed (using $1$ for yes, $0$ for no, so +% that \verb"\ifodd" tests for `yes'). The counter assignments are: +% \begin{itemize}\addtolength{\itemsep}{-1ex} +% \item \cs{@pnum} for page numbers; +% \item \cs{@ssub} for starting sub-line; +% \item \cs{@elin} for ending line; +% \item \cs{@esl} for ending sub-line; and +% \item \cs{@dash} for the dash between the starting and ending groups. +% \end{itemize} +% There's no counter for the line number because it's always printed. +% \end{quote} +% LaTeX tends to use a lot of counters and packages should try and +% minimise the number of new ones they create. In line with this +% Peter Wilson have reverted to traditional booleans. +% +% \begin{macro}{\ifl@d@pnum} +% \begin{macro}{\ifl@d@ssub} +% \begin{macro}{\ifl@d@elin} +% \begin{macro}{\ifl@d@esl} +% \begin{macro}{\ifl@d@dash} +% \begin{macrocode} +\newif\ifl@d@pnum + \l@d@pnumfalse +\newif\ifl@d@ssub + \l@d@ssubfalse +\newif\ifl@d@elin + \l@d@elinfalse +\newif\ifl@d@esl + \l@d@eslfalse +\newif\ifl@d@dash + \l@d@dashfalse +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\l@dparsefootspec} +% \begin{macro}{\l@dp@rsefootspec} +% \begin{macro}{\l@dparsedstartpage} +% \begin{macro}{\l@dparsedstartline} +% \begin{macro}{\l@dparsedstartsub} +% \begin{macro}{\l@dparsedendpage} +% \begin{macro}{\l@dparsedendline} +% \begin{macro}{\l@dparsedendsub} +% \cs{l@dparsefootspec}\marg{spec}\marg{lemma}\marg{text} parses a footnote +% specification. \meta{lemma} and \meta{text} are the lemma and text +% respectively. \meta{spec} is the line and page number and lemma font +% specifier in \cs{l@d@nums} style format. The real work is done +% by \cs{l@dp@rsefootspec} which defines macros holding the numeric values. +% \begin{macrocode} +\newcommand*{\l@dparsefootspec}[3]{\l@dp@rsefootspec#1|} +\def\l@dp@rsefootspec#1|#2|#3|#4|#5|#6|#7|{% + \gdef\l@dparsedstartpage{#1}% + \gdef\l@dparsedstartline{#2}% + \gdef\l@dparsedstartsub{#3}% + \gdef\l@dparsedendpage{#4}% + \gdef\l@dparsedendline{#5}% + \gdef\l@dparsedendsub{#6}% +} +% \end{macrocode} +% Initialise the several number value macros. +% \begin{macrocode} +\def\l@dparsedstartpage{0}% +\def\l@dparsedstartline{0}% +\def\l@dparsedstartsub{0}% +\def\l@dparsedendpage{0}% +\def\l@dparsedendline{0}% +\def\l@dparsedendsub{0}% + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\setprintlines} +% First of all, we print the page numbers only if\/: 1)~we're doing +% the lineation by page, and 2)~the ending page number is different +% from the starting page number.\phantomsection\label{printlines} +% +% Just a reminder of the arguments: \\ +% \verb?\printlines #1 | #2 | #3 | #4 | #5 | #6 | #7? \\ +% \verb?\printlines start-page | line | subline | end-page | line | subline | font ? +% +% The macro \cs{setprintlines} does the work of deciding what numbers should +% be printed. Its arguments are the same as the first 6 of \cs{printlines}. +% \changes{v0.7}{2005/02/18}{Added \cs{setprintlines} for use by \cs{printlines}} +% \begin{macrocode} +\newcommand*{\setprintlines}[6]{% + \l@d@pnumfalse \l@d@dashfalse + \ifbypage@ + \ifnum#4=#1 \else + \l@d@pnumtrue + \l@d@dashtrue + \fi + \fi +% \end{macrocode} +% +% We print the ending line number if\/: (1)~we're printing the ending +% page number, or (2)~it's different from the starting line number. +% \begin{macrocode} + \ifl@d@pnum \l@d@elintrue \else \l@d@elinfalse \fi + \ifnum#2=#5 \else + \l@d@elintrue + \l@d@dashtrue + \fi +% \end{macrocode} +% +% We print the starting sub-line if it's nonzero. +% \begin{macrocode} + \l@d@ssubfalse + \ifnum#3=0 \else + \l@d@ssubtrue + \fi +% \end{macrocode} +% +% We print the ending sub-line if it's nonzero and: (1)~it's different +% from the starting sub-line number, or (2)~the ending line number is +% being printed. +% \begin{macrocode} + \l@d@eslfalse + \ifnum#6=0 \else + \ifnum#6=#3 + \ifl@d@elin \l@d@esltrue \else \l@d@eslfalse \fi + \else + \l@d@esltrue + \l@d@dashtrue + \fi + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\printlines} +% Now we're ready to print it all. If the lineation is by pstart, we print the pstart. +% \changes{v0.15}{2012/06/11}{Line numbering can be reset at each pstart.} +% \begin{macrocode} +\def\printlines#1|#2|#3|#4|#5|#6|#7|{\begingroup + \ifbypstart@% + \ifl@dpairing% + \ifledRcol% + \thepstartR% + \else% + \thepstartL% + \fi% + \else% + \thepstart% + \fi% + \fi% + \setprintlines{#1}{#2}{#3}{#4}{#5}{#6}% +% \end{macrocode} +% One subtlety left here is when to print a period between +% numbers. But the only instance in which this is tricky is for the +% ending sub-line number: it could be coming after the starting +% sub-line number (in which case we want only the dash) or after an +% ending line number (in which case we need to insert a period). +% \begin{macrocode} + \ifl@d@pnum #1\fullstop\fi + \linenumrep{#2} +% \end{macrocode} +% \changes{v0.3}{2004/02/14}{Added \cs{linenumr@p} and \cs{sublinenumr@p} +% to \cs{printlines}} +% \begin{macrocode} + \ifl@d@ssub \fullstop \sublinenumrep{#3}\fi + \ifl@d@dash \endashchar\fi + \ifl@d@pnum #4\fullstop\fi + \ifl@d@elin \linenumrep{#5}\fi + \ifl@d@esl \ifl@d@elin \fullstop\fi \sublinenumrep{#6}\fi +\endgroup} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\normalfootstart}\label{normalvalues} +% \phantomsection\relax +% \cs{normalfootstart} +% is a standard footnote-starting macro, called in the output +% routine whenever there are footnotes of this series to be +% printed: it skips a bit and then draws a rule. +% +% Any \verb"footstart" macro must put onto the page something that +% takes up space exactly equal to the \verb"\skip\footins" value for +% the associated series of notes. \TeX\ makes page computations based +% on that \cs{skip} value, and the output pages will suffer from +% spacing problems if what you add takes up a different amount of +% space. +% +% The \cs{leftskip} and \cs{rightskip} values +% are both zeroed here.\phantomsection\label{footskips} +% Similarly, these skips are cancelled in the \verb"vfootnote" macros +% for the various types of notes. Strictly speaking, +% this is necessary only +% if you are using paragraphed footnotes, but we have put it here +% and in the other \verb"vfootnote" macros too so that the behavior of +% \Eledmac{} in this respect is general across all footnote types +% (you can change this). What this means is that any \cs{leftskip} +% and \cs{rightskip} you specify applies to the main text, but not +% the footnotes. The footnotes continue to be of width \cs{hsize}. +% \begin{macrocode} +\newcommand*{\normalfootstart}[1]{% + \vskip\skip\csname #1footins\endcsname + \leftskip0pt \rightskip0pt + \csname #1footnoterule\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\normalfootnoterule} +% \cs{norrmalfootnoterule} is +% a standard footnote-rule macro, for use by a \verb"footstart" +% macro: just the same as the \PlainTeX\ footnote rule. +% \begin{macrocode} +\let\normalfootnoterule=\footnoterule +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\normalfootgroup} +% \cs{normalfootgroup} is +% a standard footnote-grouping macro: it sends the +% contents of the footnote-insert box to the output page without +% alteration. +% \begin{macrocode} +\newcommand*{\normalfootgroup}[1]{\unvbox\csname #1footins\endcsname} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mpnormalfootgroup} +% A somewhat different version for minipages. +% \changes{v0.4}{2004/02/29}{Added \cs{mpnormalfootgroup}} +% \begin{macrocode} +\newcommand*{\mpnormalfootgroup}[1]{{ + \vskip\skip\@nameuse{mp#1footins} + \normalcolor + \@nameuse{#1footnoterule} + \unvbox\csname mp#1footins\endcsname}} + +% \end{macrocode} +% \end{macro} +% +% \subsection{Standard footnote definitions} +% +% \begin{macro}{\footnormal} +% We can now define all the parameters for the five series of +% footnotes; initially they use the `normal' footnote formatting, +% which is set up by calling \cs{footnormal}. +% You can switch to another type of formatting by using +% \cs{footparagraph}, \cs{foottwocol}, or \cs{footthreecol}. +% +% Switching to a variation of `normal' +% formatting requires changing the +% quantities defined in \cs{footnormal}. The best way to +% proceed would be to make a copy of this macro, with a different +% name, make your desired changes in that copy, and then invoke it, +% giving it the letter of the footnote series you wish to control. +% +% (We have not defined baseline skip values like +% \cs{abaselineskip}, since this is one of the quantities set in +% \cs{notefontsetup}.) +% +% What we want to do here is to say something like the following +% for each footnote series. (This is an example, not part of the +% actual \Eledmac{} code.) +% \begin{verbatim} +% \skip\Afootins=12pt plus5pt minus5pt +% \count\Afootins=1000 +% \dimen\Afootins=0.8\vsize +% \let\vAfootnote=\normalvfootnote \let\Afootfmt=\normalfootfmt +% \let\Afootstart=\normalfootstart \let\Afootgroup=\normalfootgroup +% \let\Afootnoterule=\normalfootnoterule +% \end{verbatim} +% Instead of repeating ourselves, we define a \cs{footnormal} +% macro that makes all these assignments for us, for any given +% series letter. This also makes it easy to change from any +% different system of formatting back to the \verb"normal" setting. +% +% \begin{macro}{\ledfootinsdim} +% Have a constant value for the \verb?\dimen\footins? +% \changes{v0.4.1}{2004/03/25}{Added \cs{ledfootinsdim}} +% \begin{macrocode} +\newcommand*{\ledfootinsdim}{0.8\vsize} + +% \end{macrocode} +% \end{macro} +% +% Now we set up the \cs{footnormal} macro itself. It takes +% one argument: the footnote series letter. +% \begin{macrocode} +\newcommand*{\footnormal}[1]{% + \expandafter\let\csname #1footstart\endcsname=\normalfootstart + \expandafter\let\csname v#1footnote\endcsname=\normalvfootnote + \expandafter\let\csname #1footfmt\endcsname=\normalfootfmt + \expandafter\let\csname #1footgroup\endcsname=\normalfootgroup + \expandafter\let\csname #1footnoterule\endcsname=% + \normalfootnoterule + \count\csname #1footins\endcsname=1000 + \dimen\csname #1footins\endcsname=\ledfootinsdim + \skip\csname #1footins\endcsname=1.2em \@plus .6em \@minus .6em +% \end{macrocode} +% Now do the setup for minipage footnotes. We use as much as possible of the +% normal setup as we can (so the notes will have a similar layout). +% \changes{v0.4}{2004/02/29}{Added minpage footnote setup to \cs{footnormal}} +% \begin{macrocode} + \expandafter\let\csname mpv#1footnote\endcsname=\mpnormalvfootnote + \expandafter\let\csname mp#1footgroup\endcsname=\mpnormalfootgroup + \count\csname mp#1footins\endcsname=1000 + \dimen\csname mp#1footins\endcsname=\ledfootinsdim + \skip\csname mp#1footins\endcsname=1.2em \@plus .6em \@minus .6em +} + +% \end{macrocode} +% \end{macro} +% Some of these values deserve comment: the \cs{dimen} +% setting allows 80\% of the page to be occupied by notes; the +% \cs{skip} setting is deliberately flexible, since pages with +% lots of notes attached to many of the lines can be a bit hard +% for \TeX\ to make. +% +% +% +% \subsection{Paragraphed footnotes} +% +% The paragraphed-footnote option +% reformats all the footnotes of one series for a page into +% a single paragraph; this is especially appropriate when the notes are +% numerous and brief. The code is based +% on \thetexbook, pp.\,398--400, with +% alterations for our environment. This algorithm uses a considerable +% amount of save-stack space: a \TeX\ of ordinary size may not be able +% to handle more than about $100$ notes of this kind on a page. +% +% \begin{macro}{\footparagraph} +% The \cs{footparagraph} macro +% sets up everything for one series of the footnotes so that +% they'll be paragraphed; it takes the series letter as argument. +% We include the setting of \verb"\count\footins" to $1000$ for the +% footnote series just in case you are switching to paragraphed +% footnotes after having columnar ones, since they change this +% value (see below). +% +% It is important to call \cs{footparagraph} only after +% \cs{hsize} has been set for the pages that use +% this series of notes; otherwise \TeX\ will try to put too +% many or too few of these notes on each page. If you need to +% change the \cs{hsize} within the document, call +% \cs{footparagraph} again afterwards to take account of the new +% value. The argument of \cs{footparagraph} is the letter +% (\texttt{A}--\texttt{E}) denoting the series of notes to be paragraphed. +% \begin{macrocode} +\newcommand*{\footparagraph}[1]{% + \expandafter\newcount\csname prevpage#1@num\endcsname + \expandafter\let\csname #1footstart\endcsname=\parafootstart + \expandafter\let\csname v#1footnote\endcsname=\para@vfootnote + \expandafter\let\csname #1footfmt\endcsname=\parafootfmt + \expandafter\let\csname #1footgroup\endcsname=\para@footgroup + \count\csname #1footins\endcsname=1000 + \para@footsetup{#1} +% \end{macrocode} +% And the extra setup for minipages. +% \begin{macrocode} + \expandafter\let\csname mpv#1footnote\endcsname=\mppara@vfootnote + \expandafter\let\csname mp#1footgroup\endcsname=\mppara@footgroup + \count\csname mp#1footins\endcsname=1000 +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\footfudgefiddle} +% For paragraphed footnotes \TeX{} has to estimate the amount of space +% required. If it underestimates this then the notes may get too long and +% run off the bottom of the text block. \cs{footfudgefiddle} can be increased +% from its default 64 (say to 70) to increase the estimate. +% \changes{v0.2.2}{2003/11/04}{Added \cs{footfudgefiddle}} +% \begin{macrocode} +\providecommand{\footfudgefiddle}{64} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\para@footsetup} +% \cs{footparagraph} calls the +% \cs{para@footsetup} macro to calculate a special +% fudge factor, which is the ratio of the \cs{baselineskip} +% to the \cs{hsize}. We assume that the proper value of +% \cs{baselineskip} for the footnotes (normally 9\,pt) has been set +% already, in \cs{notefontsetup}. The argument of the macro is +% again the note series letter. +% +% Peter Wilson thinks that \cs{columnwidth} should be used here for LaTeX, not \cs{hsize}. +% I've also included \cs{footfudgefiddle}. +% \changes{v0.2.2}{2003/11/04}{Added \cs{footfudgefiddle} to \cs{para@footsetup}} +% \begin{macrocode} +\newcommand*{\para@footsetup}[1]{{\csuse{Xnotefontsize@#1} + \dimen0=\baselineskip + \multiply\dimen0 by 1024 + \divide \dimen0 by \columnwidth \multiply\dimen0 by \footfudgefiddle\relax + \expandafter + \xdef\csname #1footfudgefactor\endcsname{% + \expandafter\strip@pt\dimen0 }}} + +% \end{macrocode} +% \end{macro} +% +% \edmac{} defines \cs{en@number} which does the same as the LaTeX kernel +% \cs{strip@pt}, namely strip the characters \verb"pt" from a dimen value. +% Eledmac use \cs{strip@pt}. +% +% \begin{macro}{\parafootstart} +% \cs{parafootstart} is the same as \cs{normalfootstart}, but we give it +% again to ensure that \cs{rightskip} and \cs{leftskip} are +% zeroed (this needs to be done before \cs{para@footgroup} in the +% output routine). You might have decided to change this for other +% kinds of note, but here it should stay as it is. The size of +% paragraphed notes is calculated using a fudge factor which in +% turn is based on \cs{hsize}. So the paragraph of notes needs to be +% that wide. +% +% The argument of the macro is again the note series letter. +% \begin{macrocode} +\newcommand*{\parafootstart}[1]{% + \rightskip=0pt \leftskip=0pt \parindent=0pt + \vskip\skip\csname #1footins\endcsname + \csname #1footnoterule\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\para@vfootnote} +% \cs{para@vfootnote} +% is a version of the \cs{vfootnote} command that's used for +% paragraphed notes. It gets appended to the \cs{inserts@list} list +% by an outer-level footnote command like \cs{Afootnote}. The first +% argument is the note series letter; the second is the full text +% of the printed note itself, including line numbers, lemmata, and +% footnote text. +% +% The initial model for this insertion is, of course, the +% \verb"\insert\footins" definition in \thetexbook, p.\,398. +% There, the footnotes are first collected up in hboxes, and these +% hboxes are later unpacked and stuck together into a paragraph. +% +% However, Michael Downes\index{Downes, Michael} has pointed out +% that because text in hboxes gets typeset in restricted horizontal +% mode, there are some undesirable side-effects if you later want +% to break such text across lines. In restricted horizontal mode, +% where \TeX\ does not expect to have to break lines, it does not +% insert certain items like \cs{discretionary}s. If you later unbox +% these hboxes and stick them together, as the \texbook{} +% macros do to make these footnotes, you lose the ability to +% hyphenate after an explicit hyphen. This can lead to overfull +% \cs{hbox}es when you would not expect to find them, and to the +% uninitiated it might be very hard to see why the problem had +% arisen.\footnote{Michael Downes, `Line Breaking in \cs{unhbox}ed +% Text', \textit{TUGboat} \textbf{11} (1990), pp.\,605--612.} +% +% Wayne Sullivan\index{Sullivan, Wayne} pointed out to us another +% subtle problem that arises from the same cause: \TeX\ also leaves +% the \cs{language} whatsit nodes out of the horizontal +% list.\footnote{See \thetexbook, p.\,455 (editions after +% January 1990).} So changes from one language to another will not +% invoke the proper hyphenation rules in such footnotes. Since +% critical editions often do deal with several languages, +% especially in a footnotes, we really ought to get this bit of code +% right. +% +% To get around these problems, Wayne suggested emendations to the +% \texbook{} versions of these macros which are broadly the +% same as those described by Michael: the central idea (also +% suggested by Donald Knuth in a letter to Michael) is to avoid collecting +% the text in an \cs{hbox} in the first place, but instead to collect +% it in a \cs{vbox} whose width is (virtually) +% infinite.\phantomsection\label{hboxproblem} The text is therefore typeset in +% unrestricted horizontal mode, as a paragraph consisting of a +% single long line. Later, there is an extra level of unboxing to +% be done: we have to unpack the \cs{vbox}, as well as the hboxes +% inside it, but that's not too hard. For details, we refer you to +% Michael's article, where the issues are clearly +% explained.\footnote{Wayne supplied his own macros to do this, but +% since they were almost identical to Michael's, we have used the +% latter's \cs{unvxh} macro since it is publicly +% documented.} Michael's unboxing macro is called \cs{unvxh}: unvbox, +% extract the last line, and unhbox it. +% +% Doing things this way has an important +% consequence:\phantomsection\label{nobreaks-detail} as Michael +% pointed out, you really can't put an explicit line-break into a +% note built in a \cs{vbox} the way we are doing.\footnote{`Line +% Breaking', p.\,610.} In other words, be very careful not to say +% \cs{break}, or \verb"\penalty-10000", or any equivalent inside your +% para-footnote.\phantomsection\label{nobreak} If you do, most of the note will +% probably disappear. You \emph{are} allowed to make strong +% suggestions; in fact \verb"\penalty-9999" will be quite okay. Just +% don't make the break mandatory. We haven't applied any of +% Michael's solutions here, since we feel that the problem is +% exiguous, and \Eledmac{} is quite baroque enough already. If +% you think you are having this problem, look up Michael's +% solutions. +% +% One more thing; we set \cs{leftskip} and \cs{rightskip} to zero. +% This has the effect of neutralizing any such skips which may +% apply to the main text (cf.\ p.\,\pageref{footskips} above). +% We need to do this, since \verb"footfudgefactor" is calculated on +% the assumption that the notes are \cs{hsize} wide. +% +% So, finally, here is the modified foot-paragraph code, which +% sets the footnote in vertical mode so that language and +% discretionary nodes are included. +% +% \begin{macrocode} +\newcommand*{\para@vfootnote}[2]{% + \insert\csname #1footins\endcsname + \bgroup + \csuse{Xnotefontsize@#1} + \footsplitskips + \setbox0=\vbox{\hsize=\maxdimen + \noindent\csname #1footfmt\endcsname#2[#1]}% + \setbox0=\hbox{\unvxh0[#1]}% + \dp0=0pt + \ht0=\csname #1footfudgefactor\endcsname\wd0 +% \end{macrocode} +% Here we produce the contents of the footnote from box $0$, and +% add a penalty of $0$ between boxes in this insert. +% \begin{macrocode} + \box0 + \penalty0 + \egroup} + +% \end{macrocode} +% The final penalty of $0$ +% was added here at Wayne's\index{Sullivan, Wayne} +% suggestion to avoid a weird page-breaking problem, which occurs on +% those occasions when \TeX\ attempts to split foot paragraphs. +% After trying out such a split (see \thetexbook, p.\,124), +% \TeX\ inserts a penalty of $-10000$ here, which +% nearly always forces the break at the end of the whole footnote +% paragraph (since individual notes can't be split) even when this +% leads to an overfull vbox. The change above results in a penalty +% of $0$ instead which allows, but doesn't force, such breaks. This +% penalty of $0$ is later removed, after page breaks have been +% decided, by the \cs{unpenalty} macro in \cs{makehboxofhboxes}. So it +% does not affect how the footnote paragraphs are typeset (the +% notes still have a penalty of $-10$ between them, which is added +% by \cs{parafootfmt}). +% \end{macro} +% +% \begin{macro}{\mppara@vfootnote} +% This version is for minipages. +% \begin{macrocode} +\newcommand*{\mppara@vfootnote}[2]{% + \global\setbox\@nameuse{mp#1footins}\vbox{% + \unvbox\@nameuse{mp#1footins}% + \csuse{Xnotefontsize@#1} + \footsplitskips + \setbox0=\vbox{\hsize=\maxdimen + \noindent\color@begingroup\csname #1footfmt\endcsname #2[#1]\color@endgroup}% + \setbox0=\hbox{\unvxh0[#1]}% + \dp0=\z@ + \ht0=\csname #1footfudgefactor\endcsname\wd0 + \box0 + \penalty0 +}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\unvxh} +% Here is (modified) Michael's\index{Downes, Michael} definition of \cs{unvxh}, +% used above. Michael's macro also takes care to remove some +% unwanted penalties and glue that \TeX\ automatically attaches to +% the end of paragraphs. When \TeX\ finishes a paragraph, it +% throws away any remaining glue, and then tacks on the following +% items: a \cs{penalty} of $10000$, a \cs{parfillskip} and a +% \cs{rightskip} (\thetexbook, pp.\,99--100). \cs{unvxh} +% cancels these unwanted paragraph-final items using \cs{unskip} and +% \cs{unpenalty}. +% \begin{macrocode} +\newcommandx*{\unvxh}[2][2=Z]{% 2th is optional for retro-compatibility + \setbox0=\vbox{\unvbox#1% + \global\setbox1=\lastbox}% + \unhbox1 + \unskip % remove \rightskip, + \unskip % remove \parfillskip, + \unpenalty % remove \penalty of 10000, + \hskip\csuse{afternote@#2}} % but add the glue to go between the notes + +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\parafootfmt} +% \cs{parafootfmt} is +% \cs{normalfootfmt} adapted to do the special stuff +% needed for paragraphed notes---leaving out the \verb"\endgraf" at the +% end, sticking in special penalties and kern, and leaving out the +% \cs{footstrut}. The first argument is the line and page +% number information, the second is the lemma, the third is the +% text of the footnote, and the fourth is the series (optional, for backward compatibility). +% \begin{macrocode} +\newcommandx*{\parafootfmt}[4][4=Z]{% + \insertparafootsep{#4}% + \ledsetnormalparstuff% + \printlinefootnote{#1}{#4}% + {\select@lemmafont#1|#2}% + \iftoggle{nosep@}{\hskip\csuse{inplaceoflemmaseparator@#4}}{\ifcsempty{lemmaseparator@#4}% + {\hskip\csuse{inplaceoflemmaseparator@#4}}% + {\nobreak\hskip\csuse{beforelemmaseparator@#4}\csuse{lemmaseparator@#4}\hskip\csuse{afterlemmaseparator@#4}% + }}% + #3\penalty-10 } +% \end{macrocode} +% Note that in the above definition, the penalty of $-10$ +% encourages a line break between notes, so that notes have a +% slight tendency to begin on new lines. +% The \cs{insertparafootsep} command is used to insert the \cs{parafootsep@series} between each note in the \emph{same} page. +% \end{macro} +% +% \begin{macro}{\para@footgroup} +% This \verb"footgroup" code is modelled on the macros in +% \thetexbook, p.\,399. The only difference is the \cs{unpenalty} +% in \cs{makehboxofhboxes}, which is there to remove the penalty of +% $0$ which was added to the end of each footnote by +% \cs{para@vfootnote}. +% +% The call to \cs{notefontsetup} is to ensure that the correct +% \cs{baselineskip} for the footnotes is used. The argument is the +% note series letter. +% \begin{macrocode} +\newcommand*{\para@footgroup}[1]{% + \unvbox\csname #1footins\endcsname + \makehboxofhboxes + \setbox0=\hbox{\unhbox0 \removehboxes}% + \csuse{Xnotefontsize@#1} + \noindent\unhbox0\par} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mppara@footgroup} +% The minipage version. +% \begin{macrocode} +\newcommand*{\mppara@footgroup}[1]{{% + \vskip\skip\@nameuse{mp#1footins} + \normalcolor + \@nameuse{#1footnoterule}% + \unvbox\csname mp#1footins\endcsname + \makehboxofhboxes + \setbox0=\hbox{\unhbox0 \removehboxes}% + \csuse{Xnotefontsize@#1} + \noindent\unhbox0\par}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\makehboxofhboxes} +% \begin{macro}{\removehboxes} +% \begin{macrocode} +\newcommand*{\makehboxofhboxes}{\setbox0=\hbox{}% + \loop + \unpenalty + \setbox2=\lastbox + \ifhbox2 + \setbox0=\hbox{\box2\unhbox0}% + \repeat} + +\newcommand*{\removehboxes}{\setbox0=\lastbox + \ifhbox0{\removehboxes}\unhbox0 \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Insertion of the footnotes separator} +%The command \cs{insertparafootsep}\marg{series} must be called at the begining of \cs{parafootftm} (and like commands). +% \begin{macro}{\prevpage@num} +% \begin{macro}{\insertparafootsep} +% \begin{macrocode} +\newcommand{\insertparafootsep}[1]{% + \ifnumequal{\csuse{prevpage#1@num}}{\page@num}% + {\ifcsdef{prevline#1}% Be sur \prevline#1 exists. + {\ifnumequal{\csuse{prevline#1}}{\line@num}% + {\ifcsempty{symplinenum}{\csuse{parafootsep@#1}}{}}% + {\csuse{parafootsep@#1}}% + }% + {\csuse{parafootsep@#1}}% + }% + {}% + \global\csname prevpage#1@num\endcsname=\page@num% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \subsection{Columnar footnotes} +% +% \begin{macro}{\rigidbalance} +% \begin{macro}{\dosplits} +% \begin{macro}{\splitoff} +% \begin{macro}{\@h} +% \begin{macro}{\@k} +% We will now define macros for three-column notes and two-column +% notes. Both sets of macros will use \cs{rigidbalance}, which splits a +% box (\verb"#1") into into a number (\verb"#2") of columns, each +% with a space (\verb"#3") between the top baseline and the top of +% the \cs{vbox}. The \cs{rigidbalance} macro is taken from +% \thetexbook, p.\,397, with a slight change to the syntax of +% the arguments so that they don't depend on white space. Note also +% the extra unboxing in \cs{splitoff}, which allows the new \cs{vbox} to +% have its natural height as it goes into the alignment. +% +% The LaTeX \cs{line} macro has no relationship to the +% TeX \cs{line}. The LaTeX equivalent is \cs{@@line}. +% \begin{macrocode} +\newcount\@k \newdimen\@h +\newcommand*{\rigidbalance}[3]{\setbox0=\box#1 \@k=#2 \@h=#3 + \@@line{\splittopskip=\@h \vbadness=\@M \hfilneg + \valign{##\vfil\cr\dosplits}}} + +\newcommand*{\dosplits}{\ifnum\@k>0 \noalign{\hfil}\splitoff + \global\advance\@k-1\cr\dosplits\fi} + +\newcommand*{\splitoff}{\dimen0=\ht0 + \divide\dimen0 by\@k \advance\dimen0 by\@h + \setbox2 \vsplit0 to \dimen0 + \unvbox2 } + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \paragraph{Three columns} +% +% \begin{macro}{\footthreecol} +% You say \verb"\footthreecol{A}" to have the \texttt{A} series of the footnotes +% typeset in three columns. It is important to call this only after +% \cs{hsize} has been set for the document. +% \begin{macrocode} +\newcommand*{\footthreecol}[1]{% + \expandafter\let\csname v#1footnote\endcsname=\threecolvfootnote + \expandafter\let\csname #1footfmt\endcsname=\threecolfootfmt + \expandafter\let\csname #1footgroup\endcsname=\threecolfootgroup + \threecolfootsetup{#1} +% \end{macrocode} +% The additional setup for minipages. +% \begin{macrocode} + \expandafter\let\csname mpv#1footnote\endcsname=\mpnormalvfootnote + \expandafter\let\csname mp#1footgroup\endcsname=\mpthreecolfootgroup + \mpthreecolfootsetup{#1} +} + +% \end{macrocode} +% The \cs{footstart} and \cs{footnoterule} macros for these notes assume +% the normal values (p.\,\pageref{normalvalues} above). +% \end{macro} +% +% \begin{macro}{\threecolfootsetup} +% The \cs{threecolfootsetup} macro calculates and sets some numbers +% for three-column footnotes. +% +% We set the \cs{count} of the foot insert to $333$. +% Each footnote can be thought of as contributing only one third of +% its height to the page, since the footnote insertion has been +% made as a long narrow column, which then gets trisected by the +% \cs{rigidbalance} routine (inside \cs{threecolfootgroup}). +% These new, shorter columns are saved in a box, and then that box +% is \emph{put back} into the footnote insert, replacing the +% original collection of the footnotes. This new box is, therefore, +% only about a third of the height of the original one. +% +% The \cs{dimen} value for this note series has to change in the +% inverse way: it needs to be three times +% the actual limit on the amount of space these notes are allowed to +% fill on the page, because when \TeX\ is +% accumulating material for the page +% and checking that limit, it doesn't apply the \cs{count} scaling. +% \begin{macrocode} +\newcommand*{\threecolfootsetup}[1]{% + \count\csname #1footins\endcsname 333 + \multiply\dimen\csname #1footins\endcsname \thr@@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mpthreecolfootsetup} +% The setup for minipages. +% \begin{macrocode} +\newcommand*{\mpthreecolfootsetup}[1]{% + \count\csname mp#1footins\endcsname 333 + \multiply\dimen\csname mp#1footins\endcsname \thr@@} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\threecolvfootnote} +% \cs{threecolvfootnote} +% is the \cs{vfootnote} command for three-column notes. The +% call to \cs{notefontsetup} ensures that the +% \cs{splittopskip} and \cs{splitmaxdepth} take their values +% from the right \cs{strutbox}: the one used in a footnotes. +% Note especially the importance of temporarily reducing the +% \cs{hsize} to $0.3$ of its normal value. This determines the +% widths of the individual columns. So if the normal \cs{hsize} +% is, say, 10\,cm, then each column will be $0.3\times10=3$\,cm +% wide, leaving a gap of 1\,cm spread equally between columns +% (i.e., .5\,cm between each). +% +% The arguments are 1)~the note series letter and 2)~the full text +% of the note (including numbers, lemma and text). +% \begin{macrocode} +\newcommand*{\threecolvfootnote}[2]{% + \insert\csname #1footins\endcsname\bgroup + \csuse{Xnotefontsize@#1} + \footsplitskips + \csname #1footfmt\endcsname #2[#1]\egroup} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\threecolfootfmt} +% \cs{threecolfootfmt} +% is the command that formats one note. +% It uses \cs{raggedright}, which will usually be +% preferable with such short lines. Setting the \cs{parindent} +% to zero means that, within each individual note, the lines begin +% flush left. +% +% The arguments are 1)~the line numbers, 2)~the lemma and 3)~the +% text of the \verb"-footnote" command 4) optional (for backward compatibility): the series. +% +% \begin{macrocode} +\newcommandx*{\threecolfootfmt}[4][4=Z]{% + \normal@pars + \hsize \csuse{hsizethreecol@#4} + \parindent=0pt + \tolerance=5000 + \raggedright + \hangindent=\csuse{Xhangindent@#4} + \leavevmode + \strut{\printlinefootnote{#1}{#4}}% + {\select@lemmafont#1|#2}% + \iftoggle{nosep@}{\hskip\csuse{inplaceoflemmaseparator@#4}}{\ifcsempty{lemmaseparator@#4}% + {\hskip\csuse{inplaceoflemmaseparator@#4}}% + {\nobreak\hskip\csuse{beforelemmaseparator@#4}\csuse{lemmaseparator@#4}\hskip\csuse{afterlemmaseparator@#4}% + }}% + #3\strut\par\allowbreak} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\threecolfootgroup} +% And here is the \verb"footgroup" macro that's called within the +% output routine to regroup the notes into three columns. Once +% again, the call to \cs{notefontsetup} is there to ensure that +% it is the right \cs{splittopskip}---the one used in +% footnotes---which is used to provide the third argument for +% \cs{rigidbalance}. This third argument (\cs{@h}) is the +% \verb"topskip" for the box containing the text of the +% footnotes, and does the job of making sure the top lines of the +% columns line up horizontally. In \thetexbook, p.\,398, +% Donald Knuth suggests retrieving the ouput of \cs{rigidbalance}, +% putting it back into the insertion box, and then printing the +% box. Here, we just print the \cs{line} which comes out of +% \cs{rigidbalance} directly, without any re-boxing. +% \begin{macrocode} +\newcommand*{\threecolfootgroup}[1]{{\notefontsetup + \splittopskip=\ht\strutbox + \expandafter + \rigidbalance\csname #1footins\endcsname \thr@@ \splittopskip}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mpthreecolfootgroup} +% The setup for minipages. +% \begin{macrocode} +\newcommand*{\mpthreecolfootgroup}[1]{{% + \vskip\skip\@nameuse{mp#1footins} + \normalcolor + \@nameuse{#1footnoterule} + \splittopskip=\ht\strutbox + \expandafter + \rigidbalance\csname mp#1footins\endcsname \thr@@ \splittopskip}} + +% \end{macrocode} +% \end{macro} +% +% \paragraph{Two columns} +% +% \begin{macro}{\foottwocol} +% You say \verb"\foottwocol{A}" to have the \texttt{A} series of the footnotes +% typeset in two columns. It is important to call this only after +% \cs{hsize} has been set for the document. +% \begin{macrocode} +\newcommand*{\foottwocol}[1]{% + \expandafter\let\csname v#1footnote\endcsname=\twocolvfootnote + \expandafter\let\csname #1footfmt\endcsname=\twocolfootfmt + \expandafter\let\csname #1footgroup\endcsname=\twocolfootgroup + \twocolfootsetup{#1} +% \end{macrocode} +% The additional setup for minipages. +% \begin{macrocode} + \expandafter\let\csname mpv#1footnote\endcsname=\mpnormalvfootnote + \expandafter\let\csname mp#1footgroup\endcsname=\mptwocolfootgroup + \mptwocolfootsetup{#1} +} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\twocolfootsetup} +% \begin{macro}{\twocolvfootnote} +% \begin{macro}{\twocolfootfmt} +% \begin{macro}{\twocolfootgroup} +% Here is a series of macros which are very similar to their +% three-column counterparts. In this case, +% each note is assumed to contribute only a half a line of text. +% And the notes are set in columns +% giving a gap between them of one tenth +% of the \cs{hsize}. +% \begin{macrocode} +\newcommand*{\twocolfootsetup}[1]{% + \count\csname #1footins\endcsname 500 + \multiply\dimen\csname #1footins\endcsname \tw@} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\twocolvfootnote}[2]{\insert\csname #1footins\endcsname\bgroup + \csuse{Xnotefontsize@#1} + \footsplitskips + \csname #1footfmt\endcsname #2[#1]\egroup} +% \end{macrocode} +% \begin{macrocode} +\newcommandx*{\twocolfootfmt}[4][4=Z]{% 4th arg is optional, for backward compatibility + \normal@pars + \hsize \csuse{hsizetwocol@#4} + \parindent=0pt + \tolerance=5000 + \raggedright + \hangindent=\csuse{Xhangindent@#4} + \leavevmode + \strut{\printlinefootnote{#1}{#4}}% + {\select@lemmafont#1|#2}% + \iftoggle{nosep@}{\hskip\csuse{inplaceoflemmaseparator@#4}}{\ifcsempty{lemmaseparator@#4}% + {\hskip\csuse{inplaceoflemmaseparator@#4}}% + {\nobreak\hskip\csuse{beforelemmaseparator@#4}\csuse{lemmaseparator@#4}\hskip\csuse{afterlemmaseparator@#4}% + }}% + #3\strut\par\allowbreak} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\twocolfootgroup}[1]{{\csuse{Xnotefontsize@#1} + \splittopskip=\ht\strutbox + \expandafter + \rigidbalance\csname #1footins\endcsname \tw@ \splittopskip}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\mptwocolfootsetup} +% \begin{macro}{\mptwocolfootgroup} +% The versions for minipages. +% \begin{macrocode} +\newcommand*{\mptwocolfootsetup}[1]{% + \count\csname mp#1footins\endcsname 500 + \multiply\dimen\csname mp#1footins\endcsname \tw@} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\mptwocolfootgroup}[1]{{% + \vskip\skip\@nameuse{mp#1footins} + \normalcolor + \@nameuse{#1footnoterule} + \splittopskip=\ht\strutbox + \expandafter + \rigidbalance\csname mp#1footins\endcsname \tw@ \splittopskip}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% % \section{Familiar footnotes} +% +% +% The original \edmac{} provided the five series of critical footnotes, +% and LaTeX provides a single numbered footnote. The \Eledmac{} package +% uses the \edmac{} mechanism to provide a few series of numbered footnotes. +% +% First, though, the \Lpack{footmisc} package has an option whereby +% two or more consecutive \cs{footnote}s have their marks separated +% by commas. This seems such a useful ability that it is provided +% automatically by \Eledmac. +% +% \begin{macro}{\multiplefootnotemarker} +% \begin{macro}{\multfootsep} +% These macros may have been defined by the \Lclass{memoir} class, +% are provided by the \Lpack{footmisc} package and perhaps +% by other footnote packages. +% \begin{macrocode} +\providecommand*{\multiplefootnotemarker}{3sp} +\providecommand*{\multfootsep}{\textsuperscript{\normalfont,}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\m@mmf@prepare} +% A pair of self-cancelling kerns. This may have been defined in the +% \Lclass{memoir} class. +% \begin{macrocode} +\providecommand*{\m@mmf@prepare}{% + \kern-\multiplefootnotemarker + \kern\multiplefootnotemarker\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\m@mmf@check} +% This may have been defined in the \Lclass{memoir} class. If it recognises +% the last kern as \cs{multiplefootnotemarker} it typesets \cs{multfootsep}. +% \begin{macrocode} +\providecommand*{\m@mmf@check}{% + \ifdim\lastkern=\multiplefootnotemarker\relax + \edef\@x@sf{\the\spacefactor}% + \unkern + \multfootsep + \spacefactor\@x@sf\relax + \fi} + +% \end{macrocode} +% \end{macro} +% +% We have to modify \verb?\@footnotetext? and \verb?\@footnotemark?. However, +% if \Lclass{memoir} is used the modifications have already been made. +% \changes{v0.4.1}{2004/03/25}{Only change \cs{@footnotetext} and +% \cs{@footnotemark} if memoir not used} +% \begin{macrocode} +\@ifclassloaded{memoir}{}{% +% \end{macrocode} +% \begin{macro}{\@footnotetext} +% Add \cs{m@mmf@prepare} at the end of \cs{@footnotetext}. +% \begin{macrocode} +\let\l@dold@footnotetext\@footnotetext +\renewcommand{\@footnotetext}[1]{% + \l@dold@footnotetext{#1}% + \m@mmf@prepare} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@footnotemark} +% Modify \cs{@footnotemark} to cater for adjacent \cs{footnote}s. +% \begin{macrocode} +\renewcommand*{\@footnotemark}{% + \leavevmode + \ifhmode + \edef\@x@sf{\the\spacefactor}% + \m@mmf@check + \nobreak + \fi + \@makefnmark + \m@mmf@prepare + \ifhmode\spacefactor\@x@sf\fi + \relax} +% \end{macrocode} +% \end{macro} +% Finished the modifications for the non-memoir case. +% \begin{macrocode} +} + +% \end{macrocode} +% +% \begin{macro}{\l@doldold@footnotetext} +% \begin{macro}{\@footnotetext} +% In order to enable the regular \verb?\footnote?s in numbered text +% we have to play around with its \verb?\@footnotetext?, using +% different forms for when in numbered or regular text. +% \changes{v0.5}{2004/04/03}{Enabled regular \cs{footnote} in numbered text} +% \begin{macrocode} +\let\l@doldold@footnotetext\@footnotetext +\renewcommand{\@footnotetext}[1]{% + \ifnumberedpar@ + \edtext{}{\l@dbfnote{#1}}% + \else + \l@doldold@footnotetext{#1}% + \fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@dbfnote} +% \begin{macro}{\vl@dbfnote} +% \verb?\l@dbfnote? adds the footnote to the insert list, and +% \verb?\vl@dbfnote? calls the original \verb?\@footnotetext?. +% \changes{v0.6}{2004/11/23}{Changed \cs{l@dbfnote} and \cs{vl@dbfnote} as +% originals could give incorrect markers in the footnotes} +% \begin{macrocode} +\newcommand{\l@dbfnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\vl@dbfnote{{#1}}{\@thefnmark}}% + \to\inserts@list + \global\advance\insert@count \@ne + \fi\ignorespaces} +\newcommand{\vl@dbfnote}[2]{% + \def\@thefnmark{#2}% + \l@doldold@footnotetext{#1}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% +% +% +% \subsection{Footnote formats} +% +% Some of the code for the various formats is remarkably similar to that +% in section~\ref{sec:nfootformat}. +% +% The following macros generally set things up for the `standard' footnote +% format. +% +% \begin{macro}{\prebodyfootmark} +% \begin{macro}{\postbodyfootmark} +% Two convenience macros for use by \cs{...@footnotemark...} macros. +% \begin{macrocode} +\newcommand*{\prebodyfootmark}{% + \leavevmode + \ifhmode + \edef\@x@sf{\the\spacefactor}% + \m@mmf@check + \nobreak + \fi} +\newcommand{\postbodyfootmark}{% + \m@mmf@prepare + \ifhmode\spacefactor\@x@sf\fi\relax} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\normal@footnotemarkX} +% \cs{normal@footnotemarkX}\marg{series} sets up the typesetting of the +% marker at the point where the footnote is called for. +% \begin{macrocode} +\newcommand*{\normal@footnotemarkX}[1]{% + \prebodyfootmark + \@nameuse{bodyfootmark#1}% + \postbodyfootmark} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\normalbodyfootmarkX} +% The \cs{normalbodyfootmarkX}\marg{series} \emph{really} typesets the +% in-text marker. The style is the normal superscript. +% \begin{macrocode} +\newcommand*{\normalbodyfootmarkX}[1]{% + \hbox{\textsuperscript{\normalfont\@nameuse{@thefnmark#1}}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\normalvfootnoteX} +% \cs{normalvfootnoteX}\marg{series}\marg{text} does the \cs{insert} for +% the \meta{series} and calls the series' \cs{footfmt...} to format the +% \meta{text}. +% \begin{macrocode} +\newcommand*{\normalvfootnoteX}[2]{% + \insert\@nameuse{footins#1}\bgroup + \csuse{notefontsizeX@#1} + \footsplitskips + \spaceskip=\z@skip \xspaceskip=\z@skip + \@nameuse{footfmt#1}{#1}{#2}\egroup} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mpnormalvfootnoteX} +% The minipage version. +% \begin{macrocode} +\newcommand*{\mpnormalvfootnoteX}[2]{% + \global\setbox\@nameuse{mpfootins#1}\vbox{% + \unvbox\@nameuse{mpfootins#1} + \csuse{notefontsizeX@#1} + \hsize\columnwidth + \@parboxrestore + \color@begingroup + \@nameuse{footfmt#1}{#1}{#2}\color@endgroup}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\normalfootfmtX} +% \cs{normalfootfmtX}\marg{series}\marg{text} typesets the footnote text, +% prepended by the marker. +% \begin{macrocode} +\newcommand*{\normalfootfmtX}[2]{% + \ledsetnormalparstuff + \hangindent=\csuse{hangindentX@#1}% + {{\csuse{notenumfontX@#1}\@nameuse{footfootmark#1}}\strut%\enspace + #2\strut\par}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\normalfootfootmarkX} +% \cs{normalfootfootmarkX}\marg{series} is called by \cs{normalfootfmtX} +% to typeset the footnote marker in the footer before the footnote text. +% \begin{macrocode} +\newcommand*{\normalfootfootmarkX}[1]{% + \textsuperscript{\@nameuse{@thefnmark#1}}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\normalfootstartX} +% \cs{normalfootstartX}\marg{series} is the \meta{series} footnote +% starting macro used in the output routine. +% \begin{macrocode} +\newcommand*{\normalfootstartX}[1]{% + \vskip\skip\@nameuse{footins#1}% + \leftskip=\z@ + \rightskip=\z@ + \@nameuse{footnoterule#1}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\normalfootnoteruleX} +% The rule drawn before the footnote series group. +% \begin{macrocode} +\let\normalfootnoteruleX=\footnoterule + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\normalfootgroupX} +% \cs{normalfootgroupX}\marg{series} sends the contents of the \meta{series} +% insert box to the output page without alteration. +% \begin{macrocode} +\newcommand*{\normalfootgroupX}[1]{% + \unvbox\@nameuse{footins#1}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mpnormalfootgroupX} +% The minipage version. +% \begin{macrocode} +\newcommand*{\mpnormalfootgroupX}[1]{% + \vskip\skip\@nameuse{mpfootins#1} + \normalcolor + \@nameuse{footnoterule#1} + \unvbox\@nameuse{mpfootins#1}} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\normalbfnoteX} +% \changes{v0.7}{2005/02/18}{Removed extraneous space from \cs{normalbfnoteX}} +% \begin{macrocode} +\newcommand{\normalbfnoteX}[2]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\vbfnoteX{#1}{#2}{\@nameuse{thefootnote#1}}}% + \to\inserts@list + \global\advance\insert@count \@ne + \fi\ignorespaces} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\vbfnoteX} +% \begin{macrocode} +\newcommand{\vbfnoteX}[3]{% + \@namedef{@thefnmark#1}{#3}% + \@nameuse{regvfootnote#1}{#1}{#2}} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\vnumfootnoteX} +% \changes{v0.7}{2005/02/18}{Removed extraneous space from \cs{vnumfootnoteX}} +% \begin{macrocode} +\newcommand{\vnumfootnoteX}[2]{% + \ifnumberedpar@ + \edtext{}{\normalbfnoteX{#1}{#2}}% + \else + \@nameuse{regvfootnote#1}{#1}{#2}% + \fi} + +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\footnormalX} +% \cs{footnormalX}\marg{series} initialises the settings for +% the \meta{series} footnotes. This should always be called for +% each series. +% \begin{macrocode} +\newcommand*{\footnormalX}[1]{% + \expandafter\let\csname footstart#1\endcsname=\normalfootstartX + \@namedef{@footnotemark#1}{\normal@footnotemarkX{#1}} + \@namedef{bodyfootmark#1}{\normalbodyfootmarkX{#1}} + \expandafter\let\csname regvfootnote#1\endcsname=\normalvfootnoteX + \expandafter\let\csname vfootnote#1\endcsname=\vnumfootnoteX + \expandafter\let\csname footfmt#1\endcsname=\normalfootfmtX + \@namedef{footfootmark#1}{\normalfootfootmarkX{#1}} + \expandafter\let\csname footgroup#1\endcsname=\normalfootgroupX + \expandafter\let\csname footnoterule#1\endcsname=\normalfootnoteruleX + \count\csname footins#1\endcsname=1000 + \dimen\csname footins#1\endcsname=\ledfootinsdim + \skip\csname footins#1\endcsname=1.2em \@plus .6em \@minus .6em +% \end{macrocode} +% Aditions for minipages. +% \begin{macrocode} + \expandafter\let\csname mpvfootnote#1\endcsname=\mpnormalvfootnoteX + \expandafter\let\csname mpfootgroup#1\endcsname=\mpnormalfootgroupX + \count\csname mpfootins#1\endcsname=1000 +% \dimen\csname mpfootins#1\endcsname=0.8\vsize + \dimen\csname mpfootins#1\endcsname=\ledfootinsdim + \skip\csname mpfootins#1\endcsname=1.2em \@plus .6em \@minus .6em +} + +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Two column footnotes} +% +% The following macros set footnotes in two columns. It is assumed +% that the length of each footnote is less than the column width. +% +% \begin{macro}{\foottwocoolX} +% \cs{foottwocolX}\marg{series} +% \begin{macrocode} +\newcommand*{\foottwocolX}[1]{% + \expandafter\let\csname regvfootnote#1\endcsname=\twocolvfootnoteX + \expandafter\let\csname footfmt#1\endcsname=\twocolfootfmtX + \expandafter\let\csname footgroup#1\endcsname=\twocolfootgroupX + \twocolfootsetupX{#1} + \expandafter\let\csname mpvfootnote#1\endcsname=\mpnormalvfootnoteX + \expandafter\let\csname mpfootgroup#1\endcsname=\mptwocolfootgroupX + \mptwocolfootsetupX{#1}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\twocolfootsetupX} +% \begin{macro}{\mptwocolfootsetupX} +% \cs{twocolfootsetupX}\marg{series} +% \begin{macrocode} +\newcommand*{\twocolfootsetupX}[1]{% + \count\csname footins#1\endcsname 500 + \multiply\dimen\csname footins#1\endcsname by \tw@} +\newcommand*{\mptwocolfootsetupX}[1]{% + \count\csname mpfootins#1\endcsname 500 + \multiply\dimen\csname mpfootins#1\endcsname by \tw@} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\twocolvfootnoteX} +% \cs{twocolvfootnoteX}\marg{series} +% \begin{macrocode} +\newcommand*{\twocolvfootnoteX}[2]{% + \insert\csname footins#1\endcsname\bgroup + \csuse{notefontsizeX@#1} + \footsplitskips + \spaceskip=\z@skip \xspaceskip=\z@skip + \@nameuse{footfmt#1}{#1}{#2}\egroup} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\twocolfootfmtX} +% \cs{twocolfootfmtX}\marg{series} +% \begin{macrocode} +\newcommand*{\twocolfootfmtX}[2]{% + \normal@pars + \hangindent=\csuse{hangindentX@#1}% + \hsize \csuse{hsizetwocolX@#1} + \parindent=\z@ +%%% \parfillskip=0pt \@plus 1fil + \tolerance=5000\relax + \raggedright + \leavevmode + {\csuse{notenumfontX@#1}\@nameuse{footfootmark#1}\strut%\enspace + #2\strut\par}\allowbreak} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\twocolfootgroupX} +% \begin{macro}{\mptwocolfootgroupX} +% \cs{twocolfootgroupX}\marg{series} +% \begin{macrocode} +\newcommand*{\twocolfootgroupX}[1]{{\csuse{notefontsizeX@#1} + \splittopskip=\ht\strutbox + \expandafter + \rigidbalance\csname footins#1\endcsname \tw@ \splittopskip}} +\newcommand*{\mptwocolfootgroupX}[1]{{% + \vskip\skip\@nameuse{mpfootins#1} + \normalcolor + \@nameuse{footnoterule#1} + \splittopskip=\ht\strutbox + \expandafter + \rigidbalance\csname mpfootins#1\endcsname \tw@ \splittopskip}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Three column footnotes} +% +% The following macros set footnotes in three columns. It is assumed +% that the length of each footnote is less than the column width. +% +% +% \begin{macro}{\footthreecolX} +% \cs{footthreecolX}\marg{series} +% \begin{macrocode} +\newcommand*{\footthreecolX}[1]{% + \expandafter\let\csname regvfootnote#1\endcsname=\threecolvfootnoteX + \expandafter\let\csname footfmt#1\endcsname=\threecolfootfmtX + \expandafter\let\csname footgroup#1\endcsname=\threecolfootgroupX + \threecolfootsetupX{#1} + \expandafter\let\csname mpvfootnote#1\endcsname=\mpnormalvfootnoteX + \expandafter\let\csname mpfootgroup#1\endcsname=\mpthreecolfootgroupX + \mpthreecolfootsetupX{#1}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\threecolfootsetupX} +% \begin{macro}{\mpthreecolfootsetupX} +% \cs{threecolfootsetupX}\marg{series} +% \begin{macrocode} +\newcommand*{\threecolfootsetupX}[1]{% + \count\csname footins#1\endcsname 333 + \multiply\dimen\csname footins#1\endcsname by \thr@@} +\newcommand*{\mpthreecolfootsetupX}[1]{% + \count\csname mpfootins#1\endcsname 333 + \multiply\dimen\csname mpfootins#1\endcsname by \thr@@} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\threecolvfootnoteX} +% \cs{threecolvfootnoteX}\marg{series}\marg{text} +% \begin{macrocode} +\newcommand*{\threecolvfootnoteX}[2]{% + \insert\csname footins#1\endcsname\bgroup + \csuse{notefontsizeX@#1} + \footsplitskips + \@nameuse{footfmt#1}{#1}{#2}\egroup} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\threecolfootfmtX} +% \cs{threecolfootfmtX}\marg{series} +% \begin{macrocode} +\newcommand*{\threecolfootfmtX}[2]{% + \hangindent=\csuse{hangindentX@#1}% + \normal@pars + \hsize \csuse{hsizethreecolX@#1} + \parindent=\z@ +%%% \parfillskip=0pt \@plus 1fil + \tolerance=5000\relax + \raggedright + \leavevmode + {\csuse{notenumfontX@#1}\@nameuse{footfootmark#1}\strut%\enspace + #2\strut\par}\allowbreak} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\threecolfootgroupX} +% \begin{macro}{\mpthreecolfootgroupX} +% \cs{threecolfootgroupX}\marg{series} +% \begin{macrocode} +\newcommand*{\threecolfootgroupX}[1]{{\csuse{notefontsizeX@#1} + \splittopskip=\ht\strutbox + \expandafter + \rigidbalance\csname footins#1\endcsname \thr@@ \splittopskip}} +\newcommand*{\mpthreecolfootgroupX}[1]{{% + \vskip\skip\@nameuse{mpfootins#1} + \normalcolor + \@nameuse{footnoterule#1} + \splittopskip=\ht\strutbox + \expandafter + \rigidbalance\csname mpfootins#1\endcsname \thr@@ \splittopskip}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Paragraphed footnotes} +% +% The following macros set footnotes as one paragraph. +% +% \begin{macro}{\footparagraphX} +% \cs{footparagraphX}\marg{series} +% \begin{macrocode} +\newcommand*{\footparagraphX}[1]{% + \expandafter\newcount\csname prevpage#1@num\endcsname + \expandafter\let\csname footstart#1\endcsname=\parafootstartX + \expandafter\let\csname regvfootnote#1\endcsname=\para@vfootnoteX + \expandafter\let\csname footfmt#1\endcsname=\parafootfmtX + \expandafter\let\csname footgroup#1\endcsname=\para@footgroupX + \expandafter\let\csname footnoterule#1\endcsname=\normalfootnoteruleX + \count\csname footins#1\endcsname=1000 + \expandafter\let\csname mpvfootnote#1\endcsname=\mppara@vfootnoteX + \expandafter\let\csname mpfootgroup#1\endcsname=\mppara@footgroupX + \count\csname mpfootins#1\endcsname=1000 + \para@footsetupX{#1}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\para@footsetupX} +% \cs{para@footsetupX}\marg{series} +% \changes{v0.2.2}{2003/11/04}{Added \cs{footfudgefiddle} to \cs{para@footsetupX}} +% \begin{macrocode} +\newcommand*{\para@footsetupX}[1]{{\csuse{notefontsizeX@#1} + \dimen0=\baselineskip + \multiply\dimen0 by 1024 + \divide\dimen0 by \hsize \multiply\dimen0 by \footfudgefiddle\relax + \expandafter + \xdef\csname footfudgefactor#1\endcsname{% + \expandafter\strip@pt\dimen0 }}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\parafootstartX} +% \cs{parafootstartX}\marg{series} +% \begin{macrocode} +\newcommand*{\parafootstartX}[1]{% + \vskip\skip\@nameuse{footins#1}% + \leftskip=\z@ + \rightskip=\z@ + \parindent=\z@ + \vskip\skip\@nameuse{footins#1}% + \@nameuse{footnoterule#1}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\para@vfootnoteX} +% \begin{macro}{\mppara@vfootnoteX} +% \cs{para@vfootnoteX}\marg{series}\marg{text} +% \begin{macrocode} +\newcommand*{\para@vfootnoteX}[2]{% + \insert\csname footins#1\endcsname + \bgroup + \csuse{notefontsizeX@#1} + \footsplitskips + \setbox0=\vbox{\hsize=\maxdimen + \noindent\@nameuse{footfmt#1}{#1}{#2}}% + \setbox0=\hbox{\unvxh0[#1]}% + \dp0=\z@ + \ht0=\csname footfudgefactor#1\endcsname\wd0 + \box0 + \penalty0 + \egroup} +\newcommand*{\mppara@vfootnoteX}[2]{% + \global\setbox\@nameuse{mpfootins#1}\vbox{% + \unvbox\@nameuse{mpfootins#1} + \csuse{notefontsizeX@#1} + \footsplitskips + \setbox0=\vbox{\hsize=\maxdimen + \noindent\color@begingroup\@nameuse{footfmt#1}{#1}{#2}\color@endgroup}% + \setbox0=\hbox{\unvxh0[#1]}% + \dp0=\z@ + \ht0=\csname footfudgefactor#1\endcsname\wd0 + \box0 + \penalty0}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\parafootfmtX} +% \cs{parafootfmtX}\marg{series} +% \begin{macrocode} +\newcommand*{\parafootfmtX}[2]{% + \insertparafootsep{#1}% + \ledsetnormalparstuff + {\csuse{notenumfontX@#1}\csuse{notenumfontX@#1}\@nameuse{footfootmark#1}\strut%\enspace + #2\penalty-10}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\para@footgroupX} +% \begin{macro}{\mppara@footgroupX} +% \cs{para@footgroupX}\marg{series} +% \begin{macrocode} +\newcommand*{\para@footgroupX}[1]{% + \unvbox\csname footins#1\endcsname + \makehboxofhboxes + \setbox0=\hbox{\unhbox0 \removehboxes}% + \csuse{notefontsizeX@#1} + \noindent\unhbox0\par} +\newcommand*{\mppara@footgroupX}[1]{{% + \vskip\skip\@nameuse{mpfootins#1} + \normalcolor + \@nameuse{footnoterule#1} + \unvbox\csname mpfootins#1\endcsname + \makehboxofhboxes + \setbox0=\hbox{\unhbox0 \removehboxes}% + \csuse{notefontsizeX@#1} + \noindent\unhbox0\par}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{Other series footnotes} +% + +% +% +% +% \begin{macro}{\doxtrafeeti} +% \begin{macro}{\doreinxtrafeeti} +% We have to add all the new kinds of familiar footnotes to the output +% routine. These are the class 1 feet\index{class 1 feet}. +% \begin{macrocode} +\newcommand*{\doxtrafeeti}{% + \setbox\@outputbox \vbox{% + \unvbox\@outputbox + \renewcommand{\do}[1]{\ifvoid\csuse{footins##1}\else\csuse{footstart##1}{##1}\csuse{footgroup##1}{##1}\fi} + \dolistloop{\@series}% + }} + +\newcommand{\doreinxtrafeeti}{% + \renewcommand{\do}[1]{\ifvoid\csuse{footins##1}\else\insert\csuse{footins##1}{\unvbox\csuse{footins##1}}\fi}% + \dolistloop{\@series}% + } + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\addfootinsX} +% Juste for backward compatibility: print a warning message. +% \begin{macrocode} +\newcommand*{\addfootinsX}[1]{% + \eledmac@warning{AddfootinsX is obsolete in eledmac 1.0. Use newseries instead.}% + \footnormalX{#1}% + \g@addto@macro{\doxtrafeeti}{% + \setbox\@outputbox \vbox{% + \unvbox\@outputbox + \ifvoid\@nameuse{footins#1}\else + \@nameuse{footstart#1}{#1}\@nameuse{footgroup#1}{#1}\fi}}%as + \g@addto@macro{\doreinxtrafeeti}{% + \ifvoid\@nameuse{footins#1}\else + \insert\@nameuse{footins#1}{\unvbox\@nameuse{footins#1}}\fi}% + \g@addto@macro{\l@dfambeginmini}{% + \expandafter\expandafter\expandafter\let\expandafter\expandafter + \csname footnote#1\endcsname \csname mpfootnote#1\endcsname}% + \g@addto@macro{\l@dfamendmini}{% + \ifvoid\@nameuse{mpfootins#1}\else\@nameuse{mpfootgroup#1}{#1}\fi}% +} +% \end{macrocode} +% \end{macro} +% +% \section{Generate series}% +% In this section, X means the name of the series (A, B etc.) +% \begin{macro}{\series} +% \cs{series}\cs{series} creates one more newseries. It's the public command, which just loops on the private command \cs{newseries@}. +% \begin{macrocode} +\newcommand{\newseries}[1]{% + \renewcommand{\do}[1]{\newseries@{##1}}% + \docsvlist{#1} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@series} +% The \cs{series@} macro is an etoolbox list, which contains the name of all series. +% \begin{macrocode} +\newcommand{\@series}{} +% \end{macrocode} +% \end{macro} +% The command \cs{newseries@}\cs{series} creates a new series of the footnote. +% \begin{macro}{\newseries@} +% \begin{macrocode} +\newcommand{\newseries@}[1]{ +% \end{macrocode} +% \subsubsection{Test if series is still existing} +% \begin{macrocode} + \xifinlist{#1}{\@series}{\eledmac@warning{Series #1 is still existing !}} + {% +% \end{macrocode} +% \subsubsection{Create all commands to memorize display options} +% \begin{macrocode} + \csgdef{Xhangindent@#1}{0pt}% + \csgdef{hangindentX@#1}{0pt} + \csgdef{hsizetwocol@#1}{0.45 \hsize}% + \csgdef{hsizetwocolX@#1}{0.45 \hsize}% + \csgdef{hsizethreecol@#1}{.3 \hsize}% + \csgdef{hsizethreecolX@#1}{.3 \hsize}% + \csgdef{Xnotenumfont@#1}{\notenumfont}% + \csgdef{Xendnotenumfont@#1}{\notenumfont}% + \csgdef{notenumfontX@#1}{\notenumfont}% + \csgdef{Xnotefontsize@#1}{\notefontsetup}% + \csgdef{notefontsizeX@#1}{\notefontsetup}% + \csgdef{Xendnotefontsize@#1}{\notefontsetup}% + \csgdef{boxlinenum@#1}{0pt}% + \csgdef{boxsymlinenum@#1}{0pt}% + \newtoggle{numberonlyfirstinline@#1}% + \csgdef{symlinenum@#1}{\symplinenum}% + \newtoggle{nonumberinfootnote@#1}% + \csgdef{beforenumberinfootnote@#1}{0pt}% + \csgdef{afternumberinfootnote@#1}{0.5em}% + \csgdef{beforesymlinenum@#1}{\csuse{beforenumberinfootnote@#1}}% + \csgdef{aftersymlinenum@#1}{\csuse{afternumberinfootnote@#1}}% + \csgdef{inplaceofnumber@#1}{1em}% + \global\cslet{lemmaseparator@#1}{\rbracket}% + \csgdef{beforelemmaseparator@#1}{0em}% + \csgdef{afterlemmaseparator@#1}{0.5em}% + \csgdef{inplaceoflemmaseparator@#1}{1em}% + \csgdef{afternote@#1}{1em plus.4em minus.4em}% + \csgdef{parafootsep@#1}{\parafootftmsep}% +% \end{macrocode} +% \subsubsection{Create inserts, needed to add notes in foot} +% Concerning inserts, see chapter 15 of the TeXBook by D. Knuth +% \begin{macrocode} + + \expandafter\newinsert\csname mpfootins#1\endcsname + \expandafter\newinsert\csname footins#1\endcsname + \expandafter\newinsert\csname #1footins\endcsname + \expandafter\newinsert\csname mp#1footins\endcsname +% \end{macrocode} +% \subsubsection{Create command for critical apparatus, \cs{Xfootnote}} +% Note the double \# in command: it's because command is made inside another command. +% \begin{macrocode} + + \global\expandafter\newcommand\expandafter *\csname #1footnote\endcsname[2][]{% + \begingroup% + \newcommand{\content}{##2}% + \ifnumberedpar@ + \ifledRcol% + \footnoteoptions@[R]{##1}{true}% + \xright@appenditem{\noexpand\csuse{v#1footnote}{#1}% + {{\l@d@nums}{\csexpandonce{@tag}}{\csexpandonce{content}}}}\to\inserts@listR + \footnoteoptions@[R]{##1}{false}% + \global\advance\insert@countR \@ne% + \else% + \footnoteoptions@{##1}{true}% + \xright@appenditem{\noexpand\csuse{v#1footnote}{#1}% + {{\l@d@nums}{\csexpandonce{@tag}}{\csexpandonce{content}}}}\to\inserts@list + \global\advance\insert@count \@ne% + \footnoteoptions@{##1}{false}% + \fi + \else + \csuse{v#1footnote}{#1}{{0|0|0|0|0|0|0}{}{##1}}% + \fi% + \ignorespaces% + \endgroup + } +% \end{macrocode} +%Set standard display +% \begin{macrocode} + \footnormal{#1} +% \end{macrocode} +%\subsubsection{Create tools for familiar footnotes (\cs{footnoteX})} +% First, create the \cs{footnoteX} command. +% \begin{macrocode} + + \global\expandafter\newcommand\csname footnote#1\endcsname[1]{% + \begingroup% + \newcommand{\content}{##1}% + \stepcounter{footnote#1}% + \protected@csxdef{@thefnmark#1}{\csuse{thefootnote#1}}% + \csuse{@footnotemark#1}% + \csuse{vfootnote#1}{#1}{\csexpandonce{content}}\m@mmf@prepare% + \endgroup% + } +% \end{macrocode} +% The counters. +% \begin{macrocode} + \newcounter{footnote#1} + \global\expandafter\renewcommand\csname thefootnote#1\endcsname{\arabic{footnote#1}} +% \end{macrocode} +% Don't forget to initialize series +% \begin{macrocode} + \footnormalX{#1} +% \end{macrocode} +% \subsubsection{The endnotes} +% The \cs{Xendnote} macro functions to +% write one endnote to the \file{.end} file. We change +% \cs{newlinechar} so that in the file every space becomes the +% start of a new line; this generally ensures that a long note doesn't +% exceed restrictions on the length of lines in files. +% \begin{macrocode} + + \global\expandafter\newcommand\csname #1endnote\endcsname[2]{{\newlinechar='40 + \newcommand{\content}{##1}% + \immediate\write\l@d@end{\expandafter\string\csname #1end\endcsname% + {\ifnumberedpar@\l@d@nums\fi}% + {\ifnumberedpar@\csexpandonce{@tag}\fi}{\csexpandonce{content}}{#1}}}\ignorespaces% + } +% \end{macrocode} +% \cs{Xendnote} commands called \cs{Xend} commands on to the endnote file; these are analogous to the various +% \verb"footfmt" commands above, and they take the same arguments. +% When we process this file, we'll want to pick out the notes of one +% series and ignore all the rest. To do that, we equate the \verb"end" +% command for the series we want to \cs{endprint}, and leave the +% rest equated to \cs{@gobblethree}, which just skips over its three +% arguments.\footnote{Christophe Hebeisen (\texttt{christophe.hebeisen@a3.epfl.ch}) +% emailed on 2003/11/05 to say he had found that \cs{@gobblethree} was also +% defined in the amsfonts package.} +% \begin{macrocode} + + \global\csletcs{#1end}{@gobblethree} +%\end{macrocode} +% We need to be able to modify \Eledmac's footnote macros and restore their + + \global\csletcs{#1@@footnote}{#1footnote} +% \cs{Stock series in \cs{@series} +% \begin{macrocode} + + \listxadd{\@series}{#1} +} +}% End of \newseries +% \end{macrocode} +% \end{macro} +% \subsubsection{Init standards series (A,B,C,D,E,Z)} +% \begin{macrocode} +\newseries{A,B,C,D,E,Z} +% \end{macrocode} +% \subsection{Display} +% \changes{v1.0}{2012/09/15}{New generic commands to customize footnote display.} +% \subsubsection{Options} +% \begin{macro}{\settoggle@series} +% \cs{settoggle@series}\cs{series}{toggle}{value} is a generic command to switch one toggle for one series. +% \begin{macrocode} +\newcommand{\settoggle@series}[3]{% + \renewcommand{\do}[1]{\settoggle{#2@##1}{#3}} + \ifstrempty{#1}{% + \dolistloop{\@series}% + }% + {% + \docsvlist{#1}% + }% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\setcommand@series} +% \cs{setcommand@series}\marg{series}\marg{command}\marg{value} is a generic command to change one command for one series. +% \begin{macrocode} +\newcommand{\setcommand@series}[3]{% + \renewcommand{\do}[1]{\csgdef{#2@##1}{#3}} + \ifstrempty{#1}{% + \dolistloop{\@series}% + }% + {% + \docsvlist{#1}% + }% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\newhookcommand@series} +% \cs{newhookcommand@series}\cs{command names} is a generic command to add new commands for new commands hook, like \cs{hsizetwocol}. +% \begin{macrocode} +\newcommand{\newhookcommand@series}[1]{% + \global\expandafter\newcommand\expandafter*\csname #1\endcsname[2][]{\csuse{setcommand@series}{##1}{#1}{##2}}% +} +\newhookcommand@series{Xhangindent} + +\newhookcommand@series{hangindentX} + +\newhookcommand@series{hsizetwocol} + +\newhookcommand@series{hsizethreecol} + +\newhookcommand@series{hsizetwocolX} + +\newhookcommand@series{hsizethreecolX} + +\newhookcommand@series{Xnotenumfont} + +\newhookcommand@series{Xendnotenumfont} + +\newhookcommand@series{notenumfontX} + +\newhookcommand@series{Xnotefontsize} + +\newhookcommand@series{notefontsizeX} + +\newhookcommand@series{Xendnotefontsize} + +\newhookcommand@series{boxlinenum} + +\newhookcommand@series{boxsymlinenum} + +\newhookcommand@series{parafootsep} + +\newhookcommand@series{symlinenum} + +\newhookcommand@series{beforenumberinfootnote} + +\newhookcommand@series{afternumberinfootnote} + +\newhookcommand@series{beforesymlinenum} + +\newhookcommand@series{aftersymlinenum} + +\newhookcommand@series{inplaceofnumber} + +\newhookcommand@series{lemmaseparator} + +\newhookcommand@series{beforelemmaseparator} + +\newhookcommand@series{afterlemmaseparator} + +\newhookcommand@series{inplaceoflemmaseparator} + +\newhookcommand@series{afternote} + +% \end{macrocode} +% \end{macro} +% \begin{macro}{\newhooktoggle@series} +%\cs{newhooktoggle@series}\cs{command names} is a generic command to add new commands for new toggle hook, like \cs{numberonlyfirstinline}. +% \begin{macrocode} +\newcommand{\newhooktoggle@series}[1]{% + \global\expandafter\newcommandx\expandafter*\csname #1\endcsname[2][1,2={true},usedefault]{\settoggle@series{##1}{#1}{##2}}% +} +\newhooktoggle@series{numberonlyfirstinline} +\newhooktoggle@series{nonumberinfootnote} +% \end{macrocode} +% \end{macro} +% \subsubsection{Old commands, kept for backward compatibility} +% The next commands are kept for ascendant compatibily, but should'nt be used anymore. +% \begin{macro}{\notenumfont} +% \begin{macro}{\notefontsetup} +% \begin{macro}{\ifledplinenum} +% \begin{macro}{\symplinenum} +% \begin{macrocode} +\newcommand*{\notenumfont}{\normalfont} +\newcommand*{\notefontsetup}{\footnotesize} +\newif\ifledplinenum + \ledplinenumtrue +\newcommand*{\symplinenum}{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \subsubsection{Hooks for a particular footnote} +% \begin{macro}{\nonum@} +%\cs{nonum@} toggle is used to disable line number printing in a particular footnote. +% \begin{macrocode} +\newtoggle{nonum@} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\nosep@} +%\cs{nonum@} toggle is used to disable the lemma separator in a particular footnote. +% \begin{macrocode} +\newtoggle{nosep@} +% \end{macrocode} +% \end{macro} +% \subsubsection{Alias} +% \begin{macro}{\nolemmaseparator} +%\cs{nolemmaseparator}\oarg{series} is just an alias for \cs{lemmaseparator}\oarg{series}\verb|{}|. +% \begin{macrocode} +\newcommandx*{\nolemmaseparator}[1][1]{\lemmaseparator[#1]{}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\interparanoteglue} +% \begin{macro}{\ipn@skip} +% The \cs{ipn@skip} skip and \cs{interparanoteglue} command are kept for backward compatibility, but should not be used anymore. +% \begin{macrocode} +\newskip\ipn@skip +\newcommand*{\interparanoteglue}[1]{% + {\notefontsetup\global\ipn@skip=#1 \relax}} +\interparanoteglue{1em plus.4em minus.4em} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\parafootftmsep} +% The \cs{parafootftmsep} macro is kept for backward compatibility. It is default value of \cs{parafootsep@series}. +% \begin{macrocode} +\newcommand{\parafootftmsep}{} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Line number printing} +% \begin{macro}{\printlinefootnote} +% The \cs{printlinefootnote} macro is called in each \cs{<type>footfmt} command. +% It controls whether the line number is printed or not, according to the previous options. Its first argument is the information about lines, its second is the series of the footnote. +% \begin{macrocode} +\newcommand{\printlinefootnote}[2]{% + \iftoggle{nonum@}{%Try if the line number must printed for this specific not (by default, yes) + \hspace{\csuse{inplaceofnumber@#2}}% + }% + {% + {% + \iftoggle{nonumberinfootnote@#2}%Try if the line number must printed (by default, yes) + {% + \hspace{\csuse{inplaceofnumber@#2}}% + }% + {% + {\iftoggle{numberonlyfirstinline@#2}% If for this series the line number must be printed only in the first time. + {% + \ifcsdef{prevline#2}% + {%Be sure the \prevline exists. + \ifnumequal{\csuse{prevline#2}}{\line@num}%Try it + {% + \ifcsempty{symlinenum@#2}% Try if a symbol is define + {% + \hspace{\csuse{inplaceofnumber@#2}}% + }% + {\hspace{\csuse{beforesymlinenum@#2}}\csuse{Xnotenumfont@#2}% + \ifdimequal{\csuse{boxsymlinenum@#2}}{0pt}% + {\csuse{symlinenum@#2}}% + {\hbox to \csuse{boxsymlinenum@#2}{\csuse{symlinenum@#2}\hfill}}% + \hspace{\csuse{aftersymlinenum@#2}}}% + }% + {% + \hspace{\csuse{beforenumberinfootnote@#2}}\csuse{Xnotenumfont@#2}% + \ifdimequal{\csuse{boxlinenum@#2}}{0pt}{% + \printlines#1|}% + {% + \hbox to \csuse{boxlinenum@#2}{\printlines#1|\hfill}% + }% + \hspace{\csuse{afternumberinfootnote@#2}}% + }% + }% + {% + \hspace{\csuse{beforenumberinfootnote@#2}}\csuse{Xnotenumfont@#2}% + \ifdimequal{\csuse{boxlinenum@#2}}{0pt}{% + \printlines#1|}% + {% + \hbox to \csuse{boxlinenum@#2}{\printlines#1|\hfill}% + }% + \hspace{\csuse{afternumberinfootnote@#2}}% + }% + }% + {% + \hspace{\csuse{beforenumberinfootnote@#2}}\csuse{Xnotenumfont@#2}% + \ifdimequal{\csuse{boxlinenum@#2}}{0pt}{% + \printlines#1|}% + {% + \hbox to \csuse{boxlinenum@#2}{\printlines#1|\hfill}% + }% + \hspace{\csuse{afternumberinfootnote@#2}}% + }% + \csnumgdef{prevline#2}{\line@num}% + }% + }% + }% + }% +} +% \end{macrocode} +% \end{macro} +% \section{Output routine} +% \label{output}\relax +% +% Now we begin the output routine and associated things. +% +% +% +% \begin{macro}{\pageno} +% \begin{macro}{\advancepageno} +% \cs{pageno} is a page number, starting at 1, and \cs{advancepageno} +% increments the number. +% \begin{macrocode} +\countdef\pageno=0 \pageno=1 +\newcommand*{\advancepageno}{\ifnum\pageno<\z@ \global\advance\pageno\m@ne + \else\global\advance\pageno\@ne\fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% The next portion is probably the trickiest part of moving from +% TeX to LaTeX. The original code is below, but we need +% something very different. +% +% This is a new output routine, with changes to handle printing all our +% footnotes. Those changes have not been added directly, but are in macros +% that get called here: that should make it easier to see what would need +% to be taken over to a different output routine. We continue to use the +% \cs{pagebody}, \cs{makeheadline}, \cs{makefootline}, and \cs{dosupereject} +% macros of \PlainTeX; for those macros, and the original version of +% \cs{output}, see \thetexbook, p.\,364. +% \begin{verbatim} +% \output{\edmac@output} +% \def\edmac@output{\shipout\vbox{\normal@pars +% \vbox{\makeheadline\pagebody\makefootline}% +% }% +% \advancepageno +% \ifnum\outputpenalty>-\@MM\else\dosupereject\fi} +% +% \def\pagecontents{\page@start +% \ifvoid\topins\else\unvbox\topins\fi +% \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255 +% \do@feet +% \ifr@ggedbottom \kern-\dimen@ \vfil \fi} +% \end{verbatim} +% +% \cs{do@feet} ships out all the footnotes. Standard \edmac{} has only +% five feet, but there is nothing in principal to prevent you +% from creating an arachnoid or centipedal edition; straightforward +% modifications of \edmac{} are all that's required. However, the +% myria\-pedal edition is ruled out by eTeX limitations: the number +% of insertion classes is limited to $2^16$. +% +% +% With luck we might only have to change \cs{@makecol} and +% \cs{@reinserts}. The kernel +% definition of these, and perhaps some other things, is: +% \begin{verbatim} +% \gdef \@makecol {% +% \ifvoid\footins +% \setbox\@outputbox \box\@cclv +% \else +% \setbox\@outputbox \vbox {% +% \boxmaxdepth \@maxdepth +% \@tempdima\dp\@cclv +% \unvbox \@cclv +% \vskip \skip\footins +% \color@begingroup +% \normalcolor +% \footnoterule +% \unvbox \footins +% \color@endgroup +% }% +% \fi +% \xdef\@freelist{\@freelist\@midlist}% +% \global \let \@midlist \@empty +% \@combinefloats +% \ifvbox\@kludgeins +% \@makespecialcolbox +% \else +% \setbox\@outputbox \vbox to\@colht {% +% \@texttop +% \dimen@ \dp\@outputbox +% \unvbox\@outputbox +% \vskip -\dimen@ +% \@textbottom +% }% +% \fi +% \global \maxdepth \@maxdepth +% } +% +% \gdef \@reinserts{% +% \ifvoid\footins\else\insert\footins{\unvbox\footins}\fi +% \ifvbox\@kludgeins\insert\@kludgeins{\unvbox\@kludgeins}\fi +% } +% \end{verbatim} +% +% Now we start actually changing things. +% +% \begin{macro}{\m@m@makecolfloats} +% \begin{macro}{\m@m@makecoltext} +% \begin{macro}{\m@m@makecolintro} +% These macros are defined in the \Lclass{memoir} class and form part +% of the definition of \verb?\@makecol?. +% \changes{v0.2.1}{2003/09/13}{Added \cs{m@m@makecolfloats}, \cs{m@m@makecoltext} +% and \cs{m@m@makecolintro}} +% \begin{macrocode} +\providecommand{\m@m@makecolfloats}{% + \xdef\@freelist{\@freelist\@midlist}% + \global \let \@midlist \@empty + \@combinefloats} +\providecommand{\m@m@makecoltext}{% + \ifvbox\@kludgeins + \@makespecialcolbox + \else + \setbox\@outputbox \vbox to\@colht {% + \@texttop + \dimen@ \dp\@outputbox + \unvbox\@outputbox + \vskip -\dimen@ + \@textbottom}% + \fi} +\providecommand{\m@m@makecolintro}{} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@d@makecol} +% This is a partitioned version of the `standard' \cs{@makecol}, +% with the initial code put into another macro. +% \changes{v0.2.1}{2003/09/13}{Rewrote \cs{@makecol}, calling it \cs{l@d@makecol}} +% \begin{macrocode} +\gdef\l@d@makecol{% + \l@ddofootinsert + \m@m@makecolfloats + \m@m@makecoltext + \global \maxdepth \@maxdepth} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@ddofootinsert} +% This macro essentially holds the initial portion of the kernel +% \cs{@makecol} code. +% \changes{v0.2.1}{2003/09/13}{Renamed \cs{dofootinsert} as \cs{l@ddofootinsert}} +% \changes{v0.7}{2005/02/25}{Deleted \cs{page@start} from \cs{l@ddofootinsert}} +% \begin{macrocode} +\newcommand*{\l@ddofootinsert}{% +%%% \page@start + \ifvoid\footins + \setbox\@outputbox \box\@cclv + \else + \setbox\@outputbox \vbox {% + \boxmaxdepth \@maxdepth + \@tempdima\dp\@cclv + \unvbox \@cclv + \vskip \skip\footins + \color@begingroup + \normalcolor + \footnoterule + \unvbox \footins + \color@endgroup + }% + \fi +% \end{macrocode} +% That's the end of the copy of the kernel code. We finally call a macro +% to handle all the additional \edmac{} feet. +% \begin{macrocode} + \l@ddoxtrafeet +} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\doxtrafeet} +% \cs{doxtrafeet} is the code extending \cs{@makecol} to cater for +% the extra \Eledmac{} feet. We have two classes of extra footnotes. +% We order the footnote inserts so that the regular footnotes are first, +% then class 1\index{class 1 feet} (familiar footnotes) and finally +% class 2\index{class 2 feet} (critical footnotes). +% \changes{v0.2.1}{2003/09/13}{Renamed \cs{doxtrafeet} to \cs{l@ddoxtrafeet}} +% \begin{macrocode} +\newcommand*{\l@ddoxtrafeet}{% + \doxtrafeeti + \doxtrafeetii} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\doxtrafeetii} +% \cs{doxtrafeetii} is the code extending \cs{@makecol} to cater for +% the extra critical feet (class 2 feet\index{class 2 feet}). +% NOTE: the code is likely to be +% `featurefull'. +% \changes{v0.4.1}{2004/03/06}{Changed \cs{doxtrafeetii} code for easier extensions} +% \begin{macrocode} +\newcommand*{\doxtrafeetii}{% + \setbox\@outputbox \vbox{% + \unvbox\@outputbox + \@opxtrafeetii}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@opxtrafeetii} +% The extra critical feet to be aded to the output. +% \changes{v0.4.1}{2004/03/06}{Added \cs{@opxtrafeetii}} +% \begin{macrocode} +\newcommand*{\@opxtrafeetii}{% + \renewcommand{\do}[1]{\ifvoid\csuse{##1footins}\else\csuse{##1footstart}{##1}\csuse{##1footgroup}{##1}\fi} + \dolistloop{\@series}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\l@ddodoreinxtrafeet} +% \cs{l@ddodoreinxtrafeet} is the code for catering for the extra footnotes +% within \cs{@reinserts}. The implementation may well have to change. +% We use the same classes and ordering as in \cs{l@ddoxtrafeet}. +% \changes{v0.2.1}{203/09/13}{Renamed \cs{dodoreinxtrafeet} to \cs{l@ddodoreinxtrafeet}} +% \begin{macrocode} +\newcommand*{\l@ddodoreinxtrafeet}{% + \doreinxtrafeeti + \doreinxtrafeetii} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\doreinxtrafeetii} +% \cs{doreinxtrafeetii} is the code for catering for the +% class 2\index{class 2 feet} extra critical footnotes +% within \cs{@reinserts}. The implementation may well have to change. +% \begin{macrocode} +\newcommand*{\doreinxtrafeetii}{% + \renewcommand{\do}[1]{\ifvoid\csuse{##1footins}\else\insert\csuse{##1ootins}{\unvbox\csuse{##1footins}}\fi} + \dolistloop{\@series} +} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@d@reinserts} +% And here is the modified version of \cs{@reinserts}. +% \begin{macrocode} +\gdef \l@d@reinserts{% + \ifvoid\footins\else\insert\footins{\unvbox\footins}\fi + \l@ddodoreinxtrafeet + \ifvbox\@kludgeins\insert\@kludgeins{\unvbox\@kludgeins}\fi +} + +% \end{macrocode} +% \end{macro} +% +% The \Lclass{memoir} class does not use the `standard' versions of +% \cs{@makecol} and \cs{@reinserts}, due to its sidebar insert. +% We had better add that code if \Lclass{memoir} is used. (It can +% be awkward dealing with |\if| code within |\if| code, so don't use +% |\ifl@dmemoir| here.) +% \changes{v0.2.1}{2003/09/13}{Major changes to insert code when memoir is loaded} +% \begin{macrocode} +\@ifclassloaded{memoir}{% +% \end{macrocode} +% \Lclass{memoir} is loaded so we use \Lclass{memoir}'s built in hooks. +% \begin{macrocode} + \g@addto@macro{\m@mdoextrafeet}{\l@ddoxtrafeet}% + \g@addto@macro{\m@mdodoreinextrafeet}{\l@ddodoreinxtrafeet}% + }{% +% \end{macrocode} +% \Lclass{memoir} has not been loaded, so redefine \verb?@makecol? and +% \verb?@reinserts?. +% \begin{macrocode} + \gdef\@makecol{\l@d@makecol}% + \gdef\@reinserts{\l@d@reinserts}% +} + +% \end{macrocode} +% +% +% \begin{macro}{\addfootins} +% +% \cs{addfootins} is for backward compatibility, but should'nt be used anymore. +% \begin{macrocode} +\newcommand*{\addfootins}[1]{% + \eledmac@warning{addfootins is deprecated, use newseries instead} + \footnormal{#1} + \g@addto@macro{\@opxtrafeetii}{% + \ifvoid\@nameuse{#1footins}\else + \@nameuse{#1footstart{#1}}\@nameuse{#1footgroup}{#1}\fi} + \g@addto@macro{\doreinxtrafeetii}{% + \ifvoid\@nameuse{#1footins}\else + \insert\@nameuse{#1footins}{\unvbox\@nameuse{#1footins}}\fi} + \g@addto@macro{\l@dedbeginmini}{% + \expandafter\let\csname #1footnote\endcsname = \@nameuse{mp#1footnote}} + \g@addto@macro{\l@dedendmini}{% + \ifvoid\@nameuse{mp#1footins}\else\@nameuse{mpfootgroup#1{#1}}\fi} +} +% \end{macrocode} +% \end{macro} +% +% It turns out that \verb?\@doclearpage? also needs modifying. +% \changes{v0.4.1}{2004/03/25}{Added code for changing \cs{@doclearpage}} +% \begin{macro}{\if@led@nofoot} +% \begin{macro}{\@led@extranofeet} +% We have to check if there are any leftover feet. \verb?\@led@extranofeet? +% is a hook for handling further footnotes. +% \begin{macrocode} +\newif\if@led@nofoot +\newcommand*{\@led@extranofeet}{} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +\@ifclassloaded{memoir}{% +% \end{macrocode} +% If the \Lclass{memoir} class is loaded we hook into its modified +% \verb?\@doclearpage?. +% \begin{macro}{\@mem@extranofeet} +% \begin{macrocode} +\g@addto@macro{\@mem@extranofeet}{% + \renewcommand{\do}[1]{\ifvoid\cuse{##1footins}\else\@mem@nofootfalse\fi% + \ifvoid\csuse{footins##1}\else\@mem@nofootfalse\fi% + } + \dolistloop{\@series}% + \@led@extranofeet} +}{% +% \end{macrocode} +% \end{macro} +% As \Lclass{memoir} is not loaded we have to do it all here. +% \begin{macro}{\@led@testifnofoot} +% \begin{macro}{\@doclearpage} +% \begin{macrocode} +\newcommand*{\@led@testifnofoot}{% + \@led@nofoottrue + \ifvoid\footins\else\@led@nofootfalse\fi + \renewcommand{\do}[1]{\ifvoid\csuse{##1footins}\else\@led@nofootfalse\fi% + \ifvoid\csuse{footins##1}\else\@led@nofootfalse\fi}% + \dolistloop{\@series} + \@led@extranofeet} + +\renewcommand{\@doclearpage}{% + \@led@testifnofoot + \if@led@nofoot + \setbox\@tempboxa\vsplit\@cclv to\z@ \unvbox\@tempboxa + \setbox\@tempboxa\box\@cclv + \xdef\@deferlist{\@toplist\@botlist\@deferlist}% + \global \let \@toplist \@empty + \global \let \@botlist \@empty + \global \@colroom \@colht + \ifx \@currlist\@empty + \else + \@latexerr{Float(s) lost}\@ehb + \global \let \@currlist \@empty + \fi + \@makefcolumn\@deferlist + \@whilesw\if@fcolmade \fi{\@opcol\@makefcolumn\@deferlist}% + \if@twocolumn + \if@firstcolumn + \xdef\@dbldeferlist{\@dbltoplist\@dbldeferlist}% + \global \let \@dbltoplist \@empty + \global \@colht \textheight + \begingroup + \@dblfloatplacement + \@makefcolumn\@dbldeferlist + \@whilesw\if@fcolmade \fi{\@outputpage + \@makefcolumn\@dbldeferlist}% + \endgroup + \else + \vbox{}\clearpage + \fi + \fi + \else + \setbox\@cclv\vbox{\box\@cclv\vfil}% + \l@d@makecol\@opcol + \clearpage + \fi} +} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \section{Cross referencing} +% \label{xref}\relax +% +% Peter Wilson have rewritten portions of the code in this section so that +% the LaTeX \file{.aux} file is used. This will also handle \cs{include}d +% files. +% +% Further, I have renamed some of the original \edmac{} macros so that +% they do not clash with the LaTeX label/ref commands (\edmac{} and LaTeX +% use very different mechanisms). In particular, +% the original \edmac{} \cs{label} and \cs{pageref} have been renamed +% as \cs{edlabel} and \cs{edpageref} respectively. +% +% +% You can mark a place in the text using a command of the form +% \verb"\edlabel{foo}", and later refer to it using the label +% \verb"foo" by saying \verb"\edpageref{foo}", or \verb"\lineref{foo}" or +% \verb"\sublineref{foo}". These reference commands will produce, +% respectively, the page, line and sub-line on which the +% \verb"\edlabel{foo}" command occurred. +% +% The reference macros warn you if a reference is made to an +% undefined label. If \verb"foo" has been used as a label before, +% the \verb"\edlabel{foo}" command will issue a complaint; subsequent +% \cs{edpageref} and \cs{lineref} commands will refer to the +% latest occurrence of \verb"\label{foo}". +% +% \begin{macro}{\labelref@list} +% Set up a new list, \cs{labelref@list}, to hold the page, line and +% sub-line numbers for each label. +% \begin{macrocode} +\list@create{\labelref@list} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\zz@@@} +% A convenience macro to zero two labeling counters in one go. +% \changes{v0.2.1}{2003/08/26}{Minor change to \cs{zz@@@}} +% \begin{macrocode} +%% \newcommand*{\zz@@@}{000|000|000} % set three counters to zero in one go +\newcommand*{\zz@@@}{000|000} % set two counters to zero in one go + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\edlabel} +% The \cs{edlabel} command first writes a \cs{@lab} macro to +% the \cs{linenum@out} file. It then checks to see that the +% \cs{labelref@list} actually has something in it (if not, it +% creates a dummy entry), and pops the next value for the current +% label, storing it in \cs{label@refs}. Finally it defines the +% label to be \cs{empty} so that any future check will turn up +% the fact that it has been used.\footnote{The remaining macros +% in this section were kindly revised by Wayne +% Sullivan,\index{Sullivan, Wayne} who +% substantially improved their efficiency and flexibility.} +% +% This version of the original \edmac{} \cs{label} uses \cs{@bsphack} +% and \cs{@esphack} to eliminate extra space problems and also the LaTeX +% write methods for the \file{.aux} file. +% +% Jesse Billett\footnote{(\url{jdb43@cam.ac.uk}) via the \texttt{ctt} +% thread `ledmac cross referencing', 25 August 2003.} +% found that the original code could be off by several pages. This version, +% hopefully cures that, and also allows for non-arabic page numbering. +% +% \changes{v0.2.1}{2003/08/26}{Tweaked \cs{edlabel} to get correct page numbers} +% \changes{v0.14}{2012/04/04}{Tweaked \cs{edlabel} to get correct line number if the command is first element of a paragraph.} +% \begin{macrocode} +\newcommand*{\edlabel}[1]{\@bsphack + \write\linenum@out{\string\@lab}% + \ifx\labelref@list\empty + \xdef\label@refs{\zz@@@}% + \else + \gl@p\labelref@list\to\label@refs + \ifvmode + \advancelabel@refs + \fi + \fi +% \edef\next{\write\@aux{\string\l@dmake@labels\label@refs|{#1}}}% +% \next} +% \end{macrocode} +% Use code from the kernel \cs{label} command to write the correct +% page number (it seems possible that the original \edmac's \cs{page@num} +% scheme might also have had problems in this area). +% \begin{macrocode} + \protected@write\@auxout{}% + {\string\l@dmake@labels\space\thepage|\label@refs|{#1}}% + \@esphack} + +% \end{macrocode} +% \end{macro} +% +% +%\begin{macro}{\advancelabel@refs} +%\begin{macro}{\labelrefsparseline} +%\begin{macro}{\labelrefsparsesubline} +% \begin{macrocode} +%In cases where \cs{edlabel} is the first element in a paragraph, we have a problem with line counts, because line counts change only at the first horizontal box of the paragraph. +%Hence, we need to test \cs{edlabel} if it occurs at the start of a paragraph. To do so, we use \cs{ifvmode}. If the test is true, we must advance by one unit the amount of text we write into the \verb].aux] file. +%We do so using \cs[advancelabel@refs} command. +\newcommand{\advancelabel@refs}{% + \newcounter{line}% + \setcounter{line}{\expandafter\labelrefsparseline\label@refs}% + \stepcounter{line}% + \ifsublines@% + \newcounter{subline}% + \setcounter{subline}{\expandafter\labelrefsparsesubline\label@refs}% + \stepcounter{subline}{1}% + \def\label@refs{\theline|\thesubline}% + \else% + \def\label@refs{\theline|0}% +\fi% +} +\def\labelrefsparseline#1|#2{#1} +\def\labelrefsparsesubline#1|#2{#2} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\l@dmake@labels} +% The \cs{l@dmake@labels} macro gets executed when the labels file is +% read. For each label it defines a macro, whose name is made up +% partly from the label you supplied, that contains the page, line +% and sub-line numbers. But first it checks to see whether the +% label has already been used (and complains if it has). +% +% The initial use of \cs{newcommand} is to catch if \cs{l@dmake@labels} +% has been previously defined (by a class or package). +% \begin{macrocode} +\newcommand*{\l@dmake@labels}{} +\def\l@dmake@labels#1|#2|#3|#4{% + \expandafter\ifx\csname the@label#4\endcsname \relax\else + \led@warn@DuplicateLabel{#4}% + \fi + \expandafter\gdef\csname the@label#4\endcsname{#1|#2|#3}% + \ignorespaces} + +% \end{macrocode} +% \end{macro} +% +% LaTeX reads the \texttt{aux} file at both the beginning and end of +% the document, so we have to switch off duplicate label checking +% after the first time the file is read. +% +% \begin{macrocode} +\AtBeginDocument{% + \def\l@dmake@labels#1|#2|#3|#4{}% +} + +% \end{macrocode} +% +% \begin{macro}{\@lab} +% The \cs{@lab} command, which appears in the \cs{linenum@out} file, +% appends the current values of page, line and sub-line to the +% \cs{labelref@list}. These values are defined by the earlier +% \cs{@page}, \cs{@l}, and the \cs{sub@on} and \cs{sub@off} commands +% appearing in the \cs{linenum@out} file. +% +% LaTeX uses the \texttt{page} counter for page numbers. However, +% it appears that this is not the right place to grab the page number. +% That task is now done in the \cs{edlabel} macro. This version +% of \cs{@lab} appends just the current line and sub-line numbers +% to \cs{labelref@list}. +% \changes{v0.2.1}{2003/08/26}{Removed page setting from \cs{@lab}} +% \changes{v0.3}{2004/02/14}{Replaced \cs{the}\cs{line@num} by +% \cs{linenumr@p}\cs{line@num} in +% \cs{@lab}, and similar for sub-lines} +% \begin{macrocode} +\newcommand*{\@lab}{\xright@appenditem + {\linenumrep{\line@num}|% + \ifsublines@ \sublinenumrep{\subline@num}\else 0\fi}\to\labelref@list} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\edpageref} +% \begin{macro}{\xpageref} +% If the specified label exists, \cs{edpageref} gives its page number. +% For this reference command, as for the other two, a special +% version with prefix \verb"x" is provided for use in places where the +% command is to be scanned as a number, as in \cs{linenum}. These +% special versions have two limitations: they don't print error +% messages if the reference is unknown, and they can't appear as +% the first label or reference command in the file; you must ensure +% that a \cs{edlabel} or a normal reference command appears first, or +% these x-commands will always return zeros. +% LaTeX already defines a \cs{pageref}, so changing the name +% to \cs{edpageref}. +% \begin{macrocode} +\newcommand*{\edpageref}[1]{\l@dref@undefined{#1}\l@dgetref@num{1}{#1}} +\newcommand*{\xpageref}[1]{\l@dgetref@num{1}{#1}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lineref} +% \begin{macro}{\xlineref} +% If the specified label exists, \cs{lineref} gives its line number. +% \begin{macrocode} +\newcommand*{\lineref}[1]{\l@dref@undefined{#1}\l@dgetref@num{2}{#1}} +\newcommand*{\xlineref}[1]{\l@dgetref@num{2}{#1}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\sublineref} +% \begin{macro}{\xsublineref} +% If the specified label exists, \cs{sublineref} gives its sub-line number. +% \begin{macrocode} +\newcommand*{\sublineref}[1]{\l@dref@undefined{#1}\l@dgetref@num{3}{#1}} +\newcommand*{\xsublineref}[1]{\l@dgetref@num{3}{#1}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% The next three macros are used by the referencing commands above, +% and do the job of extracting the right numbers from the label +% macro that contains the page, line, and sub-line number. +% +% \begin{macro}{\l@dref@undefined} +% The \cs{l@dref@undefined} macro is called when you refer to a label with +% the normal referencing macros. Its argument is a label, and it +% just checks that the label has been defined. +% +% \begin{macrocode} +\newcommand*{\l@dref@undefined}[1]{% + \expandafter\ifx\csname the@label#1\endcsname\relax + \led@warn@RefUndefined{#1}% + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@dgetref@num} +% Next, \cs{l@dgetref@num} fetches the number we want. It has two +% arguments: the first is simply a digit, specifying whether to +% fetch a page (1), line (2) or sub-line (3) number. (This +% switching is done by calling \cs{l@dlabel@parse}.) The second argument +% is the label-macro, which because of the \cs{@lab} macro above is +% defined to be a string of the type \verb"123|456|789". +% \begin{macrocode} +\newcommand*{\l@dgetref@num}[2]{% + \expandafter + \ifx\csname the@label#2\endcsname \relax + 000% + \else + \expandafter\expandafter\expandafter + \l@dlabel@parse\csname the@label#2\endcsname|#1% + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@dlabel@parse} +% Notice that we slipped another \verb"|" delimiter into the +% penultimate line of \cs{l@dgetref@num}, to +% keep the `switch-number' separate from the reference numbers. This +% \verb"|" is used as another parameter delimiter by \cs{l@dlabel@parse}, +% which extracts the appropriate number from its first arguments. +% The \verb"|"-delimited arguments consist of the expanded label-macro +% (three reference numbers), followed by the switch-number (1, +% 2, or 3) which defines which of the earlier three numbers to +% pick out. (It was earlier given as the first argument of +% \cs{l@dgetref@num}.) +% \begin{macrocode} +\newcommand*{\l@dlabel@parse}{} +\def\l@dlabel@parse#1|#2|#3|#4{% + \ifcase #4\relax + \or #1% + \or #2% + \or #3% + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\xxref} +% The \cs{xxref} command takes two arguments, both of which are +% labels, e.g., \verb"\xxref{mouse}{elephant}". It first does some +% checking to make sure that the labels do exist (if one doesn't, +% those numbers are set to zero). Then it calls \cs{linenum} and sets +% the beginning page, line, and sub-line numbers to those of the +% place where \verb"\label{mouse}" was placed, and the ending +% numbers to those at \verb"\label{elephant}". The point of this is +% to be able to manufacture footnote line references to passages +% which can't be specified in the normal way as the first argument +% to \cs{critext} for one reason or another. Using \cs{xxref} in the +% second argument of \cs{critext} lets you set things up at least +% semi-automatically. +% \begin{macrocode} +\newcommand*{\xxref}[2]{% + {\expandafter\ifx\csname the@label#1\endcsname + \relax \expandafter\let\csname the@label#1\endcsname\zz@@@\fi + \expandafter\ifx\csname the@label#2\endcsname \relax + \expandafter\let\csname the@label#2\endcsname\zz@@@\fi + \linenum{\csname the@label#1\endcsname|% + \csname the@label#2\endcsname}}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\edmakelabel} +% Sometimes the \cs{edlabel} command cannot be used to specify +% exactly the page and line desired; you can use the \cs{edmakelabel} macro +% make your own label. For example, if you say +% `\verb"\edmakelabel{elephant}{10|25|0}"' you will have created a +% new label, and a later call to \verb"\edpageref{elephant}" would +% print `10' and \verb"\lineref{elephant}" would print `25'. +% The sub-line number here is zero. +% \cs{edmakelabel} takes a label, followed by a page and a line number(s) +% as arguments. +% LaTeX defines a \cs{makelabel} macro which is used in lists. +% I've changed the name to \cs{edmakelabel}. +% \begin{macrocode} +\newcommand*{\edmakelabel}[2]{\expandafter\xdef\csname the@label#1\endcsname{#2}} + +% \end{macrocode} +% (If you are only going to refer to such a label using +% \cs{xxref}, then you can omit entries in the same way as with +% \cs{linenum} (see pp.\,\pageref{linenumdef} and +% \pageref{linenumbers}), since \cs{xxref} makes a call to +% \cs{linenum} in order to do its work.) +% \end{macro} +% +% +% \section{Endnotes} +% \label{endnotes}\relax +% +% \begin{macro}{\l@d@end} +% \begin{macro}{\ifl@dend@} +% \begin{macro}{\l@dend@true} +% \begin{macro}{\l@dend@false} +% Endnotes of all varieties are saved up in a file, typically named +% \meta{jobname}\file{.end}. +% \cs{l@d@end} is the output stream number for +% this file, and \verb"\ifl@dend@" is a flag that's \verb"true" when the file is open. +% \begin{macrocode} +\newwrite\l@d@end +\newif\ifl@dend@ +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@dend@open} +% \begin{macro}{\l@dend@close} +% \cs{l@dend@open} and \cs{l@dend@close} are the +% macros that are used to open and close the endnote file. Note that +% all our writing to this file is \cs{immediate}: all page and +% line numbers for the endnotes are generated by the same mechanism +% we use for the footnotes, so that there's no need to defer any +% writing to catch information from the output routine. +% \begin{macrocode} +\newcommand{\l@dend@open}[1]{\global\l@dend@true\immediate\openout\l@d@end=#1\relax} +\newcommand{\l@dend@close}{\global\l@dend@false\immediate\closeout\l@d@end} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@dend@stuff} +% \cs{l@dend@stuff} is used by \cs{beginnumbering} to +% do everything that's necessary for the endnotes at the +% start of each section: it opens the \cs{l@d@end} file, if necessary, +% and writes the section number to the endnote file. +% \begin{macrocode} +\newcommand{\l@dend@stuff}{% + \ifl@dend@\relax\else + \l@dend@open{\jobname.end}% + \fi + \immediate\write\l@d@end{\string\l@d@section{\the\section@num}}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\endprint} +% \begin{macro}{\@gobblethree} +% \begin{macro}{\l@d@section} +% The \cs{endprint} here is nearly identical in its +% functioning to \cs{normalfootfmt}. +% +% The endnote file also contains \cs{l@d@section} commands, which +% supply the section numbers from the main text; standard \Eledmac{} does +% nothing with this information, but it's there if you want to write +% custom macros to do something with it. +% \changes{v0.2.2}{2003/11/05}{Used \cs{providecommand} for \cs{@gobblethree} +% to avoid clash with the amsfonts package} +% \begin{macrocode} +\def\endprint#1#2#3#4{{\csuse{Xendnotefontsize@#4}{\csuse{Xendnotenumfont@#4}\printendlines#1|}% + \enspace{\select@lemmafont#1|#2}\enskip#3\par}} +\providecommand*{\@gobblethree}[3]{} + +\let\l@d@section=\@gobble + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\setprintendlines} +% The \cs{printendlines} macro is similar to \cs{printlines} but is +% for printing endnotes rather than footnotes. +% +% The principal difference between foot- and endnotes is that footnotes +% are printed on the page where they are specified but endnotes +% are printed at a different point in the document. We need an indication +% of the source of an endnote; \cs{setprintendlines} provides this +% by always printing the page number. The coding is slightly simpler than +% \cs{setprintlines}. +% +% First of all, we print the second page number only if +% the ending page number is different +% from the starting page number.\phantomsection\label{printendlines} +% \changes{v0.7}{2005/02/18}{Added \cs{setprintendlines} for use by +% \cs{printendlines}} +% \begin{macrocode} +\newcommand*{\setprintendlines}[6]{% + \l@d@pnumfalse \l@d@dashfalse + \ifnum#4=#1 \else + \l@d@pnumtrue + \l@d@dashtrue + \fi +% \end{macrocode} +% +% We print the ending line number if\/: (1)~we're printing the ending +% page number, or (2)~it's different from the starting line number. +% \begin{macrocode} + \ifl@d@pnum \l@d@elintrue \else \l@d@elinfalse \fi + \ifnum#2=#5 \else + \l@d@elintrue + \l@d@dashtrue + \fi +% \end{macrocode} +% +% We print the starting sub-line if it's nonzero. +% \begin{macrocode} + \l@d@ssubfalse + \ifnum#3=0 \else + \l@d@ssubtrue + \fi +% \end{macrocode} +% +% We print the ending sub-line if it's nonzero and: (1)~it's different +% from the starting sub-line number, or (2)~the ending line number is +% being printed. +% \begin{macrocode} + \l@d@eslfalse + \ifnum#6=0 \else + \ifnum#6=#3 + \ifl@d@elin \l@d@esltrue \else \l@d@eslfalse \fi + \else + \l@d@esltrue + \l@d@dashtrue + \fi + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\printendlines} +% Now we're ready to print it all. +% \changes{v0.3}{2004/02/14}{Added \cs{linenumr@p} and \cs{sublinenumr@p} +% to \cs{printendlines}} +% \begin{macrocode} +\def\printendlines#1|#2|#3|#4|#5|#6|#7|{\begingroup + \setprintendlines{#1}{#2}{#3}{#4}{#5}{#6}% +% \end{macrocode} +% The only subtlety left here is when to print a period between +% numbers. But the only instance in which this is tricky is for the +% ending sub-line number: it could be coming after the starting +% sub-line number (in which case we want only the dash) or after an +% ending line number (in which case we need to insert a period). +% \begin{macrocode} + \printnpnum{#1} \linenumrep{#2}% + \ifl@d@ssub \fullstop \sublinenumrep{#3}\fi + \ifl@d@dash \endashchar\fi + \ifl@d@pnum \printnpnum{#4}\fi + \ifl@d@elin \linenumrep{#5}\fi + \ifl@d@esl \ifl@d@elin \fullstop\fi \sublinenumrep{#6}\fi +\endgroup} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\printnpnum} +% A macro to print a page number in an endnote. +% \begin{macrocode} +\newcommand*{\printnpnum}[1]{p.#1) } + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\doendnotes} +% \cs{doendnotes} is +% the command you use to print one series of endnotes; it +% takes one argument, the series letter of the note series you want +% to print. +% \begin{macrocode} +\newcommand*{\doendnotes}[1]{\l@dend@close + \begingroup + \makeatletter + \expandafter\let\csname #1end\endcsname=\endprint + \input\jobname.end + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\noendnotes} +% You can say \cs{noendnotes} before the first +% \cs{beginnumbering} in your file if you aren't going to be using +% any of the endnote commands: this will suppress the creation of +% an \file{.end} file. If you do have some lingering endnote +% commands in your file, +% the notes will be written to your terminal and to the log file. +% \begin{macrocode} +\newcommand*{\noendnotes}{\global\let\l@dend@stuff=\relax + \global\chardef\l@d@end=16 } +% \end{macrocode} +% \end{macro} +% +% \section{Side notes} +% +% Regular \verb?\marginpar?s do not work inside numbered text --- they +% don't produce any note but do put an extra unnumbered blank line into +% the text. +% +% \begin{macro}{\l@dold@xympar} +% \begin{macro}{\@xympar} +% Changing \verb?\@xympar? a little at least ensures that \verb?\marginpar?s +% in numbered text do not disturb the flow. +% \changes{v0.5}{2004/04/0}{Eliminated \cs{marginpar} disturbance} +% \begin{macrocode} +\let\l@dold@xympar\@xympar +\renewcommand{\@xympar}{% + \ifnumberedpar@ + \led@warn@NoMarginpars + \@esphack + \else + \l@dold@xympar + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% We provide side notes as replacement for \verb?\marginpar? in numbered text. +% \changes{v0.5}{2004/04/03}{Added left and right side notes} +% \changes{v0.5.1}{2004/04/10}{Added moveable side note} +% +% \begin{macro}{\sidenote@margin} +% \begin{macro}{\sidenotemargin} +% \begin{macro}{\l@dgetsidenote@margin} +% These are the sidenote equivalents to \cs{line@margin} and \cs{linenummargin} +% for specifying which margin. The default is the right margin (opposite to +% the default for line numbers). +% \changes{v0.5.1}{2004/04/10}{Added \cs{sidenotemargin} and \cs{sidenote@margin}} +% \changes{v0.7}{2005/02/23}{Added \cs{l@dgetsidenote@margin}} +% \begin{macrocode} +\newcount\sidenote@margin +\newcommand*{\sidenotemargin}[1]{{% + \l@dgetsidenote@margin{#1}% + \ifnum\@l@dtempcntb>\m@ne + \global\sidenote@margin=\@l@dtempcntb + \fi}} +\newcommand*{\l@dgetsidenote@margin}[1]{% + \def\@tempa{#1}\def\@tempb{left}% + \ifx\@tempa\@tempb + \@l@dtempcntb \z@ + \else + \def\@tempb{right}% + \ifx\@tempa\@tempb + \@l@dtempcntb \@ne + \else + \def\@tempb{outer}% + \ifx\@tempa\@tempb + \@l@dtempcntb \tw@ + \else + \def\@tempb{inner}% + \ifx\@tempa\@tempb + \@l@dtempcntb \thr@@ + \else + \led@warn@BadSidenotemargin + \@l@dtempcntb \m@ne + \fi + \fi + \fi + \fi} +\sidenotemargin{right} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@dlp@rbox} +% \begin{macro}{\l@drp@rbox} +% We need two boxes to store sidenote texts. +% \begin{macrocode} +\newbox\l@dlp@rbox +\newbox\l@drp@rbox + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\ledlsnotewidth} +% \begin{macro}{\ledrsnotewidth} +% \begin{macro}{\ledlsnotesep} +% \begin{macro}{\ledrsnotesep} +% \begin{macro}{\ledlsnotefontsetup} +% \begin{macro}{\ledrsnotefontsetup} +% These specify the width of the left/right boxes (initialised to +% \verb?\marginparwidth?, their distance from +% the text (initialised to \verb?\linenumsep?, and the fonts used. +% \begin{macrocode} +\newdimen\ledlsnotewidth \ledlsnotewidth=\marginparwidth +\newdimen\ledrsnotewidth \ledrsnotewidth=\marginparwidth +\newdimen\ledlsnotesep \ledlsnotesep=\linenumsep +\newdimen\ledrsnotesep \ledrsnotesep=\linenumsep +\newcommand*{\ledlsnotefontsetup}{\raggedleft\footnotesize} +\newcommand*{\ledrsnotefontsetup}{\raggedright\footnotesize} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\ledleftnote} +% \begin{macro}{\ledrightnote} +% \begin{macro}{\ledsidenote} +% \verb?\ledleftnote?\marg{text} and \verb?\ledrightnote?\marg{text} are the +% user commands for left and right sidenotes. \verb?\ledsidenote?\marg{text} +% is the command for a moveable sidenote. +% \begin{macrocode} +\newcommand*{\ledleftnote}[1]{\edtext{}{\l@dlsnote{#1}}} +\newcommand*{\ledrightnote}[1]{\edtext{}{\l@drsnote{#1}}} +\newcommand*{\ledsidenote}[1]{\edtext{}{\l@dcsnote{#1}}} + + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\l@dlsnote} +% \begin{macro}{\l@drsnote} +% \begin{macro}{\l@dcsnote} +% The `footnotes' for left, right, and moveable sidenotes. The whole +% scheme is reminiscent of the critical footnotes code. +% \begin{macrocode} +\newif\ifrightnoteup + \rightnoteuptrue +\newcommand*{\l@dlsnote}[1]{% + \begingroup% + \newcommand{\content}{#1}% + \ifnumberedpar@ + \xright@appenditem{\noexpand\vl@dlsnote{\csexpandonce{content}}}% + \to\inserts@list + \global\advance\insert@count \@ne + \fi\ignorespaces\endgroup} +\newcommand*{\l@drsnote}[1]{% + \begingroup% + \newcommand{\content}{#1}% + \ifnumberedpar@ + \xright@appenditem{\noexpand\vl@drsnote{\csexpandonce{content}}}% + \to\inserts@list + \global\advance\insert@count \@ne + \fi\ignorespaces\endgroup} +\newcommand*{\l@dcsnote}[1]{\begingroup% + \newcommand{\content}{#1}% + \ifnumberedpar@ + \xright@appenditem{\noexpand\vl@dcsnote{\csexpandonce{content}}}% + \to\inserts@list + \global\advance\insert@count \@ne + \fi\ignorespaces\endgroup} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\vl@dlsnote} +% \begin{macro}{\vl@drsnote} +% \begin{macro}{\vl@dcsnote} +% Put the left/right text into boxes, but just save the moveable text. +% \begin{macrocode} +\newcommand*{\vl@dlsnote}[1]{\setl@dlp@rbox{#1}} +\newcommand*{\vl@drsnote}[1]{\setl@drp@rbox{#1}} +\newcommand*{\vl@dcsnote}[1]{\gdef\l@dcsnotetext{#1}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\setl@dlp@rbox} +% \begin{macro}{\setl@drpr@box} +% \verb?\setl@dlprbox?\marg{lednums}\marg{tag}\marg{text} puts \meta{text} +% into the \verb?\l@dlp@rbox? box. And similarly for the right side box. +% It is these boxes that finally +% get displayed in the margins. +% \begin{macrocode} +\newcommand*{\setl@dlp@rbox}[1]{% + {\parindent\z@\hsize=\ledlsnotewidth\ledlsnotefontsetup + \global\setbox\l@dlp@rbox + \ifleftnoteup + =\vbox to\z@{\vss #1}% + \else + =\vbox to 0.70\baselineskip{\strut#1\vss}% + \fi}} +%% \global\setbox\l@dlp@rbox=\vbox to\z@{#3\vss}}}% aligns on top line +\newcommand*{\setl@drp@rbox}[1]{% + {\parindent\z@\hsize=\ledrsnotewidth\ledrsnotefontsetup + \global\setbox\l@drp@rbox + \ifrightnoteup + =\vbox to\z@{\vss#1}% + \else + =\vbox to0.7\baselineskip{\strut#1\vss}% + \fi}} +\newif\ifleftnoteup + \leftnoteuptrue +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\savel@dcsnote} +% \begin{macro}{\l@dcsnotetext} +% Save the moveable note text in \cs{l@dcsnotetext}. +% \begin{macrocode} +\newcommand*{\savel@dcsnote}[3]{% + \gdef\l@dcsnotetext{#3}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\affixside@note} +% This macro puts any moveable sidenote text into the left or right sidenote +% box, depending on which margin it is meant to go in. It's a very much +% stripped down version of \cs{affixlin@num}. +% \begin{macrocode} +\newcommand*{\affixside@note}{% + \gdef\@templ@d{}% + \ifx\@templ@d\l@dcsnotetext \else + \if@twocolumn + \if@firstcolumn + \setl@dlp@rbox{\l@dcsnotetext}% + \else + \setl@drp@rbox{\l@dcsnotetext}% + \fi + \else + \@l@dtempcntb=\sidenote@margin + \ifnum\@l@dtempcntb>\@ne + \advance\@l@dtempcntb by\page@num + \fi + \ifodd\@l@dtempcntb + \setl@drp@rbox{\l@dcsnotetext}% + \else + \setl@dlp@rbox{\l@dcsnotetext}% + \fi + \fi + \fi} + +% \end{macrocode} +% \end{macro} +% +% +% +% +% +% \section{Minipages and such} +% +% We can put footnotes into minipages. The preparatory code has +% been set up earlier, all that remains is to ensure that it is available +% inside a minipage box. This requires some alteration to the kernel code, +% specifically the \verb?\@iiiminipage? and \verb?\endminipage? macros. +% We'll arrange this so that additional series can be easily added. +% +% \begin{macro}{\l@dfeetbeginmini} +% \begin{macro}{\l@dfeetendmini} +% These will be the hooks in \verb?\@iiiminpage? and \verb?\endminipage? +% They can be extended to handle other things if necessary. +% \changes{v0.4}{2004/02/29}{Added \cs{l@dfeetbeginmini}, \cs{l@dfeetendmini} +% and all their supporting code} +% \begin{macrocode} +\newcommand*{\l@dfeetbeginmini}{\l@dedbeginmini\l@dfambeginmini} +\newcommand*{\l@dfeetendmini}{\l@dedendmini\l@dfamendmini} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@dedbeginmini} +% \begin{macro}{\l@dedendmini} +% These handle the initiation and closure of critical footnotes in a +% minipage environment. +% \begin{macrocode} +\newcommand*{\l@dedbeginmini}{% + \renewcommand{\do}[1]{\csletcs{v##1footnote}{mpv##1footnote}}% + \dolistloop{\@series}% + } +\newcommand*{\l@dedendmini}{% + \ifl@dpairing + \ifledRcol + \flush@notesR + \else + \flush@notes + \fi + \fi + \renewcommand{\do}[1]{\ifvoid\csuse{mp##1footins}\else\csuse{mp##1footgroup}{##1}\fi}% + \dolistloop{\@series}% + } + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@dfambeginmini} +% \begin{macro}{\l@dfamendmini} +% These handle the initiation and closure of familiar footnotes in a +% minipage environment. +% \begin{macrocode} +\newcommand*{\l@dfambeginmini}{% + \renewcommand{\do}[1]{\csletcs{vfootnote##1}{mpvfootnote##1}}% + \dolistloop{\@series}} +\newcommand*{\l@dfamendmini}{% + \renewcommand{\do}[1]{\ifvoid\csuse{mpfootins##1}\else\csuse{mpfootgroup##1}{##1}\fi}% + \dolistloop{\@series}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@iiiminipage} +% This is our extended form of the kernel \verb?\@iiiminipage? defined in +% \file{ltboxes.dtx}. +% \changes{v0.4}{2004/02/29}{Modified kernel \cs{@iiiminipage} and +% \cs{endminipage} to cater for critical footnotes} +% \begin{macrocode} +\def\@iiiminipage#1#2[#3]#4{% + \leavevmode + \@pboxswfalse + \setlength\@tempdima{#4}% + \def\@mpargs{{#1}{#2}[#3]{#4}}% + \setbox\@tempboxa\vbox\bgroup + \color@begingroup + \hsize\@tempdima + \textwidth\hsize \columnwidth\hsize + \@parboxrestore + \def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c@mpfootnote\z@ + \let\@footnotetext\@mpfootnotetext +% \end{macrocode} +% The next line is our addition to the original. +% \begin{macrocode} + \l@dfeetbeginmini% added + \let\@listdepth\@mplistdepth \@mplistdepth\z@ + \@minipagerestore + \@setminipage} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\endminipage} +% This is our extended form of the kernel \verb?\endminipage? defined in +% \file{ltboxes.dtx}. +% \begin{macrocode} +\def\endminipage{% + \par + \unskip + \ifvoid\@mpfootins\else + \l@dunboxmpfoot + \fi +% \end{macrocode} +% The next line is our addition to the original. +% \begin{macrocode} + \l@dfeetendmini% added + \@minipagefalse + \color@endgroup + \egroup + \expandafter\@iiiparbox\@mpargs{\unvbox\@tempboxa}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@dunboxmpfoot} +% \changes{v0.7}{2005/02/18}{Added \cs{l@dunboxmpfoot} containing +% some common code} +% \begin{macrocode} +\newcommand*{\l@dunboxmpfoot}{% + \vskip\skip\@mpfootins + \normalcolor + \footnoterule + \unvbox\@mpfootins} + +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{ledgroup} +% This environment puts footnotes at the end, even if that happens to +% be in the middle of a page, or crossing a page boundary. It is a sort +% of unboxed, fixed width minipage. +% \changes{v0.4}{2004/02/29}{Added ledgroup environment} +% \begin{macrocode} +\newenvironment{ledgroup}{% + \def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c@mpfootnote\z@ + \let\@footnotetext\@mpfootnotetext + \l@dfeetbeginmini% +}{% + \par + \unskip + \ifvoid\@mpfootins\else + \l@dunboxmpfoot + \fi + \l@dfeetendmini% +} + +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{ledgroupsized} +% \verb?\begin{ledgroupsized}?\oarg{pos}\marg{width} \\ +% This environment puts footnotes at the end, even if that happens to +% be in the middle of a page, or crossing a page boundary. It is a sort +% of unboxed, variable \meta{width} minipage. The optional \meta{pos} +% controls the sideways position of numbered text. +% \changes{v0.4}{2004/02/29}{Added ledgroupsized environment} +% \changes{v0.5.1}{2004/04/10}{Only change \cs{hsize} in ledgroupsized +% environment otherwise page number can be in wrong place} +% \begin{macrocode} +\newenvironment{ledgroupsized}[2][l]{% +% \end{macrocode} +% Set the various text measures. +% \begin{macrocode} + \hsize #2\relax +%% \textwidth #2\relax +%% \columnwidth #2\relax +% \end{macrocode} +% Initialize fills for centering. +% \begin{macrocode} + \let\ledllfill\hfil + \let\ledrlfill\hfil + \def\@tempa{#1}\def\@tempb{l}% +% \end{macrocode} +% Left adjusted numbered lines +% \begin{macrocode} + \ifx\@tempa\@tempb + \let\ledllfill\relax + \else + \def\@tempb{r}% + \ifx\@tempa\@tempb +% \end{macrocode} +% Right adjusted numbered lines +% \begin{macrocode} + \let\ledrlfill\relax + \fi + \fi +% \end{macrocode} +% Set up the footnoting. +% \begin{macrocode} + \def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c@mpfootnote\z@ + \let\@footnotetext\@mpfootnotetext + \l@dfeetbeginmini% +}{% + \par + \unskip + \ifvoid\@mpfootins\else + \l@dunboxmpfoot + \fi + \l@dfeetendmini% +} + +% \end{macrocode} +% \end{environment} +% +% \section{Indexing} +% +% Here's some code for indexing using page \& line numbers. +% +% \begin{macro}{\pagelinesep} +% \begin{macro}{\edindexlab} +% \begin{macro}{\c@labidx} +% In order to get a correct line number we have to use the label/ref +% mechanism. These macros are for that. +% \begin{macrocode} +\newcommand{\pagelinesep}{-} +\newcommand{\edindexlab}{$&} +\newcounter{labidx} +\setcounter{labidx}{0} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\doedindexlabel} +% This macro sets an |\edlabel|. +% \begin{macrocode} +\newcommand{\doedindexlabel}{\stepcounter{labidx}% + \edlabel{\edindexlab\thelabidx}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thepageline} +% This macro makes up the page/line number combo from the label/ref. +% \begin{macrocode} +\newcommand{\thepageline}{% + \thepage\pagelinesep\lineref{\edindexlab\thelabidx}} + +% \end{macrocode} +% \end{macro} +% +% The \Lpack{memoir} class provides more flexible indexing than the +% standard classes. We need different code if the \Lpack{memoir} +% class is being used. +% +% \begin{macrocode} +\@ifclassloaded{memoir}{% +% \end{macrocode} +% \Lpack{memoir} is being used. +% \changes{v0.4.1}{2003/03/29}{Let eledmac take advantage of memoir's indexing} +% +% \begin{macro}{\makeindex} +% \begin{macro}{\edindex} +% Need to add the definition of |\edindex| to |\makeindex|, and initialise +% |\edindex| to do nothing. In this case |\edindex| has an optional +% argument. We use the hook provided in \Lpack{memoir} v1.61. +% \begin{macrocode} + \g@addto@macro{\makememindexhook}{% + \def\edindex{\@bsphack% + \@ifnextchar [{\l@d@index}{\l@d@index[\jobname]}}} + \newcommand{\edindex}[2][\jobname]{\@bsphack\@esphack} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@d@index} +% |\l@d@index[file]| is the first stage of |\edindex|, handling the +% |idx| file. This a virtually a verbatim copy of \Lpack{memoir}'s |\@index|, +% the change being calling |\l@dwrindexm@m| instead of |\@wrindexm@m|. +% \begin{macrocode} + \def\l@d@index[#1]{% + \@ifundefined{#1@idxfile}% + {\ifreportnoidxfile + \led@warn@NoIndexFile{#1}% + \fi + \begingroup + \@sanitize + \@nowrindex}% + {\def\@idxfile{#1}% + \doedindexlabel + \begingroup + \@sanitize + \l@d@wrindexm@m}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@d@wrindexm@m} +% \begin{macro}{\l@d@@wrindexhyp} +% |\l@d@wrindexm@m{item}| writes the |idx| file name and the indexed +% item to the |aux| file. These are almost verbatim copies of \Lpack{memoir}'s +% |\@wrindexm@m| and |\@@wrindexhyp|. +% \begin{macrocode} + \newcommand{\l@d@wrindexm@m}[1]{\l@d@@wrindexhyp#1||\\} + \def\l@d@@wrindexhyp#1|#2|#3\\{% + \ifshowindexmark\@showidx{#1}\fi + \ifx\\#2\\% + \protected@write\@auxout{}% + {\string\@@wrindexm@m{\@idxfile}{#1|hyperpage}{\thepageline}}% + \else + \def\Hy@temp@A{#2}% + \ifx\Hy@temp@A\HyInd@ParenLeft + \protected@write\@auxout{}% + {\string\@@wrindexm@m{\@idxfile}{#1|#2hyperpage}{\thepageline}}% + \else + \protected@write\@auxout{}% + {\string\@@wrindexm@m{\@idxfile}{#1|#2}{\thepageline}}% + \fi + \fi + \endgroup + \@esphack} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% That finishes the \Lpack{memoir}-specific code. +% \begin{macrocode} +}{% +% \end{macrocode} +% \Lpack{memoir} is not being used, which makes life somewhat simpler. +% +% \begin{macro}{\makeindex} +% \begin{macro}{\edindex} +% Need to add the definition of |\edindex| to |\makeindex|, and initialise +% |\edindex| to do nothing. +% \begin{macrocode} + \g@addto@macro{\makeindex}{% + \def\edindex{\@bsphack + \doedindexlabel + \begingroup + \@sanitize + \@wredindex}} + \newcommand{\edindex}[1]{\@bsphack\@esphack} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@wredindex} +% Write the index information to the \file{idx} file. +% \begin{macrocode} + \newcommand{\@wredindex}[1]{% + \protected@write\@indexfile{}% + {\string\indexentry{#1}{\thepageline}}% + \endgroup + \@esphack} +% \end{macrocode} +% \end{macro} +% +% That finishes the non-\Lpack{memoir} index code. +% \begin{macrocode} +} + +% \end{macrocode} +% +% \begin{macro}{\l@d@@wrindexhyp} +% If the \Lpack{hyperref} package is not loaded, it doesn't make sense +% to clutter up the index with hyperreffing things. +% \begin{macrocode} +\AtBeginDocument{\@ifpackageloaded{hyperref}{}{% + \def\l@d@@wrindexhyp#1||\\{% + \ifshowindexmark\@showidx{#1}\fi + \protected@write\@auxout{}% + {\string\@@wrindexm@m{\@idxfile}{#1}{\thepageline}}% + \endgroup + \@esphack}}} + +% \end{macrocode} +% \end{macro} +% +% +% \section{Macro as environment} +% +% +% The following is borrowed, and renamed, from the \Lpack{amsmath} +% package. See also the CTT thread `eeq and amstex', 1995/08/31, started +% by Keith Reckdahl and ended definitively by David M. Jones. +% +% +% Several of the [math] macros scan their body twice. This means we must +% collect all text in the body of an environment form before calling +% the macro. +% +% \begin{macro}{\@emptytoks} +% This is actually defined in the \Lpack{amsgen} package. +% \begin{macrocode} +\newtoks\@emptytoks + +% \end{macrocode} +% \end{macro} +% +% The rest is from \Lpack{amsmath}. +% +% \begin{macro}{\l@denvbody} +% A token register to contain the body. +% \begin{macrocode} +\newtoks\l@denvbody + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addtol@denvbody} +% |\addtol@denvdody{arg}| adds |arg| to the token register |\l@denvbody|. +% \begin{macrocode} +\newcommand{\addtol@denvbody}[1]{% + \global\l@denvbody\expandafter{\the\l@denvbody#1}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@dcollect@body} +% The macro |\l@dcollect@body| starts the scan for the |\end{...}| command +% of the current environment. It takes a macro name as argument. This macro +% is supposed to take the whole body of the environment as its argument. +% For example, given |cenv#1{...}| as a macro that processes |#1|, then +% the environment form, |\begin{env}| would call |\l@dcollect@body\cenv|. +% +% \begin{macrocode} +\newcommand{\l@dcollect@body}[1]{% + \l@denvbody{\expandafter#1\expandafter{\the\l@denvbody}}% + \edef\processl@denvbody{\the\l@denvbody\noexpand\end{\@currenvir}}% + \l@denvbody\@emptytoks \def\l@dbegin@stack{b}% + \begingroup + \expandafter\let\csname\@currenvir\endcsname\l@dcollect@@body + \edef\processl@denvbody{\expandafter\noexpand\csname\@currenvir\endcsname}% + \processl@denvbody} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@dpush@begins} +% When adding a piece of the current environment's contents to |\l@denvbody|, +% we scan it to check for additional |\begin| tokens, and add a `b' to the +% stack for any that we find. +% \begin{macrocode} +\def\l@dpush@begins#1\begin#2{% + \ifx\end#2\else b\expandafter\l@dpush@begins\fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@dcollect@@body} +% |\l@dcollect@@body| takes two arguments: the first will consist of all text +% up to the next |\end| command, and the second will be the |\end| command's +% argument. If therte are any extra |\begin| commands in the body text, +% a marker is pushed onto a stack by the |l@dpush@begins| function. +% Empty state for this stack means we have reached the |\end| that matches +% our original |\begin|. Otherwise we need to include the |\end| and its +% argument in the material we are adding to the environment body accumulator. +% \begin{macrocode} +\def\l@dcollect@@body#1\end#2{% + \edef\l@dbegin@stack{\l@dpush@begins#1\begin\end + \expandafter\@gobble\l@dbegin@stack}% + \ifx\@empty\l@dbegin@stack + \endgroup + \@checkend{#2}% + \addtol@denvbody{#1}% + \else + \addtol@denvbody{#1\end{#2}}% + \fi + \processl@denvbody % A little tricky! Note the grouping +} + +% \end{macrocode} +% \end{macro} +% +% There was a question on CTT about how to use |\collect@body| for a macro +% taking an argument. The following is part of that thread. +% \begin{verbatim} +% From: Heiko Oberdiek <oberdiek@uni-freiburg.de> +% Newsgroups: comp.text.tex +% Subject: Re: Using \collect@body with commands that take >1 argument +% Date: Fri, 08 Aug 2003 09:03:20 +0200 +% +% eed132@psu.edu (Evan) wrote: +% > I'm trying to make a new Latex environment that acts like the> +% \colorbox command that is part of the color package. I looked through +% > the FAQ and ran across this bit about using the \collect@body command +% > that is part of AMSLaTeX: +% > http://www.tex.ac.uk/cgi-bin/texfaq2html?label=cmdasenv +% > +% > It almost works. If I do something like the following: +% > \newcommand{\redbox}[1]{\colorbox{red}{#1}} +% > +% > \makeatletter +% > \newenvironment{redbox}{\collect@body \redbox}{} +% +% You will get an error message: Command \redbox already defined. +% Thus you must rename either the command \redbox or the environment +% name. +% +% > \begin{coloredbox}{blue} +% > Yadda yadda yadda... this is on a blue background... +% > \end{coloredbox} +% > and can't figure out how to make the \collect@body take this. +% +% > \collect@body \colorbox{red} +% > \collect@body {\colorbox{red}} +% +% The argument of \collect@body has to be one token exactly. +% +% \documentclass{article} +% \usepackage{color} +% \usepackage{amsmath} +% +% \newcommand{\redbox}[1]{\colorbox{red}{#1}} +% \makeatletter +% \newenvironment{coloredbox}[1]{% +% \def\next@{\colorbox{#1}}% +% \collect@body\next@ +% }{} +% +% % ignore spaces at begin and end of environment +% \newenvironment{coloredboxII}[1]{% +% \def\next@{\mycoloredbox{#1}}% +% \collect@body\next@ +% }{} +% \newcommand{\mycoloredbox}[2]{% +% \colorbox{#1}{\ignorespaces#2\unskip}% +% } +% +% % support of optional color model argument +% \newcommand\coloredboxIII\endcsname{} +% \def\coloredboxIII#1#{% +% \@coloredboxIII{#1}% +% } +% \def\@coloredboxIII#1#2{% +% \def\next@{\mycoloredboxIII{#1}{#2}}% +% \collect@body\next@ +% } +% \newcommand{\mycoloredboxIII}[3]{% +% \colorbox#1{#2}{\ignorespaces#3\unskip}% +% } +% +% \makeatother +% +% \begin{document} +% Black text before +% \begin{coloredbox}{blue} +% Hello World +% \end{coloredbox} +% Black text after +% +% Black text before +% \begin{coloredboxII}{blue} +% Hello World +% \end{coloredboxII} +% Black text after +% +% Black text before +% \begin{coloredboxIII}[rgb]{0,0,1} +% Hello World +% \end{coloredboxIII} +% Black text after +% +% \end{document} +% +% Yours sincerely +% Heiko <oberdiek@uni-freiburg.de> +% \end{verbatim} +% +% +% \section{Verse} +% +% This is principally Wayne Sullivan's\index{Sullivan, Wayne} +% code and commentary from \edstanza~\cite{EDSTANZA}. +% +% +% The macro \cmd{\hangingsymbol} is used to insert a symbol on each hanging of verses. +%For example, in french typographie the symbol is `['. We obtain it by the next code: +%\begin{verbatim} +%\renewcommand{\hangingsymbol}{[\,} +%\end{verbatim} +% The \cs{ifinstanza} boolean is used to be sure that we are in a stanza part. +% \begin{macro}{\hangingsymbol} +% \begin{macro}{\ifinstanza} +% \begin{macrocode} +\newcommand*{\hangingsymbol}{} +\newif\ifinstanza +\instanzafalse +% \end{macrocode} +% \end{macro} +% \end{macro} +%\changes{v0.15}{2012/06/11}{New management of hangingsymbol insertion, preventing undesirable insertions.} +%\changes{v0.17}{2012/08/03}{New new management of hangingsymbol insertion, preventing undesirable insertions.} +% \begin{macro}{\inserthangingymbol} +% \begin{macro}{\ifinserthangingsymbol} +% The boolean \cs{ifinserthangingsymbol} is set to TRUE when \cs{@lock} is greater than 1, i.e. when we are not in the first line of a verse. The switch of \cs{ifinserthangingsymbol} is made in \cs{do@line} before the printing of line but after the line number calculation. +% \begin{macrocode} +\newif\ifinserthangingsymbol +\newcommand{\inserthangingsymbol}{% +\ifinserthangingsymbol% + \ifinstanza% + \hfill\hangingsymbol% + \fi% +\fi% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\ampersand} +% Within a stanza the \verb?\&? macro is going to be usurped. We need an +% alias in case an \& needs to be typeset in a stanza. Define it rather +% than letting it in case some other package has already defined it. +% \begin{macrocode} +\newcommand*{\ampersand}{\char`\&} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\stanza@count} +% \begin{macro}{\stanzaindentbase} +% Before we can define the main macros we need to save and reset +% some category codes. To save the current values we use +% \verb+\next+ and \verb+\body+ from the \verb+\loop+ macro. +% \begin{macrocode} + \chardef\body=\catcode`\@ + \catcode`\@=11 + \chardef\next=\catcode`\& + \catcode`\&=\active + +% \end{macrocode} +% +% A count register is allocated for counting lines in a stanza; also allocated +% is a dimension register which is used to specify the base value for +% line indentation; all stanza indentations are multiples of this +% value. The default value of \verb+\stanzaindentbase+ is 20pt. +% \begin{macrocode} + \newcount\stanza@count + \newlength{\stanzaindentbase} + \setlength{\stanzaindentbase}{20pt} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\strip@szacnt} +% \begin{macro}{\setstanzavalues} +% The indentations of stanza lines are non-negative integer multiples of the +% unit called +% \verb+\stanzaindentbase+. To make it easier for the user to specify these +% numbers, some list macros are defined. These take numerical values +% in a list separated by commas and assign the values to special control +% sequences using \verb+\mathchardef+. Though this does limit the range +% from 0 to 32767, it should suffice for most applications, +% including \emph{penalties}, which will be discussed below. +% \begin{macrocode} +\def\strip@szacnt#1,#2|{\def\@tempb{#1}\def\@tempa{#2|}} +\newcommand*{\setstanzavalues}[2]{\def\@tempa{#2,,|}% + \stanza@count\z@ + \def\next{\expandafter\strip@szacnt\@tempa + \ifx\@tempb\empty\let\next\relax\else + \expandafter\mathchardef\csname #1@\number\stanza@count + @\endcsname\@tempb\relax + \advance\stanza@count\@ne\fi\next}% + \next} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\setstanzaindents} +% \begin{macro}{\setstanzapenalties} +% \begin{macro}{\managestanza@modulo} +% In the original \verb?\setstanzavalues{sza}{...}? had to be called to +% set the indents, and similarly \verb?\setstanzavalues{szp}{...}? +% to set the penalties. These two macros are a convenience to give +% the user one less thing to worry about (misspelling the first argument). +% Since version 0.13, the \verb+stanzaindentsrepetition+ counter can be used when the indentation is repeated every n verses. The \cs{managestanza@modulo} is a command which modifies the counter stanza@modulo. The command adds 1 to stanza@modulo, but if stanza@modulo is equal to the stanzaindentsrepetition counter, the command restarts it. +%\changes{v0.13}{2011/11/08}{New stanzaindentsrepetition counter to repeat stanza indents every \emph{n} verses.} +% \begin{macrocode} +\newcommand*{\setstanzaindents}[1]{\setstanzavalues{sza}{#1}} +\newcommand*{\setstanzapenalties}[1]{\setstanzavalues{szp}{#1}} + +\newcounter{stanzaindentsrepetition} +\newcount\stanza@modulo + +\newcommand*{\managestanza@modulo}[0]{ + \advance\stanza@modulo\@ne + \ifnum\stanza@modulo>\value{stanzaindentsrepetition} + \stanza@modulo\@ne + \fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\stanza@line} +% \begin{macro}{\stanza@hang} +% \begin{macro}{\sza@penalty} +% Now we arrive at the main works. \verb+\stanza@line+ sets the +% indentation for the line and starts a numbered paragraph---each +% line is treated as a paragraph. \verb+\stanza@hang+ sets the +% hanging indentation to be used if the stanza line requires +% more than one print line. If it is known that each stanza line +% will fit on one print line, it is advisable to set the +% hanging indentation to zero. \verb+\sza@penalty+ places the +% specified penalty following each stanza line. By default, this +% facility is turned off so that no penalty is included. However, +% the user may initiate these penalties to indicate good and bad +% places in the stanza for page breaking. +% \begin{macrocode} +\def\stanza@line{ + \ifnum\value{stanzaindentsrepetition}=0 + \parindent=\csname sza@\number\stanza@count + @\endcsname\stanzaindentbase + \else + \managestanza@modulo + \parindent=\csname sza@\number\stanza@modulo + @\endcsname\stanzaindentbase + \fi + \pstart\stanza@hang\ignorespaces} +\xdef\stanza@hang{\noexpand\leavevmode\noexpand\startlock + \hangindent\expandafter + \noexpand\csname sza@0@\endcsname\stanzaindentbase + \hangafter\@ne} +\def\sza@penalty{\count@\csname szp@\number\stanza@count @\endcsname + \ifnum\count@>\@M\advance\count@-\@M\penalty-\else + \penalty\fi\count@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\startstanzahook} +% \begin{macro}{\endstanzaextra} +% \begin{macro}{\stanza} +% Now we have the components of the \verb+\stanza+ macro, +% which appears at the start of a group of lines. This macro +% initializes the count and checks to see if hanging indentation +% and penalties are to be included. Hanging indentation suspends +% the line count, so that the enumeration is by verse line +% rather than by print line. If the print line count is desired, +% invoke \verb+\let\startlock=\relax+ and do the same for +% \verb+\endlock+. Here and above we have used \verb+\xdef+ to +% make the stored macros take up a bit less space, but it also +% makes them more obscure to the reader. Lines of the stanza are +% delimited by ampersands \&. The last line of the stanza must +% end with \verb+\&+. For convenience the macro +% \verb+\endstanzaextra+ is incuded. The user may use this to add +% vertical space or penalties between stanzas. +% +% +% As a further convenience, the macro \verb?\startstanzahook? is +% called at the beginning of a stanza. This can be defined to +% do something useful. +% +% \begin{macrocode} +\let\startstanzahook\relax +\let\endstanzaextra\relax +\xdef\stanza{\noexpand\instanzatrue\expandafter + \begingroup\startstanzahook% + \catcode`\&\active\global\stanza@count\@ne\stanza@modulo\@ne + \noexpand\ifnum\expandafter\noexpand + \csname sza@0@\endcsname=\z@\let\noexpand\stanza@hang\relax + \let\noexpand\endlock\relax\noexpand\else\interlinepenalty + \@M\rightskip\z@ plus 1fil\relax\noexpand\fi\noexpand\ifnum + \expandafter\noexpand\csname szp@0@\endcsname=\z@ + \let\noexpand\sza@penalty\relax\noexpand\fi \def\noexpand&{% + \noexpand\endlock\noexpand\pend\noexpand\sza@penalty\global + \advance\stanza@count\@ne\noexpand\stanza@line}\def\noexpand + \&{\noexpand\endlock\noexpand\pend\endgroup\noexpand\instanzafalse\expandafter\endstanzaextra}% + \noexpand\stanza@line} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\flagstanza} +% Use \verb?\flagstanza[len]{text}? at the start of a line to put \texttt{text} +% a distance \texttt{len} before the start of the line. The default for +% \texttt{len} is \verb?\stanzaindentbase?. +% \begin{macrocode} +\newcommand*{\flagstanza}[2][\stanzaindentbase]{% + \hskip -#1\llap{#2}\hskip #1\ignorespaces} + +% \end{macrocode} +% \end{macro} +% +% The ampersand \& is used to mark the end of each stanza line, except the +% last, which is marked with \verb+\&+. This means that \verb+\halign+ may +% not be used directly within a stanza line. This does not affect macros +% involving alignments defined outside \verb+\stanza \&+. Since these +% macros usurp the control sequence \verb+\&+, the replacement +% \verb+\ampersand+ is defined to be used if this symbol is needed in a +% stanza. Also we reset the modified category codes and initialize the +% penalty default. +% \begin{macrocode} + \catcode`\&=\next + \catcode`\@=\body +%% \let\ampersand=\& + \setstanzavalues{szp}{0} + +% \end{macrocode} +% +% +% +% +% \section{Arrays and tables} +% +% +% This is based on the work by Herbert Breger\index{Breger, Herbert} +% in developing \file{tabmac.tex}. +% \begin{verbatim} +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % This is file tabmac.tex 1.0. +% % You find here macros for tabular structures compatible with +% % Edmac (authored by Lavagnino/Wujastyk). The use of the macros is +% % explained in German language in file tabanlei.dvi. The macros were +% % developed for Edmac 2.3, but this file has been adjusted to Edmac 3.16. +% % +% % ATTENTION: This file uses some Edmac control sequences (like +% % \text, \Afootnote etc.) and redefines \morenoexpands. If you yourself +% % redefined some Edmac control sequences, be careful: some adjustements +% % might be necessary. +% % October 1996 +% % +% % My kind thanks to Nora G^?deke for valuable support. Any hints and +% % comments are welcome, please contact Herbert Breger, +% % Leibniz-Archiv, Waterloostr. 8, D -- 30169 Hannover, Germany +% % Tel.: 511 - 1267 327 +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \end{verbatim} +% +% The original \file{tabmac.tex} file was void of comments or any explanatory +% text other than the above notice. The algorithm is Breger's. I have made +% some cosmetic changes to the original code and reimplemented some things +% so they are more LaTeX-like. All the commentary is mine, as are any mistakes +% or errors. +% +% \begin{macro}{\l@dtabnoexpands} +% An extended and modified version of the original additional no expansions.. +% \begin{macrocode} +\newcommand*{\l@dtabnoexpands}{% + \let\rtab=0% + \let\ctab=0% + \let\ltab=0% + \let\rtabtext=0% + \let\ltabtext=0% + \let\ctabtext=0% + \let\edbeforetab=0% + \let\edaftertab=0% + \let\edatab=0% + \let\edatabell=0% + \let\edatleft=0% + \let\edatright=0% + \let\edvertline=0% + \let\edvertdots=0% + \let\edrowfill=0% +} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@dampcount} +% \begin{macro}{\l@dcolcount} +% |\l@dampcount| is a counter for the \& column dividers and +% |\l@dcolcount| is a counter for the columns. These were +% |\Undcount| and |\stellencount| respectively. +% \begin{macrocode} +\newcount\l@dampcount + \l@dampcount=1\relax +\newcount\l@dcolcount + \l@dcolcount=0\relax + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\hilfsbox} +% \begin{macro}{\hilfsskip} +% \begin{macro}{\Hilfsbox} +% \begin{macro}{\hilfscount} +% Some (temporary) helper items. +% \begin{macrocode} +\newbox\hilfsbox +\newskip\hilfsskip +\newbox\Hilfsbox +\newcount\hilfscount + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% 30 columns should be adequate (compared to the original 60). +% These are the column widths. (Originally these were German spelled numbers +% e.g., |\eins|, |\zwei|, etc). +% \begin{macrocode} +\newdimen\dcoli +\newdimen\dcolii +\newdimen\dcoliii +\newdimen\dcoliv +\newdimen\dcolv +\newdimen\dcolvi +\newdimen\dcolvii +\newdimen\dcolviii +\newdimen\dcolix +\newdimen\dcolx +\newdimen\dcolxi +\newdimen\dcolxii +\newdimen\dcolxiii +\newdimen\dcolxiv +\newdimen\dcolxv +\newdimen\dcolxvi +\newdimen\dcolxvii +\newdimen\dcolxviii +\newdimen\dcolxix +\newdimen\dcolxx +\newdimen\dcolxxi +\newdimen\dcolxxii +\newdimen\dcolxxiii +\newdimen\dcolxxiv +\newdimen\dcolxxv +\newdimen\dcolxxvi +\newdimen\dcolxxvii +\newdimen\dcolxxviii +\newdimen\dcolxxix +\newdimen\dcolxxx +\newdimen\dcolerr % added for error handling + +% \end{macrocode} +% +% \begin{macro}{\l@dcolwidth} +% This is a cunning way of storing the columnwidths indexed by +% the column number |\l@dcolcount|, like an array. (was |\Dimenzuordnung|) +% \begin{macrocode} +\newcommand{\l@dcolwidth}{\ifcase \the\l@dcolcount \dcoli %??? + \or \dcoli \or \dcolii \or \dcoliii + \or \dcoliv \or \dcolv \or \dcolvi + \or \dcolvii \or \dcolviii \or \dcolix \or \dcolx + \or \dcolxi \or \dcolxii \or \dcolxiii + \or \dcolxiv \or \dcolxv \or \dcolxvi + \or \dcolxvii \or \dcolxviii \or \dcolxix \or \dcolxx + \or \dcolxxi \or \dcolxxii \or \dcolxxiii + \or \dcolxxiv \or \dcolxxv \or \dcolxxvi + \or \dcolxxvii \or \dcolxxviii \or \dcolxxix \or \dcolxxx + \else \dcolerr \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\stepl@dcolcount} +% This increments the column counter, and issues an error message +% if it is too large. +% \begin{macrocode} +\newcommand*{\stepl@dcolcount}{\advance\l@dcolcount\@ne + \ifnum\l@dcolcount>30\relax + \led@err@TooManyColumns + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@dsetmaxcolwidth} +% Sets the column width to the maximum value seen so far. (was |\dimenzuordnung|) +% \begin{macrocode} +\newcommand{\l@dsetmaxcolwidth}{% + \ifdim\l@dcolwidth < \wd\hilfsbox + \l@dcolwidth = \wd\hilfsbox + \else \relax \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\EDTEXT} +% \begin{macro}{\xedtext} +% \begin{macro}{\CRITEXT} +% \begin{macro}{\xcritext} +% We need to be able to modify the |\edtext| and |\critext| macros +% and also restore their original definitions. +% \begin{macrocode} +\let\EDTEXT=\edtext +\newcommand{\xedtext}[2]{\EDTEXT{#1}{#2}} +\let\CRITEXT=\critext +\long\def\xcritext #1#2/{\CRITEXT{#1}{#2}/} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\EDLABEL} +% \begin{macro}{\xedlabel} +% We need to be able to modify and restore the |\edlabel| macro. +% \begin{macrocode} +\let\EDLABEL=\edlabel +\newcommand*{\xedlabel}[1]{\EDLABEL{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\EDINDEX} +% \begin{macro}{\xedindex} +% \begin{macro}{\nulledindex} +% Macros supporting modification and restoration of |\edindex|. +% \begin{macrocode} +\let\EDINDEX=\edindex +\ifl@dmemoir + \newcommand{\xedindex}{\@bsphack% + \@ifnextchar [{\l@d@index}{\l@d@index[\jobname]}} + \newcommand{\nulledindex}[2][\jobname]{\@bsphack\@esphack} +\else + \newcommand{\xedindex}{\@bsphack% + \doedindexlabel + \begingroup + \@sanitize + \@wredindex} + \newcommand{\nulledindex}[1]{\@bsphack\@esphack} +\fi + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@line@@num} +% Macro supporting restoration of |\linenum|. +% \begin{macrocode} +\let\@line@@num=\linenum +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@dgobbledarg} +% \begin{macro}{\l@dgobblearg} +% |\l@dgobbledarg| replaces its delineated argument by |\relax| +% (was |\verschwinden|). +% |\l@dgobblearg|\marg{arg} replaces its argument by |\relax|. +% \begin{macrocode} +\def\l@dgobbledarg #1/{\relax} +\newcommand*{\l@dgobblearg}[1]{\relax} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\Relax} +% \begin{macro}{\NEXT} +% \begin{macro}{\@hilfs@count} +% \begin{macrocode} +\let\Relax=\relax +\let\NEXT=\next +\newcount\@hilfs@count + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\measuremcell} +% Measure (recursively) the width required for a math cell. (was |\messen|) +% \begin{macrocode} +\def\measuremcell #1&{% + \ifx #1\\ \ifnum\l@dcolcount=0\let\NEXT\relax% + \else\l@dcheckcols% + \l@dcolcount=0% + \let\NEXT\measuremcell% + \fi% + \else\setbox\hilfsbox=\hbox{$\displaystyle{#1}$}% + \stepl@dcolcount% + \l@dsetmaxcolwidth% + \let\NEXT\measuremcell% + \fi\NEXT} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\measuretcell} +% Measure (recursively) the width required for a text cell. (was |\messentext|) +% \begin{macrocode} +\def\measuretcell #1&{% + \ifx #1\\ \ifnum\l@dcolcount=0\let\NEXT\relax% + \else\l@dcheckcols% + \l@dcolcount=0% + \let\NEXT\measuretcell% + \fi% + \else\setbox\hilfsbox=\hbox{#1}% + \stepl@dcolcount% + \l@dsetmaxcolwidth% + \let\NEXT\measuretcell% + \fi\NEXT} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\measuremrow} +% Measure (recursively) the width required for a math row. (was |\Messen|) +% \begin{macrocode} +\def\measuremrow #1\\{% + \ifx #1&\let\NEXT\relax% + \else\measuremcell #1&\\&\\&% + \let\NEXT\measuremrow% + \fi\NEXT} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\measuretrow} +% Measure (recursively) the width required for a text row. (was |\Messentext|) +% \begin{macrocode} +\def\measuretrow #1\\{% + \ifx #1&\let\NEXT\relax% + \else\measuretcell #1&\\&\\&% + \let\NEXT\measuretrow% + \fi\NEXT} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\edtabcolsep} +% The length |\edtabcolsep| controls the distance between columns. +% (was |\abstand|) +% \begin{macrocode} +\newskip\edtabcolsep +\global\edtabcolsep=10pt + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NEXT} +% \begin{macro}{\Next} +% \begin{macrocode} +\let\NEXT\relax +\let\Next=\next +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\variab} +% \begin{macrocode} +\newcommand{\variab}{\relax} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@dcheckcols} +% Check that the number of columns is consistent. (was |\tabfehlermeldung|) +% \begin{macrocode} +\newcommand*{\l@dcheckcols}{% + \ifnum\l@dcolcount=1\relax + \else + \ifnum\l@dampcount=1\relax + \else + \ifnum\l@dcolcount=\l@dampcount\relax + \else + \l@d@err@UnequalColumns + \fi + \fi + \l@dampcount=\l@dcolcount + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@dmodforcritext} +% \begin{macro}{\l@drestoreforcritext} +% Modify and restore various macros for when |\critext| is used. +% \begin{macrocode} +\newcommand{\l@dmodforcritext}{% + \let\critext\relax% + \renewcommand{\do}[1]{\global\csletcs{##1footnote}{l@dgobbledarg}} + \dolistloop{\@series}% + \let\edindex\nulledindex% + \let\linenum\@gobble} +\newcommand{\l@drestoreforcritext}{% + \renewcommand{\do}[1]{\csdef{##1footnote}##1##2/{\csuse{##1@@footnote}{##1}{##2}}} + \dolistloop{\@series}% + \let\edindex\xedindex} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@dmodforedtext} +% \begin{macro}{\l@drestoreforedtext} +% Modify and restore various macros for when |\edtext| is used. +% \begin{macrocode} +\newcommand{\l@dmodforedtext}{% + \let\edtext\relax + \renewcommand{\do}[1]{\global\csletcs{##1footnote}{l@dgobblearg}} + \dolistloop{\@series}% + \let\edindex\nulledindex + \let\linenum\@gobble} +\newcommand{\l@drestoreforedtext}{% + \renewcommand{\do}[1]{\csgdef{##1footnote}##1{\csuse{##1@@footnote}{##1}}} + \dolistloop{\@series}% + \let\edindex\xedindex} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@dnullfills} +% \begin{macro}{\l@drestorefills} +% Nullify and restore some column fillers, etc. +% \begin{macrocode} +\newcommand{\l@dnullfills}{% + \def\edlabel##1{}% + \def\edrowfill##1##2##3{}% +} +\newcommand{\l@drestorefills}{% + \def\edrowfill##1##2##3{\@EDROWFILL@{##1}{##2}{##3}}% +} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% The original definition of |\rverteilen| and friends +% (`verteilen' is approximately `distribute') was along the lines: +% \begin{verbatim} +% \def\rverteilen #1&{\def\label##1{}% +% \ifx #1! \ifnum\l@dcolcount=0%\removelastskip +% \let\Next\relax% +% \else\l@dcolcount=0% +% \let\Next=\rverteilen% +% \fi% +% \else% +% \footnoteverschw% +% \stepl@dcolcount% +% \setbox\hilfsbox=\hbox{$\displaystyle{#1}$}% +% \let\critext=\xcritext\let\Dfootnote=\D@@footnote +% \let\Afootnote=\A@@footnote\let\Bfootnote=\B@@footnote +% \let\Cfootnote=\C@@footnote\let\linenum=\@line@@num% +% \hilfsskip=\Dimenzuordnung% +% \advance\hilfsskip by -\wd\hilfsbox +% \def\label##1{\xlabel{##1}}% +% \hskip\hilfsskip$\displaystyle{#1}$% +% \hskip\edtabcolsep% +% \let\Next=\rverteilen% +% \fi\Next} +% \end{verbatim} +% where the lines +% \begin{verbatim} +% \let\critext=\xcritext\let\Dfootnote=\D@@footnote +% \let\Afootnote=\A@@footnote\let\Bfootnote=\B@@footnote +% \let\Cfootnote=\C@@footnote\let\linenum=\@line@@num% +% \hilfsskip=\Dimenzuordnung% +% \advance\hilfsskip by -\wd\hilfsbox +% \def\label##1{\xlabel{##1}}% +% \end{verbatim} +% were common across the several |*verteilen*| macros, and also +% \begin{verbatim} +% \def\footnoteverschw{% +% \let\critext\relax +% \let\Afootnote=\verschwinden +% \let\Bfootnote=\verschwinden +% \let\Cfootnote=\verschwinden +% \let\Dfootnote=\verschwinden +% \let\linenum=\@gobble} +% \end{verbatim} +% +% \begin{macro}{\letsforverteilen} +% Gathers some lets and other code that is common to the |*verteilen*| macros. +% \begin{macrocode} +\newcommand{\letsforverteilen}{% + \let\critext\xcritext + \let\edtext\xedtext + \let\edindex\xedindex + \renewcommand{\do}[1]{\global\csletcs{##1footnote}{##1@@footnote}} + \dolistloop{\@series}% + \let\linenum\@line@@num + \hilfsskip=\l@dcolwidth% + \advance\hilfsskip by -\wd\hilfsbox + \def\edlabel##1{\xedlabel{##1}}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setmcellright} +% Typeset (recursively) cells of display math right justified. (was |\rverteilen|) +% \begin{macrocode} +\def\setmcellright #1&{\def\edlabel##1{}% + \let\edindex\nulledindex + \ifx #1\\ \ifnum\l@dcolcount=0%\removelastskip + \let\Next\relax% + \else\l@dcolcount=0% + \let\Next=\setmcellright% + \fi% + \else% + \disablel@dtabfeet% + \stepl@dcolcount% + \setbox\hilfsbox=\hbox{$\displaystyle{#1}$}% + \letsforverteilen% + \hskip\hilfsskip$\displaystyle{#1}$% + \hskip\edtabcolsep% + \let\Next=\setmcellright% + \fi\Next} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\settcellright} +% Typeset (recursively) cells of text right justified. (was |\rverteilentext|) +% \begin{macrocode} +\def\settcellright #1&{\def\edlabel##1{}% + \let\edindex\nulledindex + \ifx #1\\ \ifnum\l@dcolcount=0%\removelastskip + \let\Next\relax% + \else\l@dcolcount=0% + \let\Next=\settcellright% + \fi% + \else% + \disablel@dtabfeet% + \stepl@dcolcount% + \setbox\hilfsbox=\hbox{#1}% + \letsforverteilen% + \hskip\hilfsskip#1% + \hskip\edtabcolsep% + \let\Next=\settcellright% + \fi\Next} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setmcellleft} +% Typeset (recursively) cells of display math left justified. (was |\lverteilen|) +% \begin{macrocode} +\def\setmcellleft #1&{\def\edlabel##1{}% + \let\edindex\nulledindex + \ifx #1\\ \ifnum\l@dcolcount=0 \let\Next\relax% + \else\l@dcolcount=0% + \let\Next=\setmcellleft% + \fi% + \else \disablel@dtabfeet% + \stepl@dcolcount% + \setbox\hilfsbox=\hbox{$\displaystyle{#1}$}% + \letsforverteilen + $\displaystyle{#1}$\hskip\hilfsskip\hskip\edtabcolsep% + \let\Next=\setmcellleft% + \fi\Next} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\settcellleft} +% Typeset (recursively) cells of text left justified. (was |\lverteilentext|) +% \begin{macrocode} +\def\settcellleft #1&{\def\edlabel##1{}% + \let\edindex\nulledindex + \ifx #1\\ \ifnum\l@dcolcount=0 \let\Next\relax% + \else\l@dcolcount=0% + \let\Next=\settcellleft% + \fi% + \else \disablel@dtabfeet% + \stepl@dcolcount% + \setbox\hilfsbox=\hbox{#1}% + \letsforverteilen + #1\hskip\hilfsskip\hskip\edtabcolsep% + \let\Next=\settcellleft% + \fi\Next} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setmcellcenter} +% Typeset (recursively) cells of display math centered. (was |\zverteilen|) +% \begin{macrocode} +\def\setmcellcenter #1&{\def\edlabel##1{}% + \let\edindex\nulledindex + \ifx #1\\ \ifnum\l@dcolcount=0\let\Next\relax% + \else\l@dcolcount=0% + \let\Next=\setmcellcenter% + \fi% + \else \disablel@dtabfeet% + \stepl@dcolcount% + \setbox\hilfsbox=\hbox{$\displaystyle{#1}$}% + \letsforverteilen% + \hskip 0.5\hilfsskip$\displaystyle{#1}$\hskip0.5\hilfsskip% + \hskip\edtabcolsep% + \let\Next=\setmcellcenter% + \fi\Next} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\settcellcenter} +% Typeset (recursively) cells of text centered. (new) +% \begin{macrocode} +\def\settcellcenter #1&{\def\edlabel##1{}% + \let\edindex\nulledindex + \ifx #1\\ \ifnum\l@dcolcount=0 \let\Next\relax% + \else\l@dcolcount=0% + \let\Next=\settcellcenter% + \fi% + \else \disablel@dtabfeet% + \stepl@dcolcount% + \setbox\hilfsbox=\hbox{#1}% + \letsforverteilen% + \hskip 0.5\hilfsskip #1\hskip 0.5\hilfsskip% + \hskip\edtabcolsep% + \let\Next=\settcellcenter% + \fi\Next} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NEXT} +% \begin{macrocode} +\let\NEXT=\relax + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setmrowright} +% Typeset (recursively) rows of right justified math. (was |\rsetzen|) +% \begin{macrocode} +\def\setmrowright #1\\{% + \ifx #1& \let\NEXT\relax + \else \centerline{\setmcellright #1&\\&\\&} + \let\NEXT=\setmrowright + \fi\NEXT} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\settrowright} +% Typeset (recursively) rows of right justified text. (was |\rsetzentext|) +% \begin{macrocode} +\def\settrowright #1\\{% + \ifx #1& \let\NEXT\relax + \else \centerline{\settcellright #1&\\&\\&} + \let\NEXT=\settrowright + \fi\NEXT} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setmrowleft} +% Typeset (recursively) rows of left justified math. (was |\lsetzen|) +% \begin{macrocode} +\def\setmrowleft #1\\{% + \ifx #1&\let\NEXT\relax + \else \centerline{\setmcellleft #1&\\&\\&} + \let\NEXT=\setmrowleft + \fi\NEXT} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\settrowleft} +% Typeset (recursively) rows of left justified text. (was |\lsetzentext|) +% \begin{macrocode} +\def\settrowleft #1\\{% + \ifx #1& \let\NEXT\relax + \else \centerline{\settcellleft #1&\\&\\&} + \let\NEXT=\settrowleft + \fi\NEXT} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setmrowcenter} +% Typeset (recursively) rows of centered math. (was |\zsetzen|) +% \begin{macrocode} +\def\setmrowcenter #1\\{% + \ifx #1& \let\NEXT\relax% + \else \centerline{\setmcellcenter #1&\\&\\&} + \let\NEXT=\setmrowcenter + \fi\NEXT} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\settrowcenter} +% Typeset (recursively) rows of centered text. (new) +% \begin{macrocode} +\def\settrowcenter #1\\{% + \ifx #1& \let\NEXT\relax + \else \centerline{\settcellcenter #1&\\&\\&} + \let\NEXT=\settrowcenter + \fi\NEXT} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\nullsetzen} +% (was |\nullsetzen|) +% \begin{macrocode} +\newcommand{\nullsetzen}{% + \stepl@dcolcount% + \l@dcolwidth=0pt% + \ifnum\l@dcolcount=30\let\NEXT\relax% + \l@dcolcount=0\relax + \else\let\NEXT\nullsetzen% + \fi\NEXT} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\edatleft} +% |\edatleft|\oarg{math}\marg{symbol}\marg{len} (combination and +% generalisation of original |\Seklam| and |\Seklamgl|). +% Left \meta{symbol}, 2\meta{len} high with prepended \meta{math} vertically centered. +% \begin{macrocode} +\newcommand{\edatleft}[3][\@empty]{% + \ifx#1\@empty + \vbox to 10pt{\vss\hbox{$\left#2\vrule width0pt height #3 + depth 0pt \right. $\hss}\vfil} + \else + \vbox to 4pt{\vss\hbox{$#1\left#2\vrule width0pt height #3 + depth 0pt \right. $}\vfil} + \fi} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\edatright} +% |\edatright|\oarg{math}\marg{symbol}\marg{len} (combination and +% generalisation of original |\seklam| and |\seklamgl|). +% Right \meta{symbol}, 2\meta{len} high with appended \meta{math} vertically centered. +% \begin{macrocode} +\newcommand{\edatright}[3][\@empty]{% + \ifx#1\@empty + \vbox to 10pt{\vss\hbox{$\left.\vrule width0pt height #3 + depth 0pt \right#2 $\hss}\vfil} + \else + \vbox to 4pt{\vss\hbox{$\left.\vrule width0pt height #3 + depth 0pt \right#2 #1 $}\vfil} + \fi} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\edvertline} +% |\edvertline|\marg{len} vertical line \meta{len} high. (was |\sestrich|) +% \begin{macrocode} +\newcommand{\edvertline}[1]{\vbox to 8pt{\vss\hbox{\vrule height #1}\vfil}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\edvertdots} +% |\edvertdots|\marg{len} vertical dotted line \meta{len} high. (was |\sepunkte|) +% \begin{macrocode} +\newcommand{\edvertdots}[1]{\vbox to 1pt{\vss\vbox to #1% + {\cleaders\hbox{$\m@th\hbox{.}\vbox to 0.5em{ }$}\vfil}}} + +% \end{macrocode} +% \end{macro} +% +% I don't know if this is relevant here, and I haven't tried it, +% but the following appeared on CTT. +% \begin{verbatim} +% From: mdw@nsict.org (Mark Wooding) +% Newsgroups: comp.text.tex +% Subject: Re: Dotted line +% Date: 13 Aug 2003 13:51:14 GMT +% +% Alexis Eisenhofer <alexis@eisenhofer.de> wrote: +% > Can anyone provide me with the LaTex command for a vertical dotted line? +% +% How dotted? Here's the basic rune. +% \newbox\linedotbox +% \setbox\linedotbox=\vbox{...} +% \leaders\copy\linedotbox\vskip2in +% +% For just dots, this works: +% \setbox\linedotbox=\vbox{\hbox{\normalfont.}\kern2pt} +% +% For dashes, something like +% \setbox\linedotbox=\vbox{\leaders\vrule\vskip2pt\vskip2pt} +% is what you want. (Adjust the `2pt' values to taste. The first one is +% the length of the dashes, the second is the length of the gaps.) +% +% For dots in mid-paragraph, you need to say something like +% \lower10pt\vbox{\leaders\copy\linedotbox\vskip2in} +% which is scungy but works. +% +% -- [mdw] +% \end{verbatim} +% +% \begin{macro}{\edfilldimen} +% A length. (was |\klamdimen|) +% \begin{macrocode} +\newdimen\edfilldimen +\edfilldimen=0pt + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@addcolcount} +% \begin{macro}{\theaddcolcount} +% A counter to hold the number of a column. We use a roman number so +% that we can grab the column dimension from |\dcol...|. +% \begin{macrocode} +\newcounter{addcolcount} + \renewcommand{\theaddcolcount}{\roman{addcolcount}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@dtabaddcols} +% |\l@dtabaddcols|\marg{startcol}\marg{endcol} adds the widths of +% the columns \meta{startcol} through \meta{endcol} to |\edfilldimen|. +% It is a LaTeX style +% reimplementation of the original |\@add@|. +% \begin{macrocode} +\newcommand{\l@dtabaddcols}[2]{% + \l@dcheckstartend{#1}{#2}% + \ifl@dstartendok + \setcounter{addcolcount}{#1}% + \@whilenum \value{addcolcount}<#2\relax \do + {\advance\edfilldimen by \the \csname dcol\theaddcolcount\endcsname + \advance\edfilldimen by \edtabcolsep + \stepcounter{addcolcount}}% + \advance\edfilldimen by \the \csname dcol\theaddcolcount\endcsname + \fi +} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifl@dstartendok} +% \begin{macro}{\l@dcheckstartend} +% |\l@dcheckstartend|\marg{startcol}\marg{endcol} checks that the values +% of \meta{startcol} and \meta{endcol} are sensible. If they are then +% |\ifl@dstartendok| is set TRUE, otherwise it is set FALSE. +% \begin{macrocode} +\newif\ifl@dstartendok +\newcommand{\l@dcheckstartend}[2]{% + \l@dstartendoktrue + \ifnum #1<\@ne + \l@dstartendokfalse + \led@err@LowStartColumn + \fi + \ifnum #2>30\relax + \l@dstartendokfalse + \led@err@HighEndColumn + \fi + \ifnum #1>#2\relax + \l@dstartendokfalse + \led@err@ReverseColumns +%%% \eledmac@error{Start column is greater than end column}{\@ehc}% + \fi +} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\edrowfill} +% \begin{macro}{\@edrowfill@} +% \begin{macro}{\@EDROWFILL@} +% |\edrowfill|\marg{startcol}\marg{endcol}{fill} +% fills columns \meta{startcol} to \meta{endcol} inclusive with +% \meta{fill} (e.g. |\hrulefill|, |\upbracefill|). +% This is a LaTex style reimplementation and generalization of the +% original |\waklam|, |\Waklam|, |\waklamec|, |\wastricht| +% and |\wapunktel| macros. +% \begin{macrocode} +\newcommand*{\edrowfill}[3]{% + \l@dtabaddcols{#1}{#2}% + \hb@xt@ \the\l@dcolwidth{\hb@xt@ \the\edfilldimen{#3}\hss}} +\let\@edrowfill@=\edrowfill +\def\@EDROWFILL@#1#2#3{\@edrowfill@{#1}{#2}{#3}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \DescribeMacro{\edbeforetab} +% \DescribeMacro{\edaftertab} +% The macro |\edbeforetab|\marg{text}\marg{math} puts \meta{text} at +% the left margin before array cell entry \meta{math}. Conversely, +% the macro |\edaftertab|\marg{math}\marg{text} puts \meta{text} +% at the right margin after array cell entry \meta{math}. +% |\edbeforetab| should be in the first column and |\edaftertab| in the +% last column. +% The following macros support these. +% +% \begin{macro}{\leftltab} +% |\leftltab|\marg{text} for |\edbeforetab| in |\ltab|. (was |\linksltab|) +% \begin{macrocode} +\newcommand{\leftltab}[1]{% + \hb@xt@\z@{\vbox{\edtabindent% + \moveleft\Hilfsskip\hbox{\ #1}}\hss}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\leftrtab} +% |\leftrtab|\marg{text}\marg{math} for |\edbeforetab| in |\rtab|. (was |\linksrtab|) +% \begin{macrocode} +\newcommand{\leftrtab}[2]{% + #2\hb@xt@\z@{\vbox{\edtabindent% + \advance\Hilfsskip by\dcoli% + \moveleft\Hilfsskip\hbox{\ #1}}\hss}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\leftctab} +% |\leftctab|\marg{text}\marg{math} for |\edbeforetab| in |\ctab|. (was |\linksztab|) +% \begin{macrocode} +\newcommand{\leftctab}[2]{% + \hb@xt@\z@{\vbox{\edtabindent\l@dcolcount=\l@dampcount% + \advance\Hilfsskip by 0.5\dcoli% + \setbox\hilfsbox=\hbox{\def\edlabel##1{}% + \disablel@dtabfeet$\displaystyle{#2}$}% + \advance\Hilfsskip by -0.5\wd\hilfsbox% + \moveleft\Hilfsskip\hbox{\ #1}}\hss}% + #2} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rightctab} +% |\rightctab|\marg{math}\marg{text} for |\edaftertab| in |\ctab|. (was |\rechtsztab|) +% \begin{macrocode} +\newcommand{\rightctab}[2]{% + \setbox\hilfsbox=\hbox{\def\edlabel##1{}% + \disablel@dtabfeet#2}\l@dampcount=\l@dcolcount% + #1\hb@xt@\z@{\vbox{\edtabindent\l@dcolcount=\l@dampcount% + \advance\Hilfsskip by 0.5\l@dcolwidth% + \advance\Hilfsskip by -\wd\hilfsbox% + \setbox\hilfsbox=\hbox{\def\edlabel##1{}% + \disablel@dtabfeet$\displaystyle{#1}$}% + \advance\Hilfsskip by -0.5\wd\hilfsbox% + \advance\Hilfsskip by \edtabcolsep% + \moveright\Hilfsskip\hbox{ #2}}\hss}% + } + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rightltab} +% |\rightltab|\marg{math}\marg{text} for |\edaftertab| in |\ltab|. (was |\rechtsltab|) +% \begin{macrocode} +\newcommand{\rightltab}[2]{% + \setbox\hilfsbox=\hbox{\def\edlabel##1{}% + \disablel@dtabfeet#2}\l@dampcount=\l@dcolcount% + #1\hb@xt@\z@{\vbox{\edtabindent\l@dcolcount=\l@dampcount% + \advance\Hilfsskip by\l@dcolwidth% + \advance\Hilfsskip by-\wd\hilfsbox% + \setbox\hilfsbox=\hbox{\def\edlabel##1{}% + \disablel@dtabfeet$\displaystyle{#1}$}% + \advance\Hilfsskip by-\wd\hilfsbox% + \advance\Hilfsskip by\edtabcolsep% + \moveright\Hilfsskip\hbox{ #2}}\hss}% + } + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rightrtab} +% |\rightrtab|\marg{math}\marg{text} for |\edaftertab| in |\rtab|. (was |\rechtsrtab|) +% \begin{macrocode} +\newcommand{\rightrtab}[2]{% + \setbox\hilfsbox=\hbox{\def\edlabel##1{}% + \disablel@dtabfeet#2}% + #1\hb@xt@\z@{\vbox{\edtabindent% + \advance\Hilfsskip by-\wd\hilfsbox% + \advance\Hilfsskip by\edtabcolsep% + \moveright\Hilfsskip\hbox{ #2}}\hss}% + } + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rtab} +% \begin{macro}{\edbeforetab} +% \begin{macro}{\edaftertab} +% |\rtab|\marg{body} typesets \meta{body} as an array with the +% entries right justified. (was |\rtab|) +% (Here and elsewhere, +% |\edbeforetab| and |\edaftertab| were originally |\davor| and |\danach|) +% The original |\rtab| and friends included a fair bit of common code +% which I have extracted into macros. +% +% The process is first to measure the \meta{body} to get the column +% widths, and then in a second pass to typeset the body. +% \begin{macrocode} +\newcommand{\rtab}[1]{% + \l@dnullfills + \def\edbeforetab##1##2{\leftrtab{##1}{##2}}% + \def\edaftertab##1##2{\rightrtab{##1}{##2}}% + \measurembody{#1}% + \l@drestorefills + \variab + \setmrowright #1\\&\\% + \enablel@dtabfeet} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\measurembody} +% |\measurembody|\marg{body} measures the array \meta{body}. +% \begin{macrocode} +\newcommand{\measurembody}[1]{% + \disablel@dtabfeet% + \l@dcolcount=0% + \nullsetzen% + \l@dcolcount=0 + \measuremrow #1\\&\\% + \global\l@dampcount=1} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rtabtext} +% |\rtabtext|\marg{body} typesets \meta{body} as a tabular with the +% entries right justified. (was |\rtabtext|) +% \begin{macrocode} +\newcommand{\rtabtext}[1]{% + \l@dnullfills + \measuretbody{#1}% + \l@drestorefills + \variab + \settrowright #1\\&\\% + \enablel@dtabfeet} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\measuretbody} +% |\measuretbody|\marg{body} measures the tabular \meta{body}. +% \begin{macrocode} +\newcommand{\measuretbody}[1]{% + \disablel@dtabfeet% + \l@dcolcount=0% + \nullsetzen% + \l@dcolcount=0 + \measuretrow #1\\&\\% + \global\l@dampcount=1} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ltab} +% \begin{macro}{\edbeforetab} +% \begin{macro}{\edaftertab} +% Array with entries left justified. (was |\ltab|) +% \begin{macrocode} +\newcommand{\ltab}[1]{% + \l@dnullfills + \def\edbeforetab##1##2{\leftltab{##1}{##2}}% + \def\edaftertab##1##2{\rightltab{##1}{##2}}% + \measurembody{#1}% + \l@drestorefills + \variab + \setmrowleft #1\\&\\% + \enablel@dtabfeet} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ltabtext} +% Tabular with entries left justified. (was |\ltabtext|) +% \begin{macrocode} +\newcommand{\ltabtext}[1]{% + \l@dnullfills + \measuretbody{#1}% + \l@drestorefills + \variab + \settrowleft #1\\&\\% + \enablel@dtabfeet} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ctab} +% \begin{macro}{\edbeforetab} +% \begin{macro}{\edaftertab} +% Array with centered entries. (was |\ztab|) +% \begin{macrocode} +\newcommand{\ctab}[1]{% + \l@dnullfills + \def\edbeforetab##1##2{\leftctab{##1}{##2}}% + \def\edaftertab##1##2{\rightctab{##1}{##2}}% + \measurembody{#1}% + \l@drestorefills + \variab + \setmrowcenter #1\\&\\% + \enablel@dtabfeet} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ctabtext} +% Tabular with entries centered. (new) +% \begin{macrocode} +\newcommand{\ctabtext}[1]{% + \l@dnullfills + \measuretbody{#1}% + \l@drestorefills + \variab + \settrowcenter #1\\&\\% + \enablel@dtabfeet} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\spreadtext} +% (was |\breitertext|) +% \begin{macrocode} +\newcommand{\spreadtext}[1]{%\l@dcolcount=\l@dampcount% + \hb@xt@ \the\l@dcolwidth{\hbox{#1}\hss}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\spreadmath} +% (was |\breiter|, `breiter' = `broadly') +% \begin{macrocode} +\newcommand{\spreadmath}[1]{% + \hb@xt@ \the\l@dcolwidth{\hbox{$\displaystyle{#1}$}\hss}} + +% \end{macrocode} +% \end{macro} +% +% I have left the remaining \tabmac{} alone, apart from changing some names. +% I'm not yet sure what they do or how they do it. Authors should not use +% any of these as they are likely to be mutable. +% +% \begin{macro}{\tabellzwischen} +% (was |\tabellzwischen|) +% \begin{macrocode} +\def\tabellzwischen #1&{% + \ifx #1\\ \let\NEXT\relax \l@dcolcount=0 + \else \stepl@dcolcount% + \l@dcolwidth = #1 mm + \let\NEXT=\tabellzwischen + \fi \NEXT } + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\edatabell} +% For example |\edatabell 4 & 19 & 8 \\| specifies 3 columns with widths +% of 4, 19, and 8mm. (was |\atabell|) +% \begin{macrocode} +\def\edatabell #1\\{% + \tabellzwischen #1&\\&} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Setzen} +% (was |\Setzen|, `setzen' = `set') +% \begin{macrocode} +\def\Setzen #1&{% + \ifx #1\relax \let\NEXT=\relax + \else \stepl@dcolcount% + \let\tabelskip=\l@dcolwidth + \EDTAB #1| + \let\NEXT=\Setzen + \fi\NEXT} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\EDATAB} +% (was |\ATAB|) +% \begin{macrocode} +\def\EDATAB #1\\{% + \ifx #1\Relax \centerline{\Setzen #1\relax&} + \let\Next\relax + \else \centerline{\Setzen #1&\relax&} + \let\Next=\EDATAB + \fi\Next} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\edatab} +% (was |\atab|) +% \begin{macrocode} +\newcommand{\edatab}[1]{% + \variab% + \EDATAB #1\\\Relax\\} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\HILFSskip} +% \begin{macro}{\Hilfsskip} +% More helpers. +% \begin{macrocode} +\newskip\HILFSskip +\newskip\Hilfsskip + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\EDTABINDENT} +% (was |\TABINDENT|) +% \begin{macrocode} +\newcommand{\EDTABINDENT}{% + \ifnum\l@dcolcount=30\let\NEXT\relax\l@dcolcount=0% + \else\stepl@dcolcount% + \advance\Hilfsskip by\l@dcolwidth% + \ifdim\l@dcolwidth=0pt\advance\hilfscount\@ne + \else\advance\Hilfsskip by \the\hilfscount\edtabcolsep% + \hilfscount=1\fi% + \let\NEXT=\EDTABINDENT% + \fi\NEXT}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\edtabindent} +% (was |\tabindent|) +% \begin{macrocode} +\newcommand{\edtabindent}{% + \l@dcolcount=0\relax + \Hilfsskip=0pt% + \hilfscount=1\relax + \EDTABINDENT% + \hilfsskip=\hsize% + \advance\hilfsskip -\Hilfsskip% + \Hilfsskip=0.5\hilfsskip% + }% + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\EDTAB} +% (was |\TAB|) +% \begin{macrocode} +\def\EDTAB #1|#2|{% + \setbox\tabhilfbox=\hbox{$\displaystyle{#1}$}% + \setbox\tabHilfbox=\hbox{$\displaystyle{#2}$}% + \advance\tabelskip -\wd\tabhilfbox% + \advance\tabelskip -\wd\tabHilfbox% + \unhbox\tabhilfbox\hskip\tabelskip% + \unhbox\tabHilfbox}% + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\EDTABtext} +% (was |\TABtext|) +% \begin{macrocode} +\def\EDTABtext #1|#2|{% + \setbox\tabhilfbox=\hbox{#1}% + \setbox\tabHilfbox=\hbox{#2}% + \advance\tabelskip -\wd\tabhilfbox% + \advance\tabelskip -\wd\tabHilfbox% + \unhbox\tabhilfbox\hskip\tabelskip% + \unhbox\tabHilfbox}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tabhilfbox} +% \begin{macro}{\tabHilfbox} +% Further helpers. +% \begin{macrocode} +\newbox\tabhilfbox +\newbox\tabHilfbox + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{verbatim} +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % That finishes tabmac +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \end{verbatim} +% +% \begin{environment}{edarrayl} +% \begin{environment}{edarrayc} +% \begin{environment}{edarrayr} +% The `environment' forms for |\ltab|, |\ctab| and |\rtab|. +% \begin{macrocode} +\newenvironment{edarrayl}{\l@dcollect@body\ltab}{} +\newenvironment{edarrayc}{\l@dcollect@body\ctab}{} +\newenvironment{edarrayr}{\l@dcollect@body\rtab}{} + +% \end{macrocode} +% \end{environment} +% \end{environment} +% \end{environment} +% +% \begin{environment}{edtabularl} +% \begin{environment}{edtabularc} +% \begin{environment}{edtabularr} +% The `environment' forms for |\ltabtext|, |\ctabtext| and |\rtabtext|. +% \begin{macrocode} +\newenvironment{edtabularl}{\l@dcollect@body\ltabtext}{} +\newenvironment{edtabularc}{\l@dcollect@body\ctabtext}{} +\newenvironment{edtabularr}{\l@dcollect@body\rtabtext}{} + +% \end{macrocode} +% \end{environment} +% \end{environment} +% \end{environment} +% +% Here's the code for enabling |\edtext| (instead of |\critext|). +% +% \begin{macro}{\usingcritext} +% \begin{macro}{\disablel@dtabfeet} +% \begin{macro}{\enablel@dtabfeet} +% \begin{macro}{\usingedtext} +% Declarations for using |\critext{}.../| or using |\edtext{}{}| inside +% tabulars. +% The default at this point is for |\edtext|. +% \begin{macrocode} +\newcommand{\usingcritext}{% + \def\disablel@dtabfeet{\l@dmodforcritext}% + \def\enablel@dtabfeet{\l@drestoreforcritext}} +\newcommand{\usingedtext}{% + \def\disablel@dtabfeet{\l@dmodforedtext}% + \def\enablel@dtabfeet{\l@drestoreforedtext}} + +\usingedtext + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% +% +% \newpage +% \appendix +% \let\oldthesection\thesection +% \renewcommand{\thesection}{Appendix \oldthesection} +% \section{Migration from ledmac to eledmac}\label{migration} +% In eledmac, some changes were made in the code to allow for easy customization. +% This can cause problems for people who have made their own customizations. The next sections explain how to correct this. +% +% +% If you created your own series using \cs{addfootins} and \cs{addfootinsX}, you should instead use the \cs{newseries} command (see \ref{newseries} p.\pageref{newseries}). You must delete your \cs{Xfootnote} command. +% +% If you customized the \cs{XXXXXXfmt} command, you should see if commands for display options (\ref{displayoptions} p.\pageref{displayoptions}) and options in \cs{Xfootnote} (\ref{Xfootnoteopt} p.\pageref{Xfootnoteopt}) can't do the same things. If not, you can add a new ticket in Github to request a new function it\footnote{\url{https://github.com/maieul/ledmac/issues}}. +% +% If for some reason you don't want to make the modifications to use eledmac new functions, you can continue to use your own \cs{XXXXXfmt} command, but you must replace: +% \begin{verbatim} +% \renewcommand*{XXXXfmt}[3] +% \end{verbatim} +% with +% \begin{verbatim} +% \renewcommandx*{XXXXfmt}[4][4=Z] +% \end{verbatim} +% If you dont' do that, you will see a spurious \verb+[X]+, where X is series letter. +% +% If you used a \cs{protect} command inside a \cs{footnote} command inside a numbered section, you must change the \cs{protect} to \cs{noexpand}. If you don't, the command after the \cs{protect} won't be displayed. +% \clearpage +% +% \bibliographystyle{alpha} +% \section*{} +% \addcontentsline{toc}{section}{References} +% \begin{thebibliography}{WWW99} +% +% \bibitem[Bre96]{TABMAC} +% Herbert Breger. +% \newblock \tabmac. +% \newblock October 1996. +% \newblock (Available from CTAN in +% \texttt{macros/plain/contrib/tabmac}) +% +% \bibitem[Bur01]{POEMSCOLTUG} +% John Burt. +% \newblock `Typesetting critical editions of poetry'. +% \newblock \emph{TUGboat}, \textbf{22}, 4, pp 353--361, December 2001. +% \newblock (Code available from CTAN in +% \texttt{macros/latex/contrib/poemscol}) +% +% \bibitem[Eck03]{PARALLEL} +% Matthias Eckermann. +% \newblock \emph{The \Lpack{Parallel}-Package}. +% \newblock April 2003. +% \newblock (Available from CTAN in +% \texttt{macros/latex/contrib/parallel}) +% +% \bibitem[Fai03]{FOOTMISC} +% Robin Fairbairns. +% \newblock \emph{\Lpack{footmisc} --- a portmanteau package for +% customising footnotes in LaTeX}. +% \newblock February 2003. +% \newblock (Available from CTAN in +% \texttt{macros/latex/contrib/footmisc}) +% +% +% \bibitem[LW90]{EDMACTUG} +% John Lavagnino and Dominik Wujastyk. +% \newblock `An overview of \edmac: a \textsc{Plain} TeX format for +% critical editions'. +% \newblock \emph{TUGboat}, \textbf{11}, 4, pp. 623--643, November 1990. +% \newblock (Code available from CTAN in +% \texttt{macros/plain/contrib/edmac}) +% +% \bibitem[L\"{u}c03]{EDNOTES} +% Uwe L\"{u}ck. +% \newblock `\textsf{ednotes} --- critical edition typesetting with LaTeX'. +% \newblock \emph{TUGboat}, \textbf{24}, 2, pp. 224--236, 2003. +% \newblock (Code available from CTAN in +% \texttt{macros/latex/contrib/ednotes}) +% +% \bibitem[Sul92]{EDSTANZA} +% Wayne G.~Sullivan. +% \newblock \emph{The file \texttt{edstanza.doc}}. +% \newblock June 1992. +% \newblock (Available from CTAN in +% \texttt{macros/plain/contrib/edmac}) +% +% \bibitem[Wil02]{MEMOIR} +% Peter Wilson. +% \newblock \emph{The \Lpack{memoir} class for configurable typesetting}. +% \newblock November 2002. +% \newblock (Available from CTAN in +% \texttt{macros/latex/contrib/memoir}) +% +% \bibitem[Wil04]{ELEDPAR} +% Peter Wilson and Maïeul Rouquette. +% \newblock \emph{Parallel typesetting for critical editions: +% the \Lpack{eledpar} package}. +% \newblock December 2004. +% \newblock (Available from CTAN in +% \texttt{macros/latex/contrib/ledmmac}) +% +% \end{thebibliography} +% +% \Finale +% \section*{} +% \addcontentsline{toc}{section}{Index} +% \PrintIndex +% +% \section*{} +% \addcontentsline{toc}{section}{Change History} +% \PrintChanges +% \endinput +\endinput + +%% \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 \~} +%% |