diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-11 23:54:31 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-11 23:54:31 +0000 |
commit | dde731bb6765db3a2e5cadf89deb8185645d986c (patch) | |
tree | fe6f56ff27852a399ef3e44c8dc8f4d83f817d0d /Master/texmf-dist/source/latex/ledmac | |
parent | 2b2af594e7207fd05b07b07912bd7e205ea2ee2e (diff) |
trunk/Master/texmf-dist/source/latex/ledmac
git-svn-id: svn://tug.org/texlive/trunk@350 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/ledmac')
-rw-r--r-- | Master/texmf-dist/source/latex/ledmac/ledarab.dtx | 1500 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/ledmac/ledarab.ins | 83 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/ledmac/ledmac.dtx | 13746 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/ledmac/ledmac.ins | 86 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/ledmac/ledpar.dtx | 5163 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/ledmac/ledpar.ins | 82 |
6 files changed, 20660 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/ledmac/ledarab.dtx b/Master/texmf-dist/source/latex/ledmac/ledarab.dtx new file mode 100644 index 00000000000..f004fb286f8 --- /dev/null +++ b/Master/texmf-dist/source/latex/ledmac/ledarab.dtx @@ -0,0 +1,1500 @@ +% \iffalse meta-comment +% +% ledarab.dtx +% Author: Peter Wilson (Herries Press) herries dot press at earthlink dot net +% Copyright 2005 Peter R. Wilson +% +% 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 "author-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} +\providecommand{\phantomsection}{} % just in case hyperref is not used +\usepackage{graphicx} +% a simpler version of chngpage.sty's adjustwidth environment +\newenvironment{addtomargins}[2]{% + \begin{list}{}{% + \topsep 0pt + \addtolength{\leftmargin}{#1}% + \addtolength{\rightmargin}{#2}% + \listparindent \parindent + \itemindent \parindent + \parsep \parskip + }% + \item[]}{\end{list}} +\makeatletter + \@mparswitchfalse +\makeatother +\EnableCrossrefs +\CodelineIndex +%%\OnlyDescription +\renewcommand{\MakeUppercase}[1]{#1} +\pagestyle{headings} +\setcounter{StandardModuleDepth}{1} +\setcounter{IndexColumns}{2} +\begin{document} + \raggedbottom + \DocInput{ledarab.dtx} +\end{document} +%</driver> +% +% \fi +% +% \CheckSum{821} +% +% \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} +% +% \newcommand{\dtxfilename}{\texttt{ledarab.dtx}} +% \def\fileversion{v0.1} \def\filedate{2005/03/24} +% +% \changes{v0.1}{2005/03/24}{First public release} +% +% \hyphenation{man-u-script man-u-scripts} +% +% \newcommand{\Lpack}[1]{\textsf{#1}} +% \newcommand{\Lclass}[1]{\textsf{#1}} +% \newcommand{\file}[1]{\texttt{#1}} +% \newcommand{\env}[1]{\texttt{#1}} ^^A for environment names +% \newcommand{\ledpar}{ledpar} +% \newcommand{\ledmac}{ledmac} +% \newcommand{\Ledmac}{\Lpack{\ledmac}} +% \newcommand{\Ledpar}{\Lpack{\ledpar}} +% \newcommand{\edmac}{\texttt{EDMAC}} +% \newcommand{\tabmac}{\texttt{TABMAC}} +% \newcommand{\edstanza}{\texttt{EDSTANZA}} +% \newcommand{\ArabTeX}{\texttt{ArabTeX}} +% \newcommand{\Larabtex}{\Lpack{arabtex}} +% \newcommand{\Lafoot}{\Lpack{afoot}} +% \newcommand{\Lledarab}{\Lpack{ledarab}} +% \newcommand{\PWcomment}[1]{} +% \newenvironment{PW}{\itshape}{} +% \renewenvironment{PW}{\sffamily}{} +% \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{Critical editions and arabic typesetting: \\ +% the \Lpack{ledarab} and \Lpack{afoot} packages\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}}} +% +% \date{} +% +% +% \maketitle +% +% +% \begin{abstract} +% The \Ledmac{} package, which is based on the \PlainTeX\ set of +% \edmac\ macros, has been used for some time for typesetting critical +% editions, and the \ArabTeX{} system enables the typesetting of arabic +% texts. +% +% The \Lafoot{} package is an extension to the \Larabtex{} package +% to enable footnotes in arabic texts and the \Lledarab{} package +% provides an interface between \Larabtex{} and \Ledmac{} (also \Ledpar) +% for arabic text +% in critical editions. +% \end{abstract} +% +% \tableofcontents +% \listoffigures +% +% +% \section{Introduction} +% +% The \edmac{} macros \cite{EDMACTUG} for typesetting critical editions +% of texts +% have been available for use with TeX for some years, and the +% \Larabtex{} package \cite{ARABTEX} provides for arabic typesetting. +% These two +% works are interfaced by the \Lpack{aedpatch} package provided as +% part of the \ArabTeX{} distribution. +% +% Following the introduction of \edmac{} +% there had been a small but constant demand for a +% version that could be used with LaTeX. The \Ledmac{} +% package \cite{LEDMAC} was introduced in 2003 in an attempt to satisfy +% that request. This was extended in 2004 by the \Ledpar{} package +% \cite{LEDPAR} to allow the typesetting of parallel critical texts. +% The \Lledarab{} package provides an interface between the \Larabtex{} +% and the \Ledmac{} (and \Ledpar) packages. +% The package has to try and coerce \TeX{} into paths it was not designed +% for. Use of the package, therefore, may produce some surprising results. +% +% I initially used version 3.10 (2001/09/16) of the \Larabtex{} package +% but when I moved to version 3.11 (2003/08/22) I found that the code +% for footnotes (in \file{afoot.sty}) no longer worked. The \Lafoot{} package +% provided here is based on the obsolete 3.10 version, until a working +% version\footnote{I made queries about this on the \texttt{comp.text.tex} +% newsgoup on 2005/01/06 but got no responses.} +% of \file{afoot.sty} is provided in the \ArabTeX{} distribution. +% +% \section{The \Lpack{afoot} package}\label{howto} +% +% The \Larabtex{} package automatically calls the \Lafoot{} package. If you +% want to use my version of \Lafoot{} just make sure that it is found by +% LaTeX before the \ArabTeX's version, for example by having a copy in +% your working directory. +% +% \DescribeMacro{\footnote} +% The \cs{footnote}\marg{text} produces a numbered footnote. Unlike +% the usual LaTeX \cs{footnote} macro there is no optional argument +% for specifying the number. +% +% \DescribeMacro{\LRfootnotes} +% Inside an \env{arabtext} environment the \cs{LRfootnotes} declaration +% causes following footnotes to be in normal left to right (LtoR) roman text, +% left adjusted and with the number at the left. +% +% \DescribeMacro{\RLfootnotes} +% \DescribeMacro{\arabfootnotes} +% Inside an \env{arabtext} environment the \cs{RLfootnotes} or +% \cs{arabfootnotes} declaration +% causes any following footnotes to be in right to left (RtoL) arabic script, +% right adjusted and with the number at the right. +% In normal text the footnotes are normal. +% +% To get an arabic footnote in normal text try: \\ +% \verb?...roman\footnote{\RL{arabic}}...? \\ +% The footnote will be left adjusted but the note's text will be arabic. +% +% +% \section{The \Lpack{ledarab} package} +% +% The \Lledarab{} package\footnote{I offered an earlier version to Prof. +% Lagally towards the end of 2003 for possible addition to his +% \Larabtex{} package but got no response to my messages.} +% is partially based on Klaus Lagally's \file{aedpatch.sty} +% and lets the \Ledmac{} package's critical apparatus be applied +% to arabic texts. The packages must be used in the following order: +% \begin{verbatim} +% \usepackage{ledmac} +% \usepackage{ledpar} % if you need parallel texts. +% \usepackage{arabtex} +% \usepackage{ledarab} +% \end{verbatim} +% +% The package is very limited --- only the basic numbering and +% critical footnotes are supported. Even then, all critical notes +% are left adjusted with the lemma and note in left to right order, although +% the lemma and/or note may be in RtoL arabic script. Items like familiar +% footnotes, endnotes, tabulars and so on are left to you the user. +% +% In normal numbered text you can use the \cs{RL} macro within the critical +% aparatus for short pieces of arabic. +% \begin{verbatim} +% \beginnumbering +% \pstart +% Normal \edtext{latin}{\Cfootnote{roman}} text. +% Normal \edtext{\RL{latin}}{\Cfootnote{\RL{roman}}} text. +% ... +% \end{verbatim} +% In the first line above the lemma and footnote will both be in latin +% script while in the second line they will both be in arabic script; in +% each case, though, the lemma is at the left and the note follows on the +% right. +% +% \begin{verbatim} +% \beginnumbering +% \pstart +% \begin{arabtext} +% Arabic \edtext{script}{\Afootnote{roman}} text. +% Arabic \edtext{script}{\Afootnote{\LR{roman}}} text. +% Arabic \edtext{script}{\Afootnote{\RL{arabic}}} text. +% Arabic \edtext{\LR{error}}{\Afootnote{roman}} text. +% \end{arabtext} +% \pend +% ... +% \end{verbatim} +% In the first and second lines above the lemma is in arabic script and +% the note in +% latin script, while in the third line both the lemma and the note +% are in arabic script. Using \cs{LR} as part of the lemma, as in the last +% line causes errors. +% +% \begin{verbatim} +% \beginnumbering +% \begin{arabtext} +% \pstart +% Arabic \edtext{script}{\Afootnote{messy}} text. +% Arabic \edtext{script}{\Afootnote{\LR{messy}}} text. +% Arabic \edtext{script}{\Afootnote{\RL{arabic}}} text. +% \pend +% \end{arabtext} +% ... +% \end{verbatim} +% In the first two lines above the lemma is in arabic and the note +% is in what looks like (to me at least) arabic, but it is all messed up. +% In the last line both the lemma and the note are +% in arabic. +% +% \DescribeMacro{\arablnumrep} +% \DescribeMacro{\restorelnumrep} +% Line numbers are normally typeset in latin script arabic numerals and LtoR. +% Following the \cs{arablnumrep} declaration they will be typeset in +% arabic script numerals and RtoL. The \cs{restorelnumrep} ensures the +% regular line numbers. Use the declarations like: +% \begin{verbatim} +% \arablnumrep +% \begin{arabtex} ... \end{arabtex} +% \restorelnumrep +% \end{verbatim} +% +% \DescribeMacro{\latinarabic} +% \DescribeMacro{\arabiclatin} +% Arabic script naturally has a greater height or leading +% (larger \cs{baselineskip}) +% than latin text. Parallel normal texts and parallel arabic texts align +% naturally, as do parallel columns of latin/arabic or arabic/latin texts. +% However, left to their own devices pages of parallel arabic and +% normal text will not align. +% +% If you are setting normal text on the left pages and arabic script +% on the right using the \cs{latinarabic} declaration should align them. +% Similarly when you have arabic script on the left and latin script +% on the right use the \cs{arabiclatin} declaration. +% +% \DescribeMacro{\ledarabstrut} +% \DescribeMacro{\savestruts} +% \DescribeMacro{\restorestruts} +% The \cs{ledarabstrut} strut is the height of a line of arabic script +% and is used to increase the height of latin text lines to match +% arabic script lines. The definition is: \\ +% \verb?\newcommand*{\ledarabstrut}{\rule[-1ex]{0pt}{4ex}}? \\ +% If it does not quit match the arabic script in your case then change the +% \verb?4ex? appropriately. +% +% The macro \cs{savestruts} saves the current definitions of the struts +% used in the left and right texts (\cs{latinarabic} and \cs{arabiclatin} +% change these). The macro \cs{restorestruts} set the definitions of the +% left and right struts to match those stored by the last \cs{savestruts}. +% The package calls \cs{savestruts} itself to store the default struts. +% +% For example, with regular text on the left and arabic on the right +% then the general scheme is: +% \begin{verbatim} +% \savestruts +% \begin{pages} +% \begin{Leftside} +% \beginnumbering +% \pstart +% normal text +% ... +% \end{Leftside} +% \begin{Rightside} +% \begin{arabtext} +% \beginnumbering +% \pstart +% arabic text +% ... +% \end{Rightside} +% \latinarabic +% \Pages +% \restorestruts +% \end{pages} +% \end{verbatim} +% +% In the above, if it had been: \\ +% \verb?\begin{arabtext}?\\ +% \verb? \Pages?\\ +% \verb?\end{arabtext}?\\ +% Then a redefinition of \cs{ledarabstrut} as: \\ +% \verb?\renewcommand*{\ledarabstrut}{\rule[-1ex]{0pt}{3.75ex}}? \\ +% might provide better alignment of the latin text with the arabic. +% +% Life gets complicated regarding lemmas and notes when there are +% parallel latin and arabic texts. +% Consider that there are the following left (latin) and right (arabic) texts +% \begin{verbatim} +% \begin{Leftside} +% ... +% 1) \edtext{latin}{\Afootnote{roman}}... +% 2) \edtext{\RL{latin}}{\Afootnote{\RL{roman}}}... +% 3) \edtext{\LR{latin}}{\Afootnote{\LR{roman}}}... +% ... +% \end{Leftside} +% \begin{Rightside} +% \begin{arabtext} +% ... +% A) \edtext{script}{\Bfootnote{arabic}}... +% B) \edtext{script}{\Bfootnote{\RL{arabic}}}... +% C) \edtext{script}{\Bfootnote{\LR{arabic}}}... +% ... +% \end{Rightside} +% \end{verbatim} +% and they are to be output as matching pages. If they are output simply as: \\ +% \verb?\Pages? \\ +% then the lemmas and notes for the marked lines are: \\ +% 1) latin lemma, latin note \\ +% 2) arabic lemma, arabic note \\ +% 3) latin lemma, latin note \\ +% A) arabic lemma, latin note \\ +% B) arabic lemma, arabic note \\ +% C) arabic lemma, latin note +% +% On the otherhand, if they are output via: \\ +% \verb?\begin{arabtext} \Pages \end{arabtext}? \\ +% then the lemmas and notes for the marked lines are: \\ +% 1) latin lemma, messed arabic note \\ +% 2) arabic lemma, arabic note \\ +% 3) latin lemma, messed arabic note \\ +% A) arabic lemma, messed arabic note \\ +% B) arabic lemma, arabic note \\ +% C) arabic lemma, messed arabic note +% +% +% \StopEventually{% +% ^^A \addcontentsline{toc}{section}{\protect\numberline{B}Index} +% \addcontentsline{toc}{section}{Index} +% \PrintIndex +% ^^A \addtocontents{toc}{\protect\end{multicols}} +% } +% +% \section{The \Lpack{afoot} implementation} +% \label{afootimpl} +% +% The \Lafoot{} package is effectively an extraction from +% the \Lpack{alatex} package of \ArabTeX, v3.10, 2000/05/08. +% +% Announce the name and version of the package, which is +% targetted for LaTeX2e. +% +% \begin{macrocode} +%<*afoot> +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{afoot}[2005/03/24 v0.1 PW's version of ArabTeX's afoot.sty] + +% \end{macrocode} +% +% The package redefines the internals of the LaTeX \cs{footnote} macro +% along the lines of the \cs{vfootnote} macro in \PlainTeX. It also +% does some things a bit differently if the \Lpack{fnpara} package +% has been used. +% +% \begin{macro}{\@makefntext} +% I don't know why this is here as it is also defined as part of the +% \cs{@footnotetext} macro below. +% \begin{macrocode} +\ifx \footglue \undefined % normal case +\else % fnpara.sty is present + \long\def\@makefntext#1{{$^{\@thefnmark}$}#1\nobreak } +\fi + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@footnotetext} +% \begin{macrocode} +%%% Make the LaTeX \cs{footnote} catcode-safe, like in Plain TeX. + +\def \@footnotetext {% new, do not yet read footnote text + \insert \footins \bgroup + \ifx \footglue \undefined % prepare normal footnote + \interlinepenalty \interfootnotelinepenalty \floatingpenalty \@MM + \splittopskip \footnotesep \splitmaxdepth \dp \strutbox + \else + \global\long\def \@makefntext ##1{{$^{\@thefnmark }$}##1\nobreak }% + \setbox0=\hbox \bgroup % fnpara.sty is present + \floatingpenalty=20000 \footnotesize + \fi + \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}% + \a@fntext } + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@mpfootnotetext} +% The version for \env{minpage}s. +% \begin{macrocode} +\def \@mpfootnotetext {% + \global \setbox \@mpfootins \vbox \bgroup + \edef \@currentlabel {\csname p@mpfootnote\endcsname \@thefnmark }% + \unvbox \@mpfootins \reset@font \a@fntext } + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\a@fntext} +% A common portion of the code for the footnote text in both normal and +% \env{minipage} environments. +% \begin{macrocode} +\def \a@fntext {% common part for footnote text + \footnotesize \hsize \columnwidth \@parboxrestore \clubpenalty 5000 + \@makefntext {\rule {\z@ }{\footnotesep }}\futurelet \next \fo@t } + +% \end{macrocode} +% \end{macro} +% +% The next set of macros are from the \cs{vfootnote} macro +% (\textit{The TeXbook}, Appendix B) +% \begin{macro}{\fo@t} +% Copy from \textit{TeXbook}. +% \begin{macrocode} +%%%%%%%%%%%%%%%%%%%%%%%% \footnote, parts from Plain %%%%%%%%%%%%%%%%% + +\def\fo@t{% + \ifcat + \bgroup \noexpand\next + \let\next\f@@t + \else + \let\next\f@t + \fi + \next } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\f@@t} +% Copy from \textit{TeXbook}. +% \begin{macrocode} +\def\f@@t{\bgroup\aftergroup\@foot\let\next} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\f@t} +% Copy from \textit{TeXbook}. +% \begin{macrocode} +\def\f@t#1{#1\@foot} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@foot} +% This has a bit more to it than the \textit{TeXbook} macro. +% \begin{macrocode} +\def\@foot{\unskip \strut \lineskiplimit -20pt \endgraf \egroup } + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\a@footnote} +% \begin{macro}{\@foot} +% \begin{macro}{\@footnotemark} +% These macros are for normal footnotes from within an arabic environment. +% \begin{macrocode} +%%%%%%%%% footnote inside an Arabic environment, Roman document style + +\def\a@footnote{% + \def\@foot{% ArabTeX-LaTeX version + \ifx \footglue \undefined % normal case + \unskip \strut + \else % fnpara.sty is present + \penalty-10 \hskip\footglue \egroup % box 0 + \dp0=0pt \ht0=\fudgefactor\wd0 \box0 + \fi + \egroup \arab@codes \set@arabfont \test@token }% + \def\@footnotemark{\af@fnmarkb@x \a@spacetrue}% + \rmfamily \parindent \a@parindent \unarab@codes \footnote } + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\af@fnmarkb@x} +% This saves some tokens as the code is used in several places. +% \begin{macrocode} +\def\af@fnmarkb@x{% + \a@spacefalse \putword@box \@makefnmark} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\a@footnotemark} +% \begin{macro}{\@footnotemark} +% These are also for normal footnotes from within an arabic environment. +% \begin{macrocode} +\def\a@footnotemark{% + \def\@footnotemark{\af@fnmarkb@x \a@spacefalse \arab@codes \test@token}% + \unarab@codes \footnotemark } + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\a@@footnote} +% \begin{macro}{\@footnotemark} +% \begin{macro}{\a@fntext} +% These macros are for arabic footnotes from within an arabic environment. +% \begin{macrocode} +%%%%%%%%% footnote inside an Arabic environment, Arabic document style + +\def\a@@footnote{% ArabTeX-LaTeX version + \def\@footnotemark{\af@fnmarkb@x \a@spacetrue}% + \def\a@fntext{\a@@fntext }% + \footnote } + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\a@@fntext} +% This is also for arabic footnotes, being the common portion of the code +% for footnote text in both normal and \env{minipage} texts. +% \begin{macrocode} +\def\a@@fntext#1{% some common code for footnote text + \def\end{% + \a@par \egroup \test@token }% + \hsize \columnwidth \@parboxrestore + \initlineb@x \@footnotemark \test@token #1 \end } + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\a@@footnotemark} +% \begin{macro}{\@footnotemark} +% As are these. +% \begin{macrocode} +\def\a@@footnotemark{% + \def\@footnotemark{\af@fnmarkb@x \a@spacetrue \test@token}% + \footnotemark } + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\LRfootnotes} +% Inside an \env{arabtext} environment the \cs{LRfootnotes} declaration +% results in normal footnotes, left adjusted. +% \begin{macrocode} +\def \LRfootnotes {% left to right, Arabic document + \let \a@c@footnote \a@footnote + \let \a@c@footnotemark \a@footnotemark } +\all@wcmd \LRfootnotes + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\RLfootnotes} +% Inside an \env{arabtext} environment the \cs{RLfootnotes} declaration +% results in arabic footnotes, right adjusted. In normal text the footnotes +% are normal. +% \begin{macrocode} +\def \RLfootnotes {% right to left, Arabic document + \let \a@c@footnote \a@@footnote + \let \a@c@footnotemark \a@@footnotemark } +\all@wcmd \RLfootnotes +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\arabfootnotes} +% \cs{arabfootnotes} is an alias for \cs{RLfootnotes}. +% \begin{macrocode} +\let \arabfootnotes \RLfootnotes +\all@wcmd \arabfootnotes + +% \end{macrocode} +% \end{macro} +% +% Make \cs{LRfootnotes} the default. +% \begin{macrocode} +\LRfootnotes + +% \end{macrocode} +% +% The end of the package +% +% \begin{macrocode} +%</afoot> +% \end{macrocode} +% +% +% \section{The \Lpack{ledarab} implementation} +% \label{ledarabimpl} +% +% The \Lledarab{} package is based on the original \Lpack{aedpatch} +% from the \ArabTeX{} distribution. +% +% Announce the name and version of the package, which is for LaTeX2e. +% +% \begin{macrocode} +%<*ledarab> +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{ledarab}[2005/03/24 v0.1 Cooperation between arabtex and ledmac] + +% \end{macrocode} +% +% \begin{macro}{\tr@ce@n} +% \begin{macro}{\tr@ce@ff} +% I think, but don't know, that by appropriate (re)definitions of these +% you can get \Larabtex{} +% to produce some tracing of what is going on, perhaps by setting +% \cs{tracingmacros} to 1 instead of 0. +% \begin{macrocode} +\providecommand*{\tr@ce@n}{\tracingmacros 0} +\providecommand*{\tr@ce@ff}{\edef \tr@ce@n + {\nxp\tracingmacros \the\tracingmacros }\tracingmacros 0} +\let \tr@ce@n \relax + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\if@l@dparpack} +% \begin{macro}{\@l@dparpacktrue} +% \begin{macro}{\@l@dparpackfalse} +% We need a flag for knowing if \Ledpar{} is being used. +% \begin{macrocode} +\newif\if@l@dparpack + \@l@dparpackfalse +\@ifpackageloaded{ledpar}{\@l@dparpacktrue}{\@l@dparpackfalse} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Adjusting the baselines} +% +% \begin{macro}{\do@linehook} +% Arabic lines are taller than roman lines, so add some height to +% numbered lines. +% \begin{macrocode} +\renewcommand*{\do@linehook}{% + \advance\baselineskip 1ex} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{arabledparfixi} +% If the \Ledpar{} package is loaded we have to change several of its +% macros. We can't do this simply within an \cs{if@l@dparpack} because +% of the internal \cs{if}s. Hence, we define a macro whose expansion +% is the necessary changes. +% +% \begin{macrocode} +%%%%%%%%%%%%%%%%%%%%% ledpar fix %%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand{\arabledparfixi}{% +% \end{macrocode} +% \begin{macro}{\do@lineLhook} +% \begin{macro}{\do@lineRhook} +% Increase the height of numbered lines. +% \begin{macrocode} +\renewcommand*{\do@lineLhook}{% + \advance\baselineskip 1ex} +\renewcommand*{\do@lineRhook}{% + \advance\baselineskip 1ex} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\a@l@dparparamsL} +% \begin{macro}{\a@l@dparparamsR} +% Variations on \cs{a@parparams} from \ArabTeX's \file{aoutput.sty}. +% These are required to take account of the differing widths, by setting +% \cs{a@hsize} appropriately. +% \begin{macrocode} +\newcommand*{\a@l@dparparamsL}{% + \ifnum \parshape = \z@ + \a@hsize \Lcolwidth + \a@leftmargin \z@ + \else + \a@hsize \Lcolwidth \a@leftmargin \@totalleftmargin + \fi + \a@leftmargin \z@ + \a@prevgraf \z@ \spreadfalse } +\newcommand*{\a@l@dparparamsR}{% + \ifnum \parshape = \z@ + \a@hsize \Rcolwidth + \a@leftmargin \z@ + \else + \a@hsize \Rcolwidth \a@leftmargin \@totalleftmargin + \fi + \a@leftmargin \z@ + \a@prevgraf \z@ \spreadfalse } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\Leftsidehook} +% \begin{macro}{\Rightsidehook} +% +% \begin{macrocode} +\renewcommand*{\Leftsidehook}{% + \let\a@parparams\a@l@dparparamsL} +\renewcommand*{\Rightsidehook}{% + \let\a@parparams\a@l@dparparamsR} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ledarabstrut} +% \begin{macro}{\ledstrutL} +% \begin{macro}{\ledstrutR} +% \begin{macro}{\savestruts} +% \begin{macro}{\restorestruts} +% \begin{macro}{\latinarabic} +% \begin{macro}{\arabiclatin} +% In order to get parallel arabic and normal texts to line up +% a strut has to be added to each latin line to hide their different heights; +% this is \cs{ledarabstrut}. The commands \cs{savestruts} and +% \cs{restorestruts} save and restore the original left/right strut +% definitions. The declaration \cs{latinarabic} is for left and right texts +% being latin and arabic, and for left arabic and right latin use +% \cs{arabiclatin}. +% \begin{macrocode} +\newcommand*{\ledarabstrut}{% + \rule[-1ex]{0pt}{4ex}} +\newcommand*{\savestruts}{% + \let\oldl@dstr@tL\ledstrutL + \let\oldl@dstr@tR\ledstrutR} +\newcommand*{\restorestruts}{% + \let\ledstrutL\oldl@dstr@tL + \let\ledstrutR\oldl@dstr@tR} +\newcommand*{\latinarabic}{% + \def\ledstrutL{\ledarabstrut}% + \def\ledstrutR{}} +\newcommand*{\arabiclatin}{% + \def\ledstrutL{}% + \def\ledstrutR{\ledarabstrut}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% At last, the end of \cs{arabledparfixi}. +% \begin{macrocode} +}% end of \newcommand{\arabledparfixi}{... + +% \end{macrocode} +% \end{macro} +% +% Perform the fix for \Ledpar{} if necessary. +% \begin{macrocode} +\if@l@dparpack + \arabledparfixi + \savestruts +\fi +%%%%%%%%%%%%%%%%%%%%% end major ledpar fix %%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% \end{macrocode} +% \end{macro} +% +% \subsection{Lemmas} +% +% \begin{macro}{\a@c@edtext} +% This is the internal version of \cs{edtext}. The parameters +% have their original catcodes. +% \begin{macrocode} +\newcommand*{\a@c@edtext}{% + \tr@ce@n \leavea@vmode \unarab@codes +\begingroup + \tr@ce@ff \rmfamily \tr@ce@n \a@@edtext} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\a@@edtext} +% An auxiliary routine to kill leading blanks and remove spurious braces +% from \cs{edtext}'s second argument. +% \begin{macrocode} +\newcommand*{\a@@edtext}[1]{% +%%% \def\next@command{\a@@@edtext {\RL{#1}}}% causes errors + \def\next@command{\a@@@edtext {#1}}% + \futurelet \next@token \test@space } + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\a@edget@text} +% Get flags and lemma. +% \begin{macrocode} +\def\a@edget@text #1\@@{% + \a@edappend{\flag@start}\a@@Linsert{#1}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\a@edend@lemma} +% Another utility routine. +% \begin{macrocode} +\newcommand*{\a@edend@lemma}{% + \ifx\end@lemmas\empty \else + \gl@p\end@lemmas\to\x@lemma + \x@lemma + \global\let\x@lemma=\relax + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\a@edput@text} +% Unpack \cs{Linsertb@x}. +% \begin{macrocode} +\newcommand*{\a@edput@text}{% + \a@Lunpack \putwordb@x {\ins@skip }} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\a@edappend} +% \cs{a@edappend}\marg{arg} adds its argument to the \cs{lineb@x}. +% \begin{macrocode} +\newcommand*{\a@edappend}[1]{% + \setbox \lineb@x \hbox {\unhbox \lineb@x #1}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\a@@@edtext} +% The meat of it all +% \begin{macrocode} +\newcommand{\a@@@edtext}[2]{ + \no@expands + \def\next@command{\test@special}% +%%% \xdef \@tag{#1}\set@line % the original produces roman in notes +%%% \def\@@@tag{\RL{#1}} \xdef\@tag{\@@@tag}\set@line % produces errors + \xdef \@tag{{\RL{#1}}}\set@line% produces arabic in notes GOOD ONE!! + \global\insert@count=0 + \aftergroup \a@edget@text + \ignorespaces #2\relax +\endgroup +%%% #1\a@edend@lemma \@@ %% gives roman in arabic text + \showlemma{#1}\a@edend@lemma \@@% GOOD ONE + \a@edput@text \a@edappend {\flag@end }% + \arab@codes + \a@spacetrue +\tr@ce@ff \test@token} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\showlemma} +% Modify \cs{showlemma}\marg{lemma} so that its argument is set RtoL in +% arabic text, otherwise as normal. The setting of the \meta{lemma} in +% the notes is controlled independently. +% \begin{macrocode} +\renewcommand{\showlemma}[1]{% + \ifin@arab\RL{#1}\else #1\fi} % arabic in text, but roman in notes + +% \end{macrocode} +% \end{macro} +% +% \subsection{Line numbering} +% +% \begin{macro}{\beginnumbering} +% \begin{macro}{\endnumbering} +% Enable \cs{beginnumbering} and \cs{endnumbering} to be used directly in +% arabic text, though I don't know if this is useful. +% \begin{macrocode} +\all@wcmd{\beginnumbering} +\all@wcmd{\endnumbering} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\beginnumberingR} +% \begin{macro}{\endnumberingR} +% Similarly, if \Ledpar{} is used, for numbering in parallel Right texts. +% \begin{macrocode} +\if@l@dparpack + \all@wcmd{\beginnumberingR} + \all@wcmd{\endnumberingR} +\fi + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\a@par} +% \begin{macro}{\a@@par} +% \begin{macrocode} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\let\a@par=\a@@par % save for \a@@everypar in \a@c@autopar + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\pstart} +% \begin{macro}{\pend} +% Arabic(?) forms for \cs{pstart} and \cs{pend}. +% \begin{macrocode} +\def\a@c@pstart{\pstart \test@token} +\def\a@c@pend{\a@par \pend \a@par \test@token} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\a@c@autopar} +% Arabic(?) form of \cs{autopar} (but the original \cs{autopar} has some +% limitations and can cause unexpected problems). +% \begin{macrocode} +\def\a@c@autopar{% use inside Arabic environment +\ifnumbering \else \errmessage + {\string\autopar\space must be used within a numbered section}% + \beginnumbering +\fi +\a@@everypar= {\setbox0 = \box \lineb@x \let \next \test@token + \a@par \pstart % starts a group + \def \a@@par {\a@par \pend \a@par }% + \def \end {\a@par \pend \test@token \end }% + \a@@everypar= {}\arab@indent }% +\a@spacefalse \test@token} + +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@arabic} +% \begin{macro}{\arablinenumr@p} +% Provide \cs{@arabic} (for setting numbers to be typeset as arabic +% numerals in the latin script) +% as an arabic macro. \cs{arablinenumr@p}\marg{num} typesets \marg{num} +% as arabic numerals in the arabic script (and RtoL). +% \begin{macrocode} +\all@w@ne{\@arabic} +\newcommand*{\arablinenumr@p}[1]{\RL{\@arabic{#1}}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\linenumrep} +% \begin{macro}{\sublinenumrep} +% \begin{macro}{\arablnumrep} +% \begin{macro}{\restorelnumrep} +% Ensure that \cs{linenumrep} and \cs{sublinenumrep} typeset (sub)line numbers +% as normal LtoR arabic in latin script. The declaration \cs{arablnumrep} +% causes line numbers to be typeset RtoL in arabic script and +% \cs{restorelnumrep} puts them back to LtoR in latin script. +% \begin{macrocode} +\def\linenumrep#1{\LR{\@arabic{#1}}} +\let\oldlinenumrep\linenumrep +\def\sublinenumrep#1{\LR{\@arabic{#1}}} +\let\oldsublinenumrep\sublinenumrep +\newcommand*{\arablnumrep}{\global\let\linenumrep\arablinenumr@p + \global\let\sublinenumrep\arablinenumr@p} +\newcommand*{\restorelnumrep}{\global\let\linenumrep\oldlinenumrep + \global\let\sublinenumrep\oldsublinenumrep} +\all@wcmd{\arablnumrep} +\all@wcmd{\restorelnumrep} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\linenumrepR} +% \begin{macro}{\sublinenumrepR} +% \begin{macro}{\arablnumrepR} +% \begin{macro}{\restorelnumrepR} +% If \Ledpar{} is used, similarly for Right texts. +% \begin{macrocode} +\if@l@dparpack + \def\linenumrepR#1{\LR{\@arabic{#1}}} + \let\oldlinenumrepR\linenumrepR + \def\sublinenumrepR#1{\LR{\@arabic{#1}}} + \let\oldsublinenumrepR\sublinenumrepR + \newcommand*{\arablnumrepR}{\global\let\linenumrepR\arablinenumr@p + \global\let\sublinenumrepR\arablinenumr@p} + \newcommand*{\restorelnumrepR}{\global\let\linenumrepR\oldlinenumrepR + \global\let\sublinenumrepR\oldsublinenumrepR} + \all@wcmd{\arablnumrepR} + \all@wcmd{\restorelnumrepR} +\fi + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{More critical commands in arabic text} +% +% \begin{macro}{\edlabel} +% \begin{macro}{\edpageref} +% \begin{macro}{\xpageref} +% \begin{macro}{\lineref} +% \begin{macro}{\xlineref} +% \begin{macro}{\sublineref} +% \begin{macro}{\xsublineref} +% Allow more ledmac commands in Arabic text. These take no parameters. +% \begin{macrocode} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\all@w@ne{\edlabel} +\all@w@ne{\edpageref} +\all@w@ne{\xpageref} +\all@w@ne{\lineref} +\all@w@ne{\xlineref} +\all@w@ne{\sublineref} +\all@w@ne{\xsublineref} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\edindex} +% \begin{macro}{\typeout} +% And more, taking one parameter. +% \begin{macrocode} +\all@w@ne{\edindex} +\all@w@ne{\typeout} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\edmakelabel} +% \begin{macro}{\xxref} +% And more, taking two parameters. +% \begin{macrocode} +\all@wtw@{\edmakelabel} +\all@wtw@{\xxref} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\Columns} +% \begin{macro}{\Pages} +% Also enable \cs{Columns} and \cs{Pages} as arabic text commands. +% \begin{macrocode} +\if@l@dparpack + \all@wcmd{\Columns} + \all@wcmd{\Pages} +\fi + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \section{The End}\label{end} +% +% This is the end of the package code, but first use \file{ledarabpatch.sty} +% if it exists. +% +% \begin{macrocode} +\InputIfFileExists{ledarabpatch.sty} + +%</ledarab> +% \end{macrocode} +% +% \appendix +% \section{Examples} +% +% This section presents some sample documents. +% +% The figures are from processed versions of the files. Having latexed +% a file I used \texttt{dvips} to get Encapsulated PostScript, then +% the \texttt{epstopdf} script to get a PDF version as well. For example: +% \begin{verbatim} +% > latex egarab +% > latex egarab +% > latex egarab +% > dvips -E -o egarab.eps egarab % produces egarab.eps +% > epstopdf egarab.eps % produces egarab.pdf +% \end{verbatim} +% +% For those who aren't fascinated by LaTeX code I show the typeset +% results first, then the code that produced them. I know nothing +% about arabic so these are not part of any publishable work and are +% unlikely to have any connection with the arabic language. +% +% \clearpage +% +% \begin{figure} +% \begin{addtomargins}{-2cm}{-2cm} +% \centering +% \includegraphics{egarab} +% \caption{Output from \texttt{egarab.tex}} \label{egarab-out} +% \end{addtomargins} +% \end{figure} +% +% \begin{figure} +% \begin{addtomargins}{-2cm}{-2cm} +% \centering +% \includegraphics{egarabpar} +% \caption{Output from \texttt{egarabpar.tex}} \label{egarabpar-out} +% \end{addtomargins} +% \end{figure} +% +% \clearpage +% +% \subsection{General example} +% +% The result of the following code is shown in Figure~\ref{egarab-out}. +% The arabic script is nonsensical to anyone who can read Arabic +% as it is just the English text represented using the arabic script. +% +% The example illustrates a variety of critical notes, including one +% that is all messed up just to show that some things do not work. +% +% \medskip +% \hrule +% \medskip +% +% \begin{macrocode} +%<*egarab> +%%% egarab.tex +\documentclass[12pt]{article} +\addtolength{\textheight}{-10\baselineskip} +\usepackage{ledmac} +\setcounter{firstlinenum}{1} \setcounter{linenumincrement}{1} +\linenummargin{right} + +\usepackage{arabtex} +\usepackage{ledarab} + +\begin{document} + +Can we have non-arabic text in \verb?\edtext? + +\beginnumbering +\pstart +\noindent +In \edtext{roman}{\Afootnote{not arabic}} text you +can have critical notes. \\ +In \edtext{\RL{Arabic text}}{\Afootnote{not roman}} you +can have critical notes. \\ +In \edtext{latin}{\Afootnote{\RL{Arabic text --- footnote}}} you +can have critical notes. \\ +In \edtext{\RL{Arabic text}}{\Afootnote{\RL{Arabic text --- footnote}}} you +can have critical notes. +\pend +\endnumbering + +Here the order is \verb?\beginnumbering \pstart \begin{arabtext} ...? + +\beginnumbering +\pstart +\begin{arabtext} +ledmac is wonderful and so +%%% arabic lemma, latin note +\edtext{Arabic text}{\Bfootnote{Arabic text --- footnote}} is arabtex\\ +%%% arabic lemma, arabic note +and \edtext{Arabic text}{\Bfootnote{\RL{Arabic text --- footnote}}} you +can do critical notes here. +\end{arabtext} +\pend +\endnumbering + +Here the order is \verb?\beginnumbering \begin{arabtext} \pstart...? + +\arablnumrep +\beginnumbering +\begin{arabtext} +\pstart +ledmac is wonderful and so +%%% arabic lemma, screwed up arabic note +\edtext{Arabic text}{\Cfootnote{Arabic text --- footnote}} is arabtex\\ +%%% arabic lemma, arabic note +and \edtext{Arabic text}{\Cfootnote{\RL{Arabic text --- footnote}}} you +can do critical notes here. +\pend +\end{arabtext} +\endnumbering +\restorelnumrep + +\end{document} +%</egarab> +% \end{macrocode} +% +% \subsection{Parallel example} +% +% The result of the following code for parallel typesetting is shown +% in Figure~\ref{egarabpar-out}. +% The left and right inputs are the same. In this case the arabic script +% should make sense to an Arabic reader while the English text is the +% input that would produceds the arabic if it were inside the \texttt{arabtex} +% environment. The text for the example is from \file{omar.tex} in the +% \ArabTeX{} distribution; I do not know what it means. +% +% The two examples are virtually the same except that in the second the +% numbering is in arabic script instead of latin script. Note that +% the usual variety of footnotes can be used for arabic texts as well +% as western texts. +% +% \medskip +% \hrule +% \medskip +% +% \begin{macrocode} +%<*egarabpar> +%%% egarabpar.tex ledmac & parallel arabic text +\documentclass[12pt]{article} +\addtolength{\textheight}{-4\baselineskip} +\usepackage{ledmac} +\usepackage{ledpar} +\setcounter{firstlinenum}{1} \setcounter{linenumincrement}{1} +\usepackage{arabtex} +\usepackage{ledarab} +%% +% simple right text arabic script numbering version of \printlines +\makeatletter +\def\printlinesAR#1|#2|#3|#4|#5|#6|#7|{\begingroup + \setprintlines{#1}{#2}{#3}{#4}{#5}{#6}% + \ifl@d@pnum #1\fullstop\fi + \ifledplinenum \RL{#2}\Rlineflag\else \symplinenum\fi + \endgroup} +\makeatother + +%%% We will use the Bfootnote series for the arabic right texts, +%%% in paragraph style +\footparagraph{B} + +%%% right text numbering +\let\oldBfootfmt\Bfootfmt +\renewcommand{\Bfootfmt}[3]{% + \let\printlines\printlinesR + \oldBfootfmt{#1}{#2}{#3}} + +\begin{document} + +Here is an example pair of texts. The arabic version is on the right. + +\vspace{\baselineskip} + +\begin{pairs} + +\begin{Leftside} +\beginnumbering +\pstart +\noindent +gUyand kasAn behe \edtext{st}{\Afootnote{Western side}} bA .hUr hOs ast \\ +man mIgUyam keh 'Ab-i angUr hOs ast \\ +In naqd begIr wa-dast az 'An nesiyeh bedAr \\ +k-'AwAz-i dohol sanIdan az dUr hOs ast. +\pend +\end{Leftside} + +\renewcommand{\Rlineflag}{r} % writes r in latin +\begin{Rightside} +\firstlinenum{2} \linenumincrement{2} +\begin{arabtext} +\beginnumbering +\pstart +\noindent +gUyand kasAn behe \edtext{st}{\Bfootnote{Eastern side}} bA .hUr hOs ast \\ +man mIgUyam keh 'Ab-i angUr hOs ast \\ +In naqd begIr wa-dast az 'An nesiyeh bedAr \\ +k-'AwAz-i dohol sanIdan az dUr hOs ast. +\pend +\end{arabtext} +\end{Rightside} + +\Columns + +\end{pairs} + +\vspace{\baselineskip} + +The same texts but more oriented towards arabic. + +\vspace{\baselineskip} + +\begin{pairs} + +\begin{Leftside} +\pstart +\noindent +gUyand kasAn behe st bA .hUr hOs ast \\ +man mIgUyam \edtext{keh}{\Afootnote{\RL{Western side}}} 'Ab-i angUr hOs ast \\ +In naqd begIr wa-dast az 'An nesiyeh bedAr \\ +k-'AwAz-i dohol sanIdan az dUr hOs ast. +\pend +\endnumbering +\end{Leftside} + +%%% right full arabic note numbering +\renewcommand{\Bfootfmt}[3]{% + \let\printlines\printlinesAR + \oldBfootfmt{#1}{#2}{#3}} +\renewcommand{\Rlineflag}{\RL{r}} % writes r in arabic + +\begin{Rightside} +\firstlinenum{1} \linenumincrement{1} +\arablnumrepR % changes the number to arabic +\begin{arabtext} +\pstart +\noindent +gUyand kasAn behe st bA .hUr hOs ast \\ +man mIgUyam \edtext{keh}{\Bfootnote{\RL{Eastern side}}} 'Ab-i angUr hOs ast \\ +In naqd begIr wa-dast az 'An nesiyeh bedAr \\ +k-'AwAz-i dohol sanIdan az dUr hOs ast. +\pend +\endnumbering +\end{arabtext} +\end{Rightside} + +\begin{arabtext} +\Columns +\end{arabtext} + +\end{pairs} + +\end{document} +%</egarabpar> +% \end{macrocode} +% +% +% +% \bibliographystyle{alpha} +% \begin{thebibliography}{WWW99} +% \raggedright +% +% \bibitem[Lag99]{ARABTEX} +% Klaus Lagally. +% \newblock \emph{ArabTeX: A system for typesetting arabic: Draft User Manual}, +% \newblock July 1999. +% \newblock (Available from CTAN in +% \texttt{macros/latex/contrib/arabtex}) +% +% +% \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[Wil04a]{LEDMAC} +% Peter Wilson. +% \newblock \emph{\Lpack{ledmac}: A presumptuous attempt to port \Lpack{EDMAC}, +% \Lpack{TABMAC} and \Lpack{EDSTANZA} to LaTeX}. +% \newblock May 2004. +% \newblock (Available from CTAN in +% \texttt{macros/latex/contrib/ledmac}) +% +% \bibitem[Wil04b]{LEDPAR} +% Peter Wilson. +% \newblock \emph{Parallel typesetting for critical editions: +% the \Lpack{ledpar} package}. +% \newblock December 2004. +% \newblock (Available from CTAN in +% \texttt{macros/latex/contrib/ledmac}) +% +% \end{thebibliography} +% +% \Finale +% +% \PrintIndex +% \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 \~} +%% diff --git a/Master/texmf-dist/source/latex/ledmac/ledarab.ins b/Master/texmf-dist/source/latex/ledmac/ledarab.ins new file mode 100644 index 00000000000..2ebee3f55ea --- /dev/null +++ b/Master/texmf-dist/source/latex/ledmac/ledarab.ins @@ -0,0 +1,83 @@ +%% ledarab.ins +%% Author: Peter Wilson (Herries Press) herries dot press at earthlink dot net +%% Copyright 2005 Peter R. Wilson +%% +%% 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 "author-maintained". +%% +%% This work consists of the files listed in the README file. +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this work when run through +%% LaTeX. +%% +%% +%% --------------- start of docstrip commands ------------------ +%% +\def\batchfile{ledarab.ins} +\input docstrip.tex +\preamble + + Author: Peter Wilson (Herries Press) herries dot press at earthlink dot net + Copyright 2005 Peter R. Wilson + + 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 "author-maintained". + + This work consists of the files listed in the README file. + +\endpreamble + +\keepsilent + +%%% \Msg{*** Generating the driver file ***} +%%% \generateFile{ledarab.drv}{t}{\from{ledarab.dtx}{driver}} + +\Msg{*** Generating the LaTeX2e package files ***} + +\generateFile{afoot.sty}{t}{\from{ledarab.dtx}{afoot}} +\generateFile{ledarab.sty}{t}{\from{ledarab.dtx}{ledarab}} + +\Msg{*** Generating the example files ***} + +\generateFile{egarab.tex}{t}{\from{ledarab.dtx}{egarab}} +\generateFile{egarabpar.tex}{t}{\from{ledarab.dtx}{egarabpar}} + + +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* file(s) into a directory searched by LaTeX. See the FAQ on} +\Msg{* CTAN at /help/uk-tex-faq for more on this.} +\Msg{*} +\Msg{* \space\space afoot.sty} +\Msg{* \space\space ledarab.sty} +\Msg{*} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.dtx' through LaTeX.} +\Msg{* For an index, process any name.idx file by:} +\Msg{* \space\space\space\space makeindex -s gind.ist name} +\Msg{* For a list of changes, process any name.glo file by:} +\Msg{* \space\space\space\space makeindex -s gglo.ist -o name.gls name.glo} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} + +\endinput diff --git a/Master/texmf-dist/source/latex/ledmac/ledmac.dtx b/Master/texmf-dist/source/latex/ledmac/ledmac.dtx new file mode 100644 index 00000000000..89af4d40465 --- /dev/null +++ b/Master/texmf-dist/source/latex/ledmac/ledmac.dtx @@ -0,0 +1,13746 @@ +% \iffalse meta-comment +% +% ledmac.dtx +% Author: Peter Wilson (Herries Press) herries dot press at earthlink dot net +% Copyright 2003 -- 2005 Peter R. Wilson +% +% 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 "author-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} +\providecommand{\phantomsection}{} % just in case hyperref is not used +\usepackage{graphicx} +\makeatletter + \@mparswitchfalse +\makeatother +\EnableCrossrefs +\CodelineIndex +%%\OnlyDescription +\renewcommand{\MakeUppercase}[1]{#1} +\pagestyle{headings} +\setcounter{StandardModuleDepth}{1} +\setcounter{IndexColumns}{2} +\begin{document} + \raggedbottom + \DocInput{ledmac.dtx} +\end{document} +%</driver> +% +% \fi +% +% \CheckSum{9036} +% +% \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{ledmac.dtx}} +% \def\fileversion{v0.1} \def\filedate{2003/03/25} +% \def\fileversion{v0.2} \def\filedate{2003/08/16} +% \def\fileversion{v0.21} \def\filedate{2003/09/13} +% \def\fileversion{v0.22} \def\filedate{2003/11/09} +% \def\fileversion{v0.3} \def\filedate{2004/02/14} +% \def\fileversion{v0.31} \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.51} \def\filedate{2004/04/10} +% \def\fileversion{v0.6} \def\filedate{2004/12/10} +% \def\fileversion{v0.7} \def\filedate{2005/03/24} +% +% \changes{v0.1}{2003/03/25}{First public release} +% \changes{v0.2}{2003/08/16}{Added tabmac code, and extended indexing} +% \changes{v0.21}{2003/09/13}{Bug fixes and match with mempatch v1.8} +% \changes{v0.22}{2003/11/09}{Improved paragraph footnotes} +% \changes{v0.22}{2003/11/09}{New Dekker example} +% \changes{v0.3}{2004/02/14}{Includes edstanza and more} +% \changes{v0.31}{2004/02/18}{Not released. Added remarks about the parallel package} +% \changes{v0.4}{2004/02/29}{Added minipage, etc., support} +% \changes{v0.41}{2004/03/28}{Not released. Minor editorial improvements and code tweaks} +% \changes{0.5}{2004/04/04}{Added sidenotes, familiar footnotes in numbered text} +% \changes{0.51}{2004/04/10}{Fixed right line numbers killed in v0.5} +% \changes{0.6}{2004/11/16}{Fixed long paragraphs looping} +% \changes{0.6}{2004/11/16}{Prepared for ledpar package} +% \changes{0.6}{2004/12/10}{Fixed minor typos} +% \changes{0.7}{2005/02/18}{Tidying up for ledpar and ledarab packages} +% \changes{0.7}{2005/02/18}{Replaced all \cs{interAfootnotelinepenalty}, etc., +% by just \cs{interfootnotelinepenalty}} +% \changes{0.7}{2005/03/02}{ledmac having been available for 2 years, +% deleted the commented out original edmac texts} +% +% \hyphenation{man-u-script man-u-scripts} +% +% \newcommand{\Lpack}[1]{\textsf{#1}} +% \newcommand{\Lclass}[1]{\textsf{#1}} +% \newcommand{\file}[1]{\texttt{#1}} +% \newcommand{\ledmac}{ledmac} +% \newcommand{\Ledmac}{\Lpack{\ledmac}} +% \newcommand{\edmac}{\texttt{EDMAC}} +% \newcommand{\tabmac}{\texttt{TABMAC}} +% \newcommand{\edstanza}{\texttt{EDSTANZA}} +% \newcommand{\PWcomment}[1]{} +% \newenvironment{PW}{\itshape}{} +% \renewenvironment{PW}{\sffamily}{} +% \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{\ledmac} \\ +% 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}} \\ +% {\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} +% \begin{PW} +% For over ten years \edmac, a set of \PlainTeX\ macros, has been +% available 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 \Ledmac{} 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. +% \end{PW} +% \end{abstract} +% +% \tableofcontents +% +% \listoffigures +% +% +% \section{Introduction} +% +% \begin{PW} +% The \edmac{} macros \cite{EDMACTUG} for typesetting critical editions of texts +% have been available for use with TeX for some years. 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{ledmac} +% package is an attempt to satisfy that request. +% +% +% \Ledmac{} 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 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. +% +% I have altered their code and documentation as little as possible. +% In order to more easily show the debt that I owe, my few +% contributions are in the font you are now reading. I have not +% noted minor editorial changes such as replacing `TeX' with `LaTeX' +% or replacing `\edmac' with `\Ledmac' or `package'. The original +% work is in the normal roman font. +% +% There are places where I have not supplied some of the original +% \edmac{} facilities, either because they are natively provided by +% LaTeX (such as font handling), or are available from other LaTeX +% packages (such as crop marks). +% +% +% +% \end{PW} +% +% \subsection{Overview} +% +% \begin{PW} +% +% The \Ledmac{} 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 footnotes and endnotes; +% \item block or columnar formatting of footnotes; +% \item simple tabular material may be line numbered; +% \item indexing keyed to page and line numbers. +% \end{itemize} +% +% \end{PW} +% +% \Ledmac{} 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 \Ledmac{} will take care of +% the formatting and visual correlation of all the disparate types +% of information. +% +% +% \begin{itshape} +% While \Ledmac{} can be used `out of the box', with little or +% no customization, you may also go to the other extreme and view +% it as a collection of tools. Critical editions are amongst the +% most idiosyncratic of books (like their authors), so we have made +% \Ledmac{} deliberately bland in some ways, while also trying to +% document it reasonably well so that you can find out how to make +% it do what you want.\par +% \end{itshape} +% +% +% \begin{PW} +% +% 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 \Ledmac{} there are some other LaTeX packages for +% critical edition typesetting. As I am not an author, or even a +% prospective one, of any critical +% edition work I cannot 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 \Ledmac{} +% 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 \Ledmac{} will work together. +% +% Critical authors may find it useful +% to look at \edmac, \texttt{EDNOTES}, \Ledmac, and \Lpack{poemscol} to +% see which best meets their needs. +% +% At the time of writing I know of two web sites, apart from the \edmac{} +% home page, that have information on \Ledmac, 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/ledmac} +% which is a FAQ for typesetting critical editions and \Ledmac. +% \end{itemize} +% +% \end{PW} +% +% This manual contains a general description of how to use +% \begin{PW}the LaTeX version of \edmac, namely \Ledmac,\end{PW} +% (in sections~\ref{howto} through~\ref{sec:lastuser}); +% the complete source code for the package, +% with extensive documentation (in sections~\ref{overview} +% through \ref{end}); a series of examples (in +% Appendix~\ref{examples}); 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 skip from the general documentation in +% sections~\ref{howto} through~\ref{sec:lastuser} to the examples +% in Appendix~\ref{examples}, +% unless you are particularly interested in the innards of \Ledmac. +% +% \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, as well as the +% editions illustrated in Appendix~\ref{examples}. +% +% \subsubsection{ledmac} +% +% +% \begin{PW} +% +% 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. +% \end{PW} +% +% +% \section{The \Ledmac{} package}\label{howto} +% +% +% \Ledmac{} 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. \Ledmac{} 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 \Ledmac'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} +% +% \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. \Ledmac{} 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}} +% +% \begin{PW} +% \DescribeMacro{\firstlinenum} +% \DescribeMacro{\linenumincrement} +% By default, \Ledmac{} 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. +% +% \end{PW} +% +% \DescribeMacro{\pausenumbering} +% \DescribeMacro{\resumenumbering} +% \phantomsection\label{pause}\relax +% \Ledmac{} 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}. +% +% \subsection{Lineation commands} +% +% \DescribeMacro{\lineation} +% Lines can be numbered either by page or by section; you specify +% this using the \cs{lineation}\marg{arg} +% macro, where \meta{arg} is either +% \texttt{page} 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}". +% +% \DescribeMacro{\linenummargin} +% The command \cs{linenummargin}\meta{location} specifies the margin +% where the line 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. +% +% \begin{PW} +% 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). +% +% \end{PW} +% +% +% \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}?. +% +% \begin{PW} +% \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. +% \end{PW} +% +% \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. +% +% \begin{PW} +% \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 +% \end{PW} +% +% \begin{PW} +% \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. +% \end{PW} +% +% \begin{PW} +% \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. +% +% \end{PW} +% +% \section{The apparatus} +% +% \begin{PW} +% \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} +% \end{PW} +% +% +% 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 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. +% +% \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 is 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} +% Sometimes 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 \Ledmac{} 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 \Ledmac{} 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 swingeing changes. +% +% \DescribeMacro{\footparagraph} +% \DescribeMacro{\foottwocol} +% \DescribeMacro{\footthreecol} +% All footnotes will normally be formatted as a series of separate +% paragraphs in one column. But there are three other formats +% 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 (see +% figs.~\ref{iocasta-out} and \ref{periphyseon-out}, +% pp.\,\pageref{iocasta-out} and \pageref{periphyseon-out}); +% \item \cs{foottwocol} formats them as separate paragraphs, +% but in two columns (see bottom notes in fig.~\ref{arden-out}, +% p.\,\pageref{arden-out}); +% \item \cs{footthreecol}, in three columns (see second layer of notes in +% fig.\ref{features-out}, p.\,\pageref{features-out}). +% \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. +% +% \DescribeMacro{\interparanoteglue} +% If you use paragraphed footnotes, the macro \cs{interparanoteglue} +% defines the glue appearing in between footnotes in the paragraph. +% It is a macro whose argument is the glue you want, and its +% initial setting is (see p.\,\pageref{interparanoteglue}): +% \begin{verbatim} +% \interparanoteglue{1em plus .4em minus .4em} +% \end{verbatim} +% +% +% \begin{PW} +% 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;\end{PW} +% 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.} +% +% \begin{PW} +% \subsection{Creating a new series} +% +% If you need more than 5 series of critical footnotes you can +% readily create extra series. For example to create a G series +% you have to put the following code into either a \file{.sty} +% package file, or into the preamble sandwiched between +% \verb?\makeatletter? and \verb?\makeatother? declarations. +% \begin{verbatim} +% \newcommand*{\Gfootnote}[1]{% +% \ifnumberedpar@ +% \xright@appenditem{\noexpand\vGfootnote{G}% +% {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list +% \global\advance\insert@count by \@ne +% \else +% \vGfootnote{G}{{0|0|0|0|0|0|0}{}{#1}}% +% \fi\ignorespaces} +% \newinsert\Gfootins +% +% \newcommand*{\mpGfootnote}[1]{% +% \ifnumberedpar@ +% \xright@appenditem{\noexpand\mpvGfootnote{G}% +% {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list +% \global\advance\insert@count by \@ne +% \else +% \mpvGfootnote{G}{{0|0|0|0|0|0|0}{}{#1}}% +% \fi\ignorespaces} +% \newinsert\mpGfootins +% +% \addfootins{G} +% \footnormal{G} +% \end{verbatim} +% +% \end{PW} +% +% \section{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 \Ledmac{} macros relating to fonts that +% are intended for manipulation by the user: +% \cs{endashchar}, +% \cs{fullstop}, +% \cs{notefontsetup}, +% \cs{notenumfont}, +% \cs{numlabfont}, and +% \cs{rbracket}. +% +% \DescribeMacro{\notefontsetup} +% \phantomsection\label{notefonts}\relax +% The \cs{notefontsetup} macro defines the standard size of the +% fonts for all your footnotes; \Ledmac{} initially defines +% this as: \\ +% \verb"\newcommand*{\notefontsetup}{\footnotesize}" +% +% \DescribeMacro{\notenumfont} +% The \cs{notenumfont} macro specifies the font used for the line +% numbers printed in notes. This will typically be a command like +% \cs{bfseries} that selects a distinctive style for the +% note numbers, but leaves the choice of a size up to +% \cs{notefontsetup}. +% \Ledmac{} initially defines: \\ +% \verb"\newcommand{\notenumfont}{\normalfont}" \\ +% thus using the main document font. +% +% +% \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. +% +% \PWcomment{Deleted subsections dealing with the NFSS and Plain +% font selection as only NFSS is used.} +% +% +% Here are some examples of how you might redefine some of the font +% macros. +% \begin{verbatim} +% \renewcommand*{\notefontsetup}{\small} +% \renewcommand*{\notenumfont}{\sffamily} +% \end{verbatim} +% These commands select \cs{small} fonts for the notes, and choose a +% sans font for the line numbers within notes. +% +% +% +% \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 \Ledmac'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 \Ledmac'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. +% +% \Ledmac{} 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 footnotes are +% formatted in the same way. +% +% But it is also likely that you might want to have different fonts +% for just, say, the note numbers in layers \texttt{A} and \texttt{B} of +% your apparatus. To do this, make two copies of the +% \cs{normalfootfmt} macro (see p.\,\pageref{normalfootfmt})---or +% \cs{twocolfootfmt}, or the other appropriate macro ending in +% \verb"-footfmt", depending on what footnote format you have +% selected---and give these macros the names \cs{Afootfmt} and +% \cs{Bfootfmt}. Then, in these new macros, change the font +% specifications (and spacing, or whatever) to your liking. +% +% \begin{PW} +% As an example, in some texts the lemma in a footnote ends with a +% right bracket except where the lemma is an abbreviation (often +% typeset in italics). This requirement can be met as follows, +% assuming that the `A' series footnote will be used. +% +% First, define \cs{Afootfmt} as a modified version of the original +% \cs{normalfootfmt} +% (all the following should be enclosed in \cs{makeatletter} and +% \cs{makeatother} if it is in the preamble). The change is +% modifying |...#2}\rbracket\enskip...| to read +% |...#2\rbracket}\enskip...|, so that \cs{rbracket} is inside the group +% that includes the lemma argument. +% \begin{verbatim} +% \renewcommand{\Afootfmt}[3]{% +% \ledsetnormalparstuff +% {\notenumfont\printlines#1|}\strut\enspace +% {\select@lemmafont#1|#2\rbracket}\enskip#3\strut\par} +% \end{verbatim} +% Define an `abbreviation' macro that kills the definition of \cs{rbracket}. +% \begin{verbatim} +% \newcommand*{\nobrak}{} +% \newcommand{\abb}[1]{\textit{#1}\let\rbracket\nobrak\relax} +% \end{verbatim} +% Finally, make sure that \cs{abb} is not expanded during the first +% processing of a line. +% \begin{verbatim} +% \newcommand{\morenoexpands}{% +% \let\abb=0% +% } +% \end{verbatim} +% +% Now code like the following can be used, and `lemma' will be footnoted +% with a `]' and `abbrv' will have no `]'. +% \begin{verbatim} +% A sentence with a \edtext{lemma}{\Afootnote{ordinary}} in it. +% A sentence with an \edtext{\abb{abbrv}}{\Afootnote{abbreviated}} in it. +% \end{verbatim} +% +% \end{PW} +% +% \section{Verse} +% +% \begin{PW} +% +% 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{ledmac} +% package. +% +% \end{PW} +% +% \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. +% +% \begin{PW} +% To specify these +% multiples one invokes, for example \\ +% \verb+\setstanzaindents{3,1,2,1,2}+. \\ +% \end{PW} +% +% The numerical entries must be whole numbers, 0 or greater, separated by +% commas without embedded spaces. There +% must be one more entry than there are lines in the stanza. 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. 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. +% +% \begin{PW} +% 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. +% \end{PW} +% +% 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. +% +% \begin{PW} +% \DescribeMacro{\startstanzahook} +% Similarly, if \verb?\startstanzahook? is defined, it is called by +% \verb?\stanza? at the +% start. This can be defined to do something. +% \end{PW} +% +% \begin{PW} +% \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} +% \end{PW} +% +% \section{Grouping} +% \begin{PW} +% 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}? +% +% +% \end{PW} +% +% \section{Crop marks} +% +% \PWcomment{I deleted crop marks.} +% The \Lpack{\ledmac} 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{notenumfont}, \cs{select@lemmafont}, and +% \cs{notefontsetup} to select fonts, just as the footnote +% macros do (see p.\,\pageref{notefonts} above). +% +% \begin{PW} +% 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) }? +% \end{PW} +% +% \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. +% +% +% \PWcomment{label and pageref changed to edlabel and edpageref respectively.} +% +% \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 \Ledmac{} 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. +% +% \begin{PW} +% \DescribeMacro{\label} +% \DescribeMacro{\ref} +% \DescribeMacro{\pageref} +% \changes{v0.21}{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} +% +% \end{PW} +% +% \section{Side notes} +% +% \begin{PW} +% 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. +% +% \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. +% +% \end{PW} +% +% \section{Familiar footnotes} \label{sec:desc:familiar} +% +% \begin{PW} +% +% 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 \Ledmac{} 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} +% 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{footnoteC}. 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. For example, to +% specify a \texttt{D} series you have to specify the following code, +% either in a \file{.sty} package file or in the preamble sandwiched +% between \cs{makeatletter} and \cs{makeatother} commands. +% \begin{verbatim} +% \newcommand{\footnoteD}[1]{% +% \refstepcounter{footnoteD}% +% \@footnotemarkD +% \vfootnoteD{D}{#1}\m@mmf@prepare} +% \newcounter{footnoteD} +% \renewcommand{\thefootnoteD}{\arabic{footnoteD}} +% \newinsert\footinsD +% +% \newcommand{\mpfootnoteD}[1]{% +% \refstepcounter{footnoteD}% +% \@footnotemarkD +% \mpvfootnoteD{D}{#1}\m@mmf@prepare} +% \newinsert\footins\mpfootinsD +% +% \addfootinsX{D} +% \footnormalX{D} +% \end{verbatim} +% +% The above creates the \texttt{D} series with the default layout, +% and perhaps that +% is all that is required. If not, then you can now start to specialise +% it. For instance, to have the marks in the main text as lowercase +% roman numerals in parentheses, the marks in the foot on the baseline +% with a single closing parenthesis, and using the paragraph style: +% \begin{verbatim} +% \renewcommand*{\thefootnoteD}{\roman{footnoteD}} +% \renewcommand*{\bodyfootmarkD}{\hbox{\textsuperscript{(\thefootnoteD)}}} +% \renewcommand*{\footfootmarkD}{\thefootnoteD) } +% \footparagraphX{D} +% \end{verbatim} +% +% \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, \ledmac{} 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. +% +% \end{PW} +% +% \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. +% +% \begin{PW} +% \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} +% \end{PW} +% +% \begin{PW} +% \DescribeMacro{\ledplinenumtrue} +% \DescribeMacro{\ledplinenumfalse} +% \DescribeMacro{\symplinenum} +% Following the declaration \cs{ledplinenumtrue} critical footnotes will be +% marked with their line number. After \cs{ledplinenumfalse} the footnotes +% will be marked by \cs{symplinenum}, whose default definition is \\ +% \verb?\newcommand*{\symplinenum}{}? +% +% \subsection{Hints} +% +% By doing a little work it is possible, for example, +% to set things up so that a particular footnote series only prints +% the linenumber for the first footnote on a +% line.\footnote{This was requested by Dirk-Jan Dekker\index{Dekker, Dirk-Jan} +% (\texttt{djdekker@let.ru.nl}).} You may wish to skip +% the following but if not read it in conjunction with the code definitions +% from section~\ref{sec:nfootformat}. Suppose that we only want this to +% apply to the \texttt{B} series +% of normal footnotes. To accomplish this goal we have to modify the definition +% of \cs{normalvfootnote} as follows: +% +% \begin{verbatim} +% \makeatletter +% \newcommand*{\previous@B@number}{-1} +% \newcommand*{\previous@page}{-1} +% \renewcommand*{\normalvfootnote}[2]{ +% \insert\csname #1footins\endcsname\bgroup +% \notefontsetup +% \footsplitskips +% \spaceskip=\z@skip \xspaceskip=\z@skip +% \l@dparsefootspec #2\ledplinenumtrue% % NEW FROM HERE +% \ifnum\@nameuse{previous@#1@number} = \l@dparsedstartline\relax +% \ledplinenumfalse +% \fi +% \ifnum\previous@page=\l@dparsedstartpage\relax +% \else \ledplinenumtrue \fi +% \ifnum\l@dparsedstartline=\l@dparsedendline\relax +% \else \ledplinenumtrue \fi +% \expandafter\xdef\csname previous@#1@number\endcsname{\l@dparsedstartline}% +% \xdef\previous@page{\l@dparsedstartpage}% % TO HERE +% \csname #1footfmt\endcsname #2\egroup} +% \footnormal{B} +% \makeatother +% \end{verbatim} +% The additional code uses \cs{l@dparsefootspec} to get the footnote's line +% number as \cs{l@dparsedstartline} and the page number as +% \cs{l@dparsedstartpage}. It then sets \cs{ledplinenum} according +% to whether or not \cs{l@dparsedstartline} is the same as the +% previous (\cs{previous@B@number}) number. If the page number has changed +% then the line number must be printed. If the starting line number +% is not the same as the ending line number then the line number +% must be printed. After \cs{ledplinenum} +% has been set the two previous values are updated to the current +% line and page numbers. +% +% After the redefinition of \cs{normalvfootnote} the \texttt{B} +% series has to be +% respecified as normal for the changes to take effect. The \texttt{A} series +% will still be in the traditional style of printing every line number. +% To eliminate duplicate printing from the normal \texttt{A} series, you +% simply need to define \cs{previous@A@number} and respecify the series. +% +% Similar techniques can be used for the other footnote styles. +% +% \changes{v0.3}{2004/02/14}{Two more Dekker examples} +% Dirk-Jan Dekker\index{Dekker, Dirk-Jan} felt that there was too much +% empty space if the starting line number was ommited in a footnote. He +% proposed\footnote{Posted to \texttt{comp.text.tex} on 24 January 2004.} +% this solution, here applied to a paragraphed footnote. +% \begin{verbatim} +% \renewcommand*{\Bparafootfmt}[3]{% +% \ledsetnormalparstuff +% \scriptsize +% \notenumfont\printlines#1|% % NEW FROM HERE +% \ifledplinenum +% \enspace +% \else +% {\hskip 0em plus 0em minus .4em}% +% \fi% % TO HERE +% {\select@lemmafont#1|#2}\rbracket\enskip +% #3\penalty-10} +% \end{verbatim} +% +% Another question has been how to control the printing, or not, +% of line numbers in the footnote from the |\edtext| command. Here +% is an awful hack to do this. The example is an extension of the +% code just above. +% \begin{verbatim} +% \newcounter{killnum} +% \setcounter{killnum}{0} +% \newcommand*{\killnumbers}{\setcounter{killnum}{-1}} +% \newcommand*{\restorenumbers}{\setcounter{killnum}{0}} +% \renewcommand*{\Bparafootfmt}[3]{% +% \ledsetnormalparstuff +% \scriptsize +% \ifnum\c@killnum<\z@\ledplinenumfalse\fi% %% NEW +% \notenumfont\printlines#1|% +% \ifledplinenum +% \enspace +% \else +% {\hskip 0em plus 0em minus .4em}% +% \fi% +% {\select@lemmafont#1|#2}\rbracket\enskip +% #3\penalty-10} +% \end{verbatim} +% In the text it is used like: +% \begin{verbatim} +% ... +% \edtext{text}{\Bfootnote{TEXT\killnumbers}}% later B line numbers not printed +% ... +% \edtext{textual}{\Bfootnote{TEXTUAL\restorenumbers}}% later B numbers printed +% ... +% \end{verbatim} +% That is, |\killnumbers| and |\restorenumbers| only take effect for the next +% and later |\edtext|s, not the one they are in. You have to kill/restore +% numbers in the note \emph{before} you want the change. +% +% Dirk-Jan Dekker\index{Dekker, Dirk-Jan} +% suggested\footnote{Private communication, 17 February 2004.} the following +% \verb?\killnumber? macro if you want to occasionaly kill a number. \\ +% \verb?\newcommand*{\killnumber}{\linenum{|-1|||-1||}}? \\ +% Then insert \\ +% \verb?\ifnum#2=-1 \ledplinenumfalse\fi? \\ +% near the start of the definition of \verb?\printlines? so it reads +% \begin{verbatim} +% \def\printlines#1|#2|#3|#4|#5|#6|#7|{\begingroup +% \ifnum#2=-1 \ledplinenumfalse\fi% %% NEW +% \setprintlines{#1}{#2}{#3}{#4}{#5}{#6}% +% ... +% \end{verbatim} +% It is used like this: \\ +% \verb?\edtext{critical}{\killnumber\Afootnote{criticism}}? \\ +% The \verb?\killnumber? command will kill the line number for the one +% note, unlike \verb?\killnumbers? which kills numbers for subsequent notes. +% +% +% ^^A +% ^^A From D-J D email 17 Feb 04: +% ^^A In preamble \verb?\newcommand*{\killnumber}{\linenum{|-1|||-1||}}? +% ^^A Into \verb?\def\printlines#1|#2|#3|#4|#5|#6|#7|? +% ^^A \verb?\ifnum#2=-1 \ledplinenumfalse \fi +% ^^A Use it as +% ^^A \verb?\edtext{critical}{\killnumber\Afootnote{criticism}}? +% ^^A Which kills the number for the one footnote only (taking effect +% ^^A immediately, not delayed like \killnumbers) +% ^^A +% +% Perhaps, though, you just want a footnote series with no numbers at +% all (and maybe no lemma either). +% \begin{verbatim} +% \footparagraph{A} +% \makeatletter +% \def\zparafootfmt#1#2#3{% +% \ledsetnormalparstuff +% \notetextfont #3\penalty-10 } +% \makeatother +% \let\Afootfmt=\zparafootfmt +% ... +% \beginnumbering +% \edtext{}{\Afootnote{numberless and lemmaless}} +% ... +% \end{verbatim} +% +% At least one user has wanted a big space between the text and footnotes +% but a smaller space between each series. That is, the first printed series +% on a page must have a big skip and all later ones a small skip. Of course, +% there is no telling which will be the first on any given page; on one +% page there might be A, C and E series and on the next D and E. +% +% Here is the start of a solution. +% \begin{verbatim} +% \newskip\prefootskip % the big initial skip +% \prefootskip=3.3em plus .6em minus .6em +% \newif\ifskipped \skippedfalse +% \renewcommand*{\normalfootstart}[1]{% +% \ifskipped +% \vskip\skip\csname #1footins\endcsname% normal skip +% \else +% \skip\prefootskip% first note so big skip +% \skippedtrue +% \fi +% \leftskip0pt\rightskip0pt +% \csname #1\footnoterule\endcsname} +% \footnormal{A}% make sure the new \normalfootstart is used +% \footnormal{B} +% ... +% \end{verbatim} +% In addition similar changes would be required for paragraphed footnotes, +% footnotes in minipages, and the familiar footnotes. +% +% Another user has had a wider ranging set of requirements: +% \begin{itemize} +% \item Number paragraphs and use the number in the notes for that paragraph; +% \item Duplicate a paragraph number later in the document and use it for +% that paragraph's notes; +% \item In any series of notes only use the paragraph number for the first +% in the paragraph +% \item Have some series use line nummbers in the notes and in other series +% have neither lemmas nor line numbers in the notes. +% \item Perhaps eliminate all paragraph numbers in the notes. +% \end{itemize} +% Here is some code that enables these requirements to be met. This should +% be in an environment where \texttt{@} is treated as a letter. +% First, here is a version of \cs{ref} that returns a number even if the +% corresponding \cs{label} has not been defined. +% \begin{verbatim} +% \newcommand*{\saferef}[1]{% +% \expandafter\ifx\csname r@#1\endcsname\relax 0\else +% \ref{#1}\fi} +% \end{verbatim} +% Now for some code for the paragraph numbering. Use \cs{newpara} at the start +% of a numbered paragraph and \cs{oldpara}\marg{lab} at the start of +% a `re-numbered' one, where \cs{label}\marg{lab} has been used in the +% original numbered one. +% \begin{verbatim} +% \newcounter{para}\setcounter{para}{0} +% \newcounter{thispara}\setcounter{thispara}{0} +% \newcommand*{\newpara}{% +% \refstepcounter{para}% +% \setcounter{thispara}{\value{para}}% +% \noindent\textbf{\thepara. }} +% \newcommand{\oldpara}[1]{% +% \noindent\setcounter{thispara}{\saferef{#1}}\textbf{\saferef{#1}. }} +% \end{verbatim} +% Set up the \texttt{A} note series for lemmas, line numbers and non-repeated +% paragraph numbers, assuming paragraphed notes. +% \begin{verbatim} +% \newif\ifparnumfoot +% \parnumfoottrue% false to eliminate paragraph numbers in notes +% \newcommand*{\previous@Aparnum}{-1} +% \def\printlinesA#1|#2|#3|#4|#5|#6|#7|{\begingroup +% \setprintlines{#1}{#2}{#3}{#4}{#5}{#6}% +% \ifnum\previous@Aparnum=\the\c@thispara% not a new paragraph +% \else% new paragraph, print, and update the check +% \ifparnumfoot \textbf{\thethispara.}\fi +% \xdef\previous@Aparnum{\the\c@thispara}% +% \fi +% \ifledplinenum \linenumr@p{#2}\else \symplinenum\fi +% \ifl@d@ssub \fullstop \sublinenumr@p{#3}\fi +% \ifl@d@dash \endashchar\fi +% \ifl@d@pnum #4\fullstop\fi +% \ifl@d@elin \linenumr@p{#5}\fi +% \ifl@d@esl \ifl@d@elin \fullstop\fi \sublinenumr@p{#6}\fi +% \endgroup} +% \renewcommand*{\Afootfmt}[3]{% +% \ledsetnormalparstuff +% {\notenumfont\printlinesA#1|}\enspace +% {\select@lemmafont#1|#2}\rbracket\enskip +% #3\penalty-10 } +% \end{verbatim} +% Set up the \texttt{B} series notes for no line numbers or lemmas, just +% non-repeated paragraph numbers, assuming normal notes. +% \begin{verbatim} +% \newcommand*{\previous@Bparnum}{-1} +% \def\printlinesB#1|#2|#3|#4|#5|#6|#7|{\begingroup +% \setprintlines{#1}{#2}{#3}{#4}{#5}{#6}% +% \ifnum\previous@Bparnumm=\the\c@thispara% not a new paragraph +% \else% new paragraph, print, and update the check +% \ifparnumfoot \textbf{\thethispara.}\fi +% \xdef\previous@Aparnum{\the\c@thispara}% +% \fi +% \endgroup} +% \renewcommand*{\Bfootfmt}[3]{% +% \ledsetnormalparstuff +% {\notenumfont\printlinesB#1|}%\enspace +% {\select@lemmafont#1|#2}%\enskip +% #3\strut\par} +% \end{verbatim} +% +% You can use the above like: +% \begin{verbatim} +% ... +% \newpara\label{fpara} A numbered\edtext{}{\Bfootnote{lemma-less +% and linenumber-less}} \edtext{paragraph}{\Afootnote{chunk}} ... +% ... +% \oldpara{fpara} \edtext{Repeated}{\Afootnote{Again}} +% paragraph\edtext{}{\Bfootnote{Just a comment}} ... +% ... +% \end{verbatim} +% +% \end{PW} +% +% \subsection{Known and suspected limitations} +% +% In general, \Ledmac's system for adding marginal line numbers +% breaks anything that makes direct use of the LaTeX insert system, +% which includes marginpars, footnotes and floats. +% +% \begin{PW} +% 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. +% \end{PW} +% +% \cs{parshape} cannot be used within numbered text, except in a +% very restricted way (see p.\,\pageref{parshape}). +% +% \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, \Ledmac{} 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 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. +% +% \begin{PW} +% +% LaTeX has a reputation for putting things in the wrong margin after +% a page break. The \Ledmac{} 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}? +% +% +% \end{PW} +% +% Help, suggestions and corrections will be gratefully received. +% +% \subsection{Use with other packages} +% +% \begin{PW} +% +% Because of \Ledmac's complexity it may not play well with other +% packages. In particular \Ledmac{} 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 \Ledmac{} 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{ledmac} 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 \Ledmac{} 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 actally 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. +% +% \end{PW} +% +% \subsection{Parallel typesetting} +% +% \begin{PW} +% +% \changes{v0.31}{2004/12/1}{Added remarks about ledmac/parallel package incompatability} +% \changes{v0.7}{2005/02/20}{Added bits about ledpar package} +% +% \Ledmac{} and the \Lpack{parallel} package~\cite{PARALLEL} +% do not work together --- they have very different ideas about +% footnoting --- and I do not have the skills to try and get them +% to cooperate. If you are +% trying to typeset short pieces in parallel on the same page you can +% try using the \verb?edtabular? environment. +% +% More likely you are wanting to typeset in parallel on opposite +% pages (e.g., original on the left (even numbered) pages and a translation +% on the right (odd numbered) pages). Essentially you will have to do +% all the page breaking yourself. Here's some example code that might help, +% though. +% \begin{verbatim} +% \makeatletter +% \providecommand{\cleartoevenpage}{% defined in the memoir class +% \clearpage% +% \ifodd\c@page\hbox{}\clearpage\fi} +% \providecommand{\cleartooddpage}{% defined in the memoir class +% \clearpage% +% \ifodd\c@page\else\hbox{}\clearpage\fi} +% \makeatother +% \newenvironment{parallelpages}{\cleartoevenpage}{} +% \newcommand{\leftpage}{\cleartoevenpage} +% \newcommand{\rightpage}{\cleartooddpage} +% ... +% \begin{parallelpages} +% \leftpage{first left page text} +% \rightpage{first right page text} +% \leftpage{second left page text} +% ... +% \end{parallelpages} +% \end{verbatim} +% Notes: +% \begin{itemize} +% \item The \verb?\(left|right)page? declarations are guaranteed to +% start a new page of the specified kind. +% \item You are responsible for ensuring that each text (plus any footnotes) +% is not more than a page long. +% \item I used braces above so that would be possible to do, say, \\ +% \verb?\renewcommand{\rightpage}[1]{}? \\ +% to comment out all the texts on the righthand pages. +% \item However, +% in general it's probably not a good idea for these macros +% to take the text as an argument as that would prohibit +% the use of any verbatim text. +% \item You could do things like \\ +% \verb?\renewcommand{\rightpage}{\cleartooddpage\normalfont\itshape}? \\ +% \verb?\renewcommand{\leftpage}{\cleartoevenpage\normalfont\sfseries}? \\ +% to have different fonts for the two texts. +% \end{itemize} +% I realise that the above does not eliminate the need for hand massaging +% but it might help in other ways. +% +% Since the above was written I have developed the \Lpack{ledpar} +% package~\cite{LEDPAR} +% as an adjunct to \Ledmac{} specifically for parallel typesetting +% of critical texts. This also cooperates with the \Lpack{babel} +% package for typesetting in multiple languages. An even more +% recent extension is the \Lpack{ledarab} package~\cite{LEDARAB} for +% handling parallel arabic text in critical editions. +% +% \end{PW} +% +% +% +% \subsection{Notes for EDMAC users} \label{sec:lastuser} +% +% \begin{PW} +% 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 \ledmac. +% +% 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. +% +% \end{PW} +% +% \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.) +% +% \begin{PW} +% The second argument of the \cs{critext} macro, \meta{commands}, +% is the same as the second argument to the \cs{edtext} macro. +% \end{PW} +% +% +% 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. +% +% \begin{PW} +% +% 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. +% +% \end{PW} +% +% \StopEventually{% +% \addcontentsline{toc}{section}{Index} +% \PrintIndex +% } +% +% \clearpage +% \section{Implementation overview}\label{overview} +% +% +% We present the \Ledmac{} 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 \Ledmac{} 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 \Ledmac{} 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 +% +% \begin{PW} +% I'll 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} I'll simply +% change that to \texttt{ledmac}. +% \end{PW} +% +% \begin{PW} +% Announce the name and version of the package, which is +% targetted for LaTeX2e. +% \end{PW} +% +% \begin{macrocode} +%<*code> +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{ledmac}[2005/03/24 v0.7 LaTeX port of EDMAC] + +% \end{macrocode} +% +% \begin{PW} +% In general I have made 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} +% \end{PW} +% +% \begin{PW} +% I'm adding final/draft options which I hope may be useful. +% +% \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} +% +% \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]{\textit{#1}} +\fi + +% \end{macrocode} +% \end{macro} +% \end{PW} +% +% \begin{PW} +% \begin{macro}{\linenumberlist} +% The code for the \verb?\linenumberlist? mechanism was given to me 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} +% \end{PW} +% +% \begin{macro}{\@l@dtempcnta} +% \begin{macro}{\@l@dtempcntb} +% In imitation of \LaTeX, we create a couple of scratch counters. +% +% \begin{PW} +% LaTeX already defines \cs{@tempcnta} and \cs{@tempcntb} but I 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). +% \end{PW} +% \begin{macrocode} +\newcount\@l@dtempcnta \newcount\@l@dtempcntb +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{PW} +% \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} +% \end{PW} +% +% +% \subsection{Messages} +% +% \begin{PW} +% 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} +% \end{PW} +% +% \begin{macro}{\ledmac@warning} +% Write a warning message. +% \begin{PW}Changed to use LaTeX capabilities.\end{PW} +% \begin{macrocode} +\newcommand{\ledmac@warning}[1]{\PackageWarning{ledmac}{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{PW} +% \begin{macro}{\ledmac@error} +% Write an error message. +% \changes{v0.2}{2003/07/25}{Added \cs{ledmac@error} and replaced error messages} +% \begin{macrocode} +\newcommand{\ledmac@error}[2]{\PackageError{ledmac}{#1}{#2}} +% \end{macrocode} +% \end{macro} +% \end{PW} +% +% \begin{PW} +% \begin{macro}{\led@err@NumberingStarted} +% \begin{macro}{\led@err@NumberingNotStarted} +% \begin{macro}{\led@err@NumberingShouldHaveStarted} +% \begin{macrocode} +\newcommand*{\led@err@NumberingStarted}{% + \ledmac@error{Numbering has already been started}{\@ehc}} +\newcommand*{\led@err@NumberingNotStarted}{% + \ledmac@error{Numbering was not started}{\@ehc}} +\newcommand*{\led@err@NumberingShouldHaveStarted}{% + \ledmac@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{ledmac reminder: }% + \typeout{ The number of 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}{% + \ledmac@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}{% + \ledmac@warning{Bad \string\lineation\space argument}} +\newcommand*{\led@warn@BadLinenummargin}{% + \ledmac@warning{Bad \string\linenummargin\space argument}} +\newcommand*{\led@warn@BadLockdisp}{% + \ledmac@warning{Bad \string\lockdisp\space argument}} +\newcommand*{\led@warn@BadSublockdisp}{% + \ledmac@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]{% + \ledmac@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}{% + \ledmac@warning{\string\advanceline\space produced a sub-line + number less than zero.}} +\newcommand*{\led@warn@BadAdvancelineLine}{% + \ledmac@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}{% + \ledmac@warning{Bad \string\setline\space argument}} +\newcommand*{\led@warn@BadSetlinenum}{% + \ledmac@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}{% + \ledmac@error{\string\pstart\space must be used within a + numbered section}{\@ehc}} +\newcommand*{\led@err@PstartInPstart}{% + \ledmac@error{\string\pstart\space encountered while another + \string\pstart\space was in effect}{\@ehc}} +\newcommand*{\led@err@PendNotNumbered}{% + \ledmac@error{\string\pend\space must be used within a + numbered section}{\@ehc}} +\newcommand*{\led@err@PendNoPstart}{% + \ledmac@error{\string\pend\space must follow a \string\pstart}{\@ehc}} +\newcommand*{\led@err@AutoparNotNumbered}{% + \ledmac@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}{% + \ledmac@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]{% + \ledmac@warning{Duplicate definition of label `#1' on page \the\pageno.}} +\newcommand*{\led@warn@RefUndefined}[1]{% + \ledmac@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}{% + \ledmac@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}{% + \ledmac@warning{Bad \string\sidenotemmargin\space argument}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\led@warn@NoIndexFile} +% \begin{macrocode} +\newcommand*{\led@warn@NoIndexFile}[1]{% + \ledmac@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}{% + \ledmac@error{Too many columns}{\@ehc}} +\newcommand*{\led@err@UnequalColumns}{% + \ledmac@error{Number of columns is not equal to the number + in the previous row (or \protect\\ \space forgotten?)}{\@ehc}} +\newcommand*{\led@err@LowStartColumn}{% + \ledmac@error{Start column is too low}{\@ehc}} +\newcommand*{\led@err@HighEndColumn}{% + \ledmac@error{End column is too high}{\@ehc}} +\newcommand*{\led@err@ReverseColumns}{% + \ledmac@error{Start column is greater than end column}{\@ehc}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \end{PW} +% +% +% \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}{\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} +% In preparation for the \Lpack{ledpar} package, these are related to +% the `left' text of parallel texts (when \cs{ifl@dpairing} is TRUE). +% They are explained in the \Lpack{ledpar} +% manual. +% \changes{v0.7}{2005/02/24}{Added \cs{l@dnumpstartsL}, \cs{ifl@dpairing} +% and \cs{ifpst@rted} for/from ledpar} +% \begin{macrocode} +\newif\ifl@dpairing + \l@dpairingfalse +\newif\ifpst@rtedL + \pst@rtedLfalse +\newcount\l@dnumpstartsL + +% \end{macrocode} +% \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} +\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} + +% \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. +% \PWcomment{Using LaTeX typeout rather than TeX write below.} +% \changes{v0.7}{2005/02/24}{Changed \cs{endnumbering} for ledpar} +% \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} + +% \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 ledpar} +% \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} +% +% Sometimes you want line numbers that start at $1$ at the top of each +% page; other times you want line numbers that start at $1$ at the start +% of each section and increase regardless of page breaks. +% \Ledmac{} 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}{\ifbypage@} +% \begin{macro}{\bypage@true} +% \begin{macro}{\bypage@false} +% The \cs{ifbypage@} flag specifies the current lineation +% system: \verb"false" for line-of-section, \verb"true" for line-of-page. +% \Ledmac{} will use the line-of-section system unless instructed otherwise. +% \begin{macrocode} +\newif\ifbypage@ +% \end{macrocode} +% \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}. +% \begin{macrocode} +\newcommand*{\lineation}[1]{{% + \ifnumbering + \led@err@LineationInNumbered + \else + \def\@tempa{#1}\def\@tempb{page}% + \ifx\@tempa\@tempb + \global\bypage@true + \else + \def\@tempb{section}% + \ifx\@tempa\@tempb + \global\bypage@false + \else + \led@warn@BadLineation + \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 \Ledmac{} 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$. +% \PWcomment{I have changed the original counts into LaTeX counters.} +% +% \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$. +% \PWcomment{I have changed the original counts into LaTeX counters.} +% +% \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} +% \begin{PW} +% These macros can be used to set the corresponding counters. +% \end{PW} +% \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{PW} +% \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} +% \end{PW} +% +% \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. +% +% \begin{PW} +% The original \cs{numlabfont} specification is equivalent to +% the LaTeX \cs{scriptsize} for a 10pt document. +% \end{PW} +% \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} +% +% \begin{PW} +% Reminder: compare these with the LaTeX list macros in case they +% would be suitable instead. +% \end{PW} +% +% 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 +% \Ledmac{} 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 \Ledmac{} 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 \Ledmac{} what action +% it's supposed to take at each of these lines. One action, the +% page-start action, is generated behind the scenes by \Ledmac{} 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. \Ledmac{} 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 \Ledmac{} 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 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} +% +% \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{PW} +% \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} +% \Ledmac{} 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} +% \end{PW} +% +% 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. +% +% \begin{PW} +% In order to get the \verb?\setlinenum? to work I 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 my 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 I 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. +% +% \end{PW} +% \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} +% \begin{PW} +% Now we are back to the original code. +% \end{PW} +% +% 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} +% \begin{PW} +% \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}. +% \end{PW} +% \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} +% \begin{PW} +% These don't do anything at this point, but will have been added to the +% auxiliary file(s) if the \Lpack{ledpar} package has been used. They +% are just here to stop \Lpack{\ledmac} from moaning if the \Lpack{ledpar} +% is used for one run and then not for the following one. +% \end{PW} +% \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{PW} +% \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} +% \end{PW} +% +% \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} +% \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 + \xright@appenditem{\the\absline@num}\to\actionlines@list + \ifsublines@ + \xright@appenditem{-1005}\to\actions@list + \ifcase\sub@lock + \sub@lock \@ne + \else + \sub@lock \z@ + \fi + \else + \xright@appenditem{-1003}\to\actions@list + \ifcase\@lock + \@lock \@ne + \else + \@lock \z@ + \fi + \fi + \fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lock@off} +% \begin{macro}{\do@lockoff} +% \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@lockoff}{% + \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*{\skip@lockoff}{\global\let\lock@off=\do@lockoff} +\global\let\lock@off=\do@lockoff + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{PW} +% \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} +% \end{PW} +% +% \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 \Ledmac{} 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.22}{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} +% \begin{PW} +% 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 +% \Ledmac{} 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} +% \end{PW} +% \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{PW} +% \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} +% \end{PW} +% +% \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{PW} +% \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} +% \end{PW} +% +% \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. +% +% \begin{PW} +% 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. +% \end{PW} +% +% \cs{critext} requires two arguments. At any point within numbered +% text, you use it by saying: +% \begin{verbatim} +% \critext{#1}#2/ +% \end{verbatim} +% \begin{PW} Similarly \cs{edtext} requires the same two arguments +% but you use it by saying: +% \begin{verbatim} +% \edtext{#1}{#2} +% \end{verbatim} +% \end{PW} +% +% \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{PW} +% \begin{macro}{\dummy@edtext} +% LaTeX users are not used to delimeted arguments, so I provide +% a \cs{edtext} macro as well. +% \begin{macrocode} +\newcommand{\dummy@edtext}[2]{#1} +% \end{macrocode} +% \end{macro} +% +% \end{PW} +% +% 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 \Ledmac{} 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 \Ledmac{} 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.21}{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 footnotes} +% \begin{macrocode} +\newcommand*{\no@expands}{\let\rm=0\let\it=0\let\sl=0\let\bf=0\let\tt=0% + \let\b=0\let\c=0\let\d=0\let\t=0% + \let\select@@lemmafont=0% + \def\protect{\noexpand\protect\noexpand}% + \let\startsub=\relax \let\endsub=\relax + \let\startlock=\relax \let\endlock=\relax + \let\edlabel=\@gobble +% \let\edpageref=\@gobble +% \let\lineref=\@gobble +% \let\sublineref=\@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}{\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 + \no@expands + \xdef\@tag{#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} +% +% \begin{PW} Here's the promised undelimited LaTeX version of \cs{critext}. +% \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 + \no@expands + \xdef\@tag{#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} +% +% \end{PW} +% +% \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]{\xdef\@tag{#1}\ignorespaces} +% \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} +% \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. +% \begin{macrocode} +\newcommand*{\pstart}{\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 + \numberedpar@true} +% \end{macrocode} +% \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 + \loop\ifvbox\raw@text + \do@line + \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} + +% \end{macrocode} +% \end{macro} +% +% \begin{PW} +% \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} +% \end{PW} +% +% \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} +\newcommand*{\autopar}{\ifnumbering \else + \led@err@AutoparNotNumbered + \beginnumbering + \fi + \everypar={\setbox0=\lastbox + \endgraf \vskip-\parskip + \pstart \noindent \kern\wd0 + \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 footnotes, for +% example. +% \begin{macrocode} +\newcommand*{\normal@pars}{\everypar={}\let\par\endgraf} + +% \end{macrocode} +% \end{macro} +% +% \subsection{Processing one line} +% +% \begin{macro}{\do@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*{\do@line}{% +% \end{macrocode} +% +% First, pull +% one line off the top of \cs{raw@text}, which contains the remaining +% unprocessed lines of the paragraph. \cs{vbadness} must be cranked up to +% suppress \verb"Underfull vbox" errors from +% \cs{vsplit}; \cs{splittopskip} will be inserted at the top of +% \cs{one@line}, so we zero it. (This skip will appear in the final +% vertical list, just before every \cs{baselineskip}.) +% \begin{macrocode} + {\vbadness=10000 \splittopskip=0pt +% \end{macrocode} +% \begin{PW} +% Provide a hook for potential extra settings. +% \begin{macrocode} + \do@linehook +% \end{macrocode} +% Null the \cs{...d@ta}, which may later hold line numbers, here. +% They will get defined within \cs{affixline@num}. Similarly for +% \cs{l@dcsnotetext} for the text of a sidenote. +% \begin{macrocode} + \l@demptyd@ta +% \end{macrocode} +% \end{PW} +% +% \begin{macrocode} + \global\setbox\one@line=\vsplit\raw@text to\baselineskip}% +% \end{macrocode} +% +% \cs{one@line} comes out of \cs{vsplit} as a \verb"vbox"; +% we now convert it to an \verb"hbox". +% +% This operation breaks if there's an insert connected to the +% \phantomsection\label{doline} line. In that case, the content of the \verb"vbox" +% \cs{one@line} before this operation is not just an \verb"hbox": it's +% an \verb"hbox" followed by an insert. After the \cs{unvbox}, the +% last thing on the vertical list is not the \verb"hbox" but the +% insert. The result is that our line heads prematurely onto the +% vertical list---with incorrect interline spacing, because there's +% still a level of boxing that should be undone---and \cs{one@line} +% is the void box, because the last thing on the vertical list +% wasn't a box. The subsequent code consequently prints a blank +% line. +% +% All this is why insertions need to be kept out of the paragraph +% until this point; our footnote macros add all insertions to list +% macros, and the \cs{add@inserts} macro below puts them onto the +% vertical list at the proper time. +% \begin{macrocode} + \unvbox\one@line \global\setbox\one@line=\lastbox +% \end{macrocode} +% +% Calculate the line and page number for this line. +% \begin{macrocode} + \getline@num +% \end{macrocode} +% +% Now we'll add the line to the vertical list, with a line +% number attached if necessary. +% +% The \verb"\hfil\hbox to \wd\one@line" is necessary to position a +% hangindented line correctly: without it, \cs{one@line} gets +% stretched out to \cs{hsize} in width and the indentation +% disappears. This is because hanging indentation is done by +% setting a nonzero `shift' value for the \verb"hbox" that +% contains the line within the \verb"vbox", and that shift vanishes, like +% the penalties, when we slice up the paragraph; one can examine +% the \cs{ht} or \cs{wd} of a box within \TeX{}, but it provides no +% way of examining the \cs{shift}, though it would be a trivial +% modification of the \TeX{} program to add that function. +% (\cs{parshape}\phantomsection\label{parshape} +% also works by setting a nonzero shift, but this fix isn't good +% enough there, because the total width of the lines is also varied +% in that case; our algorithm will push all the lines of text over +% to the right margin.) +% +% We put the \cs{new@line} start-of-line marker in the output list at +% this point too: putting it within the \cs{hbox} here ensures that +% it comes before any of the text of the line in the vertical list, +% but cannot be broken away from it at a page break. +% +% \begin{PW} +% For LaTeX I think that \cs{linewidth} is more appropriate +% than \cs{hsize} here. +% +% It turns out (e.g., in the \verb?ledgroupsized? environment) to be useful +% to have controllable fills at each end of the line, not just the +% original \verb?\hfil\hbox?. Another change from the original, namely +% adding the inserts earlier at the start of the line, lets +% us have sidenotes in numbered text, and also regular and familiar +% footnotes. +% \changes{v0.5}{2004/04/03}{Changed \cs{do@line} to enable sidenotes and +% regular footnoting} +% \changes{v0.51}{2004/04/10}{Changed \cs{do@line} to restore correct line +% numbering} +% \changes{v0.51}{2004/04/10}{Added code to \cs{do@line} to handle +% \cs{ledsidenote}s} +% +% \cs{affixline@num} puts the line numbers into \cs{l@dld@ta} (left) +% and \cs{l@drd@ta} (right), so call it before starting to process the line. +% \begin{macrocode} + \affixline@num +% \end{macrocode} +% Now stick everything into a set of boxes. After calling \cs{add@inserts} +% to grab any inserts for the line call \cs{affixside@note} to grab +% the texts for any moveable sidenotes going into the margin(s). +% \begin{macrocode} + \hb@xt@ \linewidth{% + \l@dld@ta\add@inserts\affixside@note + \l@dlsn@te% left side note + {\ledllfill + \hb@xt@ \wd\one@line{\new@line\unhbox\one@line}% + \ledrlfill\l@drd@ta% + \l@drsn@te}% right side note + }% +% \end{macrocode} +% +% Originally the footnotes and insertions for this line were pulled out of the +% \cs{inserts@list} list macro at this point and attached, but this has +% now been done earlier. +% \end{PW} +% +% Penalties get stripped off by this slicing process; the following +% macro puts them back in as the last step. +% \begin{macrocode} + \add@penalties} + +% \end{macrocode} +% \end{macro} +% +% \begin{PW} +% \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} +% \end{PW} +% +% +% \begin{PW} +% \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} +% \end{PW} +% +% \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 + \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} + +% \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@ + \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% %1000 +% \end{macrocode} +% +% Commands that turn sub-lineation on and off. +% \begin{macrocode} + \or% % 1001 + \global\sublines@true + \or% % 1002 + \global\sublines@false +% \end{macrocode} +% +% Line locking. We ignore these indications when they don't appear +% at the right times: a start-lock should appear only when locking +% is entirely off, and an end-lock should only appear when locking is +% in the `middle'. +% \begin{macrocode} + \or% % 1003 + \ifcase\@lock + \global\@lock=\@ne + \else + \global\@lock=\z@ + \fi + \or% % 1004 + \ifnum\@lock=\tw@ + \global\@lock=\thr@@ + \else + \global\@lock=\z@ + \fi +% \end{macrocode} +% +% Sub-line locking. Same comments as for line locking. +% \begin{macrocode} + \or% % 1005 + \ifcase\sub@lock + \global\sub@lock=\@ne + \else + \global\sub@lock=\z@ + \fi + \or% % 1006 + \ifnum\sub@lock=\tw@ + \global\sub@lock=\thr@@ + \else + \global\sub@lock=\z@ + \fi +% \end{macrocode} +% Number skipping. +% \begin{macrocode} + \or% % 1007 + \l@dskipnumbertrue +% \end{macrocode} +% +% If we get here, some unknown action code has been encountered. +% \begin{macrocode} + \else + \led@warn@BadAction + \fi} + +% \end{macrocode} +% \end{macro} +% +% \subsection{Line number printing} +% +% \begin{macro}{\affixline@num} +% \begin{PW} +% \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. +% \end{PW} +% +% 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. +% +% \begin{PW} +% Remember that some counts are now counters! +% \end{PW} +% +% First, the case when we're within a sub-line range. +% \changes{v0.51}{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). +% \begin{macrocode} +\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} +% \begin{PW} +% Check on the \verb?\linenumberlist? If it's \verb?\empty? use the standard +% algorithm. +% \end{PW} +% \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} +% \begin{PW} +% The \verb?\linenumberlist? wasn't \verb?\empty?, so here's Wayne's +% numbering mechanism. This takes place in TeX's mouth. +% \end{PW} +% \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. +% +% \begin{PW} +% 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. +% \end{PW} +% \begin{macro}{\l@dld@ta} +% \begin{macro}{\l@drd@ta} +% \begin{PW} +% A left line number is stored in \cs{l@dld@ta} and a right one in +% \cs{l@drd@ta}. +% \end{PW} +% +% \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} + +% \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{PW} +% \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} +% \end{PW} +% +% \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 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{PW}I have deleted all Plain Font-related code and just keept +% the code for NFSS font handling.\end{PW} +% +% \begin{macro}{\notefontsetup} +% The font setup defined in \cs{notefontsetup} defines the standard +% fonts for the text of the footnotes. Parts of the footnote, such +% as the line number references and the lemma, are enclosed in +% groups, with their own font macros, so a note in plain roman can +% still have line numbers in bold, say, and the lemma in the same +% font encoding, family, series, and shape +% of font as in the main text. Typically this definition should +% specify only a size. +% +% \begin{PW} +% The original font for \cs{notefontsetup} effectively maps to LaTeX +% \cs{footnotesize} for a 10pt document. +% \end{PW} +% +% \begin{macrocode} +\newcommand*{\notefontsetup}{\footnotesize} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\notenumfont} +% The line numbers will be printed using the font selected by +% executing \cs{notenumfont}. +% +% \begin{PW} +% The original font for \cs{notenumfont} maps to LaTeX \cs{scriptsize} +% for a 10pt document. However, the description in the user guide does +% not seem to match the definition (the usage guide says that the +% size is \cs{notefontsetup}). +% \end{PW} +% \begin{macrocode} +\newcommand*{\notenumfont}{\normalfont} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\select@lemmafont} +% \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} +% \begin{macro}{\Afootnote} +% The outer-level footnote commands will look familiar: they're +% just called \cs{Afootnote}, \cs{Bfootnote}, etc., instead of +% plain \cs{footnote}. What they do, however, is quite different, +% since they have to operate in conjunction with \cs{critext} when +% numbering is in effect. +% +% If we're within a line-numbered paragraph, then, we tack this note onto +% the \cs{inserts@list} list, and increment the deferred-page-bottom-note +% counter. +% \begin{macrocode} +\newcommand*{\Afootnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\vAfootnote{A}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne +% \end{macrocode} +% +% Within free text, there's no need to put off making the insertion +% for this note. No line numbers are available, so this isn't generally +% that useful; but you might want to use it to get around some +% limitation of \Ledmac. +% \begin{macrocode} + \else + \vAfootnote{A}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Bfootnote} +% \begin{macro}{\Cfootnote} +% \begin{macro}{\Dfootnote} +% \begin{macro}{\Efootnote} +% We need similar commands for the other footnote series. +% \begin{macrocode} +\newcommand*{\Bfootnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\vBfootnote{B}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \else + \vBfootnote{B}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\Cfootnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\vCfootnote{C}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \else + \vCfootnote{C}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\Dfootnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\vDfootnote{D}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \else + \vDfootnote{D}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\Efootnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\vEfootnote{E}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \else + \vEfootnote{E}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{PW} +% \begin{macro}{\mpAfootins} +% \begin{macro}{\mpBfootins} +% \begin{macro}{\mpCfootins} +% \begin{macro}{\mpDfootins} +% \begin{macro}{\mpEfootins} +% For footnotes in minipages and the like, we need a new set of inserts. +% \changes{v0.4}{2004/02/29}{Added \cs{mpAfootins} and friends} +% \begin{macrocode} +\newinsert\mpAfootins +\newinsert\mpBfootins +\newinsert\mpCfootins +\newinsert\mpDfootins +\newinsert\mpEfootins + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\mpAfootnote} +% \begin{macro}{\mpBfootnote} +% \begin{macro}{\mpCfootnote} +% \begin{macro}{\mpDfootnote} +% \begin{macro}{\mpEfootnote} +% For footnotes in minipages and the like, we need a similar series of commands. +% \changes{v0.4}{2004/02/29}{Added \cs{mpAfootnote} and friends} +% \begin{macrocode} +\newcommand*{\mpAfootnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\mpvAfootnote{A}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \else + \mpvAfootnote{A}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\mpBfootnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\mpvBfootnote{B}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \else + \mpvBfootnote{B}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\mpCfootnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\mpvCfootnote{C}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \else + \mpvCfootnote{C}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\mpDfootnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\mpvDfootnote{D}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \else + \mpvDfootnote{D}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\mpEfootnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\mpvEfootnote{E}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \else + \mpvEfootnote{E}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \end{PW} +% +% \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 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 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 + \notefontsetup + \footsplitskips + \spaceskip=\z@skip \xspaceskip=\z@skip + \csname #1footfmt\endcsname #2\egroup} +% \end{macrocode} +% \end{macro} +% +% \begin{PW} +% \begin{macro}{\footsplitskips} +% Some setup code that is common for a variety of 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} +% \end{PW} +% +% \begin{PW} +% \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} + \notefontsetup + \hsize\columnwidth + \@parboxrestore + \color@begingroup + \csname #1footfmt\endcsname #2\color@endgroup}} + +% \end{macrocode} +% \end{macro} +% \end{PW} +% +% \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} +\newcommand*{\normalfootfmt}[3]{% + \ledsetnormalparstuff + {\notenumfont\printlines#1|}\strut\enspace + {\select@lemmafont#1|#2}\rbracket\enskip#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 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. +% +% \begin{PW} +% 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 +% I have reverted to traditional booleans. +% \end{PW} +% +% \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}{\ifledplinenum} +% \begin{macro}{\symplinenum} +% \begin{PW} +% Sometimes it could be useful not to print the line number, or give +% it a symbolic value (perhaps if there are several notes from the same line). +% \end{PW} +% \changes{v0.22}{2003/11/04}{Added \cs{symplinenum}} +% \begin{macrocode} +\newif\ifledplinenum + \ledplinenumtrue +\newcommand*{\symplinenum}{} + +% \end{macrocode} +% \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 ? +% +% \begin{PW} +% 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}. +% \end{PW} +% \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. +% \begin{macrocode} +\def\printlines#1|#2|#3|#4|#5|#6|#7|{\begingroup + \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 +% \end{macrocode} +% \begin{PW} +% The other thing is whether to print the real starting line number or a +% symbolic value. +% \changes{v0.3}{2004/02/14}{Added \cs{linenumr@p} and \cs{sublinenumr@p} +% to \cs{printlines}} +% \end{PW} +% \begin{macrocode} + \ifledplinenum \linenumrep{#2}\else \symplinenum\fi + \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} +% \phantomsection\label{normalvalues}\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 +% \Ledmac{} 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{PW} +% \begin{macro}{\mpnormalfootgroup} +% A somewhat different version for minipages. +% \changes{v04.}{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} +% \end{PW} +% +% \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 \Ledmac{} code.) +% \begin{verbatim} +% \newinsert\Afootins +% \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{PW} +% \begin{macro}{\ledfootinsdim} +% Have a constant value for the \verb?\dimen\footins? +% \changes{v0.41}{2004/03/25}{Added \cs{ledfootinsdim}} +% \begin{macrocode} +\newcommand*{\ledfootinsdim}{0.8\vsize} + +% \end{macrocode} +% \end{macro} +% \end{PW} +% +% We begin by defining the five new insertion classes, and some +% \verb"count" registers; these are \cs{outer} operations that +% can't be done inside \cs{footnormal}. +% \begin{macrocode} +\newinsert\Afootins \newinsert\Bfootins +\newinsert\Cfootins \newinsert\Dfootins +\newinsert\Efootins +% \end{macrocode} +% 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} +% \begin{PW} +% 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}} +% \end{PW} +% \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. +% +% And finally, we initialize the formatting for all the footnote series +% to be normal. +% \begin{macrocode} +\footnormal{A} +\footnormal{B} +\footnormal{C} +\footnormal{D} +\footnormal{E} + +% \end{macrocode} +% +% +% \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 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\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} +% \begin{PW} +% And the extra setup for minipages. +% \end{PW} +% \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} +% \begin{PW} +% 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. +% \end{PW} +% \changes{v0.22}{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. +% +% \begin{PW} +% I think that \cs{columnwidth} should be used here for LaTeX, not \cs{hsize}. +% I've also included \cs{footfudgefiddle}. +% \end{PW} +% \changes{v0.22}{2003/11/04}{Added \cs{footfudgefiddle} to \cs{para@footsetup}} +% \begin{macrocode} +\newcommand*{\para@footsetup}[1]{{\notefontsetup + \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} +% +% \begin{PW} +% \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. +% I'll use \cs{strip@pt}. +% \end{PW} +% +% \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 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 \Ledmac{} 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 + \notefontsetup + \footsplitskips + \setbox0=\vbox{\hsize=\maxdimen + \noindent\csname #1footfmt\endcsname#2}% + \setbox0=\hbox{\unvxh0}% + \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{PW} +% \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}% + \notefontsetup + \footsplitskips + \setbox0=\vbox{\hsize=\maxdimen + \noindent\color@begingroup\csname #1footfmt\endcsname #2\color@endgroup}% + \setbox0=\hbox{\unvxh0}% + \dp0=\z@ + \ht0=\csname #1footfudgefactor\endcsname\wd0 + \box0 + \penalty0 +}} + +% \end{macrocode} +% \end{macro} +% \end{PW} +% +% \begin{macro}{\unvxh} +% Here is 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} +\newcommand*{\unvxh}[1]{% + \setbox0=\vbox{\unvbox#1% + \global\setbox1=\lastbox}% + \unhbox1 + \unskip % remove \rightskip, + \unskip % remove \parfillskip, + \unpenalty % remove \penalty of 10000, + \hskip\ipn@skip} % but add the glue to go between the notes + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\interparanoteglue} +% \begin{macro}{\ipn@skip} +% \phantomsection +% \label{interparanoteglue}\relax +% Close observers will notice that we snuck some glue called +% \cs{ipn@skip} onto the end of the hbox produced by \cs{unvxh} in the +% above macro. +% +% We want to be able to have some glue between our paragraphed +% footnotes. But since we are initially setting our notes in +% internal vertical mode, as little paragraphs, any paragraph-final +% glue will get discarded. Since \cs{unvxh} is already busy fiddling +% with glue and penalties at the end of these paragraphs, we take +% advantage of the opportunity to provide our inter-note spacing. +% +% We collect the value of the inter-parafootnote glue value as the +% parameter of a macro called---wait for it---\cs{interparanoteglue}. +% We put this value into the value of a glue register +% \cs{ipn@skip} (inter-para-note-skip) making sure first to set the +% current font to the value normally used in footnotes so that the value of an +% \verb"em" will be taken from the right font. +% \begin{macrocode} +\newskip\ipn@skip +\newcommand*{\interparanoteglue}[1]{% + {\notefontsetup\global\ipn@skip=#1 \relax}} +\interparanoteglue{1em plus.4em minus.4em} + +% \end{macrocode} +% There is a point to be careful about regarding the +% \cs{interparanoteglue}. Remember that in \cs{para@vfootnote} we do +% some measurements on the footnote box, and use the resulting size +% to make an estimate of how much the note will contribute to the +% height of our final footnote paragraph. This information is used +% by the output routine to allocate the right amount of vertical +% space on the page for the notes (\thetexbook, pp.\,398--399). +% +% The length of the footnote includes the natural size of the glue +% specified by \cs{interparanoteglue}, but not its stretch or shrink +% components, since at this point the note has no need to stretch +% or shrink. Later, when the paragraph is actually composed by +% \cs{parafootgroup} in the output routine, \TeX\ will almost +% certainly do some stretching and shrinking of this glue in order +% to make the paragraph look nice. Probably the stretching and +% shrinking over the whole paragraph will cancel each other out. +% But if not, the actual vertical size of the paragraph may not +% match the size the output routine had been told to expect, and +% you may get an overfull/underfull \cs{vbox} message from the output +% routine. To minimize the risk of this, you can do two things: +% keep the \verb"plus" and \verb"minus" components of \cs{interparanoteglue} +% small compared with its natural glue, and keep them the same as +% each other. As a general precaution, keep the size and +% flexibility of the \verb"\skip\footins" glue on the high side too: +% because the reckoning is approximate, footnote blocks may be up +% to a line bigger or smaller than the output routine allows for, +% so keep some flexible space between the text and the notes. +% \end{macro} +% \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, and the third is the +% text of the footnote. +% \begin{macrocode} +\newcommand*{\parafootfmt}[3]{% + \ledsetnormalparstuff + {\notenumfont\printlines#1|}\enspace + {\select@lemmafont#1|#2}\rbracket\enskip + #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. +% \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}% + \notefontsetup + \noindent\unhbox0\par} + +% \end{macrocode} +% \end{macro} +% +% \begin{PW} +% \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}% + \notefontsetup + \noindent\unhbox0\par}} + +% \end{macrocode} +% \end{macro} +% \end{PW} +% +% \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} +% +% \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. +% +% \begin{PW} +% The LaTeX \cs{line} macro has no relationship to the +% TeX \cs{line}. The LaTeX equivalent is \cs{@@line}. +% \end{PW} +% \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 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} +% \begin{PW} +% The additional setup for minipages. +% \end{PW} +% \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 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{PW} +% \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} +% \end{PW} +% +% \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 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 + \notefontsetup + \footsplitskips + \csname #1footfmt\endcsname #2\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. +% +% \begin{macrocode} +\newcommand*{\threecolfootfmt}[3]{% + \normal@pars + \hsize .3\hsize + \parindent=0pt + \tolerance=5000 + \raggedright + \leavevmode + \strut{\notenumfont\printlines#1|}\enspace + {\select@lemmafont#1|#2}\rbracket\enskip + #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{PW} +% \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} +% \end{PW} +% +% \paragraph{Two columns} +% +% \begin{macro}{\foottwocol} +% You say \verb"\foottwocol{A}" to have the \texttt{A} series of 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} +% \begin{PW} +% The additional setup for minipages. +% \end{PW} +% \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 +% \verb"0.45\hsize" wide, 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 + \notefontsetup + \footsplitskips + \csname #1footfmt\endcsname #2\egroup} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\twocolfootfmt}[3]{% + \normal@pars + \hsize .45\hsize + \parindent=0pt + \tolerance=5000 + \raggedright + \leavevmode + \strut{\notenumfont\printlines#1|}\enspace + {\select@lemmafont#1|#2}\rbracket\enskip + #3\strut\par\allowbreak} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\twocolfootgroup}[1]{{\notefontsetup + \splittopskip=\ht\strutbox + \expandafter + \rigidbalance\csname #1footins\endcsname \tw@ \splittopskip}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{PW} +% \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} +% \end{PW} +% +% \section{Output routine} +% \label{output}\relax +% +% Now we begin the output routine and associated things. +% +% \begin{PW}I have deleted all the crop mark code.\end{PW} +% +% \begin{PW} There are a couple of macros from plain TeX that we need +% (at least for now). +% +% \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} +% +% \end{PW} +% +% +% \begin{PW} 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. \end{PW} +% +% 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 \TeX's limitations: the number +% of insertion classes is limited to $255$. +% \begin{verbatim} +% \def\do@feet{% +% \ifvoid\footins\else +% \vskip\skip\footins +% \footnoterule +% \unvbox\footins +% \fi +% \ifvoid\Afootins\else +% \Afootstart{A}\Afootgroup{A}% +% \fi +% \ifvoid\Bfootins\else +% \Bfootstart{B}\Bfootgroup{B}% +% \fi +% \ifvoid\Cfootins\else +% \Cfootstart{C}\Cfootgroup{C}% +% \fi +% \ifvoid\Dfootins\else +% \Dfootstart{D}\Dfootgroup{D}% +% \fi +% \ifvoid\Efootins\else +% \Efootstart{E}\Efootgroup{E}% +% \fi} +% \end{verbatim} +% +% \begin{PW} For information (and so that I don't forget it), the code that +% now follows is part of the +% standard LaTeX output routine. +% +% 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.21}{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.21}{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.21}{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 \Ledmac{} 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.21}{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.41}{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.41}{2004/03/06}{Added \cs{@opxtrafeetii}} +% \begin{macrocode} +\newcommand*{\@opxtrafeetii}{% + \ifvoid\Afootins\else\Afootstart{A}\Afootgroup{A}\fi + \ifvoid\Bfootins\else\Bfootstart{B}\Bfootgroup{B}\fi + \ifvoid\Cfootins\else\Cfootstart{C}\Cfootgroup{C}\fi + \ifvoid\Dfootins\else\Dfootstart{D}\Dfootgroup{D}\fi + \ifvoid\Efootins\else\Efootstart{E}\Efootgroup{E}\fi} + +% \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.21}{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}{% + \ifvoid\Afootins\else\insert\Afootins{\unvbox\Afootins}\fi + \ifvoid\Bfootins\else\insert\Bfootins{\unvbox\Bfootins}\fi + \ifvoid\Cfootins\else\insert\Cfootins{\unvbox\Cfootins}\fi + \ifvoid\Dfootins\else\insert\Dfootins{\unvbox\Dfootins}\fi + \ifvoid\Efootins\else\insert\Efootins{\unvbox\Efootins}\fi +} + +% \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.21}{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} +% +% \end{PW} +% +% \begin{PW} +% \begin{macro}{\addfootins} +% Let's make it easier for an author to create a new series by providing +% this macro, \verb?\addfootins?\marg{letter}, to add the series to +% the several lists. +% \changes{v0.41}{2004/03/06}{Added \cs{addfootins}} +% \begin{macrocode} +\newcommand*{\addfootins}[1]{% + \footnormal{#1} +% \end{macrocode} +% Add it to the output. +% \begin{macrocode} + \g@addto@macro{\@opxtrafeetii}{% + \ifvoid\@nameuse{#1footins}\else + \@nameuse{#1footstart{#1}}\@nameuse{#1footgroup}{#1}\fi} +% \end{macrocode} +% Add it to the reinsertions. +% \begin{macrocode} + \g@addto@macro{\doreinxtrafeetii}{% + \ifvoid\@nameuse{#1footins}\else + \insert\@nameuse{#1footins}{\unvbox\@nameuse{#1footins}}\fi} +% \end{macrocode} +% Add it to minipages. +% \begin{macrocode} + \g@addto@macro{\l@dedbeginmini}{% + \expandafter\let\csname #1footnote\endcsname = \@nameuse{mp#1footnote}} +% \end{macrocode} +% And at the end of a minipage. +% \begin{macrocode} + \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.41}{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}{% + \ifvoid\Afootins\else\@mem@nofootfalse\fi + \ifvoid\Bfootins\else\@mem@nofootfalse\fi + \ifvoid\Cfootins\else\@mem@nofootfalse\fi + \ifvoid\Dfootins\else\@mem@nofootfalse\fi + \ifvoid\Efootins\else\@mem@nofootfalse\fi + \ifvoid\footinsA\else\@mem@nofootfalse\fi + \ifvoid\footinsB\else\@mem@nofootfalse\fi + \ifvoid\footinsC\else\@mem@nofootfalse\fi + \@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 + \ifvoid\Afootins\else\@led@nofootfalse\fi + \ifvoid\Bfootins\else\@led@nofootfalse\fi + \ifvoid\Cfootins\else\@led@nofootfalse\fi + \ifvoid\Dfootins\else\@led@nofootfalse\fi + \ifvoid\Efootins\else\@led@nofootfalse\fi + \ifvoid\footinsA\else\@led@nofootfalse\fi + \ifvoid\footinsB\else\@led@nofootfalse\fi + \ifvoid\footinsC\else\@led@nofootfalse\fi + \@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} +% +% \end{PW} +% +% \section{Cross referencing} +% \label{xref}\relax +% +% \begin{PW} +% I 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. +% \end{PW} +% +% +% 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.21}{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.} +% +% \begin{PW} +% 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. +% \end{PW} +% +% \changes{v0.21}{2003/08/26}{Tweaked \cs{edlabel} to get correct page numbers} +% \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 + \fi +% \edef\next{\write\@aux{\string\l@dmake@labels\label@refs|{#1}}}% +% \next} +% \end{macrocode} +% \begin{PW} +% 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). +% \end{PW} +% \begin{macrocode} + \protected@write\@auxout{}% + {\string\l@dmake@labels\space\thepage|\label@refs|{#1}}% + \@esphack} + +% \end{macrocode} +% \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). +% +% \begin{PW} +% The initial use of \cs{newcommand} is to catch if \cs{l@dmake@labels} +% has been previously defined (by a class or package). +% \end{PW} +% \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} +% +% \begin{PW} +% 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. +% \end{PW} +% +% \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. +% +% \begin{PW} +% 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}. +% \end{PW} +% \changes{v0.21}{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. +% \begin{PW} LaTeX already defines a \cs{pageref}, so changing the name +% to \cs{edpageref}. \end{PW} +% \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. +% \begin{PW} LaTeX defines a \cs{makelabel} macro which is used in lists. +% I've changed the name to \cs{edmakelabel}. \end{PW} +% \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]{\l@dend@true\immediate\openout\l@d@end=#1\relax} +\newcommand{\l@dend@close}{\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}{\Aendnote} +% \begin{macro}{\Bendnote} +% \begin{macro}{\Cendnote} +% \begin{macro}{\Dendnote} +% \begin{macro}{\Eendnote} +% The following five macros each function to +% write one endnote to the \file{.end} file. Like the footnotes, these +% endnotes come in five series, \texttt{A} through \texttt{E}. 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} +\newcommand*{\Aendnote}[1]{{\newlinechar='40 + \immediate\write\l@d@end{\string\Aend% + {\ifnumberedpar@\l@d@nums\fi}% + {\ifnumberedpar@\@tag\fi}{#1}}}\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\Bendnote}[1]{{\newlinechar='40 + \immediate\write\l@d@end{\string\Bend% + {\ifnumberedpar@\l@d@nums\fi}% + {\ifnumberedpar@\@tag\fi}{#1}}}\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\Cendnote}[1]{{\newlinechar='40 + \immediate\write\l@d@end{\string\Cend% + {\ifnumberedpar@\l@d@nums\fi}% + {\ifnumberedpar@\@tag\fi}{#1}}}\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\Dendnote}[1]{{\newlinechar='40 + \immediate\write\l@d@end{\string\Dend% + {\ifnumberedpar@\l@d@nums\fi}% + {\ifnumberedpar@\@tag\fi}{#1}}}\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\newcommand*{\Eendnote}[1]{{\newlinechar='40 + \immediate\write\l@d@end{\string\Eend% + {\ifnumberedpar@\l@d@nums\fi}% + {\ifnumberedpar@\@tag\fi}{#1}}}\ignorespaces} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\Aend} +% \begin{macro}{\Bend} +% \begin{macro}{\Cend} +% \begin{macro}{\Dend} +% \begin{macro}{\Eend} +% \begin{macro}{\endprint} +% \begin{macro}{\@gobblethree} +% \begin{macro}{\l@d@section} +% \cs{Aendnote} and the like write commands called \cs{Aend} and +% so 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.} 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 \Ledmac{} does +% nothing with this information, but it's there if you want to write +% custom macros to do something with it. +% \changes{v0.22}{2003/11/05}{Used \cs{providecommand} for \cs{@gobblethree} +% to avoid clash with the amsfonts package} +% \begin{macrocode} +\def\endprint#1#2#3{{\notefontsetup{\notenumfont\printendlines#1|}% + \enspace{\select@lemmafont#1|#2}\enskip#3\par}} +\providecommand*{\@gobblethree}[3]{} +\let\Aend=\@gobblethree +\let\Bend=\@gobblethree +\let\Cend=\@gobblethree +\let\Dend=\@gobblethree +\let\Eend=\@gobblethree +\let\l@d@section=\@gobble + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{PW} +% \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} +% \end{PW} +% +% +% \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} +% \begin{PW} +% +% 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.51}{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.51}{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} +\newcommand*{\l@dlsnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\vl@dlsnote{{\l@d@nums}{\@tag}{#1}}}% + \to\inserts@list + \global\advance\insert@count \@ne + \fi\ignorespaces} +\newcommand*{\l@drsnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\vl@drsnote{{\l@d@nums}{\@tag}{#1}}}% + \to\inserts@list + \global\advance\insert@count \@ne + \fi\ignorespaces} +\newcommand*{\l@dcsnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\vl@dcsnote{{\l@d@nums}{\@tag}{#1}}}% + \to\inserts@list + \global\advance\insert@count \@ne + \fi\ignorespaces} + +% \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]{\savel@dcsnote#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}[3]{% + {\parindent\z@\hsize=\ledlsnotewidth\ledlsnotefontsetup + \global\setbox\l@dlp@rbox=\vbox to\z@{\vss#3}}}% aligns on bottom line +%% \global\setbox\l@dlp@rbox=\vbox to\z@{#3\vss}}}% aligns on top line +\newcommand*{\setl@drp@rbox}[3]{% + {\parindent\z@\hsize=\ledrsnotewidth\ledrsnotefontsetup + \global\setbox\l@drp@rbox=\vbox to\z@{\vss#3}}} + +% \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} +% +% +% +% \end{PW} +% +% \section{Familiar footnotes} +% +% \begin{PW} +% +% The original \edmac{} provided the five series of critical footnotes, +% and LaTeX provides a single numbered footnote. The \Ledmac{} 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 \Ledmac. +% +% \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.41}{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} +% +% Now we can get on with providing the extra series of numbered +% footnotes. The general naming convention is to add an uppercase letter, +% denoting the series, at the end of macro names (the \edmac{} series +% have an uppercase letter at the start of macro names). +% +% First we'll give all the code for the \texttt{A} series, then the +% much more limited code for defining additional series. +% +% \subsection{The \texttt{A} series footnotes} +% +% \begin{macro}{\footnoteA} +% \cs{footnoteA}\marg{text} is the user level command. +% \changes{v0.6}{2004/11/23}{Modified \cs{footnoteA} and friends to +% include \cs{@thefnmarkA} etc} +% \begin{macrocode} +\newcommand{\footnoteA}[1]{% + \stepcounter{footnoteA}% + \protected@xdef\@thefnmarkA{\thefootnoteA}% + \@footnotemarkA + \vfootnoteA{A}{#1}\m@mmf@prepare} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footinsA} +% The insert for the \texttt{A} series. +% \begin{macrocode} +\newinsert\footinsA +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@footnoteA} +% \begin{macro}{\thefootnoteA} +% The \texttt{A} series counter. +% \begin{macrocode} +\newcounter{footnoteA} + \renewcommand{\thefootnoteA}{\arabic{footnoteA}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% \begin{macro}{\footfootmarkA} +% This macro typesets the \texttt{A} series marker at the start of +% the footnote text (where it appears at the foot of the page). +% \begin{macrocode} +\newcommand*{\footfootmarkA}{\textsuperscript{\thefootnoteA}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mpfootnoteA} +% \begin{macro}{\mpfootinsA} +% The extras for minipages. +% \changes{v0.4}{2004/02/29}{Familiar footnotes extended for minipages} +% \begin{macrocode} +\newcommand{\mpfootnoteA}[1]{% + \stepcounter{footnoteA}% + \protected@xdef\@thefnmarkA{\thefootnoteA}% + \@footnotemarkA + \mpvfootnoteA{A}{#1}\m@mmf@prepare} +\newinsert\mpfootinsA + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% We have to specify the default footnote style for the \texttt{A} series. +% This is done later. +% +% That completes the specific macros that have to be specified for +% the \texttt{A} series. Similar ones are required for any other series. +% +% \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 + \notefontsetup + \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} + \notefontsetup + \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 + {\notenumfont\@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 + \notefontsetup + \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 + \hsize .45\hsize + \parindent=\z@ +%%% \parfillskip=0pt \@plus 1fil + \tolerance=5000\relax + \raggedright + \leavevmode + {\notenumfont\@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]{{\notefontsetup + \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 + \notefontsetup + \footsplitskips + \@nameuse{footfmt#1}{#1}{#2}\egroup} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\threecolfootfmtX} +% \cs{threecolfootfmtX}\marg{series} +% \begin{macrocode} +\newcommand*{\threecolfootfmtX}[2]{% + \normal@pars + \hsize .3\hsize + \parindent=\z@ +%%% \parfillskip=0pt \@plus 1fil + \tolerance=5000\relax + \raggedright + \leavevmode + {\notenumfont\@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]{{\notefontsetup + \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\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.22}{2003/11/04}{Added \cs{footfudgefiddle} to \cs{para@footsetupX}} +% \begin{macrocode} +\newcommand*{\para@footsetupX}[1]{{\notefontsetup + \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 + \notefontsetup + \footsplitskips + \setbox0=\vbox{\hsize=\maxdimen + \noindent\@nameuse{footfmt#1}{#1}{#2}}% + \setbox0=\hbox{\unvxh0}% + \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} + \notefontsetup + \footsplitskips + \setbox0=\vbox{\hsize=\maxdimen + \noindent\color@begingroup\@nameuse{footfmt#1}{#1}{#2}\color@endgroup}% + \setbox0=\hbox{\unvxh0}% + \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]{% + \ledsetnormalparstuff + {\notenumfont\@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}% + \notefontsetup + \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}% + \notefontsetup + \noindent\unhbox0\par}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{Other series footnotes} +% +% Other series, such as \texttt{B}, are provided here. +% +% \begin{macro}{\footnoteB} +% \cs{footnoteB}\marg{text} is the user command for a series \texttt{B} +% footnote. +% \begin{macrocode} +\newcommand{\footnoteB}[1]{% + \stepcounter{footnoteB}% + \protected@xdef\@thefnmarkB{\thefootnoteB}% + \@footnotemarkB + \vfootnoteB{B}{#1}\m@mmf@prepare} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\c@footnoteB} +% \begin{macro}{\thefootnoteB} +% \begin{macrocode} +\newcounter{footnoteB} + \renewcommand{\thefootnoteB}{\arabic{footnoteB}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\footinsB} +% \begin{macrocode} +\newinsert\footinsB + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\mpfootnoteB} +% \begin{macro}{\mpfootinsB} +% The extras for minipages. +% \changes{v0.4}{2004/02/29}{Familiar footnotes extended for minipages} +% \begin{macrocode} +\newcommand{\mpfootnoteB}[1]{% + \stepcounter{footnoteB}% + \protected@xdef\@thefnmarkB{\thefootnoteB}% + \@footnotemarkB + \mpvfootnoteB{B}{#1}\m@mmf@prepare} +\newinsert\mpfootinsB + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\footnoteC} +% \cs{footnoteC}\marg{text} is the user command for a series \texttt{C} +% footnote. +% \begin{macrocode} +\newcommand{\footnoteC}[1]{% + \stepcounter{footnoteC}% + \protected@xdef\@thefnmarkC{\thefootnoteC}% + \@footnotemarkC + \vfootnoteC{C}{#1}\m@mmf@prepare} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\c@footnoteC} +% \begin{macro}{\thefootnoteC} +% \begin{macro}{\footinsC} +% \begin{macrocode} +\newcounter{footnoteC} + \renewcommand{\thefootnoteC}{\arabic{footnoteC}} +\newinsert\footinsC + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\mpfootnoteC} +% \begin{macro}{\mpfootinsC} +% The extras for minipages. +% \changes{v0.4}{2004/02/29}{Familiar footnotes extended for minipages} +% \begin{macrocode} +\newcommand{\mpfootnoteC}[1]{% + \stepcounter{footnoteC}% + \protected@xdef\@thefnmarkC{\thefootnoteC}% + \@footnotemarkC + \mpvfootnoteC{C}{#1}\m@mmf@prepare} +\newinsert\mpfootinsC + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% Don't forget to initialise the series. +% +% \begin{macrocode} +\footnormalX{A} +\footnormalX{B} +\footnormalX{C} + +% \end{macrocode} +% +% \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 + \ifvoid\footinsA\else\footstartA{A}\footgroupA{A}\fi + \ifvoid\footinsB\else\footstartB{B}\footgroupB{B}\fi + \ifvoid\footinsC\else\footstartC{C}\footgroupC{C}\fi + }} + +\newcommand{\doreinxtrafeeti}{% + \ifvoid\footinsA\else\insert\footinsA{\unvbox\footinsA}\fi + \ifvoid\footinsB\else\insert\footinsB{\unvbox\footinsB}\fi + \ifvoid\footinsC\else\insert\footinsC{\unvbox\footinsC}\fi + } + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\addfootinsX} +% Make life just a little easier for those who want additional series +% of class 1\index{class 1 feet} footnotes. +% \changes{v0.41}{2003/03/06}{Added minpage setup to \cs{addfootinsX}} +% \begin{macrocode} +\newcommand*{\addfootinsX}[1]{% + \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}}% + \g@addto@macro{\doreinxtrafeeti}{% + \ifvoid\@nameuse{footins#1}\else + \insert\@nameuse{footins#1}{\unvbox\@nameuse{footins#1}}\fi}% + \g@addto@macro{\l@dfambeginmini}{% + \expandafter\let\csname footnote#1\endcsname=\@nameuse{mpfootnote#1}} + \g@addto@macro{\l@dfamendmini}{% + \ifvoid\@nameuse{mpfootins#1}\else\@nameuse{mpfootgroup#1{#1}}}% +} + +% \end{macrocode} +% \end{macro} +% +% \end{PW} +% +% \begin{PW} +% \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. They can be extended to cater for additional +% series. +% \begin{macrocode} +\newcommand*{\l@dedbeginmini}{% + \let\Afootnote=\mpAfootnote% + \let\Bfootnote=\mpBfootnote% + \let\Cfootnote=\mpCfootnote% + \let\Dfootnote=\mpDfootnote% + \let\Efootnote=\mpEfootnote} +\newcommand*{\l@dedendmini}{% + \ifvoid\mpAfootins\else\mpAfootgroup{A}\fi% + \ifvoid\mpBfootins\else\mpBfootgroup{B}\fi% + \ifvoid\mpCfootins\else\mpCfootgroup{C}\fi% + \ifvoid\mpDfootins\else\mpDfootgroup{D}\fi% + \ifvoid\mpEfootins\else\mpEfootgroup{E}\fi} + +% \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. They can be extended to cater for additional +% series. +% \begin{macrocode} +\newcommand*{\l@dfambeginmini}{% + \let\footnoteA=\mpfootnoteA% + \let\footnoteB=\mpfootnoteB% + \let\footnoteC=\mpfootnoteC} +\newcommand*{\l@dfamendmini}{% + \ifvoid\mpfootinsA\else\mpfootgroupA{A}\fi% + \ifvoid\mpfootinsB\else\mpfootgroupB{B}\fi% + \ifvoid\mpfootinsC\else\mpfootgroupC{C}\fi} + +% \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.51}{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} +% +% \end{PW} +% +% \begin{PW} +% \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.41}{2003/03/29}{Let ledmac 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. +% +% +% \end{PW} +% +% 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} +% +% \begin{PW} +% 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} +% +% \end{PW} +% +% \section{Verse} +% +% \begin{PW} +% This is principally Wayne Sullivan's\index{Sullivan, Wayne} +% code and commentary from \edstanza~\cite{EDSTANZA}. +% \end{PW} +% +% +% \begin{PW} +% \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} +% \end{PW} +% +% +% \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{PW} +% \begin{macro}{\setstanzaindents} +% \begin{macro}{\setstanzapenalties} +% 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). +% \begin{macrocode} +\newcommand*{\setstanzaindents}[1]{\setstanzavalues{sza}{#1}} +\newcommand*{\setstanzapenalties}[1]{\setstanzavalues{szp}{#1}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{PW} +% +% \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{\parindent=\csname sza@\number\stanza@count + @\endcsname\stanzaindentbase + \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. +% +% \begin{PW} +% As a further convenience, the macro \verb?\startstanzahook? is +% called at the beginning of a stanza. This can be defined to +% do something useful. +% \end{PW} +% \begin{macrocode} +\let\startstanzahook\relax +\let\endstanzaextra\relax +\xdef\stanza{\begingroup\startstanzahook% + \catcode`\&\active\global\stanza@count\@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\endstanzaextra}% + \noexpand\stanza@line} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{PW} +% \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} +% \end{PW} +% +% 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} +% +% \begin{PW} +% +% 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}{% + \def\ss{\noexpand\ss}% + \def\"##1{\noexpand\"##1}% + \def\'##1{\noexpand\'##1}% + \def\`##1{\noexpand\`##1}% + \def\^##1{\noexpand\^##1}% + \def\phantom##1{\noexpand\phantom{##1}}% + \def\hphantom##1{\noexpand\hphantom{##1}}% + \def\underbrace##1{\noexpand\underbrace{##1}}% + \def\dots{\noexpand\dots}% + \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}{\A@@footnote} +% \begin{macro}{\B@@footnote} +% \begin{macro}{\C@@footnote} +% \begin{macro}{\D@@footnote} +% \begin{macro}{\E@@footnote} +% We need to be able to modify \Ledmac's footnote macros and restore their +% original definitions. There are five of these. +% \begin{macrocode} +\let\A@@footnote=\Afootnote +\let\B@@footnote=\Bfootnote +\let\C@@footnote=\Cfootnote +\let\D@@footnote=\Dfootnote +\let\E@@footnote=\Efootnote +% \end{macrocode} +% \end{macro} +% \end{macro} +% \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% + \led@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% + \let\Afootnote\l@dgobbledarg% + \let\Bfootnote\l@dgobbledarg% + \let\Cfootnote\l@dgobbledarg% + \let\Dfootnote\l@dgobbledarg% + \let\Efootnote\l@dgobbledarg% + \let\edindex\nulledindex% + \let\linenum\@gobble} +\newcommand{\l@drestoreforcritext}{% + \def\Afootnote##1##2/{\A@@footnote{##1}{##2}}% + \def\Bfootnote##1##2/{\B@@footnote{##1}{##2}}% + \def\Cfootnote##1##2/{\C@@footnote{##1}{##2}}% + \def\Dfootnote##1##2/{\D@@footnote{##1}{##2}}% + \def\Efootnote##1##2/{\E@@footnote{##1}{##2}}% + \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 + \let\Afootnote\l@dgobblearg + \let\Bfootnote\l@dgobblearg + \let\Cfootnote\l@dgobblearg + \let\Dfootnote\l@dgobblearg + \let\Efootnote\l@dgobblearg + \let\edindex\nulledindex + \let\linenum\@gobble} +\newcommand{\l@drestoreforedtext}{% + \def\Afootnote##1{\A@@footnote{##1}}% + \def\Bfootnote##1{\B@@footnote{##1}}% + \def\Cfootnote##1{\C@@footnote{##1}}% + \def\Dfootnote##1{\D@@footnote{##1}}% + \def\Efootnote##1{\E@@footnote{##1}}% + \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 + \let\Afootnote\A@@footnote + \let\Bfootnote\B@@footnote + \let\Cfootnote\C@@footnote + \let\Dfootnote\D@@footnote + \let\Efootnote\E@@footnote + \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 +%%% \ledmac@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} +% +% \end{PW} +% +% \section{The End}\label{end} +% +% This is the end of the package code. But before we finish, enable +% a patch file (if there is one) to be read. +% +% \begin{macrocode} +\InputIfFileExists{ledpatch.sty} + +%</code> +% \end{macrocode} +% +% \newpage +% \appendix +% +% \section{Examples}\label{examples} +% +% +% \begin{PW} +% This section presents some sample documents. +% +% The examples +% in sections~\ref{example:ledfeat} through \ref{example:ledmixed}, plus +% \ref{example:ledbraonain}, +% were originally written for TeX. +% I have done some limited conversions of these so that +% they look more like LaTeX code. In particular wherever possible +% I have replaced \cs{def} commands by either \cs{newcommand} or +% \cs{renewcommand} as appropriate. +% I have also replaced the original TeX font handling commands by the +% LaTeX font commands. +% +% The other examples were written natively in LaTeX. +% +% The figures are from processed versions of the files. Having latexed +% a file I used DVIPS to get Encapsulated PostScript, then the epstopdf +% script to get a PDF version as well, for example: \\ +% \begin{verbatim} +% > latex ledeasy +% > latex ledeasy +% > latex ledeasy +% > dvips -E -o ledeasy.eps ledeasy +% > epstopdf ledeasy.eps % produces ledeasy.pdf +% \end{verbatim} +% +% For those who aren't fascinated by LaTeX code, I show the all the +% typeset results first, then the code that produced them. +% +% \end{PW} +% +% \clearpage +% +% \begin{figure}[p] +% \centering +% \includegraphics{ledeasy} +% \caption{Output from \file{ledeasy.tex}.} +% \label{easy-out} +% \end{figure} +% +% \begin{figure}[p] +% \centering +% \includegraphics{ledfeat} +% \caption{Output from \file{ledfeat.tex}.} +% \label{features-out} +% \end{figure} +% +% \begin{figure}[p] +% \centering +% \includegraphics{ledioc} +% \caption{Output from \file{ledioc.tex}.} +% \label{iocasta-out} +% \end{figure} +% +% \begin{figure}[p] +% \centering +% \includegraphics{ledarden} +% \caption{Output from \file{ledarden.tex}.} +% \label{arden-out} +% \end{figure} +% +% \begin{figure}[p] +% \centering +% \hspace*{-2in}\includegraphics{ledmixed}\hspace*{-2in} +% \caption{Output from \texttt{ledmixed.tex}.} +% \label{periphyseon-out} +% \end{figure} +% +% \begin{figure}[p] +% \centering +% \includegraphics{ledekker} +% \caption{Output from \file{ledekker.tex}.} +% \label{ledekker-out} +% \end{figure} +% +% \begin{figure}[p] +% \centering +% \includegraphics{ledbraonain} +% \caption{Output from \file{ledbraonain.tex}.} +% \label{braonain-out} +% \end{figure} +% +% +% \clearpage +% +% \subsection{Simple example}\label{example:ledeasy} +% +% \begin{PW} +% This made-up example, \file{ledeasy.tex}, is included to show how +% simple it can be to use \edmac{} in a LaTeX document. +% The code is given below and the result is shown in Figure~\ref{easy-out}. +% +% \end{PW} +% +% \medskip +% \hrule +% \medskip +% \begin{macrocode} +%<*easy> +% ledeasy.tex simple example of the ledmac package +\documentclass{article} +\usepackage{ledmac} +%% number every line +\setcounter{firstlinenum}{1} +\setcounter{linenumincrement}{1} +%% Show some B series familiar footnotes, lettered and paragraphed +\renewcommand*{\thefootnoteB}{\alph{footnoteB}} +\footparagraphX{B} +%% no endnotes +\noendnotes +%% narrow sidenotes +\setlength{\ledrsnotewidth}{4em} +\title{Simple Example} +\author{Peter Wilson\thanks{Standing on the shoulders of giants.}} +\date{} +\begin{document} +\maketitle +\tableofcontents +\section{First} + This is a simple example of using the \textsf{ledmac} +package with ordinary LaTeX constructs. + +\subsection{Example text}\label{subsec} + +\beginnumbering +\pstart +The \textsf{ledmac} package lets you do some unusual things in +a LaTeX document. For example you can have lines numbered and +there are +\edtext{several}{\Afootnote{This is an `A' footnote.}} +\edtext{levels}{\Bfootnote{This is a `B' level footnote.}} +of footnotes. +You can label lines within the numbered text and refer to them +outside. Do not try and use any normal LaTeX +marginpars\footnote{You will get a warning but no text.}% +\ledrightnote{Sidenotes are OK} +or \edtext{exotica}{\Afootnote{Like floats.}} +within the numbered portions of the text\edlabel{line}. +\pend +\endnumbering + +\section{Last} + + I forgot to mention that you can use ordinary +footnotes\footnote{An ordinary footnote}\footnote{And another} +outside the numbered text. You can also\footnoteB{Additionally} +have\footnoteB{Specify} formatted footnotes\footnoteB{Like this} +in normal\footnoteB{Text that does not have line numbers} text. + + There are \lineref{line} numbered lines in the example shown +in section~\ref{subsec}. + +\end{document} +%</easy> +% \end{macrocode} +% +% +% \subsection{General example of features} \label{example:ledfeat} +% +% This made-up example, \file{ledfeat.tex}, is included purely to illustrate +% some of \Ledmac's main features. It is hard to find real-world +% examples that actually use as many layers of notes as this, so we made +% one up. The example is a bit tricky to read, but close study and +% comparison with the output (Figure~\ref{features-out}) will be +% illuminating. +% +% \begin{PW} +% I have converted the original TeX code to look more like LaTeX code. +% \end{PW} +% +% \medskip +% \hrule +% \medskip +% \begin{macrocode} +%<*features> +% ledfeat.tex Small test file for ledmac package +\documentclass{article} +\usepackage{ledmac} + +\noendnotes % we aren't having any endnotes + + \makeatletter + % I'd like a spaced out colon after the lemma: + \newcommand{\spacedcolon}{{\rmfamily\thinspace:\thinspace}} + \renewcommand*{\normalfootfmt}[3]{% + \ledsetnormalparstuff + {\notenumfont\printlines#1|}\strut\enspace + {\select@lemmafont#1|#2}\spacedcolon\enskip#3\strut\par} + + % And I'd like the 3-col notes printed with a hanging indent: + \renewcommand*{\threecolfootfmt}[3]{% + \normal@pars + \hsize .3\hsize + \setlength{\parindent}{0pt} + \tolerance=5000 % high, but not infinite + \raggedright + \hangindent1.5em \hangafter1 + \leavevmode + \strut\hbox to 1.5em{\notenumfont\printlines#1|\hfil}\ignorespaces + {\select@lemmafont#1|#2}\rbracket\enskip + #3\strut\par\allowbreak} + + % And I'd like the 2-col notes printed with a double colon: + \newcommand*{\doublecolon}{{\rmfamily\thinspace::\thinspace}} + \renewcommand*{\twocolfootfmt}[3]{% + \normal@pars + \hsize .45\hsize + \setlength{\parindent}{0pt} + \tolerance=5000 + \raggedright + \leavevmode + \strut{\notenumfont\printlines#1|}\enspace + {\select@lemmafont#1|#2}\doublecolon\enskip + #3\strut\par\allowbreak} + + % And in the paragraphed footnotes, I'd like a colon too: + \renewcommand*{\parafootfmt}[3]{% + \ledsetnormalparstuff + {\notenumfont\printlines#1|}\enspace + {\select@lemmafont#1|#2}\spacedcolon\enskip + #3\penalty-10 } + \makeatother + + % I'd like the line numbers picked out in bold. + \renewcommand{\notenumfont}{\bfseries} + \lineation{page} + \linenummargin{inner} + \setcounter{firstlinenum}{3} % just because I can + \setcounter{linenumincrement}{1} + \foottwocol{A} + \footthreecol{B} + \footparagraph{E} + % I've changed \normalfootfmt, so invoke it again for C and D notes. + \footnormal{C} + \footnormal{D} + +\begin{document} + + \beginnumbering + + \pstart + This is an \edtext{example}{ + \Afootnote{eximemple C, D.}} + of some %\footnote{A normal footnote} + text with \edtext{variant}{ + \Afootnote{alternative, A, B.}} + readings recorded as `A' footnotes. From here on, \edtext{though}{ + \Afootnote{however $\alpha$, $\beta$}}, + we shall have \edtext{`C'}{ + \Bfootnote{B, \textit{pace} the text}}. + \edtext{For spice, let us mark a longer passage, but give a different + lemma for it, so that we don't get a \edtext{huge}{ + \Dfootnote{vast E, F; note that this is + a `D' note to section of text within a longer lemma}} + amount of text in a note}{\lemma{For spice \dots\ note} + \Cfootnote{The note here is type `C'}}. + \edtext{Finally}{ + \Efootnote{in the end X, Y}}, + \edtext{we}{ + \Efootnote{us K}} + \edtext{shouldn't}{ + \Efootnote{ought not to L, M}} + \edtext{forget the}{ + \Efootnote{omit to mention the \S, \P}} + \edtext{paragraphed}{ + \Efootnote{blocked M, N}} + \edtext{notes}{ + \Efootnote{variants HH, KK}}, + which are so \edtext{useful}{ + \Efootnote{truly useful L, P}} + when there are \edtext{a great number of}{ + \Efootnote{many, many (preferably)}} + short notes to be \edtext{recorded}{ + \Efootnote{noted: repetition}}. + \pend + + \pstart + This is a second paragraph, giving more \textit{\edtext{examples}{ + \Afootnote{eximples L, M.}}} + of text with \edtext{variant}{ + \Afootnote{alternative, A, B.}} + readings recorded as `A' footnotes. From here on, \edtext{though}{ + \Bfootnote{however $\alpha$, $\beta$}}, + we shall have \edtext{`B'}{ + \Bfootnote{B, as correctly stated in the text}} notes in the text. + \edtext{For spice, let us mark a longer passage, but give a different + lemma for it, so that we don't get a \textit{\edtext{huge}{ + \Dfootnote{vast E, F; note that this is + a `D' note to text within a longer lemma.}}} + amount of text in a note}{\lemma{For spice, \dots\ note} + \Cfootnote{This is a rogue note of type `C'.}}. + \edtext{Finally}{ + \Bfootnote{In the end X, Y}}, + \edtext{we}{ + \Bfootnote{we here K}} + \edtext{shouldn't}{ + \Bfootnote{ought not to L, M}} + \edtext{forget the}{ + \Bfootnote{omit to mention the \S, \P}} + \edtext{column}{ + \Bfootnote{blocked M, N}} + \edtext{notes}{ + \Bfootnote{variants H}}, + which are so \edtext{useful}{ + \Bfootnote{very, very useful L, P}} + when there are \edtext{many}{ + \Bfootnote{lots of Z}} + short notes to be \edtext{recorded}{ + \Bfootnote{recorded and put down: M (repetition)}}. + \pend + + \endnumbering +\end{document} +%</features> +% \end{macrocode} +% \medskip +% \hrule +% \medskip +% +% \subsection{Gascoigne} +% +% The first real-life example is taken from an edition of George +% Gascoigne's \textit{A Hundreth Sundrie Flowres} that is being +% prepared by G.~W.~Pigman III,\index{Pigman, III$^{rd}$, G. W.} at +% the California Institute of Technology. Figure \ref{iocasta-out} +% shows the result of setting the text with \Ledmac. +% +% +% \begin{PW} +% I have LaTeXified the original code, and removed all the code related +% to the main document layout, relying on the standard LaTeX layout parameters.. +% \end{PW} +% +% \medskip +% +% \hrule +% \medskip +% \begin{macrocode} +%<*ioc> +%% ledioc.tex +\documentclass{article} +\usepackage{ledmac} + + \noendnotes + \makeatletter + + \newcommand{\os}{\scriptsize} + \setcounter{firstsublinenum}{1000} + \frenchspacing \setlength{\parskip}{0pt} \hyphenpenalty=1000 + + % Say \nolinenums if you want no line numbers in the notes. + \newif\ifnolinenums + \newcommand{\nolinenums}{\global\nolinenumstrue} + \newcommand{\linenums}{\global\nolinenumsfalse} + + \renewcommand{\rightlinenum}{\ifbypage@\ifnum\line@num<10\kern.5em\fi\else + \ifnum\line@num<10\kern1em\else\ifnum\line@num<100 + \kern.5em\fi\fi\fi\kern.5em\numlabfont\the\line@num + \ifnum\subline@num>0:\the\subline@num\fi} + + \renewcommand{\leftlinenum}{\numlabfont\the\line@num + \ifnum\subline@num>0:\the\subline@num\fi \kern.5em} + \linenummargin{outer} + \lineation{page} + + \newcommand{\ggfootfmt}[3]{% + \notefontsetup + \let\par=\endgraf + \rightskip=0pt \leftskip=0pt + \setlength{\parindent}{0pt} \parfillskip=0pt plus 1fil + \ifnolinenums\relax\else + \begingroup \os \printlines#1|\endgroup + \enskip + \fi + {\rmfamily #2\def\@tempa{#2}\ifx\@tempa\empty + \else]\enskip\fi#3\penalty-10 }} + + % Now reset the \Afootnote parameters and macros: + \footparagraph{A} + \let\Afootfmt=\ggfootfmt + \dimen\Afootins=\vsize + \skip\Afootins=3pt plus9pt + \newcommand*{\ggfootstart}[1]{\vskip\skip\Afootins} + \let\Afootstart=\ggfootstart + + \newcommand*{\stage}[1]{\pstart\startsub\parindent=0pt + \hangindent=3em\hangafter=0 + {\itshape #1}\let\par=\finishstage} + \newcommand{\finishstage}{\pend\endsub} + \newcommand{\sen}{\leavevmode\lower1ex\hbox{\textrm{''}}} + \newcommand{\senspeak}[1]{\pstart\obeylines\setbox0=\hbox{\textrm{''}}% + \leavevmode + \lower1ex\copy0\kern-\wd0\hskip1em{\textit{#1}}% + \hbox to1ex{}\ignorespaces} + \newcommand*{\speak}[1]{\pstart\obeylines\hskip1em{\textit{#1}}% + \hbox to1ex{}\ignorespaces} + \def\nospeaker{\parindent=0em\pstart\let\par=\pend} + \newcommand*{\nospeak}{\pstart\obeylines} + \makeatother + +\begin{document} + + \setlength{\parindent}{0pt} + + \beginnumbering + + \stage{Oedipus \edtext{entreth}{\Afootnote{\textit{intrat} MS}}.} + + \nospeak + Or that with wrong the right and doubtlesse heire, + Shoulde banisht be out of his princely seate. + Yet thou O queene, so fyle thy sugred toung, + And with suche counsell decke thy mothers tale, + That peace may bothe the brothers heartes inflame, + And rancour yelde, that erst possest the same. + \pend + + \speak{Eteocl.} Mother, beholde, youre hestes for to obey, + In person nowe am I resorted hither: + In haste therefore, fayne woulde I knowe what cause + With hastie speede, so moued hath your mynde + To call me nowe so causelesse out of tyme, + When common wealth moste craues my onely ayde: + Fayne woulde I knowe, what queynt commoditie + Persuades you thus to take a truce for tyme, + And yelde the gates wide open to my foe, + The gates that myght our stately state defende, + And nowe are made the path of our decay. + \pend + + \senspeak{Ioca.}Represse deare son, those raging stormes of wrath, + \sen That so bedimme the eyes of thine intente, + \edtext{\sen As when \edtext{the}{\Afootnote{thie MS}} tongue % + (a redy Instrument) + \sen Would \edtext{fayne pronounce}{\Afootnote{faynest tell MS}} % + the meaning of \edtext{the minde}{\Afootnote{thy minde MS}}, + \sen \edtext{It}{\lemma{It \dots\ worde.}\Afootnote{Thie % + swelling hart puft vp with wicked ire / Can scarce pronounce % + one inward louing thought. MS}} cannot speake one honest % + seemely worde.}{\lemma{As \dots\ worde.}\Afootnote{\textit{not % + in} \os73}} + \sen But when disdayne is shrunke, or sette asyde, + \sen And mynde of man with leysure can discourse + \sen What seemely woordes his tale may best beseeme, + \sen And that the toung vnfoldes without affectes + \sen Then may proceede an answere sage and graue, + \sen And euery sentence sawst with sobernesse: + Wherefore vnbende thyne angrie browes deare chylde, + And caste thy rolling eyes none other waye, + That here doost not \edtext{\textit{Medusaes}}{% + \Afootnote{One of the furies. {\os75}m}} face beholde, + But him, euen him, thy blood and brother deare. + And thou beholde, my \textit{Polinices} eke, + Thy brothers face, wherin when thou mayst see + Thine owne image, remember therwithall, + That what offence thou woldst to him were done, + \pend + \endnumbering + +\end{document} + +%</ioc> +% \end{macrocode} +% \medskip +% \hrule +% +% +% \subsection{Shakespeare} \label{example:ledarden} +% +% The following text illustrates another input file of moderate +% complexity, with two layers of annotation in use. The example is +% taken from the Arden \textit{Merchant of Venice}.\index{Shakespeare, William} +% +% +% \begin{PW} +% I have roughly converted the original TeX file to a LaTeX file. +% The file is below and the result of LaTeXing it is shown in +% Figure~\ref{arden-out}. +% \end{PW} +% +% +% \medskip +% \hrule +% \medskip +% +% \begin{macrocode} +%<*arden> +%% ledarden.tex +\documentclass{article} +\usepackage{ledmac} + +\makeatletter + \newcommand{\stage}[1]{\rlap{\hbox to \the\linenumsep{% + \hfil\llap{[\textit{#1}]}}}} + + \newcommand{\speaker}[1]{\pstart\hangindent2em\hangafter1 + \leavevmode\textit{#1}\enspace\ignorespaces} + + \newcommand{\exit}[1]{\hfill\stage{#1}} + + % LEDMAC customizations: + \noendnotes + \setlength{\parindent}{0pt} + \setlength{\linenumsep}{.4in} + \rightskip\linenumsep + + \renewcommand{\interparanoteglue}{1em plus.5em minus.1em} + + \newcommand{\scf}{\tiny} + \let\Afootnoterule=\relax \let\Bfootnoterule=\relax + + \renewcommand{\rightlinenum}{\numlabfont\llap{\the\line@num}} + \frenchspacing + + % Footnote formats: + % \nonumparafootfmt is a footnote format without line numbers. + \newcommand{\nonumparafootfmt}[3]{% + \ledsetnormalparstuff + \rightskip=0pt + \select@lemmafont#1|#2\rbracket\enskip + \itshape #3\penalty-10 } + + \newcommand{\newparafootfmt}[3]{% + \ledsetnormalparstuff + {\notenumfont\printlines#1|}\fullstop\enspace + {\select@lemmafont#1|#2}\rbracket\enskip + \itshape #3\penalty-10 } + + \newcommand{\newtwocolfootfmt}[3]{% + \normal@pars + \hsize .48\hsize + \tolerance=5000 + \rightskip=0pt \leftskip=0pt \parindent=5pt + \strut\notenumfont\printlines#1|\fullstop\enspace + \itshape #2\/\rbracket\penalty100\hskip .5em plus .5em + \normalfont #3\strut\goodbreak} + + % Footnote style selections etc. (done last): + \footparagraph{A} + \foottwocol{B} + \let\Afootfmt=\newparafootfmt + \let\Bfootfmt=\newtwocolfootfmt + \let\collation=\Afootnote + \let\note=\Bfootnote + \lineation{section} + \linenummargin{right} + \makeatother + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\begin{document} + \pagestyle{empty} + + % Initially, we don't want line numbers. + \let\Afootfmt=\nonumparafootfmt + + \beginnumbering + \pstart + \centerline{[\edtext{SCENE III}{ + \lemma{Scene III} + \collation{Capell; om. Q, F; \textnormal{Scene IV} Pope.}}.---% + \edtext{\textit{Venice}}{ + \collation{om. Q, F; Shylock's house Theobald; The same. + A Room in Shylock's House Capell.}}.]} + \pend + \bigskip + + \pstart + \centerline{\textit{Enter} JESSICA \textit{and} + [\edtext{LAUNCELOT}{ + \lemma{Launcelot} + \collation{Rowe; om. Q, F.}}] \textit{the clown.}} \pend \bigskip + + \let\Afootfmt=\newparafootfmt % we do want line numbers from now + + \setline{0}% + + \speaker{Jes.}\edtext{I am}{ + \collation{Q, F; \textnormal{I'm} Pope.}} + sorry thou wilt leave my father so,\\ + Our house is hell, and thou (a merry devil)\\ + Didst rob it of some taste of tediousness,---\\ + But fare thee well, there is a ducat for thee,\\ + And Launcelot, \edtext{soon}{ + \note{early.}} + at supper shalt thou see\\ + Lorenzo, who is thy new master's guest,\\ + Give him this letter,---do it secretly,---\\ + And so farewell: I would not have my father\\ + See me \edtext{in}{ + \collation{Q; om. F.}} + talk with thee. + \pend + + \speaker{Laun.} + \edtext{}{\lemma{\textit{Laun.}}\collation{Q2; Clowne. Q, F.}}% + \edtext{Adieu!}{ + \collation{\textnormal{Adiew}, Q, F.}} + tears \edtext{exhibit}{ + \note{Eccles paraphrased ``My tears serve to express what my + tongue should, if sorrow would permit it,'' but probably it is + Launce\-lot's blunder for prohibit (Halliwell) or inhibit + (Clarendon).}} + my tongue, most beautiful \edtext{pagan}{ + \note{This may have a scurrilous undertone: cf. \textit{2 H 4,} + {\scf II.} \textrm{ii. 168.}}}% + , most sweet \edtext{Jew!}{ + \collation{\textnormal{Iewe}, Q, F. \quad \textnormal{do]} Q, F; + \textnormal{did} F2.}}% + ---if a Christian \edtext{do}{ + \note{Malone upheld the reading of Qq and F by comparing {\scf II.} + vi. 23: ``When you shall please to play the thieves for + wives''; Launcelot seems fond of hinting at what is going to + happen (cf. {\scf II.} v. 22--3). If F2's ``did'' is accepted, + \textit{get} is used for beget, as in {\scf III.} v. 9.}} + not play the knave and get thee, I am much deceived; but \edtext{adieu!}{ + \collation{\textnormal{adiew}, Q, F.}} + these \edtext{foolish drops do \edtext{something}{ + \collation{Q; \textnormal{somewhat} F.}} + drown my manly spirit}{ + \lemma{foolish\textnormal{\dots}spirit} + \note{``tears do not become a man'' (\textit{AYL.}, {\scf III.} + iv. 3); cf. also \textit{H 5,} {\scf IV.} vi. 28--32.}}% + : \edtext{adieu!}{ + \collation{\textnormal{adiew}. Q, F. \quad \textnormal{S. D.]} Q2, F; om. Q; + after l. 15 Capell.}} + \exit{Exit.} + \pend + + \speaker{Jes.} + Farewell good Launcelot.\\ + Alack, what heinous sin is it in me\\ + To be ashamed to be my father's \edtext{child!}{ + \collation{\textnormal{child}, Q, F; \textnormal{Child?} Rowe.}} + \pend + \endnumbering + +\end{document} + +%</arden> +% \end{macrocode} +% +% \medskip +% \hrule +% +% +% \subsection{Classical text edition} \label{example:ledmixed} +% +% The next example, which was extracted from a longer file kindly +% supplied by Wayne Sullivan,\index{Sullivan, Wayne} University +% College, Dublin, Ireland, illustrates the use of \Ledmac{} to +% produce a Latin text edition, the \textit{Periphyseon}, with Greek +% passages.\footnote{The bibliographic details of the forthcoming book +% are: Iohannis Scotti Erivgenae, \textit{Periphyseon} (\textit{De +% Diuisione Naturae}) Liber Qvartvs [Scriptores Latini Hiberniae +% vol.\,xii], (Dublin: School of Celtic Studies, Dublin Institute +% for Advanced Studies, forthcoming 1992).} The Greek font used is +% that prepared by Silvio Levy\index{Levy, Silvio} and described in +% \textit{TUGboat}.\footnote{\textit{TUGboat} \textbf{9} (1988), pp.\,20--24.} The +% output of this file is shown in Figure~\ref{periphyseon-out}. +% Note the use of two layers of footnotes to record testimonia and +% manuscript readings respectively. +% +% \begin{PW} +% I have converted the original \edmac{} example file from TeX +% to something that looks more like LaTeX. +% \end{PW} +% +% ^^A Periphyseon, Liber IV +% +% +% \medskip +% \hrule +% \medskip +% +% \begin{macrocode} +%<*periph> +% ledmixed.tex +\documentclass{article} +\usepackage{ledmac} + + \noendnotes +%% \overfullrule0 pt + \lefthyphenmin=3 + +% \end{macrocode} +% \begin{PW} +% The LaTeX version uses the \Lpack{lgreek} package to access Silvio Levy's +% greek font. The \texttt{delims} package option +% subverts\footnote{It actually changes its category code.} the normal meaning +% of \$ to switch in and out of math mode. We have to save the original meaning +% of \$ before calling the package. Later, we use \cs{Ma} and \cs{aM} for math mode +% switching. +% \end{PW} +% \begin{macrocode} +\let\Ma=$ +\let\aM=$ +\usepackage[delims]{lgreek} + + % We need an addition to \no@expands since the \active $ in lgreek + % causes problems: + \newcommand{\morenoexpands}{\let$=0} + +\makeatletter + + \newbox\lp@rbox + + \newcommand{\ffootnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\vffootnote{f}{{\l@d@nums}{\@tag}{#1}}}% + \to\inserts@list + \global\advance\insert@count by 1 + % \else %% may be used only in numbered text + % \vffootnote{f}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} + + \newcommand{\gfootnote}[1]{% + \ifnumberedpar@ + \xright@appenditem{\noexpand\vgfootnote{g}{#1}}% + \to\inserts@list + \global\advance\insert@count by 1 + % \else %% may be used only in numbered text + % \vgfootnote{g}{#1}% + \fi\ignorespaces} + + \newcommand{\setlp@rbox}[3]{% + {\parindent\z@\hsize=2.5cm\raggedleft\scriptsize + \baselineskip 9pt% + \global\setbox\lp@rbox=\vbox to\z@{\vss#3}}} + + \newcommand{\vffootnote}[2]{\setlp@rbox#2} + + \newcommand{\vgfootnote}[2]{\def\rd@ta{#2}} + + \renewcommand{\do@line}{% + {\vbadness=10000 \splittopskip=0pt + \gdef\rd@ta{}% for right margin paragraph->always a few characters + \global\setbox\one@line=\vsplit\raw@text to\baselineskip}% + \unvbox\one@line \global\setbox\one@line=\lastbox + \getline@num + \hbox to\hsize{\affixline@num\add@inserts\hbox to\z@% inserts added here so + {\hss\box\lp@rbox\kern\linenumsep}% that margin pars are + \hfil\hbox to\wd\one@line{\new@line\unhbox\one@line% included. + \hbox to\z@{\kern\linenumsep\notenumfont\rd@ta\hss}}}% + \add@penalties} % margin pars also included in line format + + \renewcommand{\affixline@num}{% + \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 + % + \ifcase\sub@lock + \or + \ifnum\sublock@disp=1 + \@l@dtempcntb=0 \@l@dtempcnta=1 + \fi + \or + \ifnum\sublock@disp=2 \else + \@l@dtempcntb=0 \@l@dtempcnta=1 + \fi + \or + \ifnum\sublock@disp=0 + \@l@dtempcntb=0 \@l@dtempcnta=1 + \fi + \fi + \else + \@l@dtempcntb=\line@num + \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 + \ifcase\@lock + \or + \ifnum\lock@disp=1 + \@l@dtempcntb=0 \@l@dtempcnta=1 + \fi + \or + \ifnum\lock@disp=2 \else + \@l@dtempcntb=0 \@l@dtempcnta=1 + \fi + \or + \ifnum\lock@disp=0 + \@l@dtempcntb=0 \@l@dtempcnta=1 + \fi + \fi + \fi + % + \ifnum\@l@dtempcnta=\@l@dtempcntb + \@l@dtempcntb=\line@margin + \ifnum\@l@dtempcntb>1 + \advance\@l@dtempcntb by\page@num + \fi + \ifodd\@l@dtempcntb + % #1\rlap{{\rightlinenum}}% + \xdef\rd@ta{\the\line@num}% + \else + \llap{{\leftlinenum}}%#1% + \fi + \else + %#1% + \fi + \ifcase\@lock + \or + \global\@lock=2 + \or \or + \global\@lock=0 + \fi + \ifcase\sub@lock + \or + \global\sub@lock=2 + \or \or + \global\sub@lock=0 + \fi} + + \lineation{page} + \linenummargin{right} + \footparagraph{A} + \footparagraph{B} + +\renewcommand{\notenumfont}{\footnotesize} +\newcommand{\notetextfont}{\footnotesize} + + \let\Afootnoterule=\relax + \count\Afootins=825 + \count\Bfootins=825 + + \newcommand{\Aparafootfmt}[3]{% + \ledsetnormalparstuff + \scriptsize + \notenumfont\printlines#1|\enspace + % \lemmafont#1|#2\enskip + \notetextfont + #3\penalty-10\hskip 1em plus 4em minus.4em\relax} + + \newcommand{\Bparafootfmt}[3]{% + \ledsetnormalparstuff + \scriptsize + \notenumfont\printlines#1|\enspace + \select@lemmafont#1|#2\rbracket\enskip + \notetextfont + #3\penalty-10\hskip 1em plus 4em minus.4em\relax } + \makeatother + + \let\Afootfmt=\Aparafootfmt + \let\Bfootfmt=\Bparafootfmt + \def\lemmafont#1|#2|#3|#4|#5|#6|#7|{\scriptsize} + \parindent=1em + + \newcommand{\lmarpar}[1]{\edtext{}{\ffootnote{#1}}} + \newcommand{\rmarpar}[1]{\edtext{}{\gfootnote{#1}}} + \emergencystretch40pt + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\begin{document} + + \beginnumbering + \pstart + \rmarpar{741C} + \noindent \edtext{Incipit Quartus $PERIFUSEWN$}{% + \lemma{incipit\ .~.~.\ $PERIFUSEWN$}\Bfootnote{\textit{om.\ R}, + incipit quartus \textit{M}}} + \pend + \medskip + + \pstart + \noindent \edtext{NVTRITOR}{\lemma{$ANAKEFALIOSIS$}\Bfootnote{\textit{ + FJP, lege} $<anakefala'iwsis$}}.\lmarpar{$ANAKEFALIOSIS$ + NATVRARVM} Prima nostrae + \edtext{Physiologiae}{\lemma{physiologiae}\Bfootnote{phisiologiae + \textit{P}, physeologiae \textit{R}}} + intentio praecipuaque mat\-e\-ria erat + \edtext{quod}{\Bfootnote{\textit{p}.\ natura \textit{transp.\ MR}}} + \edtext{$UPEROUSIADES$}{\Bfootnote{\textit{codd.\ Vtrum} + $<uperousi'wdhs$ (hoc est superessentialis) natura \textit{cum Gale + (p.160) an} $<uperousi'oths$ (hoc est superessentialis natura) + \textit{cum Floss (PL 122,741C) intelligendum sit, ambigitur}}} + (hoc est superessentialis) natura sit causa creatrix existentium et + non existentium omnium, a nullo creata, unum principium, una + origo, unus et uniuersalis uniuersorum fons, a nullo manans, dum + ab eo manant omnia, trinitas coessentialis in tribus substantiis, + $ANARQOS$ (hoc est sine principio), principium et finis, una + bonitas, deus unus, + \edtext{$OMOUSIOS$}{\Bfootnote{\textit{codd., lege} $<omoo'usios$}} + \edtext{et}{\lemma{\textbf{et}}\Bfootnote{\textit{ + R}\textsuperscript{1}, \textit{om.\ R}\textsuperscript{0}}} + $UPEROUSIOS$ (id est coessentialis et superessentialis). Et, ut + ait sanctus Epifanius, episcopus Constantiae Cypri, in + \edtext{$AGKURATW$}{\Bfootnote{anchurato \textit{MR}}} + sermone + \edtext{de fide}{\Bfootnote{Glo\Ma\langle\aM ssa\Ma\rangle\aM: Ita + enim uocatur sermo eius de fide $AGKURATOS$, id est procuratus + \textit{mg.\ add.\ FJP}}}: + \begin{itshape}Tria sancta, tria consancta, tria + \edtext{agentia}{\Bfootnote{actiua \textit{MR}}}, + tria coagentia, tria + \edtext{formantia}{\Bfootnote{formatiua \textit{MR}}}, + tria conformantia, tria +\edtext{operantia}{\Bfootnote{operatiua \textit{MR}}}, + tria cooperantia, tria subsistentia, tria\rmarpar{742C} + consubsistentia sibi inuicem coexistentia. Trinitas haec + sancta uocatur: tria existentia, una consonantia, una deitas + \edtext{eiusdem}{\Bfootnote{eiusdemque \textit{M}}} + essentiae, + \edtext{eiusdem uirtutis, eiusdem + \edtext{subsistentiae}{\Bfootnote{substantiae \textit{R}}}}{% + \Bfootnote{\textit{om.\ M}}}, + similia +\edtext{similiter}{\Bfootnote{ex simili \textit{MR}}} + aequalitatem gratiae operantur patris et filii et sancti spiritus. + Quomodo autem + \edtext{sunt}{\Bfootnote{\textit{om.\ M}}}, + ipsis relinquitur docere: + \edtext{`Nemo enim nouit patrem nisi filius, neque filium nisi pater, + et cuicumque filius reuelauerit'}{\Afootnote{Matth.\ 11, 27}}; + reuelatur autem per spiritum sanctum. Non ergo haec tria existentia + aut ex ipso aut per ipsum aut ad ipsum in unoquoque digne intelliguntur, + \Ma\mid\! R, 264^{\rm r}\!\mid\aM\ sicut ipsa reuelant:\end{itshape} + $FWS, PUR, PNEUMA$ + \edtext{(hoc est lux, ignis, spiritus)}{\Afootnote{EPIPHANIVS, + \textit{Ancoratus} 67; PG~43, 137C--140A; GCS 25, p.~82, 2--12}}. + \pend + + \pstart + Haec, ut dixi, ab Epifanio tradita, ut quisquis interrogatus quae + tria et quid unum in sancta trinitate debeat credere, sana fide + \Ma\!\mid J, 1^{\rm v}\!\mid\aM\ respondere ualeat, aut ad + fidem accedens\rmarpar{743A} sic erudiatur. Et mihi uidetur + spiritum pro calore posuisse, quasi dixisset in similitudine: + lux, ignis, calor. Haec enim tria unius essentiae sunt. Sed cur + lucem primo dixit, non est mirum. Nam et pater lux est et ignis + et calor; et filius est lux, ignis, calor; et + \edtext{spiritus sanctus}{\Bfootnote{sanctus spiritus \textit{R}}} + lux, ignis, calor. Illuminat enim pater, illuminat filius, illuminat + spiritus sanctus: ex ipsis enim omnis scientia et sapientia donatur. + \pend + \endnumbering + +\end{document} + +%</periph> +% \end{macrocode} +% +% \medskip +% \hrule +% +% ^^A PW: I have removed the bits of the Arabic and Sanskrit examples. +% ^^A PW: the iffalse ... fi trick doesn't work here because of embedded ifs +% +% \subsection{Nijmegen}\label{example:ledekker} +% \changes{v0.22}{2003/11/09}{Added the Dekker example} +% \changes{v0.6}{2004/11/16}{Changed version of the Dekker example} +% +% \begin{PW} +% This example, illustrated in Figure~\ref{ledekker-out}, +% was provided in 2004 by Dirk-Jan Dekker\index{Dekker, Dirk-Jan} +% of the Department of Medieval History at the University of +% Nijmegen\footnote{On 1st September 2004 the University changed its +% name to Radboud University.}. +% Unlike earlier examples, this was coded for LaTeX and \Ledmac{} from +% the start. I have reformatted the example to help it fit this document; +% any errors are those that I have inadvertently introduced. Note that +% repeated line numbers are eliminated from the footnotes. +% \end{PW} +% +% \medskip +% \hrule +% \medskip +% \begin{macrocode} +%<*dekker> +%%% This is ledekker.tex, a sample critical text edition +%%% written in LaTeX2e with the ledmac package. +%%% (c) 2003--2004 by Dr. Dirk-Jan Dekker, +%%% University of Nijmegen (The Netherlands) +%%% (PRW) Modified slightly by PRW to fit the ledmac manual + +\documentclass[10pt, letterpaper, oneside]{article} +\usepackage[latin]{babel} +\usepackage{ledmac} + +\lineation{section} +\linenummargin{left} +\sidenotemargin{outer} + +\renewcommand{\notenumfont}{\footnotesize} +\newcommand{\notetextfont}{\footnotesize} + +%\let\Afootnoterule=\relax +\let\Bfootnoterule=\relax +\let\Cfootnoterule=\relax + +\addtolength{\skip\Afootins}{1.5mm} +%\addtolength{\skip\Bfootins}{1.5mm} +%\addtolength{\skip\Cfootins}{1.5mm} + +\makeatletter + +\renewcommand*{\para@vfootnote}[2]{% + \insert\csname #1footins\endcsname + \bgroup + \notefontsetup + \footsplitskips + \l@dparsefootspec #2\ledplinenumtrue % new from here + \ifnum\@nameuse{previous@#1@number}=\l@dparsedstartline\relax + \ledplinenumfalse + \fi + \ifnum\previous@page=\l@dparsedstartpage\relax + \else \ledplinenumtrue \fi + \ifnum\l@dparsedstartline=\l@dparsedendline\relax + \else \ledplinenumtrue \fi + \expandafter\xdef\csname previous@#1@number\endcsname{\l@dparsedstartline} + \xdef\previous@page{\l@dparsedstartpage} % to here + \setbox0=\vbox{\hsize=\maxdimen + \noindent\csname #1footfmt\endcsname#2}% + \setbox0=\hbox{\unvxh0}% + \dp0=0pt + \ht0=\csname #1footfudgefactor\endcsname\wd0 + \box0 + \penalty0 + \egroup +} + +\newcommand*{\previous@A@number}{-1} +\newcommand*{\previous@B@number}{-1} +\newcommand*{\previous@C@number}{-1} +\newcommand*{\previous@page}{-1} + +\newcommand{\abb}[1]{#1% + \let\rbracket\nobrak\relax} +\newcommand{\nobrak}{\textnormal{}} +\newcommand{\morenoexpands}{% + \let\abb=0% +} + +\newcommand{\Aparafootfmt}[3]{% + \ledsetnormalparstuff + \scriptsize + \notenumfont\printlines#1|\enspace +% \lemmafont#1|#2\enskip + \notetextfont + #3\penalty-10\hskip 1em plus 4em minus.4em\relax} + +\newcommand{\Bparafootfmt}[3]{% + \ledsetnormalparstuff + \scriptsize + \notenumfont\printlines#1|% + \ifledplinenum + \enspace + \else + {\hskip 0em plus 0em minus .3em} + \fi + \select@lemmafont#1|#2\rbracket\enskip + \notetextfont + #3\penalty-10\hskip 1em plus 4em minus.4em\relax } + +\newcommand{\Cparafootfmt}[3]{% + \ledsetnormalparstuff + \notenumfont\printlines#1|\enspace +% \lemmafont#1|#2\enskip + \notetextfont + #3\penalty-10\hskip 1em plus 4em minus.4em\relax} + +\makeatother + +\footparagraph{A} +\footparagraph{B} +\footparagraph{C} + +\let\Afootfmt=\Aparafootfmt +\let\Bfootfmt=\Bparafootfmt +\let\Cfootfmt=\Cparafootfmt + +\emergencystretch40pt + +\author{Guillelmus de Berchen} +\title{Chronicle of Guelders} +\date{} +\hyphenation{archi-epi-sco-po Huns-dis-brug li-be-ra No-vi-ma-gen-si} +\begin{document} +\maketitle +\thispagestyle{empty} + +\section*{St.\ Stephen's Church in Nijmegen} +\beginnumbering +\autopar + +\noindent +Nobilis itaque comes Otto imperio et dominio Novimagensi sibi, +ut praefertur, impignoratis et commissis +\edtext{proinde}{\Bfootnote{primum D}} praeesse cupiens, anno +\textsc{liiii}\ledsidenote{1254} superius descripto, mense +Iu\edtext{}{\Afootnote{p.\ 227~R}}nio, una cum iudice, scabinis +ceterisque civibus civitatis Novimagensis, pro ipsius et +inhabitantium in ea necessitate,\edtext{}{\Afootnote{p.\ 97~N}} +commodo et utilitate, ut +\edtext{ecclesia eius}{\Bfootnote{ecclesia D: eius eius H}} +parochialis +\edtext{\abb{extra civitatem}}{\Bfootnote{\textit{om.}~H}} sita +destrueretur et \edtext{infra}{\Bfootnote{intra D}} muros +\edtext{transfer\edtext{}{\Afootnote{p.\ 129~D}}retur}% +{\Bfootnote{transferreretur NH}} +ac de novo construeretur, \edtext{a reverendo patre domino +\edtext{Conrado de \edtext{Hofsteden}% +{\Bfootnote{Hoffstede D: Hoffsteden H}}, +archiepiscopo +\edtext{Coloniensi}{\Bfootnote{Colononiensi H}}}% +{\Cfootnote{Conrad of Hochstaden was archbishop of Cologne in +1238--1261}}, licentiam}{\Cfootnote{William is confusing two +charters that are five years apart. Permission from St.\ Apostles' +Church in Cologne had been obtained as early as 1249. Cf.\ Sloet, +\textit{Oorkondenboek} nr.\ 707 (14 November 1249): +``\ldots{}nos devotionis tue precibus annuentes, ut ipsam +ecclesiam faciens demoliri transferas in locum alium competentem, +tibi auctoritate presentium indulgemus\ldots{}''}}, et a +venerabilibus \edtext{dominis}{\Bfootnote{viris H}} decano et +capitulo sanctorum Apostolorum +\edtext{Coloniensi}{\Bfootnote{Coloniae H}}, ipsius ecclesiae ab +antiquo veris et pacificis patronis, consensum, citra tamen +praeiudicium, damnum aut gravamen +\edtext{iurium}{\Bfootnote{virium D}} et bonorum eorundem, +impetravit. + +\edtext{Et exinde \edtext{liberum}{\Bfootnote{librum H}} locum +eiusdem civitatis \edtext{qui}{\Bfootnote{quae D}} dicitur +\edtext{Hundisbrug}{\Bfootnote{Hundisburch D: Hunsdisbrug R}}, +de praelibati Wilhelmi Romanorum +\edtext{regis}{\Bfootnote{imperatoris D}}, ipsius fundi +do\edtext{}{\Afootnote{f.\ 72v~M}}mini, consensu, ad aedificandum +\edtext{\abb{et consecrandum}}{\Bfootnote{\textit{om.}\ H}} +ecclesi\edtext{}{\Afootnote{p.\ 228~R}}am et coemeterium, +\edtext{eisdem}{\Bfootnote{eiusdem D}} decano et capitulo de +expresso eiusdem civitatis assensu libera contradiderunt voluntate, +obligantes se ipsi \edtext{comes}{\Bfootnote{comites D}} et civitas +\edtext{\abb{dictis}}{\Bfootnote{\textit{om.}\ H}} decano et +capitulo, quod in recompensationem illius areae infra castrum et +portam, quae fuit dos ecclesiae, in qua plebanus habitare +solebat---quae \edtext{tunc}{\Bfootnote{nunc H}} per novum fossatum +civitatis est destructa---aliam aream competentem et ecclesiae +novae, +\edtext{ut praefertur, aedificandae}{\lemma{\abb{ut\ldots aedificandae}}% +\Bfootnote{\textit{om.}\ H}} satis +\edtext{contiguam}{\Bfootnote{contiguum M}}, ipsi plebano darent +et assignarent. Et desuper +\edtext{\abb{apud}}{\Bfootnote{\textit{om.}\ H}} dictam ecclesiam +sanctorum Apostolorum \edtext{est}{\Bfootnote{et H}} +\edtext{littera}{\Bfootnote{litteram H}} sigillis ipsorum +Ottonis\edtext{}{\Afootnote{p.\ 130~D}} comitis et civitatis +\edtext{Novimagensis}{\Bfootnote{Novimagii D}} +\edtext{sigillata}{\Bfootnote{sigillis communita H}}.}% +{\Cfootnote{Cf.\ Sloet, \textit{Oorkondenboek} nr.\ 762 (June 1254)}} + +% (PRW) the full document continues on after this point +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\endnumbering +\end{document} +%%%%%%%%%%%%%%%%%% + +%</dekker> +% \end{macrocode} +% +% \medskip +% \hrule +% \medskip +% +% \subsection{Irish verse}\label{example:ledbraonain} +% \changes{v0.3}{2004/02/14}{Added the Braonain example} +% +% \begin{PW} +% This example, illustrated in Figure~\ref{braonain-out}, +% is a somewhat modified and shortened version of Wayne Sullivan's example +% demonstration for \edstanza. +% +% The stanza lines are numbered according to the source verse lines, +% not according to the printed lines. For example, the +% sixth (`f') line in the first stanza is printed as two lines as the source +% line was too long to fit on one printed line. Note that if you process +% this yourself you will get error reports about counters the first time +% through; this is because alphabetic counters, like roman numerals, have no +% notion of zero. +% +% As is fairly typical of critical edition typesetting, some of +% \Lpack{ledmac}'s internal macros had to be modified to get the +% desired effects. +% \end{PW} +% +% \medskip +% \hrule +% \medskip +% \begin{macrocode} +%<*braonain> +%%% This is ledbraonain.tex, a sample critical verse edition. +%%% Originally written for TeX processing with edmac and edstanza +%%% by Wayne Sullivan. +%%% Extensively modified by Peter Wilson for LaTeX and the ledmac package. + +\documentclass{article} +\usepackage{ledmac} + +\setlength{\textheight}{40pc} +\setlength{\textwidth}{24pc} +\bigskipamount=12pt plus 6pt minus 6pt +\newcommand*{\notetextfont}{\footnotesize} + +%%% Just one footnote series +\footparagraph{C} +\count\Cfootins=800 +\makeatletter +%% but using two different formats +\def\xparafootfmt#1#2#3{% + \ledsetnormalparstuff + {\notenumfont\printlines#1|}\enspace +%%% {\select@lemmafont#1|#2}\rbracket\enskip + \notetextfont #3\penalty-10 } +\def\yparafootfmt#1#2#3{% + \ledsetnormalparstuff +%%% {\notenumfont\printlines#1|}\enspace +%%% {\select@lemmafont#1|#2}\rbracket\enskip + \notetextfont #3\penalty-10 } + +\let\Cfootfmt=\xparafootfmt +\skip\Cfootins=\bigskipamount +\makeatother + +%% This is the default, but just to demonstrate... +\setlength{\stanzaindentbase}{20pt} + +%% MUST SET THE INDENTS +%% indent multiples; first=hangindent. +%% Must all be non-negative whole numbers +\setstanzaindents{4,1,2,1,2,3,3,1,2,1} + +%% Set stanza line penalties +%% Must be nonnegative whole numbers. +%% An initial zero indicates no penalties. +\setstanzapenalties{1,5000,10500,5000,10500,5000,5000,5000,0} +%\setstanzapenalties{0}% the default + +%% Put some space between stanzas +\let\endstanzaextra=\bigbreak % ==> \bigskip \penalty -200 + +%% (almost) force line break in foot paragraph +\mathchardef\IMM=9999 +\def\lbreak{\hfil\penalty-\IMM} + +%% Number each stanza in bold +\newcounter{stanzanum} +\setcounter{stanzanum}{0} +\newcommand*{\numberit}{% + \flagstanza[0.5\stanzaindentbase]{\textbf{\thestanzanum}}} +%% Use the hook to insert the number (and counteract a new line) +%% and reset the line number to zero +\newcommand*{\startstanzahook}{\refstepcounter{stanzanum}% + \numberit\vskip-\baselineskip% + \setlinenum{0}} + +%% Want to label the footnotes with the stanza and line number +%% We'll use \linenum to replace the sub-line number +%% with the stanza number, redefining \edtext to do this +%% automatically for us. +%%%%%%%%%%%%%%%%%%%%%%%%% +\makeatletter + +\renewcommand{\edtext}[2]{\leavevmode + \begingroup + \no@expands + \xdef\@tag{#1}% + \set@line + \global\insert@count=0 + \ignorespaces \linenum{||\the\c@stanzanum}#2\relax + \flag@start + \endgroup + #1% + \ifx\end@lemmas\empty \else + \gl@p\end@lemmas\to\x@lemma + \x@lemma + \global\let\x@lemma=\relax + \fi + \flag@end} + +%% We need only a very simple macro for footnote numbers, +%% to produce the stanza number (sub-line) then the line number. +\def\printstanzalines#1|#2|#3|#4|#5|#6|#7|{\begingroup + #3\fullstop \linenumrep{#2} + \endgroup} +\let\oldprintlines\printlines + +\makeatother +%%%%%%%%%%%%%%%%%%%%%%%%% + +\pagestyle{empty} + +\begin{document} + +\beginnumbering + +\pstart \centering \textbf{22} \pend + +\bigskip +%% do not print line number beside heading +\setcounter{firstlinenum}{1000} +%% and heading footnotes use a different format +\let\Cfootfmt=\yparafootfmt + +\pstart +\centerline{[Se\'an \'O Braon\'ain cct] chuim Tom\'ais U\'{\i} +\edtext{Dh\'unlaing}{\Cfootnote{\textbf{22} \textit{Teideal}: Dhuinnluinng T, +Se\'aghan Mac Domhnaill cct B\lbreak}}} +\pend + +\pstart +\centerline{[Fonn: M\'airse\'ail U\'{'i} Sh\'uilleabh\'ain (P\'ainseach + na nUbh]} +\pend + +\bigskip + +%% revert to the regular footnote format +\let\Cfootfmt=\xparafootfmt +%% but use our special number printing routine +\let\printlines\printstanzalines +%% Use letters for line numbering +\linenumberstyle{alph} +%% number lines from the second onwards +\setcounter{firstlinenum}{2} +\setcounter{linenumincrement}{1} + +%% Each verse starts with \stanza. +%% Lines end with &; the last line with \&. + +\stanza +A \edtext{dhuine}{\Cfootnote{dhuinne T}} gan ch\'eill do +\edtext{mhaisligh}{\Cfootnote{mhaslaidh T, mhaslaig B}} an chl\'eir& +is tharcaisnigh naomhscruipt na bhf\'aige,& +na haitheanta \edtext{r\'eab}{\Cfootnote{raob T}} 's an + t-aifreann thr\'eig& +\edtext{re}{\Cfootnote{le B}} taithneamh do chlaonchreideamh + Mh\'artain,& +c\'a rachair \edtext{'od}{\Cfootnote{dod B}} dh\'{\i}on ar + \'Iosa Nasardha& +nuair \edtext{chaithfimid}{\Cfootnote{chaithfam\'{\i}d T}} cruinn +bheith ar \edtext{mhaoileann}{\Cfootnote{maoilinn B}} Josepha?& +N\'{\i} caraid Mac Crae chuim t'anama ' + \edtext{phl\'e}{\Cfootnote{phleidh T}}& +n\'a Calvin \edtext{bhiais}{\Cfootnote{bh\'{\i}os B}} taobh +\edtext{ris}{\Cfootnote{leis B}} an l\'a sin.\& + +\stanza +N\'ach damanta an sc\'eal don chreachaire + \edtext{chlaon}{\Cfootnote{claon B}}& +ghlac baiste na cl\'eire 'na ph\'aiste& +'s do \edtext{glanadh}{\Cfootnote{glannuig T}} mar ghr\'ein + \'on bpeaca r\'o-dhaor& +tr\'{\i} \edtext{ainibhfios}{\Cfootnote{ainnibhfios T, ainnbhfios B}} +\edtext{\'Eva}{\Cfootnote{\'Eabha B}} rinn \'Adam,& +tuitim ar\'{\i}s f\'e chuing na haicme sin& +tug atharrach br\'{\i} don scr\'{\i}bhinn bheannaithe,& +d'aistrigh b\'easa \edtext{agus}{\Cfootnote{is B}} reachta na cl\'eire& +'s n\'ach \edtext{tugann}{\Cfootnote{tuigionn T}} aon + gh\'eilleadh don Ph\'apa?\& + +\stanza +Gach \edtext{scolaire}{\Cfootnote{sgollaire T}} baoth, n\'{\i} +\edtext{mholaim}{\Cfootnote{mholluim T}} a cheird& +\edtext{'t\'a ag obair}{\Cfootnote{'t\'ag ccobar T}} + \edtext{le}{\Cfootnote{re B}} g\'eilleadh d\'a th\'aille& +don \edtext{doirbhchoin chlaon}{\Cfootnote{dorbhchon daor B}} + d\'a ngorthar Mac Crae,& +deisceabal \edtext{straeigh}{\Cfootnote{straodhaig T}} as an + gcoll\'aiste.& +T\'a \edtext{\edtext{adaithe}{\Cfootnote{fadaighthe B}} +th\'{\i}os}{\Cfootnote{fhadoghthe ts\'{\i}os T}} in + \'{\i}ochtar ifrinn,& +gan \edtext{solas}{\Cfootnote{sollus T}} gan soilse i + dt\'{\i}orthaibh dorcha,& +tuigsint an l\'einn, gach + \edtext{cuirpeacht}{\Cfootnote{cuirripeacht T}} d\'ein& +is \edtext{Lucifer}{\Cfootnote{Luicifer T, L\'ucifer B}} aosta + 'na \edtext{mh\'aistir}{\Cfootnote{mhaighistir T}}.\& + +\endnumbering + +\end{document} + +%</braonain> +% \end{macrocode} +% +% +% \medskip +% \hrule +% +% +% \clearpage +% +% \bibliographystyle{alpha} +% \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]{LEDPAR} +% Peter Wilson. +% \newblock \emph{Parallel typesetting for critical editions: +% the \Lpack{ledpar} package}. +% \newblock December 2004. +% \newblock (Available from CTAN in +% \texttt{macros/latex/contrib/ledmmac}) +% +% \bibitem[Wil05]{LEDARAB} +% Peter Wilson. +% \newblock \emph{Critical editions and arabic typesetting: +% the \Lpack{ledarab} and \Lpack{afoot} packages}. +% \newblock February 2005. +% \newblock (Available from CTAN in +% \texttt{macros/latex/contrib/ledmmac}) +% +% \end{thebibliography} +% +% \Finale +% +% \PrintIndex +% \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 \~} +%% diff --git a/Master/texmf-dist/source/latex/ledmac/ledmac.ins b/Master/texmf-dist/source/latex/ledmac/ledmac.ins new file mode 100644 index 00000000000..ea49a8ec730 --- /dev/null +++ b/Master/texmf-dist/source/latex/ledmac/ledmac.ins @@ -0,0 +1,86 @@ +%% ledmac.ins +%% Author: Peter Wilson (Herries Press) herries dot press at earthlink dot net +%% Copyright 2003 -- 2005 Peter R. Wilson +%% +%% 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 "author-maintained". +%% +%% This work consists of the files listed in the README file. +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this work when run through +%% LaTeX. +%% +%% +%% --------------- start of docstrip commands ------------------ +%% +\def\batchfile{ledmac.ins} +\input docstrip.tex +\preamble + + Author: Peter Wilson (Herries Press) herries dot press at earthlink dot net + Copyright 2003 -- 2005 Peter R. Wilson + + 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 "author-maintained". + + This work consists of the files listed in the README file. + +\endpreamble + +\keepsilent + +%%% \Msg{*** Generating the driver file ***} +%%% \generateFile{ledmac.drv}{t}{\from{ledmac.dtx}{driver}} + +\Msg{*** Generating the LaTeX2e package files ***} + +\generateFile{ledmac.sty}{t}{\from{ledmac.dtx}{code}} + +\Msg{*** Generating the LaTeX2e example files ***} + +\generateFile{ledeasy.tex}{t}{\from{ledmac.dtx}{easy}} +\generateFile{ledfeat.tex}{t}{\from{ledmac.dtx}{features}} +\generateFile{ledioc.tex}{t}{\from{ledmac.dtx}{ioc}} +\generateFile{ledarden.tex}{t}{\from{ledmac.dtx}{arden}} +\generateFile{ledmixed.tex}{t}{\from{ledmac.dtx}{periph}} +\generateFile{ledekker.tex}{t}{\from{ledmac.dtx}{dekker}} +\generateFile{ledbraonain.tex}{t}{\from{ledmac.dtx}{braonain}} + + +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* file(s) into a directory searched by LaTeX. See the FAQ on} +\Msg{* CTAN at /help/uk-tex-faq for more on this.} +\Msg{*} +\Msg{* \space\space ledmac.sty} +\Msg{*} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.dtx' through LaTeX.} +\Msg{* For an index, process any name.idx file by:} +\Msg{* \space\space\space\space makeindex -s gind.ist name} +\Msg{* For a list of changes, process any name.glo file by:} +\Msg{* \space\space\space\space makeindex -s gglo.ist -o name.gls name.glo} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} + +\endinput diff --git a/Master/texmf-dist/source/latex/ledmac/ledpar.dtx b/Master/texmf-dist/source/latex/ledmac/ledpar.dtx new file mode 100644 index 00000000000..72372f14cae --- /dev/null +++ b/Master/texmf-dist/source/latex/ledmac/ledpar.dtx @@ -0,0 +1,5163 @@ +% \iffalse meta-comment +% +% ledpar.dtx +% Author: Peter Wilson (Herries Press) herries dot press at earthlink dot net +% Copyright 2004, 2005 Peter R. Wilson +% +% 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 "author-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} +\providecommand{\phantomsection}{} % just in case hyperref is not used +\usepackage{graphicx} +\makeatletter + \@mparswitchfalse +\makeatother +\EnableCrossrefs +\CodelineIndex +%%\OnlyDescription +\renewcommand{\MakeUppercase}[1]{#1} +\pagestyle{headings} +\setcounter{StandardModuleDepth}{1} +\setcounter{IndexColumns}{2} +\begin{document} + \raggedbottom + \DocInput{ledpar.dtx} +\end{document} +%</driver> +% +% \fi +% +% \CheckSum{4226} +% +% \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} +% +% \newcommand{\dtxfilename}{\texttt{ledpar.dtx}} +% \def\fileversion{v0.1} \def\filedate{2004/12/10} +% \def\fileversion{v0.2} \def\filedate{2005/01/01} +% \def\fileversion{v0.3} \def\filedate{2005/03/24} +% \def\fileversion{v0.3a} \def\filedate{2005/03/30} +% \def\fileversion{v0.3b} \def\filedate{2005/04/08} +% +% \changes{v0.1}{2004/12/10}{First public release} +% \changes{v0.2}{2005/01/01}{Fix babel problems} +% \changes{v0.3}{2005/03/24}{Reorganize for ledarab} +% \changes{v0.3a}{2005/03/30}{Minor \cs{linenummargin} fix} +% \changes{v0.3b}{2005/04/08}{Improved parallel page balancing} +% +% \hyphenation{man-u-script man-u-scripts} +% +% \newcommand{\Lpack}[1]{\textsf{#1}} +% \newcommand{\Lclass}[1]{\textsf{#1}} +% \newcommand{\file}[1]{\texttt{#1}} +% \newcommand{\ledpar}{ledpar} +% \newcommand{\ledmac}{ledmac} +% \newcommand{\Ledmac}{\Lpack{\ledmac}} +% \newcommand{\Ledpar}{\Lpack{\ledpar}} +% \newcommand{\edmac}{\texttt{EDMAC}} +% \newcommand{\tabmac}{\texttt{TABMAC}} +% \newcommand{\edstanza}{\texttt{EDSTANZA}} +% \newcommand{\PWcomment}[1]{} +% \newenvironment{PW}{\itshape}{} +% \renewenvironment{PW}{\sffamily}{} +% \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{Parallel typesetting for critical editions: \\ +% the \Lpack{\ledpar} package\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}}} +% +% \date{} +% +% +% \maketitle +% +% +% \begin{abstract} +% The \Ledmac{} package, which is based on the \PlainTeX\ set of +% \edmac\ macros, has been used for some time for typesetting critical +% editions. The \Ledpar{} package is an extension to \Ledmac{} +% which enables texts and their critical apparatus to be typeset in +% parallel, either in two columns or on pairs of facing pages. +% \end{abstract} +% +% \tableofcontents +% +% \listoffigures +% +% +% \section{Introduction} +% +% The \edmac{} macros \cite{EDMACTUG} for typesetting critical editions +% of texts +% have been available for use with TeX for some years. Since \edmac{} +% became available there had been a small but constant demand for a +% version of \edmac{} that could be used with LaTeX. The \Ledmac{} +% package was introduced in 2003 in an attempt to satisfy that request. +% +% Some critical editions contain texts in more than one form, such as +% a set of verses in one language and their translations in another. In +% such cases there is a desire to be able to typeset the two texts, together +% with any critical apparatus, in parallel. The \Ledpar{} package +% is an extension to \Ledmac{} that enables two texts and their +% apparatus to be set in parallel, either in two columns or on pairs of +% facing pages. +% +% The package has to try and coerce \TeX{} into paths it was not designed +% for. Use of the package, therefore, may produce some surprising results. +% +% This manual contains a general description of how to use +% \Ledpar{} starting in section~\ref{howto}; +% the complete source code for the package, +% with extensive documentation (in sections~\ref{overview} +% through \ref{end}); +% and an Index to the source code. As \Ledpar{} is an adjunct to \Ledmac{} +% I assume that you have read the \Ledmac{} manual. Also \Ledpar{} requires +% \Ledmac{} to be used, preferably at least version 0.6 (2004/12/10). +% You do not need to read the source code for this package in order to +% use it but doing so may help to answer any questions you might have. +% On a first reading, +% I suggest that you should skip anything after the general documentation in +% sections~\ref{howto} until~\ref{overview}, +% unless you are particularly interested in the innards of \Ledpar. +% +% +% \section{The \Lpack{\ledpar} package}\label{howto} +% +% 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 \Ledmac's note commands with it: this is appropriate for +% introductions and other material added by the editor around the +% edited text. +% +% The \Ledpar{} package lets you typeset two \emph{numbered} texts in +% parallel. This can be done either as setting the `Leftside' and `Rightside' +% texts in two columns or on facing pages. +% In the paired pages case footnotes are placed at the bottom of the page +% on which they are called out --- that is, footnotes belonging to the left +% are set at the foot of a left (even numbered) page, and those for right +% texts are at the bottom of the relevant right (odd numbered) page. However, +% in the columnar case, all footnotes are set at the bottom left of the +% page on which they are called out --- they are not set below the +% relevant column. +% The line numbering schemes need not be the same for the two texts. +% +% \subsection{General} +% +% \Ledmac{} essentially puts each chunk of numbered text +% (the text within a \cs{pstart} \ldots \cs{pend}) into a box and then +% following the \cs{pend} extracts the text line by line from the box +% to number and print it. More precisely, the text is first put into the +% the box as though it was being typeset as normal onto a page and +% any notes are stored without being typeset. Then each typeset line +% is extracted from the box and any notes for that line are recalled. +% The line, with any notes, is then output for printing, possibly with +% a line number attached. Effectively, all the text is typeset and then +% afterwards all the notes are typeset. +% +% +% \Ledpar{} similarly puts the left and right chunks into boxes but can't +% immediately output the text after a \cs{pend} --- it has to wait until +% after both the left and right texts have been collected before it can +% start processing. This means that several boxes are required and possibly +% TeX has to store a lot of text in its memory; both the number of potential +% boxes and memory are limited. If TeX's memory is overfilled the recourse is +% to reduce the amount of text stored before printing. +% +% \DescribeMacro{\maxchunks} +% It is possible to have multiple chunks in the left and right texts before +% printing them. The macro \cs{maxchunks}\marg{num} specifies the maximum +% number of chunks within the left or right texts. This is initially set as: \\ +% \verb?\maxchunks{10}? \\ +% meaning that there can be up to 10 chunks in the left text and up to +% 10 chunks in +% the right text, requiring a total of 20 boxes. If you need more chunks +% then you can increase \cs{maxchunks}. +% +% TeX has a limited number of boxes; if you get an error +% message along the lines of `no room for a new box', then decrease +% the number. A chunk also requires a counter so you may get a message +% along the lines `no room for a new count', which may be resolved by reducing +% \cs{maxchunks}. +% +% On the other hand, if you get a \Ledmac{} error message along the +% lines: `Too many \cs{pstart} without printing. Some text will be lost.' +% then you will have to either increase \cs{maxchunks} or use the +% parallel printing commands (\cs{Columns} or \cs{Pages}) more frequently. +% +% When typesetting verse using \cs{syntax}, each line is treated as a chunk, +% so be warned that if you are setting parallel verses you might have to +% increase \cs{maxchunks} much more than it appears at first sight. +% +% In general, \Ledmac{} is a TeX resource hog, and \Ledpar{} only +% makes things worse in this respect. +% +% \section{Parallel columns}\label{columns} +% +% \DescribeEnv{pairs} +% Numbered text that is to be set in columns must be within a \verb?pairs? +% environment. Within the environment the text for the lefthand and righthand +% columns is placed within the \verb?Leftside? and \verb?Rightside? +% environments, respectively; these are described in more detail below +% in section~\ref{leftright}. +% +% \DescribeMacro{\Columns} +% The command \cs{Columns} typesets the texts in the previous pair of +% \verb?Leftside? and \verb?Rightside? environments. +% The general scheme for parallel columns looks like this: +% \begin{verbatim} +% \begin{pairs} +% \begin{Leftside} ... \end{Leftside} +% \begin{Rightside} ... \end{Rightside} +% \Columns +% \begin{Leftside} ... \end{Leftside} +% ... +% \Columns +% \end{pairs} +% \end{verbatim} +% +% There is no required pagebreak before or after the columns. +% +% \DescribeMacro{\Lcolwidth} +% \DescribeMacro{\Rcolwidth} +% The lengths \cs{Lcolwidth} and \cs{Rcolwidth} are the widths of the left +% and right columns, respectively. By default, these are: \\ +% \verb?\setlength{\Lcolwidth}{0.45\textwidth}? \\ +% \verb?\setlength{\Rcolwidth}{0.45\textwidth}? \\ +% They may be adjusted if one text tends to be `bulkier' than the other. +% +% \DescribeMacro{\columnrulewidth} +% \DescribeMacro{\columnseparator} +% The macro \cs{columnseparator} is called between each left/right pair +% of lines. By default it inserts a vertical rule of width +% \cs{columnrulewidth}. As this is initially defined to be 0pt the rule +% is invisible. For a visible rule between the columns you could try: \\ +% \verb?\setlength{\columnrulewidth}{0.4pt}? \\ +% You can also modify \cs{columnseparator} if you want more control. +% +% +% \section{Facing pages}\label{pages} +% +% \DescribeEnv{pages} +% Numbered text that is to be set on facing pages must be within a \verb?pages? +% environment. Within the environment the text for the lefthand and righthand +% pages is placed within the \verb?Leftside? and \verb?Rightside? +% environments, respectively. +% +% \DescribeMacro{\Pages} +% The command \cs{Pages} typesets the texts in the previous pair of +% \verb?Leftside? and \verb?Rightside? environments. +% The general scheme for parallel pages looks like this: +% \begin{verbatim} +% \begin{pages} +% \begin{Leftside} ... \end{Leftside} +% \begin{Rightside} ... \end{Rightside} +% \Pages +% \begin{Leftside} ... \end{Leftside} +% ... +% \Pages +% \end{pages} +% \end{verbatim} +% The \verb?Leftside? text is set on lefthand (even numbered) pages and +% the \verb?Rightside? text is set on righthand (odd numbered) pages. +% Each \cs{Pages} command starts a new even numbered page. After parallel +% typesetting is finished, a new page is started. +% +% \DescribeMacro{\Lcolwidth} +% \DescribeMacro{\Rcolwidth} +% Within the \verb?pages? environment the lengths \cs{Lcolwidth} and +% \cs{Rcolwidth} are the widths of the left +% and right pages, respectively. By default, these are set to the normal +% textwidth for the document, but can be changed within the environment if +% necessary. +% +% \DescribeMacro{\goalfraction} +% When doing parallel pages \Ledpar{} has to guess where TeX is going to +% put pagebreaks and hopefully get there first in order to put the pair of +% texts on their proper pages. When it thinks that the fraction +% \cs{goalfraction} of a page has been filled, it finishes that page and +% starts on the other side's text. The definition is: \\ +% \verb?\newcommand*{\goalfraction}{0.9}? \\ +% If you think you can get more on a page, increase this. On the other hand, +% if some left text overflows onto an odd numbered page or some right text +% onto an even page, try reducing it, for instance by: \\ +% \verb?\renewcommand*{\goalfraction}{0.8}? +% +% \section{Left and right texts}\label{leftright} +% +% Parallel texts are divided into Leftside and Rightside. The form of the +% contents of these two are independent of whether they will be set +% in columns or pages. +% +% \DescribeEnv{Leftside} +% \DescribeEnv{Rightside} +% The left text is put within the \verb?Leftside? environment and the +% right text likewise in the \verb?Rightside? environment. The number of +% \verb?Leftside? and \verb?Rightside? environments must be the same. +% +% Within these environments you can designate the line numbering scheme(s) +% to be used. +% \DescribeMacro{\firstlinenum} +% \DescribeMacro{\linenumincrement} +% \DescribeMacro{\firstsublinenum} +% \DescribeMacro{\sublinenumincrement} +% The \Ledmac{} package originally used counters for specifying the +% numbering scheme; now both \Ledmac\footnote{when used with \Lpack{ledpatch} +% v0.2 or greater.} and +% the \Ledpar{} package use macros instead. Following +% \cs{firstlinenum}\marg{num} the first line number will be \meta{num}, and +% following \cs{linenumincrement}\marg{num} only every \meta{num}th +% line will have a printed number. Using these macros inside the +% \verb?Leftside? and \verb?Rightside? environments gives you independent +% control over the left and right numbering schemes. The \cs{firstsublinenum} +% and \cs{sublinenumincrement} macros correspondingly set the numbering +% scheme for sublines. +% +% \DescribeMacro{\pstart} +% \DescribeMacro{\pend} +% In a serial (non-parallel) mode, each numbered paragraph, or chunk, +% is contained +% between the \cs{pstart} and \cs{pend} macros, and the paragraph is output +% when the \cs{pend} macro occurs. The situation is somewhat different +% with parallel typesetting as the left text (contained within \cs{pstart} +% and \cs{pend} groups within the \verb?Leftside? environment) has to be +% set in parallel with the right text (contained within its own \cs{pstart} +% and \cs{pend} groups within the corresponding \verb?Rightside? environment) +% the \cs{pend} macros cannot immediately initiate any typesetting --- +% this has to be controlled by the \cs{Columns} or \cs{Pages} macros. +% Several chunks may be specified within a \verb?Leftside? or +% \verb?Rightside? environment. +% A multi-chunk text then looks like: +% \begin{verbatim} +% \begin{...side} +% % \beginnumbering +% \pstart first chunk \pend +% \pstart second chunk \pend +% ... +% \pstart last chunk \pend +% % \endnumbering +% \end{...side} +% \end{verbatim} +% Numbering, via \cs{beginnumbering} and \cs{endnumbering}, may extend +% across several \verb?Leftside? or \verb?Rightside? environments. +% Remember, though, +% that the Left/Right sides are effectively independent of each other. +% +% Generally speaking, controls like \cs{firstlinenum} or \cs{linenummargin} +% apply to sequential and left texts. To effect right texts only they have +% to be within a \verb?Rightside? environment. + +% If you are using the +% \Lpack{babel} package with different languages +% (via, say, \cs{selectlanguage}) for the left and right texts it is +% particularly important to select the appropriate language within the +% \verb?Leftside? and \verb?Rightside? environments. The initial language +% selected for the right text is the \Lpack{babel} package's default. Also, +% it is the \emph{last} \cs{selectlanguage} in a side that controls the +% language used in any notes for that side when they get printed. If +% you are using multilingual notes then it is probably safest to explicitly +% specify the language(s) for each note rather than relying on the language +% selection for the side. The right side language is also +% applied to the right side line numbers. +% +% Corresponding left and right sides must have the same number of +% paragraph chunks --- if there are four on the left there must be four +% on the right, even if some are empty. The start of each pair of left and +% right chunks are aligned horizontally on the page. The ends may +% come at different positions --- if one chunk is shorter than the other +% then blank lines are output on the shorter side until the end of the longer +% chunk is reached. +% +% \section{Numbering text lines} +% +% \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} \\ +% These have to be separately specified within \verb?Leftside? and +% \verb?Rightside? environments. +% +% 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. +% Separate auxiliary files are maintained for right hand texts and +% these are named \meta{jobname}.\file{nnR}, using the `R' to distinguish +% them from the left hand and serial (non-parallel) texts. +% +% \DescribeMacro{\memorydump} +% The command \cs{memorydump} effectively performs an \cs{endumbering} +% immediately followed by a \cs{beginnumbering} while not restarting the +% numbering sequence. This has the effect of clearing TeX's memory of previous +% texts and any associated notes, allowing +% longer apparent streams of parallel texts. The command should be applied +% to both left and right texts, and after making sure that all previous +% notes have been output. For example, along the lines of: +% \begin{verbatim} +% \begin{Leftside} +% \beginnumbering +% ... +% \end{Leftside} +% \begin{Rightside} +% \beginnumbering +% ... +% \end{Rightside} +% \Pages +% \begin{Leftside} +% \memorydump +% ... +% \end{Leftside} +% \begin{Rightside} +% \memorydump +% ... +% \end{verbatim} +% +% \DescribeMacro{\Rlineflag} +% The value of \cs{Rlineflag} is appended to the line numbers of the +% right texts. Its default definition is: \\ +% \verb?\newcommand*{\Rlineflag}{R}? \\ +% This may be useful for parallel columns but for parallel pages it might +% be more appropriate to redefine it as: \\ +% \verb?\renewcommand*{\Rlineflag}{}?. +% +% \DescribeMacro{\printlinesR} +% \DescribeMacro{\ledsavedprintlines} +% The \cs{printlines} macro is ordinarily used to print the line number +% references for critical footnotes. For footnotes from right side texts +% a special version is supplied, called \cs{printlinesR}, which incorporates +% \cs{Rlineflag}. (The macro \cs{ledsavedprintlines} is a copy of the original +% \cs{printlines}, just in case \ldots). As provided, the package makes no +% use of \cs{printlinesR} but you may find it useful. For example, if you only +% use the B footnote series in righthand texts then you may wish to flag +% any line numbers in those footnotes with the value of \cs{Rlineflag}. You +% could do this by putting the following code in your preamble: +% \begin{verbatim} +% \let\oldBfootfmt\Bfootfmt +% \renewcommand{\Bfootfmt}[3]{% +% \let\printlines\printlinesR +% \oldBfootfmt{#1}{#2}{#3}} +% \end{verbatim} +% +% \section{Verse} +% +% If you are typesetting verse with \Ledmac{} you can use the \cs{stanza} +% construct, and you can also use this in right or left parallel texts. +% In this case each verse line is a chunk which has two implications. +% (1) you can unexpectedly exceed the \cs{maxchunks} limit or the overall +% limit on the number of boxes, and (2) left and right verse lines are +% matched, which may not be desirable if one side requires more print lines +% for verse lines than the other does. +% +% \DescribeEnv{astanza} +% \Ledpar{} provides an \verb?astanza? environment which you can use instead +% of \cs{stanza} (simply replace \verb?\stanza? by \verb?\begin{astanza}? and +% add \verb?\end{astanza}? after the ending \verb?\&?). Within the +% \verb?astanza? environment each verse line is treated as a paragraph, +% so there must be no blank lines in the environment otherwise there will +% be some extraneous vertical spacing. +% +% If you get an error message along the lines of `Missing number, +% treated as zero \cs{sza@0@}' it is because you have forgotten to use +% \cs{setstanzaindents} to set the stanza indents. +% +% \DescribeMacro{\skipnumbering} +% The command \cs{skipnumbering} when inserted in a line of parallel text +% causes the numbering of that particular line to be skipped. This can +% useful if you are putting some kind of marker (even if it is only a +% blank line) between stanzas. Remember, parallel texts must be numbered +% and this provides a way to slip in an `unnumbered' line. +% +% The \verb?astanza? environment forms a chunk but you may want to +% have more than one stanza within the chunk. Here are a couple of ways of +% doing that with a blank line between each internal stanza, and with +% each stanza numbered. First some preliminary definitions: +% \begin{verbatim} +% \newcommand*{\stanzanum}[2][\stanzaindentbase]{% +% \hskip -#1\llap{\textbf{#2}}\hskip #1\ignorespaces} +% \newcommand{\interstanza}{\par\mbox{}\skipnumbering} +% \end{verbatim} +% And now for two stanzas in one. In this first example the line numbering +% repeats for each stanza. +% \begin{verbatim} +% \setstanzaindents{1,0,1,0,1,0,1,0,1,0,1} +% \begin{pairs} +% \begin{Leftside} +% \firstlinenum{2} +% \linenumincrement{1} +% \beginnumbering +% \begin{astanza} +% \stanzanum{1} First in first stanza & +% Second in first stanza & +% Second in first stanza & +% Third in first stanza & +% Fourth in first stanza & +% \interstanza +% \setline{2}\stanzanum{2} First in second stanza & +% Second in second stanza & +% Second in second stanza & +% Third in second stanza & +% Fourth in second stanza \& +% \end{astanza} +% ... +% \end{verbatim} +% And here is a slightly different way of doing the same thing, but with +% the line numbering being continuous. +% \begin{verbatim} +% \setstanzaindents{1,0,1,0,1,0,0,1,0,1,0,1} +% \begin{pairs} +% \begin{Leftside} +% \firstlinenum{2} +% \linenumincrement{1} +% \beginnumbering +% \begin{astanza} +% \stanzanum{1} First in first stanza & +% Second in first stanza & +% Second in first stanza & +% Third in first stanza & +% Fourth in first stanza & +% \strut & +% \stanzanum{2}\advanceline{-1} First in second stanza & +% Second in second stanza & +% Second in second stanza & +% Third in second stanza & +% Fourth in second stanza \& +% \end{astanza} +% ... +% \end{verbatim} +% +% +% +% \StopEventually{% +% ^^A \addcontentsline{toc}{section}{\protect\numberline{B}Index} +% \addcontentsline{toc}{section}{Index} +% \PrintIndex +% ^^A \addtocontents{toc}{\protect\end{multicols}} +% } +% +% \clearpage +% \section{Implementation overview}\label{overview} +% +% TeX is designed to process a single stream of text, which may include +% footnotes, tables, and so on. It just keeps converting its input into +% a stream typeset pages. It was not designed for typesetting two texts +% in parallel, where it has to alternate from one to the other. Further, +% TeX essentially processes its input one paragraph at a time --- it is +% very difficult to get at the `internals' of a paragraph such as the +% individual lines in case you want to number them or put some mark at the +% start or end of the lines. +% +% \Ledmac{} solves the problem of line numbering by putting the paragraph +% in typeset form into a box, and then extracting the lines one by one +% from the box for TeX to put them onto the page with the appropriate page +% breaks. Most of the \Ledmac{} code is concerned with handling this box +% and its contents. +% +% \Ledpar's solution to the problem of parallel texts is to put the two +% texts into separate boxes, and then appropriately extract the pairs of +% lines from the boxes. This involves duplicating +% much of the original box code for an extra right text box. The other, +% smaller, +% part of the code is concerned with coordinating the line extractions from +% the boxes. +% +% The package code is presented in roughly in the same order as in \Ledmac. +% +% \section{Preliminaries} +% \label{preliminaries}\relax +% +% Announce the name and version of the package, which is +% targetted for LaTeX2e. The package also requires the \Ledmac{} +% package, preferably at least version 0.6 (2004/12/10). +% +% \begin{macrocode} +%<*code> +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{ledpar}[2005/04/08 v0.3b ledmac extension for parallel texts] + +% \end{macrocode} +% +% As noted above,much of the code is a duplication of the original +% \Ledmac{} code to handle the extra box(es) for the right hand side text, +% and sometimes for the left hand side as well. In order to distinguish +% I use `R' or `L' in the names of macros for the right and left code. +% The specifics of `L' and `R' are normally hidden from the user by +% letting the \verb?Leftside? and \verb?Rightside? environments set things +% up appropriately. +% +% \begin{macro}{\ifl@dpairing} +% \begin{macro}{\ifl@dpaging} +% \begin{macro}{\ifledRcol} +% \cs{ifl@dpairing} is set TRUE if we are processing parallel texts and +% \cs{ifl@dpaging} is also set TRUE if we are doing parallel pages. +% \cs{ifledRcol} is set TRUE if we are doing the right hand text. +% \cs{ifl@dpairing} is defined in \Lpack{ledmac}. +% \changes{v0.3}{2005/02/24}{Moved \cs{ifl@dpairing} to ledmac} +% \begin{macrocode} + \l@dpairingfalse +\newif\ifl@dpaging + \l@dpagingfalse +\newif\ifledRcol + \ledRcolfalse +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\Lcolwidth} +% \begin{macro}{\Rcolwidth} +% The widths of the left and right parallel columns (or pages). +% \begin{macrocode} +\newdimen\Lcolwidth + \Lcolwidth=0.45\textwidth +\newdimen\Rcolwidth + \Rcolwidth=0.45\textwidth + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Messages} +% +% All the error and warning messages are collected here as macros. +% +% \begin{macro}{\led@err@TooManyPstarts} +% \begin{macrocode} +\newcommand*{\led@err@TooManyPstarts}{% + \ledmac@error{Too many \string\pstart\space without printing. + Some text will be lost}{\@ehc}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\led@err@BadLeftRightPstarts} +% \begin{macrocode} +\newcommand*{\led@err@BadLeftRightPstarts}[2]{% + \ledmac@error{The numbers of left (#1) and right (#2) + \string\pstart s do not match}{\@ehc}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\led@err@LeftOnRightPage} +% \begin{macro}{\led@err@RightOnLeftPage} +% \begin{macrocode} +\newcommand*{\led@err@LeftOnRightPage}{% + \ledmac@error{The left page has ended on a right page}{\@ehc}} +\newcommand*{\led@err@RightOnLeftPage}{% + \ledmac@error{The right page has ended on a left page}{\@ehc}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \section{Sectioning commands} +% +% \begin{macro}{\section@numR} +% This is the right side equivalent of \cs{section@num}. +% +% Each section will read and write an associated `line-list +% file', containing information used to do the numbering. Normally +% the file will be called \meta{jobname}\file{.nn}, where \file{nn} is the +% section number. However, for right side texts the file is called +% \meta{jobname}\file{.nnR}. The \cs{extensionchars} applies to the +% right side files just as it does to the normal files. +% \begin{macrocode} +\newcount\section@numR + \section@numR=\z@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifnumberingR} +% 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} +% +% \begin{macro}{\ifpst@rtedL} +% \begin{macro}{\ifpst@rtedR} +% \cs{ifpst@rtedL} is set FALSE at the start of left side numbering, and +% similarly for \cs{ifpst@rtedR}. +% \cs{ifpst@rtedL} is defined in \Lpack{ledmac}. +% \changes{v0.3}{2005/02/24}{Moved \cs{ifpst@rtedL} to ledmac} +% \begin{macrocode} + \pst@rtedLfalse +\newif\ifpst@rtedR + \pst@rtedRfalse + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\beginnumbering} +% For parallel processing the original \cs{beginnumbering} is extended +% to zero \cs{l@dnumpstartsL} --- the number of chunks to be processed. +% It also sets \cs{ifpst@rtedL} to FALSE. +% \begin{macrocode} +\providecommand*{\beginnumbering}{% + \ifnumbering + \led@err@NumberingStarted + \endnumbering + \fi + \global\l@dnumpstartsL \z@ + \global\pst@rtedLfalse + \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} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\beginnumberingR} +% This is the right text equivalent of \cs{beginnumbering}, and begins +% a section of numbered text. +% \begin{macrocode} +\newcommand*{\beginnumberingR}{% + \ifnumberingR + \led@err@NumberingStarted + \endnumberingR + \fi + \global\l@dnumpstartsR \z@ + \global\pst@rtedRfalse + \global\numberingRtrue + \global\advance\section@numR \@ne + \global\absline@numR \z@ + \global\line@numR \z@ + \global\subline@numR \z@ + \global\@lock \z@ + \global\sub@lock \z@ + \global\sublines@false + \global\let\next@page@numR=\relax + \global\let\sub@change=\relax + \message{Section \the\section@numR R }% + \line@list@stuffR{\jobname.\extensionchars\the\section@numR R}% + \l@dend@stuff} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\endnumbering} +% This is the left text version of the regular \cs{endnumbering} and must +% follow the last text for a left text numbered section. +% It sets \cs{ifpst@rtedL} to FALSE. It is fully defined in \Lpack{ledmac}. +% \end{macro} +% +% \begin{macro}{\endnumberingR} +% This is the right text equivalent of \cs{endnumbering} and must follow the +% last text for a right text numbered section. +% \begin{macrocode} +\def\endnumberingR{% + \ifnumberingR + \global\numberingRfalse + \normal@pars + \ifl@dpairing + \global\pst@rtedRfalse + \else + \ifx\insertlines@listR\empty\else + \global\noteschanged@true + \fi + \ifx\line@listR\empty\else + \global\noteschanged@true + \fi + \fi + \ifnoteschanged@ + \led@mess@NotesChanged + \fi + \else + \led@err@NumberingNotStarted + \fi} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\pausenumberingR} +% \begin{macro}{\resumenumberingR} +% These are the right text equivalents of \cs{pausenumbering} and +% \cs{resumenumbering}. +% \begin{macrocode} +\newcommand*{\pausenumberingR}{% + \endnumberingR\global\numberingRtrue} +\newcommand*{\resumenumberingR}{% + \ifnumberingR + \global\pst@rtedRtrue + \global\advance\section@numR \@ne + \led@mess@SectionContinued{\the\section@numR R}% + \line@list@stuffR{\jobname.\extensionchars\the\section@numR R}% + \l@dend@stuff + \else + \led@err@numberingShouldHaveStarted + \endnumberingR + \beginnumberingR + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\memorydumpL} +% \begin{macro}{\memorydumpR} +% \cs{memorydump} is a shorthand for \cs{pausenumbering}\cs{resumenumbering}. +% This will clear the memorised stuff for the previous chunks while +% keeping the numbering going. +% \begin{macrocode} +\newcommand*{\memorydumpL}{% + \endnumbering + \numberingtrue + \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} +\newcommand*{\memorydumpR}{% + \endnumberingR + \numberingRtrue + \global\pst@rtedRtrue + \global\advance\section@numR \@ne + \led@mess@SectionContinued{\the\section@numR R}% + \line@list@stuffR{\jobname.\extensionchars\the\section@numR R}% + \l@dend@stuff} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% \section{Line counting} +% \label{lineation}\relax +% +% \subsection{Choosing the system of lineation} +% +% Sometimes you want line numbers that start at $1$ at the top of each +% page; other times you want line numbers that start at $1$ at the start +% of each section and increase regardless of page breaks. +% \Ledpar{} lets you choose different schemes for the left and right texts. +% +% \begin{macro}{\ifbypage@R} +% \begin{macro}{\bypage@Rtrue} +% \begin{macro}{\bypage@Rfalse} +% The \cs{ifbypage@R} flag specifies the current lineation +% system for right texts: \verb"false" for line-of-section, \verb"true" +% for line-of-page. +% \Ledpar{} will use the line-of-section system unless instructed otherwise. +% \begin{macrocode} +\newif\ifbypage@R + \bypage@Rfalse +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lineationR} +% \cs{lineationR}\marg{word} is the macro used to select the +% lineation system for right texts. +% Its argument is a string: either \texttt{page} or \texttt{section}. +% \begin{macrocode} +\newcommand*{\lineationR}[1]{{% + \ifnumberingR + \led@err@LineationInNumbered + \else + \def\@tempa{#1}\def\@tempb{page}% + \ifx\@tempa\@tempb + \global\bypage@Rtrue + \else + \def\@tempb{section}% + \ifx\@tempa\@tempb + \global\bypage@Rfalse + \else + \led@warn@BadLineation + \fi + \fi + \fi}} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\linenummargin} +% \begin{macro}{\line@marginR} +% You call \cs{linenummargin}\marg{word} to specify which margin you want your +% right text's 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. +% 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. +% +% For right texts the selection is recorded in the count \cs{line@marginR}, +% otherwise in the count \cs{line@margin}: +% $0$ for left, $1$ for right, $2$ for outer, and $3$ for inner. +% \changes{v0.3a}{2005/03/30}{Don't just set \cs{line@marginR} in \cs{linenummargin}} +% \begin{macrocode} +\newcount\line@marginR +\renewcommand*{\linenummargin}[1]{{% + \l@dgetline@margin{#1}% + \ifnum\@l@dtempcntb>\m@ne + \ifledRcol + \global\line@marginR=\@l@dtempcntb + \else + \global\line@margin=\@l@dtempcntb + \fi + \fi}} +% \end{macrocode} +% By default put right text numbers at the right. +% \begin{macrocode} +\line@marginR=\@ne + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\c@firstlinenumR} +% \begin{macro}{\c@linenumincrementR} +% The following counters tell \Ledmac{} which right text 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{firstlinenumR} + \setcounter{firstlinenumR}{5} +\newcounter{linenumincrementR} + \setcounter{linenumincrementR}{5} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\c@firstsublinenumR} +% \begin{macro}{\c@sublinenumincrementR} +% The following parameters are just like \texttt{firstlinenumR} and +% \texttt{linenumincrementR}, but for sub-line numbers. +% \texttt{sublinenumincrementR} must be at least $1$. +% +% \begin{macrocode} +\newcounter{firstsublinenumR} + \setcounter{firstsublinenumR}{5} +\newcounter{sublinenumincrementR} + \setcounter{sublinenumincrementR}{5} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\firstlinenum} +% \begin{macro}{\linenumincrement} +% \begin{macro}{\firstsublinenum} +% \begin{macro}{\sublinenumincrement} +% These are the user's macros for changing (sub) line numbers. They are +% defined in \Lpack{ledmac} v0.7, but just in case +% I have started by \cs{provide}ing them. +% \begin{macrocode} +\providecommand*{\firstlinenum}{} +\providecommand*{\linenumincrement}{} +\providecommand*{\firstsublinenum}{} +\providecommand*{\sublinenumincrement}{} +\renewcommand*{\firstlinenum}[1]{% + \ifledRcol \setcounter{firstlinenumR}{#1}% + \else \setcounter{firstlinenum}{#1}% + \fi} +\renewcommand*{\linenumincrement}[1]{% + \ifledRcol \setcounter{linenumincrementR}{#1}% + \else \setcounter{linenumincrement}{#1}% + \fi} +\renewcommand*{\firstsublinenum}[1]{% + \ifledRcol \setcounter{firstsublinenumR}{#1}% + \else \setcounter{firstsublinenum}{#1}% + \fi} +\renewcommand*{\sublinenumincrement}[1]{% + \ifledRcol \setcounter{sublinenumincrementR}{#1}% + \else \setcounter{sublinenumincrement}{#1}% + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\Rlineflag} +% This is appended to the line numbers of right text. +% \begin{macrocode} +\newcommand*{\Rlineflag}{R} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\linenumrepR} +% \begin{macro}{\sublinenumrepR} +% \cs{linenumrepR}\marg{ctr} typesets the right line number \meta{ctr}, and +% similarly \cs{sublinenumrepR} for subline numbers. +% \changes{v0.3}{2005/02/10}{Added \cs{linenumrepR} and \cs{sublinenumrepR}} +% \begin{macrocode} +\newcommand*{\linenumrepR}[1]{\@arabic{#1}} +\newcommand*{\sublinenumrepR}[1]{\@arabic{#1}} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\leftlinenumR} +% \begin{macro}{\rightlinenumR} +% \begin{macro}{\l@dlinenumR} +% \cs{leftlinenumR} and \cs{rightlinenumR} are the macros that are +% called to print the right text's marginal line numbers. Much of the +% code for these is common and is maintained in \cs{l@dlinenumR}. +% \changes{v0.3}{2005/02/10}{Simplified \cs{leftlinenumR} and +% \cs{rightlinenumR} by introducing \cs{l@dlinenumR}} +% \begin{macrocode} +\newcommand*{\leftlinenumR}{% + \l@dlinenumR + \kern\linenumsep} +\newcommand*{\rightlinenumR}{% + \kern\linenumsep + \l@dlinenumR} +\newcommand*{\l@dlinenumR}{% + \numlabfont\linenumrepR{\line@numR}\Rlineflag% + \ifsublines@ + \ifnum\subline@num>\z@ + \unskip\fullstop\sublinenumrepR{\subline@numR}% + \fi + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsection{Line-number counters and lists} +% +% We need another set of counters and lists for the right text, +% corresponding to those in \Lpack{ledmac} for regualr or left text. +% +% \begin{macro}{\line@numR} +% \begin{macro}{\subline@numR} +% \begin{macro}{\absline@numR} +% The count \cs{line@numR} stores the line number that's used in +% the right text's marginal line numbering and in notes. +% The count \cs{subline@numR} stores +% a sub-line number that qualifies \cs{line@numR}. +% The count \cs{absline@numR} stores the +% absolute number of lines since the start +% of the right text section: that is, the number we've actually printed, +% no matter what numbers we attached to them. +% +% \begin{macrocode} +\newcount\line@numR +\newcount\subline@numR +\newcount\absline@numR + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\line@listR} +% \begin{macro}{\insertlines@listR} +% \begin{macro}{\actionlines@listR} +% \begin{macro}{\actions@listR} +% Now we can define the list macros that will be created from the +% line-list file. They are directly analagous to the left text ones. +% The full list of action codes and their meanings is given in the \Ledmac{} +% manual. +% +% Here are the commands to create these lists: +% +% \begin{macrocode} +\list@create{\line@listR} +\list@create{\insertlines@listR} +\list@create{\actionlines@listR} +\list@create{\actions@listR} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\linesinpar@listL} +% \begin{macro}{\linesinpar@listR} +% \begin{macro}{\maxlinesinpar@list} +% In order to synchonise left and right chunks in parallel processing +% we need to know how many lines are in each left and right text chunk, +% and the maximum of these for each pair of chunks. +% \begin{macrocode} +\list@create{\linesinpar@listL} +\list@create{\linesinpar@listR} +\list@create{\maxlinesinpar@list} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\page@numR} +% The right text page number. +% \begin{macrocode} +\newcount\page@numR + +% \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} +\renewcommand*{\read@linelist}[1]{% +% \end{macrocode} +% We do do different things depending whether or not we are processing +% right text +% \begin{macrocode} + \ifledRcol + \list@clear{\line@listR}% + \list@clear{\insertlines@listR}% + \list@clear{\actionlines@listR}% + \list@clear{\actions@listR}% + \list@clear{\linesinpar@listR}% + \list@clear{\linesonpage@listR} + \else + \list@clearing@reg + \list@clear{\linesinpar@listL}% + \list@clear{\linesonpage@listL}% + \fi +% \end{macrocode} +% +% Make sure that the \cs{maxlinesinpar@list} is empty (otherwise things +% will be thrown out of kilter if there is any old stuff still hanging +% in there). +% \begin{macrocode} + \list@clear{\maxlinesinpar@list} +% \end{macrocode} +% Now get the file and interpret it. +% \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} + \ifledRcol + \global\page@numR=\m@ne + \ifx\actionlines@listR\empty + \gdef\next@actionlineR{1000000}% + \else + \gl@p\actionlines@listR\to\next@actionlineR + \gl@p\actions@listR\to\next@actionR + \fi + \else + \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 + \fi} + +% \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. The \cs{memorydump} macro is available if you run into +% macro memory limitations. +% +% \subsection{Commands within the line-list file} +% +% This section defines the commands that can appear within a +% line-list file, except for \cs{@lab} which is in a +% later section among the cross-referencing commands it is +% associated with. +% +% The macros with \verb"action" in their names contain all the code +% that modifies the action-code list. +% +% \begin{macro}{\@l} +% \cs{@l} does everything related to the start of a +% new line of numbered text. Exactly what it does depends +% on whether right text is being processed. +% +% \begin{macrocode} +\renewcommand{\@l}[2]{% + \fix@page{#1}% + \ifledRcol + \ifx\l@dchset@num\relax \else + \advance\absline@numR \@ne + \set@line@action + \let\l@dchset@num=\relax + \advance\absline@numR \m@ne + \advance\line@numR \m@ne% % do we need this?? + \fi + \advance\absline@numR \@ne +% \end{macrocode} +% Increment the absolute line-number, and perform +% deferred actions relating to page starts and sub-lines. +% \begin{macrocode} + \ifx\next@page@numR\relax \else + \page@action + \let\next@page@numR=\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@numR \@ne + \fi + \else + \ifnum\@lock<\tw@ + \advance\line@numR \@ne \subline@numR \z@ + \fi + \fi + \else +% \end{macrocode} +% And when we are not in right text +% \begin{macrocode} + \@l@reg + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\last@page@numR} +% \begin{macro}{\fix@page} +% We have to adjust \cs{fix@page} to handle parallel texts. +% +% \begin{macrocode} +\newcount\last@page@numR + \last@page@numR=-10000 +\renewcommand*{\fix@page}[1]{% + \ifledRcol + \ifnum #1=\last@page@numR + \else + \ifbypage@R + \line@numR \z@ \subline@numR \z@ + \fi + \page@numR=#1\relax + \last@page@numR=#1\relax + \def\next@page@numR{#1}% + \fi + \else + \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 + \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} +\renewcommand*{\@adv}[1]{% + \ifsublines@ + \ifledRcol + \advance\subline@numR by #1\relax + \ifnum\subline@numR<\z@ + \led@warn@BadAdvancelineSubline + \subline@numR \z@ + \fi + \else + \advance\subline@num by #1\relax + \ifnum\subline@num<\z@ + \led@warn@BadAdvancelineSubline + \subline@num \z@ + \fi + \fi + \else + \ifledRcol + \advance\line@numR by #1\relax + \ifnum\line@numR<\z@ + \led@warn@BadAdvancelineLine + \line@numR \z@ + \fi + \else + \advance\line@num by #1\relax + \ifnum\line@num<\z@ + \led@warn@BadAdvancelineLine + \line@num \z@ + \fi + \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} +\renewcommand*{\@set}[1]{% + \ifledRcol + \ifsublines@ + \subline@numR=#1\relax + \else + \line@numR=#1\relax + \fi + \set@line@action + \else + \ifsublines@ + \subline@num=#1\relax + \else + \line@num=#1\relax + \fi + \set@line@action + \fi} + +% \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} +\renewcommand*{\l@d@set}[1]{% + \ifledRcol + \line@numR=#1\relax + \advance\line@numR \@ne + \def\l@dchset@num{#1} + \else + \line@num=#1\relax + \advance\line@num \@ne + \def\l@dchset@num{#1} + \fi} +\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} +\renewcommand*{\page@action}{% + \ifledRcol + \xright@appenditem{\the\absline@numR}\to\actionlines@listR + \xright@appenditem{\next@page@numR}\to\actions@listR + \else + \xright@appenditem{\the\absline@num}\to\actionlines@list + \xright@appenditem{\next@page@num}\to\actions@list + \fi} +% \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} +\renewcommand*{\set@line@action}{% + \ifledRcol + \xright@appenditem{\the\absline@numR}\to\actionlines@listR + \ifsublines@ + \@l@dtempcnta=-\subline@numR + \else + \@l@dtempcnta=-\line@numR + \fi + \advance\@l@dtempcnta by -5000\relax + \xright@appenditem{\the\@l@dtempcnta}\to\actions@listR + \else + \xright@appenditem{\the\absline@num}\to\actionlines@list + \ifsublines@ + \@l@dtempcnta=-\subline@num + \else + \@l@dtempcnta=-\line@num + \fi + \advance\@l@dtempcnta by -5000\relax + \xright@appenditem{\the\@l@dtempcnta}\to\actions@list + \fi} + +% \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} +\renewcommand*{\sub@action}{% + \ifledRcol + \xright@appenditem{\the\absline@numR}\to\actionlines@listR + \ifsublines@ + \xright@appenditem{-1001}\to\actions@listR + \else + \xright@appenditem{-1002}\to\actions@listR + \fi + \else + \xright@appenditem{\the\absline@num}\to\actionlines@list + \ifsublines@ + \xright@appenditem{-1001}\to\actions@list + \else + \xright@appenditem{-1002}\to\actions@list + \fi + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\do@lockon} +% \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. +% \begin{macrocode} +\renewcommand*{\do@lockon}{% + \ifx\next\lock@off + \global\let\lock@off=\skip@lockoff + \else + \ifledRcol + \xright@appenditem{\the\absline@numR}\to\actionlines@listR + \ifsublines@ + \xright@appenditem{-1005}\to\actions@listR + \ifcase\sub@lock + \sub@lock \@ne + \else + \sub@lock \z@ + \fi + \else + \xright@appenditem{-1003}\to\actions@listR + \ifcase\@lock + \@lock \@ne + \else + \@lock \z@ + \fi + \fi + \else + \xright@appenditem{\the\absline@num}\to\actionlines@list + \ifsublines@ + \xright@appenditem{-1005}\to\actions@list + \ifcase\sub@lock + \sub@lock \@ne + \else + \sub@lock \z@ + \fi + \else + \xright@appenditem{-1003}\to\actions@list + \ifcase\@lock + \@lock \@ne + \else + \@lock \z@ + \fi + \fi + \fi + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lock@off} +% \begin{macro}{\do@lockoff} +% \begin{macro}{\skip@lockoff} +% \cs{lock@off} adds an entry to the action-code list +% to turn line number locking off. +% \begin{macrocode} +\renewcommand*{\do@lockoff}{% + \ifledRcol + \xright@appenditem{\the\absline@numR}\to\actionlines@listR + \ifsublines@ + \xright@appenditem{-1006}\to\actions@listR + \ifnum\sub@lock=\tw@ + \sub@lock \thr@@ + \else + \sub@lock \z@ + \fi + \else + \xright@appenditem{-1004}\to\actions@listR + \ifnum\@lock=\tw@ + \@lock \thr@@ + \else + \@lock \z@ + \fi + \fi + \else + \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 + \fi} +\global\let\lock@off=\do@lockoff + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\n@num} +% This macro implements the \cs{skipnumbering} command. It uses a new +% action code, namely 1007. +% \begin{macrocode} +\providecommand*{\n@num}{} +\renewcommand*{\n@num}{% + \ifledRcol + \xright@appenditem{\the\absline@numR}\to\actionlines@listR + \xright@appenditem{-1007}\to\actions@listR + \else + \n@num@reg + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ref} +% \begin{macro}{\insert@countR} +% \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 for right text, here and within \cs{edtext}, +% which computes it and writes it to the line-list file, +% will be stored in the count \cs{insert@countR}. +% \begin{macrocode} +\newcount\insert@countR +% \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} +% +% The first thing \cs{@ref} itself does is to add the specified number +% of items to the \cs{insertlines@list} list. +% \begin{macrocode} +\renewcommand*{\@ref}[2]{% + \ifledRcol + \global\insert@countR=#1\relax + \loop\ifnum\insert@countR>\z@ + \xright@appenditem{\the\absline@numR}\to\insertlines@listR + \global\advance\insert@countR \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@numR + \global\endline@num=\line@numR + \global\endsubline@num=\subline@numR + \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@numR|\the\line@numR|% + \ifsublines@ \the\subline@numR \else 0\fi|% + \the\endpage@num|\the\endline@num|% + \ifsublines@ \the\endsubline@num \else 0\fi}\to\line@listR +% \end{macrocode} +% +% Finally, execute the second argument of \cs{@ref} again, +% to perform for real all the commands within it. +% \begin{macrocode} + #2 + \else +% \end{macrocode} +% And when not in right text +% \begin{macrocode} + \@ref@reg{#1}{#2}% + \fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@pend} +% \begin{macro}{\@pendR} +% \cs{@pend}\marg{num} adds its argument to the \cs{linesinpar@listL} +% list, and analagously for \cs{@pendR}. We start off with a +% \cs{providecommand} just in case an older version of \Ledmac{} is being +% used which does not define these macros. +% \begin{macrocode} +\providecommand*{\@pend}[1]{} +\renewcommand*{\@pend}[1]{% + \xright@appenditem{#1}\to\linesinpar@listL} +\providecommand*{\@pendR}[1]{} +\renewcommand*{\@pendR}[1]{% + \xright@appenditem{#1}\to\linesinpar@listR} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@lopL} +% \begin{macro}{\@lopR} +% \cs{@lopL}\marg{num} adds its argument to the \cs{linesonpage@listL} +% list, and analagously for \cs{@lopR}. We start off with a +% \cs{providecommand} just in case an older version of \Ledmac{} is being +% used which does not define these macros. +% \begin{macrocode} +\providecommand*{\@lopL}[1]{} +\renewcommand*{\@lopL}[1]{% + \xright@appenditem{#1}\to\linesonpage@listL} +\providecommand*{\@lopR}[1]{} +\renewcommand*{\@lopR}[1]{% + \xright@appenditem{#1}\to\linesonpage@listR} + +% \end{macrocode} +% \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 \Ledmac{} uses within the text of a +% section to write commands out to the line-list. +% +% \begin{macro}{\linenum@outR} +% The file for right texts will be opened on output stream \cs{linenum@outR}. +% \begin{macrocode} +\newwrite\linenum@outR +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\iffirst@linenum@out@R} +% \begin{macro}{\first@linenum@out@Rtrue} +% \begin{macro}{\first@linenum@out@Rfalse} +% Once any file is opened on this stream, we keep it open forever, or +% else switch to another file that we keep open. +% \begin{macrocode} +\newif\iffirst@linenum@out@R + \first@linenum@out@Rtrue +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\line@list@stuffR} +% This is the right text version of the \cs{line@list@stuff}\marg{file} +% macro. It is called by \cs{beginnumberingR} and 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@stuffR}[1]{% + \read@linelist{#1}% + \iffirst@linenum@out@R + \immediate\closeout\linenum@outR + \global\first@linenum@out@Rfalse + \immediate\openout\linenum@outR=#1 + \else + \closeout\linenum@outR + \openout\linenum@outR=#1 + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\new@lineR} +% The \cs{new@lineR} macro sends the \cs{@l} command to the right text +% line-list file, to mark the start of a new text line. +% \begin{macrocode} +\newcommand*{\new@lineR}{% + \write\linenum@outR{\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. +% \changes{v0.3}{2005/02/04}{Removed extraneous spaces from\cs{flag@end}} +% \begin{macrocode} +\renewcommand*{\flag@start}{% + \ifledRcol + \edef\next{\write\linenum@outR{% + \string\@ref[\the\insert@countR][}}% + \next + \else + \edef\next{\write\linenum@out{% + \string\@ref[\the\insert@count][}}% + \next + \fi} +\renewcommand*{\flag@end}{% + \ifledRcol + \write\linenum@outR{]}% + \else + \write\linenum@out{]}% + \fi} +% \end{macrocode} +% \end{macro} +% \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. +% \begin{macrocode} +\renewcommand*{\startsub}{\dimen0\lastskip + \ifdim\dimen0>0pt \unskip \fi + \ifledRcol \write\linenum@outR{\string\sub@on}% + \else \write\linenum@out{\string\sub@on}% + \fi + \ifdim\dimen0>0pt \hskip\dimen0 \fi} +\def\endsub{\dimen0\lastskip + \ifdim\dimen0>0pt \unskip \fi + \ifledRcol \write\linenum@outR{\string\sub@off}% + \else \write\linenum@out{\string\sub@off}% + \fi + \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} +\renewcommand*{\advanceline}[1]{% + \ifledRcol \write\linenum@outR{\string\@adv[#1]}% + \else \write\linenum@out{\string\@adv[#1]}% + \fi} +% \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} +\renewcommand*{\setline}[1]{% + \ifnum#1<\z@ + \led@warn@BadSetline + \else + \ifledRcol \write\linenum@outR{\string\@set[#1]}% + \else \write\linenum@out{\string\@set[#1]}% + \fi + \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} +\renewcommand*{\setlinenum}[1]{% + \ifnum#1<\z@ + \led@warn@BadSetlinenum + \else + \ifledRcol \write\linenum@outR{\string\l@d@set[#1]} + \else \write\linenum@out{\string\l@d@set[#1]} \fi + \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} +\renewcommand*{\startlock}{% + \ifledRcol \write\linenum@outR{\string\lock@on}% + \else \write\linenum@out{\string\lock@on}% + \fi} +\def\endlock{% + \ifledRcol \write\linenum@outR{\string\lock@off}% + \else \write\linenum@out{\string\lock@off}% + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\skipnumbering} +% In numbered text, \cs{skipnumbering} in a line will suspend the +% numbering for that particular line. That is, line numbers are unchanged and +% no line number will be printed. +% \begin{macrocode} +\renewcommand*{\skipnumbering}{% + \ifledRcol \write\linenum@outR{\string\n@num}% + \advanceline{-1}% + \else + \skipnumbering@reg + \fi} + +% \end{macrocode} +% \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. +% +% \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{macro}{\critext} +% Now we begin \cs{critext} itself. +% +% We slightly modify the original to make accomodation for when right text is +% being processed. +% +% \begin{macrocode} +\long\def\critext#1#2/{\leavevmode + \begingroup + \no@expands + \xdef\@tag{#1}% + \set@line + \ifledRcol \global\insert@countR \z@ + \else \global\insert@count \z@ \fi + \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}{\edtext} +% And similarly for \cs{edtext}. +% \begin{macrocode} +\renewcommand{\edtext}[2]{\leavevmode + \begingroup + \no@expands + \xdef\@tag{#1}% + \set@line + \ifledRcol \global\insert@countR \z@ + \else \global\insert@count \z@ \fi + \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}{\set@line} +% The \cs{set@line} macro +% is called by \cs{edtext} to put the line-reference field and +% font specifier for the current block of text into \cs{l@d@nums}. +% \begin{macrocode} +\renewcommand*{\set@line}{% + \ifledRcol + \ifx\line@listR\empty + \global\noteschanged@true + \xdef\l@d@nums{000|000|000|000|000|000|\edfont@info}% + \else + \gl@p\line@listR\to\@tempb + \xdef\l@d@nums{\@tempb|\edfont@info}% + \global\let\@tempb=\undefined + \fi + \else + \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 + \fi} + +% \end{macrocode} +% \end{macro} +% +% \section{Parallel environments} +% +% The initial set up for parallel processing is deceptively simple. +% +% +% \begin{environment}{pairs} +% \begin{environment}{pages} +% The \verb?pairs? environment is for parallel columns and the \verb?pages? +% environment for parallel pages. +% \begin{macrocode} +\newenvironment{pairs}{% + \l@dpairingtrue + \l@dpagingfalse +}{% + \l@dpairingfalse +} +% \end{macrocode} +% The \verb?pages? environment additionally sets the `column' widths to the +% \cs{textwidth} (as known at the time the package is called). +% \begin{macrocode} +\newenvironment{pages}{% + \l@dpairingtrue + \l@dpagingtrue + \setlength{\Lcolwidth}{\textwidth}% + \setlength{\Rcolwidth}{\textwidth}% +}{% + \l@dpairingfalse + \l@dpagingfalse +} + +% \end{macrocode} +% \end{environment} +% \end{environment} +% +% \begin{environment}{Leftside} +% Within the \verb?pairs? and \verb?pages? environments the left and +% right hand texts are within \verb?Leftside? and \verb?Rightside? +% environments, respectively. The \verb?Leftside? environment is simple, +% indicating that right text is not within its purview and using some +% particular macros. +% \changes{v0.3}{2005/02/10}{Added hooks into Leftside environment} +% \begin{macrocode} +\newenvironment{Leftside}{% + \ledRcolfalse + \let\pstart\pstartL + \let\pend\pendL + \let\memorydump\memorydumpL + \Leftsidehook +}{\Leftsidehookend} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\Leftsidehook} +% \begin{macro}{\Leftsidehookend} +% \begin{macro}{\Rightsidehook} +% \begin{macro}{\Rightsidehookend} +% Hooks into the start and end of the \texttt{Leftside} and \texttt{Rightside} +% environments. These are initially empty. +% \changes{v0.3}{2005/02/10}{Added \cs{Leftsidehook}, \cs{Leftsidehookend}, +% \cs{Rightsidehook} and \cs{Rightsidehookend}} +% \begin{macrocode} +\newcommand*{\Leftsidehook}{} +\newcommand*{\Leftsidehookend}{} +\newcommand*{\Rightsidehook}{} +\newcommand*{\Rightsidehookend}{} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{environment}{Rightside} +% The \verb?Rightside? environment is only slightly more complicated +% than the \verb?Leftside?. +% Apart from indicating that right text is being provided it +% ensures that the right right text code will be used. +% \begin{macrocode} +\newenvironment{Rightside}{% + \ledRcoltrue + \let\beginnumbering\beginnumberingR + \let\endnumbering\endnumberingR + \let\pausenumbering\pausenumberingR + \let\resumenumbering\resumenumberingR + \let\memorydump\memorydumpR + \let\pstart\pstartR + \let\pend\pendR + \let\lineation\lineationR + \Rightsidehook +}{% + \ledRcolfalse + \Rightsidehookend +} + +% \end{macrocode} +% \end{environment} +% +% +% +% \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}{\num@linesR} +% \begin{macro}{\one@lineR} +% \begin{macro}{\par@lineR} +% 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{l@dLcolrawbox} or \cs{l@dRcolrawbox} for right 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(R)} 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} or \cs{one@lineR} register, and \cs{par@line(R)} +% will be the number +% of that line within the paragraph. +% \begin{macrocode} +\newcount\num@linesR +\newbox\one@lineR +\newcount\par@lineR +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\pstartL} +% \begin{macro}{\pstartR} +% \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 appropriate box. +% \cs{pstart} needs to appear at the start of +% every paragraph that's to be numbered. +% +% 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. +% +% We have to have specific left and right \cs{pstart} when parallel processing; +% among other things because of potential changes in the linewidth. +% +% \begin{macrocode} +\newcommand*{\pstartL}{\ifnumbering \else + \led@err@PstartNotNumbered + \beginnumbering + \fi + \ifnumberedpar@ + \led@err@PstartInPstart + \pend + \fi +% \end{macrocode} +% If this is the first \cs{pstart} in a numbered section, clear any inserts +% and set \cs{ifpst@rtedL} to FALSE. +% \begin{macrocode} + \ifpst@rtedL\else + \list@clear{\inserts@list}% + \global\let\next@insert=\empty + \global\pst@rtedLtrue + \fi + \begingroup\normal@pars +% \end{macrocode} +% When parallel processing we check that we haven't exceeded +% the maximum number of chunks. In any event we grab a box for the +% forthcoming text. +% \begin{macrocode} + \global\advance\l@dnumpstartsL \@ne + \ifnum\l@dnumpstartsL>\l@dc@maxchunks + \led@err@TooManyPstarts + \global\l@dnumpstartsL=\l@dc@maxchunks + \fi + \global\setnamebox{l@dLcolrawbox\the\l@dnumpstartsL}=\vbox\bgroup% + \hsize=\Lcolwidth + \numberedpar@true} +% \end{macrocode} +% +% \begin{macrocode} +\newcommand*{\pstartR}{\ifnumberingR \else + \led@err@PstartNotNumbered + \beginnumberingR + \fi + \ifnumberedpar@ + \led@err@PstartInPstart + \pendR + \fi + \ifpst@rtedR\else + \list@clear{\inserts@listR}% + \global\let\next@insertR=\empty + \global\pst@rtedRtrue + \fi + \begingroup\normal@pars + \global\advance\l@dnumpstartsR \@ne + \ifnum\l@dnumpstartsR>\l@dc@maxchunks + \led@err@TooManyPstarts + \global\l@dnumpstartsR=\l@dc@maxchunks + \fi + \global\setnamebox{l@dRcolrawbox\the\l@dnumpstartsR}=\vbox\bgroup% + \hsize=\Rcolwidth + \numberedpar@true} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\pendL} +% \cs{pend} must be used to end a numbered paragraph. Again we need +% a version +% that knows about left parallel texts. +% +% \begin{macrocode} +\newcommand*{\pendL}{\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. +% \begin{macrocode} + \l@dzeropenalties + \endgraf\global\num@lines=\prevgraf\egroup + \global\par@line=0 +% \end{macrocode} +% End the group that was begun in the \cs{pstart}. +% \begin{macrocode} + \endgroup + \ignorespaces} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pendR} +% The version of \cs{pend} needed for right texts. +% +% \begin{macrocode} +\newcommand*{\pendR}{\ifnumberingR \else + \led@err@PendNotNumbered + \fi + \ifnumberedpar@ \else + \led@err@PendNoPstart + \fi + \l@dzeropenalties + \endgraf\global\num@linesR=\prevgraf\egroup + \global\par@lineR=0 + \endgroup + \ignorespaces} + +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Processing one line} +% +% For parallel texts we have to be able to process left and right lines +% independently. For sequential text we happily use the +% original \cs{do@line}. Otherwise \ldots +% +% \begin{macro}{\l@dleftbox} +% \begin{macro}{\l@drightbox} +% A line of left text will be put in the box \cs{l@dleftbox}, and analagously +% for a line of right text. +% \begin{macrocode} +\newbox\l@dleftbox +\newbox\l@drightbox + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\countLline} +% \begin{macro}{\countRline} +% We need to know the number of lines processed. +% \begin{macrocode} +\newcount\countLline + \countLline \z@ +\newcount\countRline + \countRline \z@ + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@donereallinesL} +% \begin{macro}{\@donetotallinesL} +% \begin{macro}{\@donereallinesR} +% \begin{macro}{\@donetotallinesR} +% We need to know the number of `real' lines output (i.e., those that +% have been input by the user), and the total lines output (which includes +% any blank lines output for synchronisation). +% \begin{macrocode} +\newcount\@donereallinesL +\newcount\@donetotallinesL +\newcount\@donereallinesR +\newcount\@donetotallinesR + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\do@lineL} +% The \cs{do@lineL} macro is called to +% do all the processing for a single line of left text. +% \changes{v0.3}{2005/02/10}{Added \cs{do@lineLhook} to \cs{do@lineL}} +% \changes{v0.3}{2005/02/10}{Simplified \cs{do@lineL} by using macros for +% some common code} +% \begin{macrocode} +\newcommand*{\do@lineL}{% + \advance\countLline \@ne +% \end{macrocode} +% If the current \cs{l@dLcolrawbox} box is not empty it contains +% the remaining unprocessed lines of the chunk, so +% pull one line off the top. +% \cs{vbadness} must be cranked up to +% suppress \verb"Underfull vbox" errors from +% \cs{vsplit}; \cs{splittopskip} will be inserted at the top of +% \cs{one@line}, so we zero it. (This skip will appear in the final +% vertical list, just before every \cs{baselineskip}.) +% \begin{macrocode} + \ifvbox\namebox{l@dLcolrawbox\the\l@dpscL}% + {\vbadness=10000 \splittopskip=0pt +% \end{macrocode} +% Insert the \cs{do@lineLhook} and +% null the \cs{...d@ta}, which may later hold line numbers, here. +% They will get defined within \cs{affixline@num}. Similarly for +% \cs{l@dcsnotetext} for the text of a sidenote. +% \begin{macrocode} + \do@lineLhook + \l@demptyd@ta +% \end{macrocode} +% +% \begin{macrocode} + \global\setbox\one@line=\vsplit\namebox{l@dLcolrawbox\the\l@dpscL} + to\baselineskip}% +% \end{macrocode} +% +% \cs{one@line} comes out of \cs{vsplit} as a \verb"vbox"; +% we now convert it to an \verb"hbox". +% \begin{macrocode} + \unvbox\one@line \global\setbox\one@line=\lastbox +% \end{macrocode} +% +% Calculate the line and page number for this line. +% \begin{macrocode} + \getline@num +% \end{macrocode} +% Now we'll put the line into a box of the apropriate width, with a line +% number attached if necessary. +% \begin{macrocode} + \setbox\l@dleftbox + \hb@xt@ \Lcolwidth{% +% \end{macrocode} +% Add line numbers, inserts, sidenotes, etc. +% \begin{macrocode} + \affixline@num + \l@dld@ta + \add@inserts + \affixside@note +% \end{macrocode} +% Now stick everything into a set of boxes. +% \begin{macrocode} + \l@dlsn@te% left side note + {\ledllfill\hb@xt@ \wd\one@line{\new@line\unhbox\one@line}\ledrlfill\l@drd@ta + \l@drsn@te% right side note + }}% +% \end{macrocode} +% Penalties get stripped off by this slicing process; the following +% macro puts them back in as the last stepandthen we increment the +% number of `real' (text),and total lines done. +% \begin{macrocode} + \add@penaltiesL + \global\advance\@donereallinesL\@ne + \global\advance\@donetotallinesL\@ne +% \end{macrocode} +% Otherwise, the curent \cs{l@dLcolrawbox} has been emptied, so just +% generate an empty box and increment the total lines. +% \begin{macrocode} + \else + \setbox\l@dleftbox \hb@xt@ \Lcolwidth{\hspace*{\Lcolwidth}}% + \global\advance\@donetotallinesL\@ne + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\do@lineLhook} +% \begin{macro}{\do@lineRhook} +% Hooks, initially empty, into the respective \cs{do@line(L/R)} macros. +% \changes{v0.3}{2005/02/10}{Added \cs{do@lineLhook} and \cs{do@lineRhook}} +% \begin{macrocode} +\newcommand*{\do@lineLhook}{} +\newcommand*{\do@lineRhook}{} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\do@lineR} +% The \cs{do@lineR} macro is called to +% do all the processing for a single line of right text. +% \changes{v0.3}{2005/02/10}{Changed \cs{do@lineR} similarly to \cs{do@lineL}} +% \begin{macrocode} +\newcommand*{\do@lineR}{% + \advance\countRline \@ne + \ifvbox\namebox{l@dRcolrawbox\the\l@dpscR}% + {\vbadness=10000 \splittopskip=0pt + \do@lineRhook + \l@demptyd@ta + \global\setbox\one@lineR=\vsplit\namebox{l@dRcolrawbox\the\l@dpscR} + to\baselineskip}% + \unvbox\one@lineR \global\setbox\one@lineR=\lastbox + \getline@numR + \setbox\l@drightbox + \hb@xt@ \Rcolwidth{% + \affixline@numR + \l@dld@ta + \add@insertsR + \affixside@noteR + \l@dlsn@te% left side note + {\ledllfill\hb@xt@ \wd\one@lineR{\new@lineR\unhbox\one@lineR}\ledrlfill\l@drd@ta + \l@drsn@te% right side note + }}% + \add@penaltiesR + \global\advance\@donereallinesR \@ne + \global\advance\@donetotallinesR \@ne + \else + \setbox\l@drightbox \hb@xt@ \Rcolwidth{\hspace*{\Rcolwidth}} + \global\advance\@donetotallinesR \@ne + \fi} + +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Line and page number computation} +% +% \begin{macro}{\getline@numR} +% The \cs{getline@numR} macro +% determines the page and line numbers for the right text line we're about to +% send to the vertical list. +% \begin{macrocode} +\newcommand*{\getline@numR}{% + \global\advance\absline@numR \@ne + \do@actionsR + \do@ballastR + \ifsublines@ + \ifnum\sub@lock<\tw@ + \global\advance\subline@numR \@ne + \fi + \else + \ifnum\@lock<\tw@ + \global\advance\line@numR \@ne + \global\subline@numR=\z@ + \fi + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\do@ballastR} +% \phantomsection\label{do@ballastR}\relax +% The real work in the line macros above is done in \cs{do@actions}, but +% before we plunge into that, let's get \cs{do@ballastR} out of the +% way. +% \begin{macrocode} +\newcommand*{\do@ballastR}{\global\ballast@count=\z@ + \begingroup + \advance\absline@numR \@ne + \ifnum\next@actionlineR=\absline@numR + \ifnum\next@actionR>-1001 + \global\advance\ballast@count by -\c@ballast + \fi + \fi + \endgroup} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\do@actionsR} +% \begin{macro}{\do@actions@nextR} +% +% The \cs{do@actionsR} macro +% looks at the list of actions to take at particular right text absolute line +% numbers, and does everything that's specified for the current line. +% +% It may call itself recursively and we use tail recursion, via +% \cs{do@actions@nextR} for this. +% \changes{v0.3}{2005/02/24}{Used \cs{do@actions@fixedcode} in \cs{do@actionsR}} +% \begin{macrocode} +\newcommand*{\do@actionsR}{% + \global\let\do@actions@nextR=\relax + \@l@dtempcntb=\absline@numR + \ifnum\@l@dtempcntb<\next@actionlineR\else + \ifnum\next@actionR>-1001 + \global\page@numR=\next@actionR + \ifbypage@R + \global\line@numR=\z@ \global\subline@numR=\z@ + \fi + \else + \ifnum\next@actionR<-4999 + \@l@dtempcnta=-\next@actionR + \advance\@l@dtempcnta by -5001 + \ifsublines@ + \global\subline@numR=\@l@dtempcnta + \else + \global\line@numR=\@l@dtempcnta + \fi + \else + \@l@dtempcnta=-\next@actionR + \advance\@l@dtempcnta by -1000 + \do@actions@fixedcode + \fi + \fi + \ifx\actionlines@listR\empty + \gdef\next@actionlineR{1000000}% + \else + \gl@p\actionlines@listR\to\next@actionlineR + \gl@p\actions@listR\to\next@actionR + \global\let\do@actions@nextR=\do@actionsR + \fi + \fi + \do@actions@nextR} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Line number printing} +% +% +% \begin{macro}{\affixline@numR} +% \cs{affixline@numR} is the right text version of the +% \cs{affixline@num} macro. +% \changes{v0.3}{2005/02/24}{Changed \cs{affixline@numR} to match new ledmac} +% \begin{macrocode} +\newcommand*{\affixline@numR}{% +\ifl@dskipnumber + \global\l@dskipnumberfalse +\else + \ifsublines@ + \@l@dtempcntb=\subline@numR + \ifnum\subline@numR>\c@firstsublinenumR + \@l@dtempcnta=\subline@numR + \advance\@l@dtempcnta by-\c@firstsublinenumR + \divide\@l@dtempcnta by\c@sublinenumincrementR + \multiply\@l@dtempcnta by\c@sublinenumincrementR + \advance\@l@dtempcnta by\c@firstsublinenumR + \else + \@l@dtempcnta=\c@firstsublinenumR + \fi + \ch@cksub@l@ck + \else + \@l@dtempcntb=\line@numR + \ifx\linenumberlist\empty + \ifnum\line@numR>\c@firstlinenumR + \@l@dtempcnta=\line@numR + \advance\@l@dtempcnta by-\c@firstlinenumR + \divide\@l@dtempcnta by\c@linenumincrementR + \multiply\@l@dtempcnta by\c@linenumincrementR + \advance\@l@dtempcnta by\c@firstlinenumR + \else + \@l@dtempcnta=\c@firstlinenumR + \fi + \else + \@l@dtempcnta=\line@numR + \edef\rem@inder{,\linenumberlist,\number\line@numR,}% + \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 + \ch@ck@l@ck + \fi + \ifnum\@l@dtempcnta=\@l@dtempcntb + \if@twocolumn + \if@firstcolumn + \gdef\l@dld@ta{\llap{{\leftlinenumR}}}% + \else + \gdef\l@drd@ta{\rlap{{\rightlinenumR}}}% + \fi + \else + \@l@dtempcntb=\line@marginR + \ifnum\@l@dtempcntb>\@ne + \advance\@l@dtempcntb by\page@numR + \fi + \ifodd\@l@dtempcntb + \gdef\l@drd@ta{\rlap{{\rightlinenumR}}}% + \else + \gdef\l@dld@ta{\llap{{\leftlinenumR}}}% + \fi + \fi + \else +%% #1% + \fi + \f@x@l@cks +\fi} + +% \end{macrocode} +% \end{macro} +% +% \subsection{Add insertions to the vertical list} +% +% \begin{macro}{\inserts@listR} +% \cs{inserts@listR} is the list macro that contains the inserts that +% we save up for one right text paragraph. +% +% \begin{macrocode} +\list@create{\inserts@listR} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\add@insertsR} +% \begin{macro}{\add@inserts@nextR} +% The right text version. +% \begin{macrocode} +\newcommand*{\add@insertsR}{% + \global\let\add@inserts@nextR=\relax + \ifx\inserts@listR\empty \else + \ifx\next@insertR\empty + \ifx\insertlines@listR\empty + \global\noteschanged@true + \gdef\next@insertR{100000}% + \else + \gl@p\insertlines@listR\to\next@insertR + \fi + \fi + \ifnum\next@insertR=\absline@numR + \gl@p\inserts@listR\to\@insertR + \@insertR + \global\let\@insertR=\undefined + \global\let\next@insertR=\empty + \global\let\add@inserts@nextR=\add@insertsR + \fi + \fi + \add@inserts@nextR} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Penalties} +% +% \begin{macro}{\add@penaltiesL} +% \begin{macro}{\add@penaltiesR} +% \cs{add@penaltiesL} is +% the last macro used by \cs{do@lineL}. 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 the code below, which is a virtual copy of the original +% \cs{add@penalties}, \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}. +% Finally, the penalty is +% checked to see that it doesn't go below $-10000$. +% \begin{verbatim} +% \newcommand*{\add@penaltiesR}{\@l@dtempcnta=\ballast@count +% \ifnum\num@linesR>\@ne +% \global\advance\par@lineR \@ne +% \ifnum\par@lineR=\@ne +% \advance\@l@dtempcnta by \clubpenalty +% \fi +% \@l@dtempcntb=\par@lineR \advance\@l@dtempcntb \@ne +% \ifnum\@l@dtempcntb=\num@linesR +% \advance\@l@dtempcnta by \widowpenalty +% \fi +% \ifnum\par@lineR<\num@linesR +% \advance\@l@dtempcnta by \interlinepenalty +% \fi +% \fi +% \ifnum\@l@dtempcnta=\z@ +% \relax +% \else +% \ifnum\@l@dtempcnta>-10000 +% \penalty\@l@dtempcnta +% \else +% \penalty -10000 +% \fi +% \fi} +% \end{verbatim} +% This is for a single chunk. However, as we are probably dealing +% with several chunks at a time, the above is nor really relevant. I think +% that it is likely with parallel text that there is no real need to add +% back any penalties; even if there was, they would have to match across the +% left and right lines. So, I end up with the following. +% +% \begin{macrocode} +\newcommand*{\add@penaltiesL}{} +\newcommand*{\add@penaltiesR}{} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Printing leftover notes} +% +% \begin{macro}{\flush@notesR} +% The \cs{flush@notesR} +% macro is called after the entire right text has been sliced up +% and sent on to the vertical list. +% \begin{macrocode} +\newcommand*{\flush@notesR}{% + \@xloop + \ifx\inserts@listR\empty \else + \gl@p\inserts@listR\to\@insertR + \@insertR + \global\let\@insertR=\undefined + \repeat} + +% \end{macrocode} +% \end{macro} +% +% +% \section{Footnotes} +% \label{footnotes}\relax +% +% \subsection{Outer-level footnote commands} +% \begin{macro}{\Afootnote} +% The outer-level footnote commands will look familiar: they're +% just called \cs{Afootnote}, \cs{Bfootnote}, etc., instead of +% plain \cs{footnote}. What they do, however, is quite different, +% since they have to operate in conjunction with \cs{edtext} when +% numbering is in effect. +% +% If we're within a line-numbered paragraph, then, we tack this note onto +% the \cs{inserts@list} list, and increment the deferred-page-bottom-note +% counter. +% \begin{macrocode} +\renewcommand*{\Afootnote}[1]{% + \ifnumberedpar@ + \ifledRcol + \xright@appenditem{\noexpand\vAfootnote{A}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@listR + \global\advance\insert@countR \@ne + \else + \xright@appenditem{\noexpand\vAfootnote{A}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \fi +% \end{macrocode} +% +% Within free text, there's no need to put off making the insertion +% for this note. No line numbers are available, so this isn't generally +% that useful; but you might want to use it to get around some +% limitation of \Ledmac. +% \begin{macrocode} + \else + \vAfootnote{A}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Bfootnote} +% \begin{macro}{\Cfootnote} +% \begin{macro}{\Dfootnote} +% \begin{macro}{\Efootnote} +% We need similar commands for the other footnote series. +% \begin{macrocode} +\renewcommand*{\Bfootnote}[1]{% + \ifnumberedpar@ + \ifledRcol + \xright@appenditem{\noexpand\vBfootnote{B}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@listR + \global\advance\insert@countR \@ne + \else + \xright@appenditem{\noexpand\vBfootnote{B}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \fi + \else + \vBfootnote{B}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\renewcommand*{\Cfootnote}[1]{% + \ifnumberedpar@ + \ifledRcol + \xright@appenditem{\noexpand\vCfootnote{C}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@listR + \global\advance\insert@countR \@ne + \else + \xright@appenditem{\noexpand\vCfootnote{C}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \fi + \else + \vCfootnote{C}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\renewcommand*{\Dfootnote}[1]{% + \ifnumberedpar@ + \ifledRcol + \xright@appenditem{\noexpand\vDfootnote{D}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@listR + \global\advance\insert@countR \@ne + \else + \xright@appenditem{\noexpand\vDfootnote{D}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \fi + \else + \vDfootnote{D}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\renewcommand*{\Efootnote}[1]{% + \ifnumberedpar@ + \ifledRcol + \xright@appenditem{\noexpand\vEfootnote{E}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@listR + \global\advance\insert@countR \@ne + \else + \xright@appenditem{\noexpand\vEfootnote{E}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \fi + \else + \vEfootnote{E}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\mpAfootnote} +% \begin{macro}{\mpBfootnote} +% \begin{macro}{\mpCfootnote} +% \begin{macro}{\mpDfootnote} +% \begin{macro}{\mpEfootnote} +% For footnotes in minipages and the like, we need a similar series of commands. +% \begin{macrocode} +\renewcommand*{\mpAfootnote}[1]{% + \ifnumberedpar@ + \ifledRcol + \xright@appenditem{\noexpand\mpvAfootnote{A}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@listR + \global\advance\insert@countR \@ne + \else + \xright@appenditem{\noexpand\mpvAfootnote{A}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \fi + \else + \mpvAfootnote{A}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\renewcommand*{\mpBfootnote}[1]{% + \ifnumberedpar@ + \ifledRcol + \xright@appenditem{\noexpand\mpvBfootnote{B}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@listR + \global\advance\insert@countR \@ne + \else + \xright@appenditem{\noexpand\mpvBfootnote{B}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \fi + \else + \mpvBfootnote{B}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\renewcommand*{\mpCfootnote}[1]{% + \ifnumberedpar@ + \ifledRcol + \xright@appenditem{\noexpand\mpvCfootnote{C}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@listR + \global\advance\insert@countR \@ne + \else + \xright@appenditem{\noexpand\mpvCfootnote{C}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \fi + \else + \mpvCfootnote{C}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\renewcommand*{\mpDfootnote}[1]{% + \ifnumberedpar@ + \ifledRcol + \xright@appenditem{\noexpand\mpvDfootnote{D}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@listR + \global\advance\insert@countR \@ne + \else + \xright@appenditem{\noexpand\mpvDfootnote{D}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \fi + \else + \mpvDfootnote{D}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \begin{macrocode} +\renewcommand*{\mpEfootnote}[1]{% + \ifnumberedpar@ + \ifledRcol + \xright@appenditem{\noexpand\mpvEfootnote{E}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@listR + \global\advance\insert@countR \@ne + \else + \xright@appenditem{\noexpand\mpvEfootnote{E}% + {{\l@d@nums}{\@tag}{#1}}}\to\inserts@list + \global\advance\insert@count \@ne + \fi + \else + \mpvEfootnote{E}{{0|0|0|0|0|0|0}{}{#1}}% + \fi\ignorespaces} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Normal footnote formatting} \label{sec:nfootformat} +% +% 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. +% +% +% \begin{macro}{\printlinesR} +% \begin{macro}{\ledsavedprintlines} +% This is the right text version of \cs{printlines} and takes account +% of \cs{Rlineflag}. Just in case, \cs{ledsavedprintlines} is a copy +% of the original \cs{printlines}. +% +% Just a reminder of the arguments: \\ +% \verb?\printlinesR #1 | #2 | #3 | #4 | #5 | #6 | #7? \\ +% \verb?\printlinesR start-page | line | subline | end-page | line | subline | font ? +% \changes{v0.3}{2005/02/10}{Simplified \cs{printlinesR} by using +% \cs{setprintlines}} +% \begin{macrocode} +\def\printlinesR#1|#2|#3|#4|#5|#6|#7|{\begingroup + \setprintlines{#1}{#2}{#3}{#4}{#5}{#6}% + \ifl@d@pnum #1\fullstop\fi + \ifledplinenum \linenumr@p{#2}\Rlineflag\else \symplinenum\fi + \ifl@d@ssub \fullstop \sublinenumr@p{#3}\fi + \ifl@d@dash \endashchar\fi + \ifl@d@pnum #4\fullstop\fi + \ifl@d@elin \linenumr@p{#5}\Rlineflag\fi + \ifl@d@esl \ifl@d@elin \fullstop\fi \sublinenumr@p{#6}\fi +\endgroup} + +\let\ledsavedprintlines\printlines + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% \section{Cross referencing} +% \label{xref}\relax +% +% +% \begin{macro}{\labelref@listR} +% Set up a new list, \cs{labelref@listR}, to hold the page, line and +% sub-line numbers for each label in right text. +% \begin{macrocode} +\list@create{\labelref@listR} + +% \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. +% \begin{macrocode} +\renewcommand*{\edlabel}[1]{\@bsphack + \ifledRcol + \write\linenum@outR{\string\@lab}% + \ifx\labelref@listR\empty + \xdef\label@refs{\zz@@@}% + \else + \gl@p\labelref@listR\to\label@refs + \fi + \protected@write\@auxout{}% + {\string\l@dmake@labelsR\space\thepage|\label@refs|{#1}}% + \else + \write\linenum@out{\string\@lab}% + \ifx\labelref@list\empty + \xdef\label@refs{\zz@@@}% + \else + \gl@p\labelref@list\to\label@refs + \fi + \fi + \protected@write\@auxout{}% + {\string\l@dmake@labels\space\thepage|\label@refs|{#1}}% + \@esphack} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@dmake@labelsR} +% This is the right text version of \cs{l@dmake@labels}, taking account +% of \cs{Rlineflag}. +% +% \begin{macrocode} +\def\l@dmake@labelsR#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\Rlineflag|#3}% + \ignorespaces} +\AtBeginDocument{% + \def\l@dmake@labelsR#1|#2|#3|#4{}% +} + +% \end{macrocode} +% \end{macro} +% +% +% \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. +% +% \begin{macrocode} +\renewcommand*{\@lab}{% + \ifledRcol + \xright@appenditem{\linenumr@p{\line@numR}|% + \ifsublines@ \sublinenumr@p{\subline@numR}\else 0\fi}% + \to\labelref@listR + \else + \xright@appenditem{\linenumr@p{\line@num}|% + \ifsublines@ \sublinenumr@p{\subline@num}\else 0\fi}% + \to\labelref@list + \fi} + +% \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}{\sidenote@marginR} +% \begin{macro}{\sidenotemargin} +% Specifies which margin sidenotes can be in. +% \begin{macrocode} +\newcount\sidenote@marginR +\renewcommand*{\sidenotemargin}[1]{{% + \l@dgetsidenote@margin{#1}% + \ifnum\@l@dtempcntb>\m@ne + \ifledRcol + \global\sidenote@marginR=\@l@dtempcntb + \else + \global\sidenote@margin=\@l@dtempcntb + \fi + \fi}} +\sidenotemargin{right} +\global\sidenote@margin=\@ne + +% \end{macrocode} +% \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} +\renewcommand*{\l@dlsnote}[1]{% + \ifnumberedpar@ + \ifledRcol + \xright@appenditem{\noexpand\vl@dlsnote{{\l@d@nums}{\@tag}{#1}}}% + \to\inserts@listR + \global\advance\insert@countR \@ne + \else + \xright@appenditem{\noexpand\vl@dlsnote{{\l@d@nums}{\@tag}{#1}}}% + \to\inserts@list + \global\advance\insert@count \@ne + \fi + \fi\ignorespaces} +\renewcommand*{\l@drsnote}[1]{% + \ifnumberedpar@ + \ifledRcol + \xright@appenditem{\noexpand\vl@drsnote{{\l@d@nums}{\@tag}{#1}}}% + \to\inserts@listR + \global\advance\insert@countR \@ne + \else + \xright@appenditem{\noexpand\vl@drsnote{{\l@d@nums}{\@tag}{#1}}}% + \to\inserts@list + \global\advance\insert@count \@ne + \fi + \fi\ignorespaces} +\renewcommand*{\l@dcsnote}[1]{% + \ifnumberedpar@ + \ifledRcol + \xright@appenditem{\noexpand\vl@dcsnote{{\l@d@nums}{\@tag}{#1}}}% + \to\inserts@listR + \global\advance\insert@countR \@ne + \else + \xright@appenditem{\noexpand\vl@dcsnote{{\l@d@nums}{\@tag}{#1}}}% + \to\inserts@list + \global\advance\insert@count \@ne + \fi + \fi\ignorespaces} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\affixside@noteR} +% The right text version of \cs{affixside@note}. +% \begin{macrocode} +\newcommand*{\affixside@noteR}{% + \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@marginR + \ifnum\@l@dtempcntb>\@ne + \ifl@dpaging + \advance\@l@dtempcntb by\@ne + \else + \advance\@l@dtempcntb by\page@num + \fi + \fi + \ifodd\@l@dtempcntb + \setl@drp@rbox{}{}{\l@dcsnotetext}% + \else + \setl@dlp@rbox{}{}{\l@dcsnotetext}% + \fi + \fi + \fi} + +% \end{macrocode} +% \end{macro} +% +% +% \section{Familiar footnotes} +% +% +% \begin{macro}{\l@dbfnote} +% \verb?\l@dbfnote? adds the footnote to the insert list, and +% \verb?\vl@dbfnote? calls the original \verb?\@footnotetext?. +% \begin{macrocode} +\renewcommand{\l@dbfnote}[1]{% + \ifnumberedpar@ + \ifledRcol + \xright@appenditem{\noexpand\vl@dbfnote{{#1}}{\@thefnmark}}% + \to\inserts@listR + \global\advance\insert@countR \@ne + \else + \xright@appenditem{\noexpand\vl@dbfnote{{#1}}{\@thefnmark}}% + \to\inserts@list + \global\advance\insert@count \@ne + \fi + \fi\ignorespaces} + +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\normalbfnoteX} +% \changes{v0.3}{2005/02/04}{Removed extraneous spaces from \cs{normalbfnoteX}} +% \begin{macrocode} +\renewcommand{\normalbfnoteX}[2]{% + \ifnumberedpar@ + \ifledRcol + \xright@appenditem{\noexpand\vbfnoteX{#1}{#2}{\@nameuse{thefootnote#1}}}% + \to\inserts@listR + \global\advance\insert@countR \@ne + \else + \xright@appenditem{\noexpand\vbfnoteX{#1}{#2}{\@nameuse{thefootnote#1}}}% + \to\inserts@list + \global\advance\insert@count \@ne + \fi + \fi\ignorespaces} + +% \end{macrocode} +% \end{macro} +% +% +% \section{Verse} +% +% Before we can define the main stanza macros we need to be able to save +% and reset +% the category code for \&. To save the current value we use +% \verb+\next+ from the \verb+\loop+ macro. +% \begin{macrocode} + \chardef\next=\catcode`\& + \catcode`\&=\active + +% \end{macrocode} +% +% +% \begin{environment}{astanza} +% This is roughly an environmental form of \cs{stanza}, which treats +% its stanza-like contents as a single chunk. +% +% \begin{macrocode} +\newenvironment{astanza}{% + \startstanzahook + \catcode`\&\active + \global\stanza@count\@ne + \ifnum\usenamecount{sza@0@}=\z@ + \let\stanza@hang\relax + \let\endlock\relax + \else +%%% \interlinepenalty\@M % this screws things up, but I don't know why + \rightskip\z@ plus 1fil\relax + \fi + \ifnum\usenamecount{szp@0@}=\z@ + \let\sza@penalty\relax + \fi + \def&{% + \endlock\mbox{}% + \sza@penalty + \global\advance\stanza@count\@ne + \@astanza@line}% + \def\&{% + \endlock\mbox{} + \pend + \endstanzaextra}% + \pstart + \@astanza@line +}{} + +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\@astanza@line} +% This gets put at the start of each line in the environment. It sets up +% the paragraph style --- each line is treated as a paragraph. +% \begin{macrocode} +\newcommand*{\@astanza@line}{% + \parindent=\csname sza@\number\stanza@count @\endcsname\stanzaindentbase + \par + \stanza@hang%\mbox{}% + \ignorespaces} + +% \end{macrocode} +% \end{macro} +% +% Lastly reset the modified category codes. +% \begin{macrocode} + \catcode`\&=\next + +% \end{macrocode} +% +% \section{Naming macros} +% +% The LaTeX kernel provides \cs{@namedef} and \cs{@namuse} for defining +% and using macros that may have non-letters in their names. We need +% something similar here as we are going to need and use some numbered +% boxes and counters. +% +% \begin{macro}{\newnamebox} +% \begin{macro}{\setnamebox} +% \begin{macro}{\unhnamebox} +% \begin{macro}{\unvnamebox} +% \begin{macro}{\namebox} +% A set of macros for creating and using `named'boxes; the macros are called +% after the regular box macros, but including the string `name'. +% \begin{macrocode} +\providecommand*{\newnamebox}[1]{% + \expandafter\newbox\csname #1\endcsname} +\providecommand*{\setnamebox}[1]{% + \expandafter\setbox\csname #1\endcsname} +\providecommand*{\unhnamebox}[1]{% + \expandafter\unhbox\csname #1\endcsname} +\providecommand*{\unvnamebox}[1]{% + \expandafter\unvbox\csname #1\endcsname} +\providecommand*{\namebox}[1]{% + \csname #1\endcsname} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\newnamecount} +% \begin{macro}{\usenamecount} +% Macros for creating and using `named' counts. +% \begin{macrocode} +\providecommand*{\newnamecount}[1]{% + \expandafter\newcount\csname #1\endcsname} +\providecommand*{\usenamecount}[1]{% + \csname #1\endcsname} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \section{Counts and boxes for parallel texts} +% +% In sequential text, each chunk (that enclosed by \cs{pstart} \ldots +% \cs{pend}) is put into a box called \cs{raw@text} and then immediately +% printed, resulting in the box being emptied and ready for the next chunk. +% For parallel processing multiple boxes are needed as printing is delayed. +% We also need extra counters for various things. +% +% \begin{macro}{\maxchunks} +% \begin{macro}{\l@dc@maxchunks} +% The maximum number of chunk pairs before printing has to be called for. +% The default is 10 chunk pairs. +% \begin{macrocode} +\newcount\l@dc@maxchunks +\newcommand{\maxchunks}[1]{\l@dc@maxchunks=#1} + \maxchunks{10} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@dnumpstartsL} +% \begin{macro}{\l@dnumpstartsR} +% The numbers of left and right chunks. \cs{l@dnumpstartsL} is defined +% in \Lpack{ledmac}. +% \changes{v0.3}{2005/02/24}{Moved \cs{l@dnumpstartsL} to ledmac} +% \begin{macrocode} +\newcount\l@dnumpstartsR + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@pscL} +% \begin{macro}{\l@pscR} +% A couple of scratch counts for use in left and right texts, respectively. +% \begin{macrocode} +\newcount\l@dpscL +\newcount\l@dpscR + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@dsetuprawboxes} +% This macro creates \cs{maxchunks} pairs of boxes for left and right +% chunks. The boxes are called \cs{l@dLcolrawbox1}, \cs{l@dLcolrawbox2}, etc. +% \begin{macrocode} +\newcommand*{\l@dsetuprawboxes}{% + \@l@dtempcntb=\l@dc@maxchunks + \loop\ifnum\@l@dtempcntb>\z@ + \newnamebox{l@dLcolrawbox\the\@l@dtempcntb} + \newnamebox{l@dRcolrawbox\the\@l@dtempcntb} + \advance\@l@dtempcntb \m@ne + \repeat} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@dsetupmaxlinecounts} +% \begin{macro}{\l@dzeromaxlinecounts} +% To be able to synchronise left and right texts we need +% to know the maximum number of text lines there are in each pair of chunks. +% \cs{l@dsetupmaxlinecounts} creates \cs{maxchunks} new counts +% called \cs{l@dmaxlinesinpar1}, etc., and +% \cs{l@dzeromaxlinecounts} zeroes all of them. +% \begin{macrocode} +\newcommand*{\l@dsetupmaxlinecounts}{% + \@l@dtempcntb=\l@dc@maxchunks + \loop\ifnum\@l@dtempcntb>\z@ + \newnamecount{l@dmaxlinesinpar\the\@l@dtempcntb} + \advance\@l@dtempcntb \m@ne + \repeat} +\newcommand*{\l@dzeromaxlinecounts}{% + \begingroup + \@l@dtempcntb=\l@dc@maxchunks + \loop\ifnum\@l@dtempcntb>\z@ + \global\usenamecount{l@dmaxlinesinpar\the\@l@dtempcntb}=\z@ + \advance\@l@dtempcntb \m@ne + \repeat + \endgroup} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% Make sure that all these are set up. This has to be done after the +% user has had an opportunity to change \cs{maxchunks}. +% \begin{macrocode} +\AtBeginDocument{% + \l@dsetuprawboxes + \l@dsetupmaxlinecounts + \l@dzeromaxlinecounts + \l@dnumpstartsL=\z@ + \l@dnumpstartsR=\z@ + \l@dpscL=\z@ + \l@dpscR=\z@} + +% \end{macrocode} +% +% \section{Fixing babel} +% +% With parallel texts there is the possibility that the two sides +% might use different languages via \verb?babel?. On the other hand, +% \verb?babel? might not be called at all (even though it might be already +% built into the format). +% \changes{v0.2}{2004/12/20}{Added section of babel related code} +% +% With the normal sequential text each line is initially typeset +% in the current language environment, and then it is output at which +% time its attachments are typeset (in the same language environment. +% In the parallel case lines are typeset in their current language but +% an attachment might be typeset outside the language environment +% of its line if the left and right side languages are different. +% To counter this, we have to make sure that the correct language is +% used at the proper times. +% +% \begin{macro}{\ifl@dusedbabel} +% \begin{macro}{\l@dusedbabelfalse} +% \begin{macro}{\l@dusedbabeltrue} +% A flag for checking if \verb?babel? has been used as a package. +% \begin{macrocode} +\newif\ifl@dusedbabel + \l@dusedbabelfalse +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ifl@dsamelang} +% \begin{macro}{\l@dsamelangfalse} +% \begin{macro}{\l@dsamelangtrue} +% A flag for checking if the same \verb?babel? language has been used +% for both the left and right texts. +% \begin{macrocode} +\newif\ifl@dsamelang + \l@dsamelangtrue +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\l@dchecklang} +% I'm going to use \cs{theledlanguageL} and \cs{theledlanguageR} to hold +% the names of the languages used for the left and right texts. This macro +% sets \cs{ifl@dsamelang} TRUE if they are the same, otherwise it +% sets it FALSE. +% \begin{macrocode} +\newcommand*{\l@dchecklang}{% + \l@dsamelangfalse + \edef\@tempa{\theledlanguageL}\edef\@temp{\theledlanguageR}% + \ifx\@tempa\@tempb + \l@dsamelangtrue + \fi} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@dbbl@set@language} +% In \verb?babel? the macro \cs{bbl@set@language}\marg{lang} does the work when +% the language \meta{lang} is changed via \cs{selectlanguage}. +% Unfortunately for me, if it is given +% an argument in the form of a control sequence it strips off the \verb?\? +% character rather than expanding the command. I need a version that accepts +% an argument in the form \cs{lang} without it stripping the \verb?\?. +% \begin{macrocode} +\newcommand*{\l@dbbl@set@language}[1]{% + \edef\languagename{#1}% + \select@language{\languagename}% + \if@filesw + \protected@write\@auxout{}{\string\select@language{\languagename}}% + \addtocontents{toc}{\string\select@language{\languagename}}% + \addtocontents{lof}{\string\select@language{\languagename}}% + \addtocontents{lot}{\string\select@language{\languagename}}% + \fi} + +% \end{macrocode} +% \end{macro} +% +% The rest of the setup has to be postponed until the end of the preamble +% when we know if \verb?babel? has been used or not. However, for now assume +% that it has not been used. +% +% \begin{macro}{\selectlanguage} +% \begin{macro}{\l@duselanguage} +% \begin{macro}{\theledlanguageL} +% \begin{macro}{\theledlanguageR} +% \cs{selectlanguage} is a \verb?babel? command. \cs{theledlanguageL} and +% \cs{theledlanguageR} are the names of the languages of the left and right +% texts. \cs{l@duselanguage} is similar to \cs{selectlanguage}. +% \begin{macrocode} +\providecommand{\selectlanguage}[1]{} +\newcommand*{\l@duselanguage}[1]{} +\gdef\theledlanguageL{} +\gdef\theledlanguageR{} + +% \end{macrocode} +% +% Now do the \verb?babel? fix, if necessary. +% \begin{macrocode} +\AtBeginDocument{% + \@ifundefined{bbl@main@language}{% +% \end{macrocode} +% Either \verb?babel? has not been used or it has been used with no +% specified language. +% \begin{macrocode} + \l@dusedbabelfalse + \renewcommand*{\selectlanguage}[1]{}}{% +% \end{macrocode} +% Here we deal with the case where babel has been used. \cs{selectlanguage} +% has to be redefined to use our version of \cs{bbl@set@language} and to +% store the left or right language. +% \begin{macrocode} + \l@dusedbabeltrue + \let\l@doldselectlanguage\selectlanguage + \let\l@doldbbl@set@language\bbl@set@language + \let\bbl@set@language\l@dbbl@set@language + \renewcommand{\selectlanguage}[1]{% + \l@doldselectlanguage{#1}% + \ifledRcol \gdef\theledlanguageR{#1}% + \else \gdef\theledlanguageL{#1}% + \fi} +% \end{macrocode} +% \cs{l@duselanguage} simply calls the original \cs{selectlanguage} so +% that \cs{theledlanguageL} and \cs{theledlanguageR} are unaltered. +% \begin{macrocode} + \renewcommand*{\l@duselanguage}[1]{% + \l@doldselectlanguage{#1}} +% \end{macrocode} +% Lastly, initialise the left and right languages to the current \verb?babel? +% one. +% \begin{macrocode} + \gdef\theledlanguageL{\bbl@main@language}% + \gdef\theledlanguageR{\bbl@main@language}% +% \end{macrocode} +% That's it. +% \begin{macrocode} +}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \section{Parallel columns} +% +% \begin{macro}{\Columns} +% The \cs{Columns} command results in the previous Left and +% Right texts being typeset in matching columns. There should +% be equal numbers of chunks in the left and right texts. +% +% \begin{macrocode} +\newcommand*{\Columns}{% + \ifnum\l@dnumpstartsL=\l@dnumpstartsR\else + \led@err@BadLeftRightPstarts{\the\l@dnumpstartsL}{\the\l@dnumpstartsR}% + \fi +% \end{macrocode} +% Start a group and zero counters, etc. +% \begin{macrocode} + \begingroup + \l@dzeropenalties + \endgraf\global\num@lines=\prevgraf + \global\num@linesR=\prevgraf + \global\par@line=\z@ + \global\par@lineR=\z@ + \global\l@dpscL=\z@ + \global\l@dpscR=\z@ +% \end{macrocode} +% Check if there are chunks to be processed, and process them +% two by two (left and right pairs). +% \begin{macrocode} + \check@pstarts + \loop\if@pstarts +% \end{macrocode} +% Increment \cs{l@dpscL} and \cs{l@dpscR} which here count +% the numbers of left and right chunks. +% \begin{macrocode} + \global\advance\l@dpscL \@ne + \global\advance\l@dpscR \@ne +% \end{macrocode} +% Check if there is text yet to be processed in at least one of +% the two current chunks, and also whether the left and right languages +% are the same +% \changes{v0.2}{2004/12/20}{Added \cs{l@dchecklang} and \cs{l@duselanguage} +% to \cs{Columns}} +% \begin{macrocode} + \checkraw@text + \l@dchecklang +{ \loop\ifaraw@text +% \end{macrocode} +% Grab the next pair of left and right text lines and output them, swapping +% languages if they differ +% \begin{macrocode} + \ifl@dsamelang + \do@lineL + \do@lineR + \else + \l@duselanguage{\theledlanguageL}% + \do@lineL + \l@duselanguage{\theledlanguageR}% + \do@lineR + \fi + \hb@xt@ \hsize{% + \unhbox\l@dleftbox + \hfill \columnseparator \hfill + \unhbox\l@drightbox + }% + \checkraw@text + \repeat} +% \end{macrocode} +% Having completed a pair of chunks, write the number of lines +% in each chunk to the respective section files. +% \begin{macrocode} + \@writelinesinparL + \@writelinesinparR + \check@pstarts + \repeat +% \end{macrocode} +% Having output all chunks, make sure all notes have been output, +% then zero counts ready for the next set of texts. +% \begin{macrocode} + \flush@notes + \flush@notesR + \endgroup +% \end{macrocode} +% \begin{macrocode} + \global\l@dpscL=\z@ + \global\l@dpscR=\z@ + \global\l@dnumpstartsL=\z@ + \global\l@dnumpstartsR=\z@ + \ignorespaces} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\columnseparator} +% \begin{macro}{\columnrulewidth} +% The separator between line pairs in parallel columns is in the form +% of a vertical rule extending a little below the baseline and with a height +% slightly greater than the \cs{baselineskip}. The width of the rule +% is \cs{columnrulewidth} (initially 0pt so the rule is invisible). +% \begin{macrocode} +\newcommand*{\columnseparator}{% + \smash{\rule[-0.2\baselineskip]{\columnrulewidth}{1.05\baselineskip}}} +\newdimen\columnrulewidth + \columnrulewidth=\z@ + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\if@pstarts} +% \begin{macro}{\@pstartstrue} +% \begin{macro}{\@pstartsfalse} +% \begin{macro}{\check@pstarts} +% \cs{check@pstarts} returns \cs{@pstartstrue} if there are any unprocessed +% chunks. +% \begin{macrocode} +\newif\if@pstarts +\newcommand*{\check@pstarts}{% + \@pstartsfalse + \ifnum\l@dnumpstartsL>\l@dpscL + \@pstartstrue + \else + \ifnum\l@dnumpstartsR>\l@dpscR + \@pstartstrue + \fi + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ifaraw@text} +% \begin{macro}{\araw@texttrue} +% \begin{macro}{\araw@textfalse} +% \begin{macro}{\checkraw@text} +% \cs{checkraw@text} checks whether the current Left or Right box is +% void or not. If one or other is not void it sets \cs{araw@texttrue}, +% otherwise both are void and it sets \cs{araw@textfalse}. +% \begin{macrocode} +\newif\ifaraw@text + \araw@textfalse +\newcommand*{\checkraw@text}{% + \araw@textfalse + \ifvbox\namebox{l@dLcolrawbox\the\l@dpscL} + \araw@texttrue + \else + \ifvbox\namebox{l@dRcolrawbox\the\l@dpscR} + \araw@texttrue + \fi + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@writelinesinparL} +% \begin{macro}{\@writelinesinparR} +% These write the number of text lines in a chunk to the section files, +% and then afterwards zero the counter. +% \begin{macrocode} +\newcommand*{\@writelinesinparL}{% + \edef\next{% + \write\linenum@out{\string\@pend[\the\@donereallinesL]}}% + \next + \global\@donereallinesL \z@} +\newcommand*{\@writelinesinparR}{% + \edef\next{% + \write\linenum@outR{\string\@pendR[\the\@donereallinesR]}}% + \next + \global\@donereallinesR \z@} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \section{Parallel pages} +% +% This is considerably more complicated than parallel columns. +% +% \begin{macro}{\numpagelinesL} +% \begin{macro}{\numpagelinesR} +% \begin{macro}{\l@dminpagelines} +% Counts for the number of lines on a left or right page, and the smaller +% of the number of lines on a pair of facing pages. +% \begin{macrocode} +\newcount\numpagelinesL +\newcount\numpagelinesR +\newcount\l@dminpagelines + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\Pages} +% The \cs{Pages} command results in the previous Left and +% Right texts being typeset on matching facing pages. There should +% be equal numbers of chunks in the left and right texts. +% +% \begin{macrocode} +\newcommand*{\Pages}{% + \typeout{} + \typeout{*************************** PAGES ***************************} + \ifnum\l@dnumpstartsL=\l@dnumpstartsR\else + \led@err@BadLeftRightPstarts{\the\l@dnumpstartsL}{\the\l@dnumpstartsR}% + \fi +% \end{macrocode} +% Get onto an empty even (left) page, then initialise counters, etc. +% \begin{macrocode} + \cleartol@devenpage + \begingroup + \l@dzeropenalties + \endgraf\global\num@lines=\prevgraf + \global\num@linesR=\prevgraf + \global\par@line=\z@ + \global\par@lineR=\z@ + \global\l@dpscL=\z@ + \global\l@dpscR=\z@ + \writtenlinesLfalse + \writtenlinesRfalse +% \end{macrocode} +% Check if there are chunks to be processed. +% \begin{macrocode} + \check@pstarts + \loop\if@pstarts +% \end{macrocode} +% Loop over the number of chunks, incrementing the chunk counts +% (\cs{l@dpscL} +% and \cs{l@dpscR} are chunk (box) counts.) +% \begin{macrocode} + \global\advance\l@dpscL \@ne + \global\advance\l@dpscR \@ne +% \end{macrocode} +% Calculate the maximum number of real text lines in the chunk pair, +% storing the result in the relevant \cs{l@dmaxlinesinpar}. +% \begin{macrocode} + \getlinesfromparlistL + \getlinesfromparlistR + \l@dcalc@maxoftwo{\@cs@linesinparL}{\@cs@linesinparR}% + {\usenamecount{l@dmaxlinesinpar\the\l@dpscL}}% + \check@pstarts + \repeat +% \end{macrocode} +% Zero the counts again, ready for the next bit. +% \begin{macrocode} + \global\l@dpscL=\z@ + \global\l@dpscR=\z@ +% \end{macrocode} +% Get the number of lines on the first pair of pages and store +% the minumum in \cs{l@dminpagelines}. +% \begin{macrocode} + \getlinesfrompagelistL + \getlinesfrompagelistR + \l@dcalc@minoftwo{\@cs@linesonpageL}{\@cs@linesonpageR}% + {\l@dminpagelines}% +% \end{macrocode} +% Now we start processing the left and right chunks (\cs{l@dpscL} and +% \cs{l@dpscR} count the left and right chunks), starting with the first pair. +% \begin{macrocode} + \check@pstarts + \if@pstarts +% \end{macrocode} +% Increment the chunk counts to get the first pair. +% \begin{macrocode} + \global\advance\l@dpscL \@ne + \global\advance\l@dpscR \@ne +% \end{macrocode} +% We haven't processed any lines from these chunks yet, so zero the +% respective line counts. +% \begin{macrocode} + \global\@donereallinesL=\z@ + \global\@donetotallinesL=\z@ + \global\@donereallinesR=\z@ + \global\@donetotallinesR=\z@ +% \end{macrocode} +% Start a loop over the boxes (chunks). +% \begin{macrocode} + \checkraw@text +% \end{macrocode} +% \begin{macrocode} +% \begingroup +{ \loop\ifaraw@text +% \end{macrocode} +% See if there is more that can be done for the left page and set up the +% left language. +% \changes{v0.2}{2004/12/20}{Added \cs{l@duselanguage} to \cs{Pages}} +% \begin{macrocode} + \checkpageL + \l@duselanguage{\theledlanguageL}% +%%% \begingroup +{ \loop\ifl@dsamepage +% \end{macrocode} +% Process the next (left) text line, adding it to the page. +% \changes{v0.3}{2005/02/10}{Added \cs{ledstrutL} to \cs{Pages}} +% \begin{macrocode} + \do@lineL + \advance\numpagelinesL \@ne + \hb@xt@ \hsize{\ledstrutL\unhbox\l@dleftbox}% +% \end{macrocode} +% Perhaps we have to move to the next (left) box. Check if we have got all +% we can onto the page. If not, repeat for the next line. +% \begin{macrocode} + \get@nextboxL + \checkpageL + \repeat +% \end{macrocode} +% That (left) page has been filled. Output the number of real lines +% on the page --- if the page break is because the page has been +% filled with lines, use the actual number, otherwise the page has been +% ended early in order to synchronise with the facing page so use an +% impossibly large number. +% \begin{macrocode} + \ifl@dpagefull +% \end{macrocode} +% \begin{macrocode} + \@writelinesonpageL{\the\numpagelinesL}% + \else + \@writelinesonpageL{1000}% + \fi +% \end{macrocode} +% Zero the left page lines count and clear the page to get onto the facing +% (odd, right) page. +% \begin{macrocode} + \numpagelinesL \z@ + \clearl@dleftpage }% +% \end{macrocode} +% Now do the same for the right text. +% \changes{v0.3}{2005/02/10}{Added \cs{ledstrutR} to \cs{Pages}} +% \begin{macrocode} + \checkpageR + \l@duselanguage{\theledlanguageR}% +{ \loop\ifl@dsamepage + \do@lineR + \advance\numpagelinesR \@ne + \hb@xt@ \hsize{\ledstrutR\unhbox\l@drightbox}% + \get@nextboxR + \checkpageR + \repeat + \ifl@dpagefull + \@writelinesonpageR{\the\numpagelinesR}% + \else + \@writelinesonpageR{1000}% + \fi + \numpagelinesR=\z@ +% \end{macrocode} +% The page is full, so move onto the next (left, odd) page and repeat left +% text processing. +% \begin{macrocode} + \clearl@drightpage} +% \end{macrocode} +% More to do? If there is we have to get the number of lines for the next +% pair of pages before starting to output them. +% \changes{v0.3b}{2005/04/08}{Added \cs{l@dminpagelines} calculation +% for succeeding page pairs} +% \begin{macrocode} + \checkraw@text + \ifaraw@text + \getlinesfrompagelistL + \getlinesfrompagelistR + \l@dcalc@minoftwo{\@cs@linesonpageL}{\@cs@linesonpageR}% + {\l@dminpagelines}% + \fi + \repeat} +% \end{macrocode} +% We have now output the text from all the chunks. +% \begin{macrocode} + \fi +% \end{macrocode} +% Make sure that there are no inserts hanging around. +% \begin{macrocode} + \flush@notes + \flush@notesR + \endgroup +% \end{macrocode} +% Zero counts ready for the next set of left/right text chunks. +% \begin{macrocode} + \global\l@dpscL=\z@ + \global\l@dpscR=\z@ + \global\l@dnumpstartsL=\z@ + \global\l@dnumpstartsR=\z@ + \ignorespaces} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ledstrutL} +% \begin{macro}{\ledstrutR} +% Struts inserted into leftand right text lines. +% \changes{v0.3}{2005/02/10}{Added \cs{ledtrutL} and \cs{ledstrutR}} +% \begin{macrocode} +\newcommand*{\ledstrutL}{\strut} +\newcommand*{\ledstrutR}{\strut} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\cleartoevenpage} +% \begin{macro}{\cleartol@devenpage} +% \begin{macro}{\clearl@dleftpage} +% \begin{macro}{\clearl@drightpage} +% \cs{cleartoevenpage}, which is defined in the memoir class, +% is like \cs{clear(double)page} except that we +% end up on an even page. +% \cs{cleartol@devenpage} is similar except that it first checks to see +% if it is already on an empty page. +% \cs{clearl@dleftpage} and \cs{clearl@drightpage} get us onto +% an odd and even page, respectively, checking that we end up on +% the immediately next page. +% \begin{macrocode} +\providecommand{\cleartoevenpage}[1][\@empty]{% + \clearpage + \ifodd\c@page\hbox{}#1\clearpage\fi} +\newcommand*{\cleartol@devenpage}{% + \ifdim\pagetotal<\topskip% on an empty page + \else + \clearpage + \fi + \ifodd\c@page\hbox{}\clearpage\fi} +\newcommand*{\clearl@dleftpage}{% + \clearpage + \ifodd\c@page\else + \led@err@LeftOnRightPage + \hbox{}% + \cleardoublepage + \fi} +\newcommand*{\clearl@drightpage}{% + \clearpage + \ifodd\c@page + \led@err@RightOnLeftPage + \hbox{}% + \cleartoevenpage + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\getlinesfromparlistL} +% \begin{macro}{\@cs@linesinparL} +% \begin{macro}{\getlinesfromparlistR} +% \begin{macro}{\@cs@linesinparR} +% \cs{getlinesfromparlistL} gets the next entry from the +% \cs{linesinpar@listL} and puts it into \cs{@cs@linesinparL}; if the +% list is empty, it sets \cs{@cs@linesinparL} to 0. Similarly +% for \cs{getlinesfromparlistR}. +% \begin{macrocode} +\newcommand*{\getlinesfromparlistL}{% + \ifx\linesinpar@listL\empty + \gdef\@cs@linesinparL{0}% + \else + \gl@p\linesinpar@listL\to\@cs@linesinparL + \fi} +\newcommand*{\getlinesfromparlistR}{% + \ifx\linesinpar@listR\empty + \gdef\@cs@linesinparR{0}% + \else + \gl@p\linesinpar@listR\to\@cs@linesinparR + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\getlinesfrompagelistL} +% \begin{macro}{\@cs@linesonpageL} +% \begin{macro}{\getlinesfrompagelistR} +% \begin{macro}{\@cs@linesonpageR} +% \cs{getlinesfrompagelistL} gets the next entry from the +% \cs{linesonpage@listL} and puts it into \cs{@cs@linesonpageL}; if the +% list is empty, it sets \cs{@cs@linesonpageL} to 1000. Similarly +% for \cs{getlinesfrompagelistR}. +% \begin{macrocode} +\newcommand*{\getlinesfrompagelistL}{% + \ifx\linesonpage@listL\empty + \gdef\@cs@linesonpageL{1000}% + \else + \gl@p\linesonpage@listL\to\@cs@linesonpageL + \fi} +\newcommand*{\getlinesfrompagelistR}{% + \ifx\linesonpage@listR\empty + \gdef\@cs@linesonpageR{1000}% + \else + \gl@p\linesonpage@listR\to\@cs@linesonpageR + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@writelinesonpageL} +% \begin{macro}{\@writelinesonpageR} +% These macros output the number of lines on a page to the section file +% in the form of \cs{@lopL} or \cs{@lopR} macros. +% \begin{macrocode} +\newcommand*{\@writelinesonpageL}[1]{% + \edef\next{\write\linenum@out{\string\@lopL{#1}}}% + \next} +\newcommand*{\@writelinesonpageR}[1]{% + \edef\next{\write\linenum@outR{\string\@lopR{#1}}}% + \next} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\l@dcalc@maxoftwo} +% \begin{macro}{\l@dcalc@minoftwo} +% \cs{l@dcalc@maxoftwo}\marg{num}\marg{num}\marg{count} sets \meta{count} +% to the maximum of the two \meta{num}. +% +% Similarly +% \cs{l@dcalc@minoftwo}\marg{num}\marg{num}\marg{count} sets \meta{count} +% to the minimum of the two \meta{num}. +% +% \begin{macrocode} +\newcommand*{\l@dcalc@maxoftwo}[3]{% + \ifnum #2>#1\relax + #3=#2\relax + \else + #3=#1\relax + \fi} +\newcommand*{\l@dcalc@minoftwo}[3]{% + \ifnum #2<#1\relax + #3=#2\relax + \else + #3=#1\relax + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ifl@dsamepage} +% \begin{macro}{\l@dsamepagetrue} +% \begin{macro}{\l@dsamepagefalse} +% \begin{macro}{\ifl@dpagefull} +% \begin{macro}{\l@dpagefulltrue} +% \begin{macro}{\l@dpagefullfalse} +% \begin{macro}{\checkpageL} +% \begin{macro}{\checkpageR} +% \cs{checkpageL} tests if the space and lines already taken on the page by +% text and footnotes is less than the constraints. If so, then +% \cs{ifl@dpagefull} is set FALSE and \cs{ifl@dsamepage} is set TRUE. +% If the page is spatially full +% then \cs{ifl@dpagefull} is set TRUE and \cs{ifl@dsamepage} is set FALSE. +% If it is not spatially full but the maximum number of lines have been +% output then both \cs{ifl@dpagefull} and \cs{ifl@dsamepage} +% are set FALSE. +% +% \begin{macrocode} +\newif\ifl@dsamepage + \l@dsamepagetrue +\newif\ifl@dpagefull +\newcommand*{\checkpageL}{% + \l@dpagefulltrue + \l@dsamepagetrue + \check@goal + \ifdim\pagetotal<\ledthegoal + \ifnum\numpagelinesL<\l@dminpagelines + \else + \l@dsamepagefalse + \l@dpagefullfalse + \fi + \else + \l@dsamepagefalse + \l@dpagefulltrue + \fi} +\newcommand*{\checkpageR}{% + \l@dpagefulltrue + \l@dsamepagetrue + \check@goal + \ifdim\pagetotal<\ledthegoal + \ifnum\numpagelinesR<\l@dminpagelines + \else + \l@dsamepagefalse + \l@dpagefullfalse + \fi + \else + \l@dsamepagefalse + \l@dpagefulltrue + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ledthegoal} +% \begin{macro}{\goalfraction} +% \begin{macro}{\check@goal} +% \cs{ledthegoal} is the amount of space allowed to taken by text and +% footnotes on a page before a forced pagebreak. This can be controlled via +% \cs{goalfraction}. \cs{ledthegoal} is calculated via \cs{check@goal}. +% \begin{macrocode} +\newdimen\ledthegoal +\newcommand*{\goalfraction}{0.9} +\newcommand*{\check@goal}{% + \ledthegoal=\goalfraction\pagegoal} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\ifwrittenlinesL} +% \begin{macro}{\ifwrittenlinesL} +% Booleans for whether line data has been written to the section file. +% \begin{macrocode} +\newif\ifwrittenlinesL +\newif\ifwrittenlinesR + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\get@nextboxL} +% \begin{macro}{\get@nextboxR} +% If the current box is not empty (i.e., still contains some lines) +% nothing is done. Otherwise if and only if a synchronisation point is +% reached the next box is started. +% +% \begin{macrocode} +\newcommand*{\get@nextboxL}{% + \ifvbox\namebox{l@dLcolrawbox\the\l@dpscL}% box is not empty +% \end{macrocode} +% The current box is not empty; do nothing. +% \begin{macrocode} + \else% box is empty +% \end{macrocode} +% The box is empty; check if enough lines (real and blank) have been +% output. +% \begin{macrocode} + \ifnum\usenamecount{l@dmaxlinesinpar\the\l@dpscL}>\@donetotallinesL + \else +% \end{macrocode} +% Sufficient lines have been output. +% \begin{macrocode} + \ifwrittenlinesL + \else +% \end{macrocode} +% Write out the number of lines done, and set the boolean so this is only +% done once. +% \begin{macrocode} + \@writelinesinparL + \writtenlinesLtrue + \fi + \ifnum\l@dnumpstartsL>\l@dpscL +% \end{macrocode} +% There are still unprocessed boxes. Recalculate the maximum number of +% lines needed, and move onto the next box (by incrementing \cs{l@dpscL}). +% \begin{macrocode} + \writtenlinesLfalse + \l@dcalc@maxoftwo{\the\usenamecount{l@dmaxlinesinpar\the\l@dpscL}}% + {\the\@donetotallinesL}% + {\usenamecount{l@dmaxlinesinpar\the\l@dpscL}}% + \global\@donetotallinesL \z@ + \global\advance\l@dpscL \@ne + \fi + \fi + \fi} +% \end{macrocode} +% +% \begin{macrocode} +\newcommand*{\get@nextboxR}{% + \ifvbox\namebox{l@dRcolrawbox\the\l@dpscR}% box is not empty + \else% box is empty + \ifnum\usenamecount{l@dmaxlinesinpar\the\l@dpscR}>\@donetotallinesR + \else + \ifwrittenlinesR + \else + \@writelinesinparR + \writtenlinesRtrue + \fi + \ifnum\l@dnumpstartsR>\l@dpscR + \writtenlinesRfalse + \l@dcalc@maxoftwo{\the\usenamecount{l@dmaxlinesinpar\the\l@dpscR}}% + {\the\@donetotallinesR}% + {\usenamecount{l@dmaxlinesinpar\the\l@dpscR}}% + \global\@donetotallinesR \z@ + \global\advance\l@dpscR \@ne + \fi + \fi + \fi} + +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \section{The End}\label{end} +% +% This is the end of the package code. But before we finish, enable +% a patch file (if there is one) to be read. +% +% \begin{macrocode} +\InputIfFileExists{ledparpatch.sty} + +%</code> +% \end{macrocode} +% +% \newpage +% \appendix +% +% \section{Examples}\label{examples} +% +% This section presents some sample documents. +% +% +% The figures are from processed versions of the files. Having latexed +% a file I used DVIPS to get Encapsulated PostScript, then the epstopdf +% script to get a PDF version as well, for example: \\ +% \begin{verbatim} +% > latex villon +% > latex villon +% > latex villon +% > dvips -E -o villon.eps villon % produces villon.eps +% > epstopdf villon.eps % produces villon.pdf +% \end{verbatim} +% +% For a multipage example, DVIPS has an option to output a range of pages (-p +% for the first and -l (letter l) for the last). +% For instance, to output a single page, say page 2:\\ +% \begin{verbatim} +% > latex djd17nov +% > latex djd17nov +% > latex djd17nov +% > dvips -E -p2 -l2 -o djd17novL.eps djd17nov % produces djd17novL.eps +% > epstopdf djd17novL.eps % produces djd17novL.pdf +% \end{verbatim} +% +% For those who aren't fascinated by LaTeX code, I show the all the +% typeset results first, then the code that produced them. +% +% +% \cleardoublepage +% +% \begin{figure}[p] +% \centering +% \includegraphics{villon} +% \caption{Output from \file{villon.tex}.} +% \label{villon-out} +% \end{figure} +% +% \begin{figure}[p] +% \centering +% \includegraphics{djd17novL} +% \caption{Left page output from \file{djd17nov.tex}.} +% \label{djdL-out} +% \end{figure} +% +% \begin{figure}[p] +% \centering +% \includegraphics{djd17novR} +% \caption{Right page output from \file{djd17nov.tex}.} +% \label{djdR-out} +% \end{figure} +% +% \begin{figure}[p] +% \centering +% \includegraphics{djdpoems1} +% \caption{First left page output from \file{djdpoems.tex}.} +% \label{djdp1-out} +% \end{figure} +% +% \begin{figure}[p] +% \centering +% \includegraphics{djdpoems2} +% \caption{First right page output from \file{djdpoems.tex}.} +% \label{djdp2-out} +% \end{figure} +% +% \begin{figure}[p] +% \centering +% \includegraphics{djdpoems3} +% \caption{Second left page output from \file{djdpoems.tex}.} +% \label{djdp3-out} +% \end{figure} +% +% \begin{figure}[p] +% \centering +% \includegraphics{djdpoems4} +% \caption{Second right page output from \file{djdpoems.tex}.} +% \label{djdp4-out} +% \end{figure} +% +% +% +% \clearpage +% +% \subsection{Parallel column example}\label{example:villon} +% +% This made-up example, \file{villon.tex}, is included to show +% parallel columns and how they can be interspersed in regular text. +% The verses are set using the \cs{stanza} construct, where each +% verse line is a chunk. +% The code is given below and the result is shown in Figure~\ref{villon-out}. +% +% \medskip +% \hrule +% \medskip +% \begin{macrocode} +%<*villon> +%%% villon.tex Example parallel columns +\documentclass{article} +\addtolength{\textheight}{-10\baselineskip} +\usepackage{ledmac,ledpar} +%% Use r instead of R to flag right text line numbers +\renewcommand{\Rlineflag}{r} +%% Use the flag in the notes +\let\oldBfootfmt\Bfootfmt +\renewcommand{\Bfootfmt}[3]{% + \let\printlines\printlinesR + \oldBfootfmt{#1}{#2}{#3}} +\begin{document} + +I thought that limericks were peculiarly English, but this appears not +to be the case. As with most limericks this one is by Anonymous. + +\vspace*{\baselineskip} + +\begin{pairs} +%% no indentation +\setstanzaindents{0,0,0,0,0,0,0,0,0} +%% no number flag +\renewcommand{\Rlineflag}{} +%% draw a rule and widen the columns +\setlength{\columnrulewidth}{0.4pt} +\setlength{\Lcolwidth}{0.46\textwidth} +\setlength{\Rcolwidth}{\Lcolwidth} + +\begin{Leftside} +%% set left text line numbering sequence +\firstlinenum{2} +\linenumincrement{2} +\linenummargin{left} +\beginnumbering +\stanza +Il y avait un jeune homme de Dijon, & +Qui n'avait que peu de religion. & +Il dit: `Quant \`{a} moi, & +Je d\'{e}teste tous les trois, & +Le P\`{e}re, et le Fils, et le Pigeon.' \& +\endnumbering +\end{Leftside} + +\begin{Rightside} +%% different right text line numbering sequence +\firstlinenum{1} +\linenumincrement{2} +\linenummargin{right} +\beginnumbering +\stanza +There was a young man of Dijon, & +Who had only a little religion, & +He said: `As for me, & +I detest all the three, & +The Father, the Son, and the Pigeon.' \& +\endnumbering +\end{Rightside} + +\Columns +\end{pairs} + +\vspace*{\baselineskip} + + The following is verse \textsc{lxxiii} of Fran\c{c}ois Villon's +\textit{Le Testament} (The Testament), composed in 1461. + +%% Allow for hanging indentation for long lines +\setstanzaindents{1,0,0,0,0,0,0,0,0} +%% Columns wider than the default +\setlength{\Lcolwidth}{0.46\textwidth} +\setlength{\Rcolwidth}{\Lcolwidth} +\vspace*{\baselineskip} + +\begin{pairs} +\begin{Leftside} +\firstlinenum{2} +\linenumincrement{2} +\linenummargin{left} +\beginnumbering +\stanza +Dieu mercy et Tacque Thibault, & +Qui tant d'eaue froid m'a fait boire, & +Mis en bas lieu, non pas en hault, & +Mengier d'angoisse maints \edtext{poire}{\lemma{poire d'angoisse}% + \Afootnote{This has a triple meaning: literally it is the fruit of the + choke pear, + figuratively it means `bitter fruit', and it also refers to a torture + instrument.}}, & +Enferr\'{e} \ldots Quant j'en ay memoire, & +Je Prie pour luy \edtext{\textit{et reliqua}}{\Afootnote{and so on}}, & +Que Dieu luy doint, et voire, voire! & +Ce que je pense \ldots \textit{et cetera}. \& +\endnumbering +\end{Leftside} + +\begin{Rightside} +\firstlinenum{2} +\linenumincrement{2} +\linenummargin{right} +\beginnumbering +\stanza +Thanks to God --- and to \edtext{Tacque Thibaud}{% + \Bfootnote{A favourite of Jean, Duc de Berry and loathed for his exactions + and debauchery. Villon uses his name as an insulting nickname for + Thibaud d'Auxigny, the Bishop of Orl\'{e}ans.}} & +Who made me drink so much \edtext{cold water}{% + \Bfootnote{Can either refer to the normal prison diet of bread and + water or to a common medieval torture which involved forced drinking + of cold water.}}, & +Put me underground instead of higher up & +And made me eat such bitter fruit, & +In chains \ldots When I think of this, & +I pray for him---\textit{et reliqua;} & +May God grant him (yes, by God) & +What I think \ldots \textit{et cetera}. \& +\endnumbering +\end{Rightside} + +\Columns +\end{pairs} + +\vspace*{\baselineskip} + + The translation and notes are by Anthony Bonner, +\textit{The Complete Works of Fran\c{c}ois Villon}, published by +Bantam Books in 1960. + +\end{document} + +%</villon> +% \end{macrocode} +% +% +% \subsection{Example parallel facing pages} \label{example:djd17nov} +% +% This example, illustrated in Figures~\ref{djdL-out} and~\ref{djdR-out}, +% was provided in November 2004 by Dirk-Jan Dekker\index{Dekker, Dirk-Jan} +% of the Department of Medieval History at Radboud University, Nijmegen. +% +% \medskip +% \hrule +% \medskip +% +% \begin{macrocode} +%<*djd17nov> +%%% This is djd17nov.tex, a sample critical text edition +%%% written in LaTeX2e with the ledmac and ledpar packages. +%%% (c) 2003--2004 by Dr. Dirk-Jan Dekker, +%%% Radboud University, Nijmegen (The Netherlands) +%%% (PRW) Modified slightly by PRW to fit the ledpar manual + +\documentclass[10pt, letterpaper, twoside]{article} +\usepackage[latin,english]{babel} +\usepackage{makeidx} +\usepackage{ledmac,ledpar} +\lineation{section} +\linenummargin{inner} +\sidenotemargin{outer} + +\makeindex + +\renewcommand{\notenumfont}{\footnotesize} +\newcommand{\notetextfont}{\footnotesize} + +%\let\Afootnoterule=\relax +\let\Bfootnoterule=\relax +\let\Cfootnoterule=\relax + +\addtolength{\skip\Afootins}{1.5mm} +%\addtolength{\skip\Bfootins}{1.5mm} +%\addtolength{\skip\Cfootins}{1.5mm} + +\makeatletter + +\renewcommand*{\para@vfootnote}[2]{% + \insert\csname #1footins\endcsname + \bgroup + \notefontsetup + \interlinepenalty=\interfootnotelinepenalty + \floatingpenalty=\@MM + \splittopskip=\ht\strutbox \splitmaxdepth=\dp\strutbox + \leftskip=\z@skip \rightskip=\z@skip + \l@dparsefootspec #2\ledplinenumtrue% new from here + \ifnum\@nameuse{previous@#1@number}=\l@dparsedstartline\relax + \ledplinenumfalse + \fi + \ifnum\previous@page=\l@dparsedstartpage\relax + \else \ledplinenumtrue \fi + \ifnum\l@dparsedstartline=\l@dparsedendline\relax + \else \ledplinenumtrue \fi + \expandafter\xdef\csname previous@#1@number\endcsname{\l@dparsedstartline}% + \xdef\previous@page{\l@dparsedstartpage}% to here + \setbox0=\vbox{\hsize=\maxdimen + \noindent\csname #1footfmt\endcsname#2}% + \setbox0=\hbox{\unvxh0}% + \dp0=0pt + \ht0=\csname #1footfudgefactor\endcsname\wd0 + \box0 + \penalty0 + \egroup +} + +\newcommand*{\previous@A@number}{-1} +\newcommand*{\previous@B@number}{-1} +\newcommand*{\previous@C@number}{-1} +\newcommand*{\previous@page}{-1} + +\newcommand{\abb}[1]{#1% + \let\rbracket\nobrak\relax} +\newcommand{\nobrak}{\textnormal{}} +\newcommand{\morenoexpands}{% + \let\abb=0% +} + +\newcommand{\Aparafootfmt}[3]{% + \ledsetnormalparstuff + \scriptsize + \notenumfont\printlines#1|\enspace +% \lemmafont#1|#2\enskip + \notetextfont + #3\penalty-10\hskip 1em plus 4em minus.4em\relax} + +\newcommand{\Bparafootfmt}[3]{% + \ledsetnormalparstuff + \scriptsize + \notenumfont\printlines#1|% + \ifledplinenum + \enspace + \else + {\hskip 0em plus 0em minus .3em}% + \fi + \select@lemmafont#1|#2\rbracket\enskip + \notetextfont + #3\penalty-10\hskip 1em plus 4em minus.4em\relax } + +\newcommand{\Cparafootfmt}[3]{% + \ledsetnormalparstuff + \scriptsize + \notenumfont\printlines#1|\enspace +% \lemmafont#1|#2\enskip + \notetextfont + #3\penalty-10\hskip 1em plus 4em minus.4em\relax} + +\makeatother + +\footparagraph{A} +\footparagraph{B} +\footparagraph{C} + +\let\Afootfmt=\Aparafootfmt +\let\Bfootfmt=\Bparafootfmt +\let\Cfootfmt=\Cparafootfmt + +\renewcommand*{\Rlineflag}{} + +\emergencystretch40pt + +\author{Guillelmus de Berchen} +\title{Chronicon Geldriae} +\date{} +\hyphenation{archi-epi-sco-po Huns-dis-brug li-be-ra No-vi-ma-gen-si} +\begin{document} +\begin{pages} +\begin{Leftside} +\beginnumbering\pstart +\selectlanguage{latin} +\section{De ecclesia S. Stephani Novimagensi} + +\noindent\setline{1} +Nobilis itaque comes Otto\protect\edindex{Otto II of Guelders} +imperio et dominio Novimagensi sibi, ut praefertur, impignoratis +et commissis +\edtext{proinde}{\Bfootnote{primum D}} praeesse cupiens, anno +\textsc{liiii} superius descripto, mense +Iu\edtext{}{\Afootnote{p.\ 227~R}}nio, una cum iudice, scabinis ceterisque +civibus civitatis Novimagensis, pro ipsius et inhabitantium in ea +necessitate,\edtext{}{\Afootnote{p.\ 97~N}} commodo et utilitate, +ut \edtext{ecclesia eius}{\Bfootnote{ecclesia D: eius eius H}} parochialis +\edtext{\abb{extra civitatem}}{\Bfootnote{\textit{om.}~H}} sita +destrueretur et \edtext{infra}{\Bfootnote{intra D}} muros +\edtext{transfer\edtext{}{\Afootnote{p.\ 129~D}}retur}% +{\Bfootnote{transferreretur NH}} +ac de novo construeretur, +\edtext{a reverendo patre domino +Conrado\protect\edindex{Conrad of Hochstaden} de +\edtext{Hofsteden}{\Bfootnote{Hoffstede D: Hoffsteden H}}, archiepiscopo +\edtext{Coloniensi}{\Bfootnote{Colononiensi H}}, licentiam}% +{\Cfootnote{William is confusing two charters that are five years +apart. Permission from St.\ Apostles' Church in Cologne had been +obtained as early as 1249. Cf.\ +Sloet\protect\index{Sloet van de Beele, L.A.J.W.}, +\textit{Oorkondenboek} nr.\ 707 (14 November 1249): +``\ldots{}nos devotionis tue precibus annuentes, ut ipsam ecclesiam +faciens demoliri transferas in locum alium competentem, tibi +auctoritate presentium indulgemus\ldots''}}, et a venerabilibus +\edtext{dominis}{\Bfootnote{viris H}} decano et capitulo sanctorum +Apostolorum\protect\edindex{St. Apostles' (Cologne)} +\edtext{Coloniensi}{\Bfootnote{Coloniae H}}, ipsius ecclesiae ab +antiquo veris et pacificis patronis, consensum, citra tamen +praeiudicium, damnum aut gravamen \edtext{iurium}{\Bfootnote{virium D}} +et bonorum eorundem, impetravit. +\pend + +\pstart +\edtext{Et exinde \edtext{liberum}{\Bfootnote{librum H}} +locum eiusdem civitatis +\edtext{qui}{\Bfootnote{quae D}} dicitur +\edtext{Hundisburg}{\Bfootnote{Hundisburch D: Hundisbrug HMN: +Hunsdisbrug R}}\protect\edindex{Hundisburg}, +de praelibati Wilhelmi\protect\edindex{William II of Holland} Romanorum +\edtext{regis}{\Bfootnote{imperatoris D}}, ipsius fundi +do\edtext{}{\Afootnote{f.\ 72v~M}}mini, consensu, ad aedificandum +\edtext{\abb{et consecrandum}}{\Bfootnote{\textit{om.}\ H}} +ecclesi\edtext{}{\Afootnote{p.\ 228~R}}am et coemeterium, +\edtext{eisdem}{\Bfootnote{eiusdem D}} decano et capitulo de expresso +eiusdem civitatis assensu libera contradiderunt voluntate, obligantes +se ipsi \edtext{comes}{\Bfootnote{comites D}} et civitas +\edtext{\abb{dictis}}{\Bfootnote{\textit{om.}\ H}} decano et capitulo, +quod in recompensationem illius areae infra castrum et portam, quae +fuit dos ecclesiae, in qua plebanus habitare solebat---quae +\edtext{tunc}{\Bfootnote{nunc H}} per novum fossatum civitatis est +destructa---aliam aream competentem et ecclesiae novae, +\edtext{ut praefertur, aedificandae}{% +\lemma{\abb{ut\ldots aedificandae}}\Bfootnote{\textit{om.}\ H}} satis +\edtext{contiguam}{\Bfootnote{contiguum M}}, ipsi plebano darent et +assignarent.}{\Cfootnote{Cf.\ Sloet, \textit{Oorkondenboek} nr.\ 762 +(June 1254)}} Et desuper +\edtext{\abb{apud}}{\Bfootnote{\textit{om.}\ H}} dictam ecclesiam +sanctorum Apostolorum \edtext{est}{\Bfootnote{et H}} +\edtext{littera}{\Bfootnote{litteram H}} sigillis ipsorum +Ottonis\edtext{}{\Afootnote{p.\ 130~D}} comitis et civitatis +\edtext{Novimagensis}{\Bfootnote{Novimagii D}} +\edtext{sigillata}{\Bfootnote{sigillis communita H}}. +\pend + +\pstart + // One additional line to show synchronization. // +\pend +\endnumbering +\end{Leftside} + +\begin{Rightside} +\sidenotemargin{right}\selectlanguage{english} +\beginnumbering +\pstart +\addtocounter{section}{-1}% +\leavevmode\section{St.\ Stephen's Church in Nijmegen} + +\noindent\setline{1}% +After the noble count Otto had taken in pledge the power over +Nijmegen,\footnote{In 1247 William II\protect\index{William II of Holland} +(1227--1256) count of Holland needed money to fight his way to +Aachen\protect\index{Aachen} to be crowned King of the Holy Roman +Empire. He gave the town of Nijmegen in pledge to Otto +II\protect\index{Otto II of Guelders} (1229--1271) count of Guelders.} +like I have written above, he wanted to protect the town. So in June +1254\ledsidenote{1254} he and the judge, the sheriffs and other +citizens of Nijmegen obtained permission to demolish the parish +church that lay outside the town walls,\footnote{Since the early +seventh century old St.\ Stephen's church had been located close +to the castle, at today's +Kelfkensbos\protect\index{Kelfkensbos (Nijmegen)} square. +Traces of the church and the presbytery were found during excavations +in 1998--1999.} to move it inside the walls and to rebuild it new. +This operation was necessary and useful both for Otto himself and +for the inhabitants of the town. The reverend father Conrad of +Hochstaden, archbishop of +Cologne,\footnote{Conrad of Hochstaden ({\textdagger} 1261) was +archbishop of Cologne in 1238--1261. Nijmegen belonged to the +archdiocese of Cologne until 1559.} gave his permission. So did the +reverend dean and canons of the chapter of St.\ +Apostles'\protect\index{St. Apostles' (Cologne)} in Cologne, who had +long\footnote{They probably became the patrons when the chapter was +established in the early eleventh century. About the church and the +chapter, see Gottfried Stracke\protect\index{Stracke, G.}, +\textit{K\"{o}ln:\ St.\ Aposteln}, Stadtspuren -- Denkm\"{a}ler in +K\"{o}ln, vol.\ 19, K\"{o}ln: J.\,P.\ Bachem, 1992.} been the true +and benevolent patrons of the church---but they did not allow Otto +to do anything without their knowledge, nor to infringe their rights, +nor to damage their property. +\pend + +\pstart +And so the count and the town voluntarily gave an open space in town +called Hundisburg, which was owned by the aforementioned king William, +to the dean and chapter of St.\ Apostles' in order to build and +consecrate a church and graveyard. King William approved and the +town of Nijmegen explicitly expressed its assent. A new ditch was dug +on property of the church near the castle and the +harbour,\footnote{Nowadays, the exact location of the medieval +ditch---and of two Roman ones---can be seen in the pavement of +Kelfkensbos\protect\index{Kelfkensbos (Nijmegen)} square.} causing +the demolition of the presbytery. In compensation, the count and +citizens committed themselves to giving the parish priest another +suitable space close enough to the new church that was about to be +built. A letter about these transactions, with the seals of count +Otto and the town of Nijmegen, is kept at St.\ Apostles' +church.\footnote{The original letter is lost. A 15th century +transcription of it is kept at the Historisches Archiv der +Stadt K\"{o}ln (HAStK).} +\pend + +\pstart +// One additional line to show synchronization. // +\pend +\endnumbering +\end{Rightside} +\Pages +\end{pages} + +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\printindex +\end{document} +%%%%%%%%%%%%%%%%%% + +%</djd17nov> +% \end{macrocode} +% +% \medskip +% \hrule +% +% \subsection{Example poetry on parallel facing pages} \label{example:djdpoems} +% +% This example, illustrated in Figures~\ref{djdp1-out} to~\ref{djdp4-out}, +% was originally provided in November 2004 by +% Dirk-Jan Dekker\index{Dekker, Dirk-Jan} for an earlier version of \Ledpar. +% I have updated it, and also extended it to show the difference between +% the \cs{stanza} command and the \verb?astanza? environment. \cs{stanza} +% is used for the first pair of pages and \verb?astanza? for the second +% pair. Note the +% definition of \cs{endstanzaextra} to give a short line after each stanza. +% +% \medskip +% \hrule +% \medskip +% +% \begin{macrocode} +%<*djdpoems> +%%% djdpoems.tex example parallel verses on facing pages +\documentclass{article} +\usepackage{ledmac,ledpar} +\addtolength{\textheight}{-15\baselineskip} + +\maxchunks{24} % default value = 10 +\setstanzaindents{6,0,1,0,1} + +\newcommand{\longdash}{---------} + +\footparagraph{A} % for left pages +\footparagraph{B} % for right pages +\firstlinenum{1} +\linenumincrement{1} + +\let\oldBfootfmt\Bfootfmt +\renewcommand{\Bfootfmt}[3]{% + \let\printlines\printlinesR + \oldBfootfmt{#1}{#2}{#3}} + +\begin{document} + +\newcommand{\interstanza}{\pstart\centering\longdash\skipnumbering\pend} + +\begin{pages} +\begin{Leftside} +\def\endstanzaextra{\interstanza} +\beginnumbering + +\stanza +Arma gravi numero violentaque bella parabam & + edere, materi\={a} conveniente modis. & +Par erat inferior versus---risisse Cupido & + dicitur atque unum surripuisse pedem. \& + +\stanza +``Quis tibi, saeve puer, dedit hoc in carmina iuris? & + Pieridum vates, non tua turba \edtext{sumus}{\Afootnote{note lost}}. & +Quid si praeripiat flavae V\u{e}nus arma Minervae, & + ventilet accensas flava Minerva faces? \& + +\stanza +Quis probet in silvis Cererem regnare iugosis, & + lege pharetratae Virginis arva coli? & +Crinibus insignem quis \edtext{acuta}{\Afootnote{acut\={a} (abl.\ abs.)}} +cuspide Phoebum & + instruat, Aoniam Marte movente lyram? \& +\endnumbering +\end{Leftside} + +\begin{Rightside} +\def\endstanzaextra{\interstanza} +\beginnumbering +\firstlinenum{1} +\linenumincrement{1} +\setstanzaindents{6,0,1,0,1,0} + +\stanza +I was preparing to sing of weapons and violent wars, & +in heavy numbers, with the subject matter suited to the verse measure. & +The even lines were as long as the odd ones, but Cupid laughed, & +they said, and he stole away one foot.\footnote{I.e., the even lines, +which were hexameters (with six feet) became pentameters +(with five feet).} \& + +\stanza +``O cruel boy, who gave you the right over poetry? & +We poets belong to the Pierides,\footnote{Muses} we are not your folk. & +\edlabel{beginparadox}What if Venus should seize away the arms of +Minerva with the golden hair, & + if Minerva with the golden hair should fan alight the kindled torch +of love? \& + +\stanza +Who would approve of Ceres\footnote{Ceres was the Roman goddess of +the harvest.} reigning on the woodland ridges, & + and of land tilled under the law of the Maid with the +quiver\footnote{By `\textit{Virgo}' (`Virgin') Ovid means Diana, the +Roman goddess of the hunt.}? & +Who would provide Phoebus with his beautiful hair with a sharp-pointed +spear, & + while Mars stirs the \edtext{Aonian}{\Bfootnote{Mount Parnassus, +where the Muses live, is located in Aonia.}} +lyre?\edlabel{endparadox}\footnote{Lines +\xlineref{beginparadox}--\xlineref{endparadox} show some paradoxical +situations that would occur if the gods didn't stay with their own +business.} \& +\endnumbering +\end{Rightside} + +\Pages +\end{pages} + +\begin{pages} +\begin{Leftside} +\def\endstanzaextra{\interstanza} +\beginnumbering + +\begin{astanza} +Arma gravi numero violentaque bella parabam & + edere, materi\={a} conveniente modis. & +Par erat inferior versus---risisse Cupido & + dicitur atque unum surripuisse pedem. \& +\end{astanza} + +\begin{astanza} +``Quis tibi, saeve puer, dedit hoc in carmina iuris? & + Pieridum vates, non tua turba \edtext{sumus}{\Afootnote{note lost}}. & +Quid si praeripiat flavae V\u{e}nus arma Minervae, & + ventilet accensas flava Minerva faces? \& +\end{astanza} + +\begin{astanza} +Quis probet in silvis Cererem regnare iugosis, & + lege pharetratae Virginis arva coli? & +Crinibus insignem quis \edtext{acuta}{\Afootnote{acut\={a} (abl.\ abs.)}} +cuspide Phoebum & + instruat, Aoniam Marte movente lyram? \& +\end{astanza} + +\endnumbering +\end{Leftside} + +\begin{Rightside} +\def\endstanzaextra{\interstanza} +\beginnumbering +\firstlinenum{1} +\linenumincrement{1} +\setstanzaindents{6,0,1,0,1,0} + +\begin{astanza} +I was preparing to sing of weapons and violent wars, & +in heavy numbers, with the subject matter suited to the verse measure. & +The even lines were as long as the odd ones, but Cupid laughed, & +they said, and he stole away one foot.\footnote{I.e., the even lines, +which were hexameters (with six feet) became pentameters +(with five feet).} \& +\end{astanza} + +\begin{astanza} +``O cruel boy, who gave you the right over poetry? & +We poets belong to the Pierides,\footnote{Muses} we are not your folk. & +\edlabel{beginparadox}What if Venus should seize away the arms of +Minerva with the golden hair, & + if Minerva with the golden hair should fan alight the kindled torch +of love? \& +\end{astanza} + +\begin{astanza} +Who would approve of Ceres\footnote{Ceres was the Roman goddess of the +harvest.} reigning on the woodland ridges, & + and of land tilled under the law of the Maid with the +quiver\footnote{By `\textit{Virgo}' (`Virgin') Ovid means Diana, +the Roman goddess of the hunt.}? & +Who would provide Phoebus with his beautiful hair with a sharp-pointed +spear, & + while Mars stirs the \edtext{Aonian}{\Bfootnote{Mount Parnassus, where +the Muses live, is located in Aonia.}} +lyre?\edlabel{endparadox}\footnote{Lines +\xlineref{beginparadox}--\xlineref{endparadox} show some paradoxical +situations that would occur if the gods didn't stay with their +own business.} \& +\end{astanza} + +\endnumbering +\end{Rightside} + +\Pages +\end{pages} + +\end{document} + +%</djdpoems> +% \end{macrocode} +% +% \medskip +% \hrule +% +% \clearpage +% +% \bibliographystyle{alpha} +% \begin{thebibliography}{WWW99} +% +% \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[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]{LEDMAC} +% Peter Wilson. +% \newblock \emph{\Lpack{ledmac} A presumptuous attempt to port +% \Lpack{EDMAC},\Lpack{TABMAC} and \Lpack{EDSTANZA} to +% LaTeX}. +% \newblock December 2004. +% \newblock (Available from CTAN in +% \texttt{macros/latex/contrib/ledmac}) +% +% \end{thebibliography} +% +% \Finale +% +% \PrintIndex +% \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 \~} +%% diff --git a/Master/texmf-dist/source/latex/ledmac/ledpar.ins b/Master/texmf-dist/source/latex/ledmac/ledpar.ins new file mode 100644 index 00000000000..0efe2279fda --- /dev/null +++ b/Master/texmf-dist/source/latex/ledmac/ledpar.ins @@ -0,0 +1,82 @@ +%% ledpar.ins +%% Author: Peter Wilson (Herries Press) herries dot press at earthlink dot net +%% Copyright 2004, 2005 Peter R. Wilson +%% +%% 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 "author-maintained". +%% +%% This work consists of the files listed in the README file. +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this work when run through +%% LaTeX. +%% +%% +%% --------------- start of docstrip commands ------------------ +%% +\def\batchfile{ledpar.ins} +\input docstrip.tex +\preamble + + Author: Peter Wilson (Herries Press) herries dot press at earthlink dot net + Copyright 2004, 2005 Peter R. Wilson + + 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 "author-maintained". + + This work consists of the files listed in the README file. + +\endpreamble + +\keepsilent + +%%% \Msg{*** Generating the driver file ***} +%%% \generateFile{ledpar.drv}{t}{\from{ledpar.dtx}{driver}} + +\Msg{*** Generating the LaTeX2e package files ***} + +\generateFile{ledpar.sty}{t}{\from{ledpar.dtx}{code}} + +\Msg{*** Generating the LaTeX2e example files ***} + +\generateFile{villon.tex}{t}{\from{ledpar.dtx}{villon}} +\generateFile{djd17nov.tex}{t}{\from{ledpar.dtx}{djd17nov}} +\generateFile{djdpoems.tex}{t}{\from{ledpar.dtx}{djdpoems}} + + +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* file(s) into a directory searched by LaTeX. See the FAQ on} +\Msg{* CTAN at /help/uk-tex-faq for more on this.} +\Msg{*} +\Msg{* \space\space ledpar.sty} +\Msg{*} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.dtx' through LaTeX.} +\Msg{* For an index, process any name.idx file by:} +\Msg{* \space\space\space\space makeindex -s gind.ist name} +\Msg{* For a list of changes, process any name.glo file by:} +\Msg{* \space\space\space\space makeindex -s gglo.ist -o name.gls name.glo} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} + +\endinput |