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/ledpar.dtx | |
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/ledpar.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/ledmac/ledpar.dtx | 5163 |
1 files changed, 5163 insertions, 0 deletions
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 \~} +%% |