texlive[58721] Master/texmf-dist: ekdosis (4apr21)

commits+preining at tug.org commits+preining at tug.org
Sun Apr 4 03:53:22 CEST 2021


Revision: 58721
          http://tug.org/svn/texlive?view=revision&revision=58721
Author:   preining
Date:     2021-04-04 03:53:22 +0200 (Sun, 04 Apr 2021)
Log Message:
-----------
ekdosis (4apr21)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/lualatex/ekdosis/README.md
    trunk/Master/texmf-dist/doc/lualatex/ekdosis/ekdosis.el
    trunk/Master/texmf-dist/doc/lualatex/ekdosis/ekdosis.pdf
    trunk/Master/texmf-dist/doc/lualatex/ekdosis/samples/Caesar_BG-6-13-1.pdf
    trunk/Master/texmf-dist/source/lualatex/ekdosis/Makefile
    trunk/Master/texmf-dist/source/lualatex/ekdosis/ekdosis.dtx
    trunk/Master/texmf-dist/source/lualatex/ekdosis/ekdosis.ins
    trunk/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.lua
    trunk/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.sty

Modified: trunk/Master/texmf-dist/doc/lualatex/ekdosis/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/lualatex/ekdosis/README.md	2021-04-04 01:52:15 UTC (rev 58720)
+++ trunk/Master/texmf-dist/doc/lualatex/ekdosis/README.md	2021-04-04 01:53:22 UTC (rev 58721)
@@ -23,7 +23,7 @@
 =====================
 ekdosis – Typesetting TEI xml-Compliant Critical Editions
 
-Copyright ⓒ 2020 Robert Alessi
+Copyright ⓒ 2020--2021 Robert Alessi
 
 Please send error reports and suggestions for improvements to Robert
 Alessi:

Modified: trunk/Master/texmf-dist/doc/lualatex/ekdosis/ekdosis.el
===================================================================
--- trunk/Master/texmf-dist/doc/lualatex/ekdosis/ekdosis.el	2021-04-04 01:52:15 UTC (rev 58720)
+++ trunk/Master/texmf-dist/doc/lualatex/ekdosis/ekdosis.el	2021-04-04 01:53:22 UTC (rev 58721)
@@ -2,7 +2,7 @@
 ;; This file is part of the `ekdosis' package
 
 ;; ekdosis -- TEI xml compliant critical editions
-;; Copyright (C) 2020  Robert Alessi
+;; Copyright (C) 2020--2021  Robert Alessi
 
 ;; Please send error reports and suggestions for improvements to Robert
 ;; Alessi <alessi at robertalessi.net>

Modified: trunk/Master/texmf-dist/doc/lualatex/ekdosis/ekdosis.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/lualatex/ekdosis/samples/Caesar_BG-6-13-1.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/lualatex/ekdosis/Makefile
===================================================================
--- trunk/Master/texmf-dist/source/lualatex/ekdosis/Makefile	2021-04-04 01:52:15 UTC (rev 58720)
+++ trunk/Master/texmf-dist/source/lualatex/ekdosis/Makefile	2021-04-04 01:53:22 UTC (rev 58721)
@@ -11,6 +11,10 @@
 exts := md html ins dtx el
 findopts := $(foreach ext,$(exts),-or -iname "*.$(ext)")
 
+define do_documentation
+	$(CMP) --shell-escape --recorder --interaction=nonstopmode $(NAME).dtx >/dev/null
+endef
+
 all:	sty $(NAME).pdf
 
 testsamples:
@@ -23,24 +27,26 @@
 
 $(NAME).pdf: testsamples $(NAME).dtx
 	@ echo "Making the sample files first..."
-	$(MAKE) --directory=$(SAMPLES)
-	@ echo "Building the documentation of $(NAME)..."
-	$(CMP) --shell-escape --recorder --interaction=batchmode $(NAME).dtx >/dev/null
-	biber $(NAME) >/dev/null
-	$(CMP) --shell-escape --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
-	$(CMP) --shell-escape --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
-	$(CMP) --shell-escape --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
-	$(CMP) --shell-escape --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
-	if [ -f $(NAME).glo ]; then makeindex -q -s gglo.ist -o $(NAME).gls $(NAME).glo; fi
-	if [ -f $(NAME).idx ]; then makeindex -q -s gind.ist -o $(NAME).ind $(NAME).idx; fi
-	$(CMP) --shell-escape --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
-	$(CMP) --shell-escape --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
-	$(CMP) --shell-escape --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
+	@ $(MAKE) --directory=$(SAMPLES) >/dev/null
+	@ echo "Done making samples"
+	@ echo "Building the documentation of $(NAME) with $(CMP). Please be patient..."
+	@ $(do_documentation)
+	@ echo "Now calling biber"
+	@ biber $(NAME) >/dev/null
+	@ echo "Returning to $(CMP)..."
+	@ for run in {1..4}; do $(do_documentation); done
+	@ echo "Building indexes..."
+	@ if [ -f $(NAME).glo ]; then makeindex -q -s gglo.ist -o $(NAME).gls $(NAME).glo; fi
+	@ if [ -f $(NAME).idx ]; then makeindex -q -s gind.ist -o $(NAME).ind $(NAME).idx; fi
+	@ echo "Final runs of $(CMP)..."
+	@ for run in {1..7}; do $(do_documentation); done
+	@ echo "Done"
 
 samples: clean sty
 	$(MAKE) --directory=$(SAMPLES)
 
 clean: testsamples
+	@ echo "Cleaning $(NAME) directory"
 	rm -rf auto
 	rm -f $(NAME).bib $(PWD)/TMP/*.bib
 	rm -rf .backup
@@ -66,6 +72,7 @@
 	rm -rf $(HOMEDIR)/.emacs.d/auctex/auto/$(NAME).{el,elc}
 
 inst: uninst auctex all
+	@ echo "Installing $(NAME) locally"
 	mkdir -p $(UTREE)/{tex,source,doc}/lualatex/$(NAME)
 	cp $(NAME).dtx $(UTREE)/source/lualatex/$(NAME)
 	cp $(NAME).sty $(UTREE)/tex/lualatex/$(NAME)
@@ -72,6 +79,7 @@
 	cp $(NAME).lua $(UTREE)/tex/lualatex/$(NAME)
 	cp $(NAME).pdf $(UTREE)/doc/lualatex/$(NAME)
 	cp -r samples/ $(UTREE)/doc/lualatex/$(NAME)
+	@ echo "Installation complete. Happy TeXing!"
 
 local: uninst auctex
 	$(CMP) $(NAME).ins

Modified: trunk/Master/texmf-dist/source/lualatex/ekdosis/ekdosis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/lualatex/ekdosis/ekdosis.dtx	2021-04-04 01:52:15 UTC (rev 58720)
+++ trunk/Master/texmf-dist/source/lualatex/ekdosis/ekdosis.dtx	2021-04-04 01:53:22 UTC (rev 58721)
@@ -1,7 +1,7 @@
 % \iffalse meta-comment
 % 
 % ekdosis -- Typesetting TEI xml-compliant critical editions
-% Copyright (C) 2020  Robert Alessi
+% Copyright (C) 2020--2021  Robert Alessi
 % 
 % Please send error reports and suggestions for improvements to Robert
 % Alessi <alessi at robertalessi.net>
@@ -28,7 +28,7 @@
 This file is part of the `ekdosis' package
 
 ekdosis -- Typesetting TEI xml-compliant critical editions
-Copyright (C) 2020  Robert Alessi
+Copyright (C) 2020--2021  Robert Alessi
 
 Please send error reports and suggestions for improvements to Robert
 Alessi <alessi at robertalessi.net>
@@ -61,7 +61,7 @@
 %<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
 %<package>\ProvidesPackage{ekdosis}
 %<*package>
-    [2020/11/04 v1.1 Typesetting TEI xml-compliant critical editions]
+    [2021/04/02 v1.2 Typesetting TEI xml-compliant critical editions]
 %</package>
 %<*driver>
 \begin{filecontents}[noheader,overwrite]{bibdata.xml}
@@ -104,6 +104,103 @@
       </imprint>
     </monogr>
   </biblStruct>
+  <biblStruct type="book" xml:id="shGildon1710">
+    <monogr>
+      <title level="m">Works of Mr. William Shakespeare</title>
+      <editor>
+        <forename>Charles</forename>
+        <surname>Gildon</surname>
+      </editor>
+      <imprint>
+        <biblScope unit="volume">17</biblScope>
+        <publisher>E. Curl and E. Sanders</publisher>
+        <date>1710</date>
+      </imprint>
+    </monogr>
+  </biblStruct>
+  <biblStruct type="book" xml:id="shGildon1714">
+    <monogr>
+      <title level="m">Works of Mr. William Shakespeare</title>
+      <editor>
+        <forename>Charles</forename>
+        <surname>Gildon</surname>
+      </editor>
+      <edition>2</edition>
+      <imprint>
+        <biblScope unit="volume">17</biblScope>
+        <publisher>E. Curl and E. Sanders</publisher>
+        <date>1714</date>
+      </imprint>
+    </monogr>
+  </biblStruct>
+  <biblStruct type="book" xml:id="shSewell1725">
+    <monogr>
+      <title level="m">Venus and Adonis, Tarquin and Lucrece, and Mr. Shakespeare's Miscellany Poems</title>
+      <editor>
+        <name>Sewell</name>
+      </editor>
+      <imprint>
+        <publisher>A. Bettesworth</publisher>
+        <date>1725</date>
+      </imprint>
+    </monogr>
+  </biblStruct>
+  <biblStruct type="book" xml:id="shEwing1771">
+    <monogr>
+      <title level="m">Poems, containing I. Venus and Adonis... IV. Sonnets</title>
+      <author>
+        <forename>William</forename>
+        <surname>Shakespeare</surname>
+      </author>
+      <editor>
+        <forename>T.</forename>
+        <surname>Ewing</surname>
+      </editor>
+      <imprint>
+        <pubPlace>Dublin</pubPlace>
+        <date>1771</date>
+      </imprint>
+    </monogr>
+  </biblStruct>
+  <biblStruct type="book" xml:id="shHudson1856">
+    <monogr>
+      <title level="m">Works of W. Shakespeare</title>
+      <editor>
+        <forename>H.N.</forename>
+        <surname>Hudson</surname>
+      </editor>
+      <imprint>
+        <pubPlace>Boston</pubPlace>
+        <publisher>Munroe</publisher>
+        <date>1856</date>
+      </imprint>
+    </monogr>
+  </biblStruct>
+  <biblStruct type="book" xml:id="shWalsh1908">
+    <monogr>
+      <title level="m">Shakespeare's Complete Sonnets</title>
+      <editor>
+        <forename>C.M.</forename>
+        <surname>Walsh</surname>
+      </editor>
+      <imprint>
+        <date>1908</date>
+      </imprint>
+    </monogr>
+  </biblStruct>
+  <biblStruct type="book" xml:id="shButler1899">
+    <monogr>
+      <title level="m">Shakespeare's Sonnets</title>
+      <editor>
+        <forename>Samuel</forename>
+        <surname>Butler</surname>
+      </editor>
+      <imprint>
+        <publisher>Fifield</publisher>
+        <date>1899</date>
+      </imprint>
+    </monogr>
+  </biblStruct>
 </listBibl>
 \end{filecontents}
 \begin{filecontents}[overwrite]{\jobname.bib}
@@ -113,13 +210,12 @@
                   xml}-Compliant Critical Editions and Highlighting
                   Parallel Writings},
   journaltitle = {Journal of Data Mining and Digital Humanities},
-  date =	 2020,
-  pubstate =	 {submitted},
+  date =	 {2020-11},
   issuetitle =   {Collecting, Preserving, and Disseminating Endangered
                   Cultural Heritage for New Understandings through
                   Multilingual Approaches},
-  eprinttype =	 {hal},
-  eprint =	 {hal-02779803}
+  eprinttype =	 {jdmdh},
+  eprint =	 {6536}
 }
 
 @Book{Caesar-BG-v2,
@@ -146,6 +242,29 @@
   publisher =	 {Harper \& Brothers},
   location =	 {New York}}
 
+ at MVBook{HomerMurray,
+  author =	 {{Homer}},
+  title =	 {The Odyssey},
+  date =	 1919,
+  editor =	 {Murray, A.T\adddot},
+  volumes =	 2,
+  publisher =	 {Harvard University Press -- William Heinemann},
+  location =	 {Cambridge, MA. -- London}
+}
+
+ at Book{McDonald1916,
+  editor =	 {MacDonald Alden, Raymond},
+  shorteditor =	 {MacDonald},
+  title =	 {The Sonnets of Shakespeare},
+  date =	 1916,
+  titleaddon =	 {From the Quarto of 1609 with Variorum Readings and
+                  Commentary},
+  organization = {Houghton Mifflin Co.},
+  publisher =	 {The Riverside Press Cambridge},
+  options =	 {useauthor=false, useeditor=true},
+  location =	 {Boston \& New York}
+}
+
 @Book{ReynoldsWilson1991,
   author =	 {Reynolds, L. D. and Wilson, N. G},
   title =	 {Scribes and Scholars},
@@ -192,6 +311,15 @@
   url =		 {http://www.teibyexample.org}
 }
 
+ at Software{extdash,
+  title =	 {The Extdash package},
+  titleaddon =	 {A range of dash commands for compound words},
+  author =	 {Rozhenko, Alexander I.},
+  url =		 {http://www.ctan.org/pkg/extdash},
+  date =	 {2018-06-24},
+  version =	 {1.3}
+}
+
 @Software{fnpos,
   title =	 {The Fnpos package},
   titleaddon =	 {Control the position of footnotes on the page},
@@ -210,6 +338,15 @@
   version =	 {4.41}
 }
 
+ at Software{memoir,
+  title =	 {The Memoir package},
+  titleaddon =	 {Typeset fiction, non-fiction and mathematical books},
+  author =	 {Madsen, Lars and Wilson, Peter R.},
+  url =		 {http://www.ctan.org/pkg/memoir},
+  date =	 {2021-03-23},
+  version =	 {3.7o}
+}
+
 @Software{paracol,
   title =	 {The Paracol package},
   titleaddon =	 {Multiple columns with texts “in parallel”},
@@ -237,6 +374,15 @@
   version =	 {3.47}
 }
 
+ at Software{verse,
+  title =	 {The Verse package},
+  titleaddon =	 {Aids for typesetting simple verse},
+  author =	 {Wilson, Peter R. and Robertson, Will},
+  url =		 {http://www.ctan.org/pkg/verse},
+  date =	 {2014-05-10},
+  version =	 {2.4b}
+}
+
 @Software{arabluatex,
   title =	 {The Arabluatex package},
   titleaddon =	 {ArabTeX for LuaLaTeX},
@@ -248,7 +394,7 @@
 
 @Software{icite,
   title =	 {The Icite package},
-  subtitle =	 {Indices locorum citatorum},
+  titleaddon =	 {Indices locorum citatorum},
   author =	 {Alessi, Robert},
   url =		 {http://ctan.org/pkg/icite},
   date =	 {2020-03-05},
@@ -265,7 +411,7 @@
   version =	 {4.00}
 }
 \end{filecontents}
-\begin{filecontents}[overwrite]{\jobname-cfg.tex}
+\begin{filecontents}[overwrite]{\jobname-ekd.cfg}
 \footnotelayout{m}
 \EnvtoTEI{ancientgreek}{p}[xml:lang="grc"]
 \DeclareApparatus{fontium}[
@@ -350,6 +496,23 @@
 \DeclareWitness{sV}{V}{Vaticanus lat. 1652}[
                       origDate=s. XV]
 \DeclareSource{sDrak}{\emph{Drakenborch}}
+% Homer, Odyssey
+\DeclareScholar{hZen}{Zen.}[rawname=Zenodotus]
+% Shakespeare's Sonnets:
+\NewDocumentEnvironment{ekdcenter}{}{\par\centering}{\nobreak\par}
+\NewDocumentCommand{\ekdlettrine}{mm}{%
+  \adjustbox{valign=t,raise=-0.75ex}{\Huge #1}\textsc{#2}%
+}
+\TeXtoTEIPat{\ekdlettrine {#1}{#2}}{<hi rend="smallcaps">#1#2</hi>}
+\DeclareSource{shGildon1710}{G}
+\DeclareSource{shGildon1714}{G\textsuperscript{2}}
+\DeclareSource{shSewell1725}{S}
+\DeclareSource{shEwing1771}{E}
+\DeclareSource{shHudson1856}{Hu\textsuperscript{2}}
+\DeclareSource{shButler1899}{But}
+\DeclareSource{shWalsh1908}{Wa}
+\DeclareScholar{shGod}{Godwin}[rawname=Godwin]
+\DeclareScholar{shStee}{Stee}[rawname=Steevens, note=Notes in Malone]
 \end{filecontents}
 \documentclass{ltxdoc}
  %\usepackage[letterpaper,margin=25mm,left=50mm,nohead]{geometry}
@@ -358,28 +521,27 @@
 \doxitem{Option}{option}{options}
 \usepackage{microtype}
 \usepackage[no-math]{fontspec}
+\defaultfontfeatures{Renderer=Harfbuzz}
 \usepackage[latin.classic,greek.ancient,american]{babel}
-\babelfont{rm}[
-   SlantedFont={Old Standard},
-   SlantedFeatures={FakeSlant=0.25},
-   BoldSlantedFont={Old Standard},
-   BoldSlantedFeatures={FakeBold=1.5,FakeSlant=0.25}]{Old Standard}
+\babelfont{rm}{Old Standard}
 \babelfont{sf}{NewComputerModern Sans}
 \babelfont{tt}{NewComputerModern Mono}
 \babelfont[greek]{rm}[
-   Script=Greek, RawFeature={+ss05;+ss06},
-   SlantedFont={Old Standard},
-   SlantedFeatures={FakeSlant=0.25},
-   BoldSlantedFont={Old Standard},
-   BoldSlantedFeatures={FakeBold=1.5,FakeSlant=0.25}]{Old Standard}
+      Script=Greek,
+      RawFeature={+ss05;+ss06}
+      ]{Old Standard}
 \babelfont[greek]{sf}[Script=Greek]{NewComputerModern Sans}
 \babelfont[greek]{tt}[Script=Greek]{NewComputerModern Mono}
+\newfontfamily{\junicode}{Junicode}[
+                Ligatures=TeX,
+                RawFeature={+hist}]
 \babeltags{ancientgreek = greek}
 \def\sg#1{\textancientgreek{#1}}
 \usepackage[Old Standard]{mathfont}
+\usepackage[biblatex=true]{embrac}
+\usepackage{chifoot}
 \usepackage{arabluatex}
-\usepackage[parnotes=roman,teiexport=tidy,verse]{ekdosis}
-\input{ekdosis-cfg}
+\usepackage[parnotes=roman, teiexport=tidy, poetry=verse]{ekdosis}
 \AddxmlBibResource{bibdata.xml}
 \usepackage{booktabs}
 \usepackage{xltabular}
@@ -430,6 +592,7 @@
 \usepackage[defaultindex=none,citecmd=autocite]{icite}
 \bibinput{ekdosis}
 \usepackage[nospace,american]{varioref}
+\newcommand\phts{\phantomsection}
 \usepackage[style=oxnotes-inote,dashed]{biblatex}
 \DeclareSourcemap{
     \maps[datatype=bibtex]{
@@ -458,6 +621,15 @@
 \DeclareOpenAccessEprintUrl[always]{hal}{%
   http://hal.archives-ouvertes.fr/\thefield{eprint}}
 \DeclareOpenAccessEprintAlias{HAL}{hal}
+\newcommand*{\jdmdhurl}[1]{https://jdmdh.episciences.org/#1}
+\DeclareFieldFormat{eprint:jdmdh}{%
+  \ifhyperref
+    {\href{\jdmdhurl{#1}}{jdmdh:~\nolinkurl{#1}}}
+    {jdmdh:~\nolinkurl{#1}}}
+\DeclareFieldAlias{eprint:JDMDH}{eprint:jdmdh}
+\DeclareOpenAccessEprintUrl[always]{jdmdh}{%
+  https://jdmdh.episciences.org/\thefield{eprint}}
+\DeclareOpenAccessEprintAlias{JDMDH}{jdmdh}
 \addbibresource{ekdosis.bib}
 \metaset{titletext}{%
   \metapick[#1]{title}%
@@ -491,7 +663,7 @@
 \metaset{partof}{The ekdosis Package}
 \metaset[print]{partof}{The \textsf{ekdosis} Package}
 \metaset{copyrightowner}{\metapick[#1]{author}}
-\metaset{copyrightdate}{2020}
+\metaset{copyrightdate}{2020--2021}
 \metaset{licensemessage}{Permission is granted to copy, distribute
   and/or modify this document under the terms of the GNU Free
   Documentation License, Version 1.3 or any later version published by
@@ -555,6 +727,7 @@
   xleftmargin=12pt, breaklines, numberblanklines=false, numbersep=3pt}
 \renewcommand{\theFancyVerbLine}{\normalfont\smaller\arabic{FancyVerbLine}}
 \usepackage[contents]{colordoc}
+\newcommand{\cls}[1]{\textsf{#1}\index{#1=#1 (class)}}
 \newcommand{\pkg}[1]{\textsf{#1}\index{#1=#1 (package)}}
 \newcommand{\env}[1]{\texttt{#1}\index{#1=#1 (environment)}}
 \backgroundcolor{c}{ekdcolor}
@@ -607,7 +780,7 @@
 %</driver>
 % \fi
 %
-% \CheckSum{1893}
+% \CheckSum{2188}
 %
 % \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
@@ -688,7 +861,7 @@
 % \item website: \url{http://www.robertalessi.net/ekdosis}
 % \item development: \url{http://git.robertalessi.net/ekdosis}
 % \item comments, feature requests, bug reports:
-% \url{https://gitlab.com/ralessi/eksodis/issues}
+% \url{https://gitlab.com/ralessi/ekdosis/issues}
 % \end{itemize}
 %
 % \leavevmode\marginpar{\hfill\texttt{gpl3+}}
@@ -743,8 +916,7 @@
 % \end{comment}
 % 
 % The reader will find here, by way of introduction, a summarized
-% version of the first part of an article that the author submitted
-% some weeks ago to the
+% version of the first part of an article published in the
 % \mkbibemph{\citefield{Alessi2020}{journaltitle}} as a contribution
 % to a Digital Humanities workshop held at Stanford University
 % (\printdate{2019-04-15}).\footcite{Alessi2020}
@@ -820,7 +992,7 @@
 % \label{sec:features}
 % A list of the main features of \pkg{ekdosis} follows:---
 % \begin{enumerate}
-% \item \label{it:multicol-feature}\emph{Multilingual critical
+% \item \phts\label{it:multicol-feature}\emph{Multilingual critical
 %   editions\/}: \pkg{ekdosis} can be used to typeset any number of
 %   texts in any direction accepted by \hologo{LuaTeX}. Running
 %   paragraphs of text can be arranged in any number of columns,
@@ -828,7 +1000,7 @@
 %   synchronized or not. \pkg{ekdosis} is also suitable for complex
 %   layouts as in the case of Arabic poetry or images where three-way
 %   alignment is required, or diagrams, \emph{\&c}.
-% \item \label{it:multilayer-feature}\emph{Apparatus criticus\/}:
+% \item \phts\label{it:multilayer-feature}\emph{Apparatus criticus\/}:
 %   Edited texts can receive multiple layers of apparatus, e.g.\
 %   apparatus criticus (to record variant readings), apparatus fontium
 %   (to collect references to texts quoted or cited in the edited
@@ -931,8 +1103,8 @@
 % \section{The Basics of \pkg{ekdosis}}
 % \label{sec:ekdosis-basics}
 %
-%\subsection{Loading the Package\---General Options}
-%\label{sec:load-general-options}
+% \subsection{Loading the Package\---General Options}
+% \label{sec:load-general-options}
 %
 % \pkg{ekdosis} is loaded in the preamble like so:---
 % \iffalse
@@ -945,7 +1117,7 @@
 %</example>
 % \fi
 % 
-% \pkg{ekdosis} may be loaded with four optional \enquote*{named
+% \pkg{ekdosis} may be loaded with five optional \enquote*{named
 % arguments} either of which is set using the syntax
 % \meta{key}$=$\meta{value}. The description of the optional arguments
 % follows.
@@ -953,7 +1125,7 @@
 % \danger The reader is invited to refer to the relevant sections of
 % this documentation for more information on how to use them.
 % 
-% \DescribeOption{layout}\label{ref:layout-opt}
+% \DescribeOption{layout}\phts\label{ref:layout-opt}
 % |layout|$=$\verb+float|footins+\hfill\tcboxverb{Default: float}\\
 % By default, layers of critical notes are inserted as a floating
 % environment to be printed at the bottom of pages. |layout=footins|
@@ -963,7 +1135,7 @@
 % will be inserted between regular numbered footnotes, but will carry
 % no footnote mark of its own.
 %
-% \DescribeOption{divs}\label{ref:divs-opt}
+% \DescribeOption{divs}\phts\label{ref:divs-opt}
 % |divs|$=$\verb+ekdosis|latex+\hfill\tcboxverb{Default: ekdosis}\\
 % In many occasions, \LaTeX{} standard textual divisions do not meet
 % the specific requirements of classical and literary texts, the
@@ -978,22 +1150,33 @@
 %
 % \danger It must be noted that the two styles are mutually exclusive.
 % \vskip\baselineskip
-% 
-% \DescribeOption{parnotes}\label{ref:parnotes-opt}
+%
+% \DescribeOption{poetry}\phts\label{ref:poetry-opt}
+% \newfeature[v1.2] |poetry|$=$\verb+verse+
+% \hfill\tcboxverb{Default: not set}\\
+% |poetry=verse| instructs \pkg{ekdosis} to load and use the facilites
+% supplied by the \pkg{verse} package for the typesetting of lines of
+% poetry.\footnote{\texttt{verse} does not need to be set if the
+% \cls{memoir} class be used. See \vref{sec:verse-package} for more
+% detail.} The \env{ekdverse} environment must then be used instead of
+% the \env{verse} environment that is provided by the \pkg{verse}
+% package as described below in \vref{sec:verse-package}.
+%
+% \DescribeOption{parnotes}\phts\label{ref:parnotes-opt}
 % |parnotes|$=$\verb+true|false|roman+%
 % \hfill\tcboxverb{Default: not set}\\
 % This named argument does not need a value as it defaults to |true|
-% if it is used. Apparatus criticus typeset by \pkg{ekdosis} may
-% contain notes and footnotes. The latter can be laid out as
-% paragraphed notes below the block of critical notes by means of the
-% \pkg{parnotes} package. Additionally, |parnotes=roman| prints these
-% footnotes numbered with Roman numerals.
+% if used. Apparatus criticus typeset by \pkg{ekdosis} may contain
+% notes and footnotes. The latter can be laid out as paragraphed notes
+% below the block of critical notes by means of the \pkg{parnotes}
+% package. Additionally, |parnotes=roman| prints these footnotes
+% numbered with Roman numerals.
 %
-% \DescribeOption{teiexport}\label{ref:teiexport-option}
+% \DescribeOption{teiexport}\phts\label{ref:teiexport-option}
 % |teiexport|$=$\verb+true|false|tidy+%
 % \hfill\tcboxverb{Default: not set}\\
 % This named argument does not need a value as it defaults to |true|
-% if it is used. If |teiexport| be set to |true|, \pkg{ekdosis} is
+% if used. If |teiexport| be set to |true|, \pkg{ekdosis} is
 % instructed to output both PDF and \texttt{TEI xml} files at the same
 % time. By default, the \texttt{TEI} file will receive the same
 % basename as the |.tex| source file, suffixed with |-tei.xml|. The
@@ -1020,6 +1203,18 @@
 %</example>
 % \fi
 %
+% \subsection{Using a Configuration File}
+% \label{sec:using-conf-file}
+% Complex editions may use a large number of witnesses, sources and
+% scholars. It may also be required to define a multiple-layer
+% apparatus criticus, several text environments to be aligned and
+% quite a number of new commands. \pkg{ekdosis} provides a convenient
+% way to avoid overloading the document preamble: all the settings
+% related to the critical edition can be gathered in a separate
+% configuration file named |\jobname-ekd.cfg|. If such a file can be
+% found, its contents is automatically read and used by
+% \pkg{ekdosis}.
+%
 % \subsection{Witnesses, Hands, Sources, Scholars \& Shorthands}
 % \label{sec:declarations}
 % \paragraph{Terminology}
@@ -1046,7 +1241,7 @@
 % \paragraph{Witnesses}
 % \DescribeMacro{\DeclareWitness} \cs{DeclareWitness}\marg{unique
 % id}\marg{rendition}\marg{description}\oarg{options}
-% \label{ref:declarewitness}\\
+% \phts\label{ref:declarewitness}\\
 % This command requires three mandatory arguments enclosed between
 % curly braces used to specify consecutively:
 % \begin{enumerate}
@@ -1065,9 +1260,9 @@
 % comma-separated list of the following \enquote{name=value} arguments
 % that are used to collect items of information to be found within
 % the |<msIdentifer>| element in the \texttt{TEI}
-% header:---\footnote{See
+% header:\footnote{See
 % \url{https://tei-c.org/release/doc/tei-p5-doc/en/html/MS.html\#msid}
-% for detailed information on these elements.}\\
+% for detailed information on these elements.}---\\
 % \DescribeOption{settlement} |settlement|$=$\meta{name}: The name of
 % a city or administrative unit.\\
 % \DescribeOption{institution} |institution|$=$\meta{name}: The name
@@ -1083,7 +1278,7 @@
 % \DescribeOption{origDate} |origDate|$=$\meta{date}: Any form of date
 % used to identify the date of origin for the witness.
 %
-% \label{ref:marcianus-b}
+% \phts\label{ref:marcianus-b}
 % To take here one example, a witness such as the \emph{Marcianus
 % Graecus}~269, referred to as manuscript \enquote*{M} in the
 % editions, which contains sixty treatises transmitted under the name
@@ -1190,10 +1385,10 @@
 % \iffalse
 %</example>
 % \fi
-% \label{ref:marcianus-e}
+% \phts\label{ref:marcianus-e}
 %
 % \paragraph{Sources}
-% \label{ref:declare-source}
+% \phts\label{ref:declare-source}
 % \DescribeMacro{\DeclareSource} \cs{DeclareSource}\marg{unique
 % label}\marg{rendition}\newfeature[v1.1]\\
 % The \emph{Conspectus Siglorum} that is placed ahead of the edition
@@ -1230,10 +1425,10 @@
 % \iffalse
 %</example>
 % \fi
-% \label{sec:declarations-end}
+% \phts\label{sec:declarations-end}
 %
 % \paragraph{Scholars}
-% \label{ref:declare-scholar}
+% \phts\label{ref:declare-scholar}
 % \DescribeMacro{\DeclareScholar}\cs{DeclareScholar}\marg{unique
 % id}\marg{rendition}\oarg{options}\newfeature[v1.1]\\
 % Occasionally, it is necessary to refer to a scholar as a person. For
@@ -1292,9 +1487,9 @@
 % and N, and β, which includes mss.\ T, f, U and l. Therefore,
 % provided that all these witnesses have been already declared, here
 % is how the two families α  and β could be
-% declared:---\footnote{These witnesses are used in the example
-% provided below in \vref{lst:caesar-bg}.}
-% \label{ref:caesar-bg-sigla}
+% declared:\footnote{These witnesses are used in the example
+% provided below in \vref{lst:caesar-bg}.}---
+% \phts\label{ref:caesar-bg-sigla}
 % \iffalse
 %<*example>
 % \fi
@@ -1425,7 +1620,7 @@
 % 
 % \paragraph{Apparatus Entries}
 % \DescribeMacro{\app} \cs{app}|[type=|\meta{type}|]|\marg{apparatus
-% entries}\label{ref:app-cmd}\\
+% entries}\phts\label{ref:app-cmd}\\
 % This command takes one mandatory argument and accepts one optional
 % argument.  Once references to be used as witnesses in the apparatus
 % criticus have been declared in the preamble as described in
@@ -1450,7 +1645,7 @@
 %</example>
 % \fi
 % \cs{app} accepts one further optional argument:---\\
-% \DescribeOption{type} |type|$=$\meta{type}\label{ref:app-type}
+% \DescribeOption{type} |type|$=$\meta{type}\phts\label{ref:app-type}
 % \hfill\tcboxverb{Default: default}\\
 % As will be described below in \vref{sec:multilayer-apparatus},
 % \pkg{ekdosis} initially sets one layer of notes\--- the |default|
@@ -1478,24 +1673,24 @@
 % \enquote{source} and \enquote{scholar} as defined above
 % \vpageref{sec:terminology}.
 %
-% \paragraph{Lemmata} \label{ref:lemmata}\DescribeMacro{\lem}
+% \paragraph{Lemmata} \phts\label{ref:lemmata}\DescribeMacro{\lem}
 % \cs{lem}\oarg{options}\marg{lemma text}\\
 % As \meta{lemma text} is a word or a phrase judged by the editor to
 % be authentic or authoritative, \cs{lem} prints it by default both in
 % the edition text and as the first part of a new entry in the
 % apparatus criticus, preceded by the line number where it occurs or a
-% broad space if the entry refers to the same line as the preceding
-% entry. \label{ref:lem-opts-b}The optional argument of \cs{lem}
+% broad space when the entry refers to the same line as the preceding
+% entry. \phts\label{ref:lem-opts-b}The optional argument of \cs{lem}
 % accepts the following
 % comma-separated list of \enquote{name$=$value} arguments:---\\
 % \DescribeOption{wit} |wit|$=$\meta{csv list of
-% witnesses}\label{ref:lem-wit}\\
+% witnesses}\phts\label{ref:lem-wit}\\
 % While a single witness may be recorded as in |wit=A|,
 % comma-separated lists of multiple witnesses must obviously be
 % enclosed in curly braces, like so:
-% |wit={A,B,C}|. \label{ref:mss-sep-families}It must be noted that
-% witnesses can be grouped by using spaces as separators, like so:
-% \verb*|wit={A,B,C, D,E,F}|. Although any unique identifiers or
+% |wit={A,B,C}|. \phts\label{ref:mss-sep-families}It must be noted
+% that witnesses can be grouped by using spaces as separators, like
+% so: \verb*|wit={A,B,C, D,E,F}|. Although any unique identifiers or
 % labels used to \enquote{declare} sources and scholars as described
 % above \vpagerefrange{ref:declare-source}{ref:declare-scholar} can
 % also be used as values of the |wit| optional argument, it is
@@ -1502,7 +1697,7 @@
 % recommended to use |sources| and |resp| to refer to either category
 % respectively as described below.\\
 % \DescribeOption{source} |source|$=$\meta{csv list of
-% sources}\label{ref:lem-source}\newfeature[v1.1]\\
+% sources}\phts\label{ref:lem-source}\newfeature[v1.1]\\
 % A \enquote{source} refers to any type of document consulted by the
 % editor to establish the edition text. Most commonly, corrections and
 % emendations from previous editions are cited in the apparatus
@@ -1510,7 +1705,7 @@
 % below in \vref{sec:emendations-conjectures} and
 % \vref{sec:references-cited-works}.}\\
 % \DescribeOption{resp} |resp|$=$\meta{csv list of
-% scholars}\label{ref:lem-resp}\newfeature[v1.1]\\
+% scholars}\phts\label{ref:lem-resp}\newfeature[v1.1]\\
 % |resp| refers to scholars responsible for the emendations,
 % conjectures and corrections that are cited in the apparatus
 % criticus.\footnote{See detailed examples in
@@ -1532,21 +1727,19 @@
 % bracket (|]|)\\
 % \DescribeOption{nosep} |nosep|$=$\verb+true|false+\\
 % This named argument does not need a value as it defaults to |true|
-% if it is used. |nosep| removes the separator mentioned
-% above. Obviously, |nosep| must be used when for some reason no
-% \cs{rdg} command follows a \cs{lem} command that has just been
-% used, as shown below in \vref{lst:emend-coni-corr}, l.~7.
-% \danger \DescribeMacro{\ekdsep} If |nosep| has been used so as to
-% insert an explanatory note after the lemma text with the \cs{note}
-% command described below \vpageref{ref:editorial-notes}, then
-% \cs{ekdsep} can be used\---for instance as value of the |post|
-% optional argument of the note\---to put back in the separator. This
-% technique is demonstrated below in
-% \vref{lst:emend-coni-corr}, ll.~23--5.\\
+% if used. |nosep| removes the separator mentioned above. Obviously,
+% |nosep| must be used when for some reason no \cs{rdg} command
+% follows a \cs{lem} command that has just been used, as shown below
+% in \vref{lst:emend-coni-corr}, l.~7.
+% \danger \DescribeMacro{\ekdsep} If |nosep| be used so as to insert
+% an explanatory note after the lemma text with the \cs{note} command
+% described below \vpageref{ref:editorial-notes}, then \cs{ekdsep} can
+% be used\---for instance as value of the |post| optional argument of
+% the note\---to put back in the separator. This technique is
+% demonstrated below in \vref{lst:emend-coni-corr}, ll.~23--5.\\
 % \DescribeOption{nolem} |nolem|$=$\verb+true|false+\\
 % This named argument does not need a value as it defaults to |true|
-% if it is used. |nolem| completely removes the lemma text from the
-% related
+% if used. |nolem| completely removes the lemma text from the related
 % entry in the apparatus criticus.\\
 % \DescribeOption{type} |type|$=$\meta{value}\\
 % This named argument has no effect on the apparatus criticus of the
@@ -1573,7 +1766,7 @@
 % |prewit| inserts \meta{words} \emph{before} the list of witnesses.\\
 % \DescribeOption{postwit} |postwit|$=$\meta{words}\pointtor{postwit}\\
 % |postwit| inserts \meta{words} \emph{after} the list of witnesses.
-% \label{ref:lem-opts-e}
+% \phts\label{ref:lem-opts-e}
 %
 % \paragraph{Readings} \DescribeMacro{\rdg}
 % \cs{rdg}\oarg{options}\marg{variant reading}\\
@@ -1589,13 +1782,13 @@
 % provided above \vpagerefrange{ref:lem-opts-b}{ref:lem-opts-e} for
 % more detailed information:---\\
 % \DescribeOption{wit} |wit|$=$\meta{csv list of
-% witnesses}\label{ref:rdg-wit}\\
+% witnesses}\phts\label{ref:rdg-wit}\\
 % \DescribeOption{source} |source|$=$\meta{csv list of sources}\\
 % \DescribeOption{resp} |resp|$=$\meta{csv list of scholars}\\
 % \DescribeOption{alt} |alt|$=$\meta{alternate reading}\\
 % \DescribeOption{nordg} |nordg|$=$\verb+true|false+\\
 % This named argument does not need a value as it defaults to |true|
-% if it is used. |nordg| completely removes the variant reading from
+% if used. |nordg| completely removes the variant reading from
 % the related entry in the apparatus criticus.\\
 % \DescribeOption{type} |type|$=$\meta{value}\\
 % Obviously, |type=conjecture| should be restricted to variant
@@ -1607,15 +1800,15 @@
 % \DescribeOption{postwit} |postwit|$=$\meta{words}\\
 %
 % \paragraph{Notes}
-% \DescribeMacro{\note}\label{ref:notes-b}\DescribeMacro{\note*}
+% \DescribeMacro{\note}\phts\label{ref:notes-b}\DescribeMacro{\note*}
 % \cs{note}\oarg{options}\marg{text} or
-% \cs{note*}\oarg{options}\marg{text}\label{ref:editorial-notes}\\
-% It may happen that editorial notes be needed to record short
+% \cs{note*}\oarg{options}\marg{text}\phts\label{ref:editorial-notes}\\
+% It may happen that editorial notes are needed to record short
 % comments of general nature \emph{between} lemmata and
 % readings. \cs{note} inserts inline comments while \cs{note*} places
 % comments below the entire apparatus block. Furthermore, if
-% \pkg{ekdosis} has been loaded with the |parnotes| option as
-% described above \vpageref{ref:parnotes-opt}, \cs{note*} will use the
+% \pkg{ekdosis} be loaded with the |parnotes| option as described
+% above \vpageref{ref:parnotes-opt}, \cs{note*} will use the
 % \pkg{parnotes} package to lay out the notes as an additional
 % paragraph below the apparatus criticus. The optional argument of
 % \cs{note}/\cs{note*} accepts the following comma-separated list of
@@ -1759,7 +1952,7 @@
 % \iffalse
 %</example>
 % \fi
-% \label{ref:notes-e}
+% \phts\label{ref:notes-e}
 %
 % \subsection{Indicating Subvariation in Apparatus Entries}
 % \label{sec:indic-subv-appar}
@@ -1937,7 +2130,7 @@
 % From a technical standpoint, \enquote{conjectures} are readings that
 % are not supported by manuscript evidence, but are instead proposed
 % by scholars to be taken into consideration for establishing the
-% edition text. A conjecture is called an \enquote{emendation} if it
+% edition text. A conjecture is called an \enquote{emendation} when it
 % is adopted in place of what is provided by or missing from the text
 % provided by the manuscripts. Emendations and conjectures are
 % therefore readings and as such expected to be found within |<lem>|
@@ -2025,7 +2218,7 @@
 %   |prewit=|\texttt{coni.} or |prewit=|\texttt{falso coni.}, to print
 %   explanatory words in the apparatus criticus before the abridged
 %   name of the scholar.
-% \item \label{it:egomute}Conversely, line~9 introduces an
+% \item \phts\label{it:egomute}Conversely, line~9 introduces an
 %   \emph{emendation} for which the shorthand |egoscr| has been used
 %   to print the exact term \emph{scripsi} in the apparatus criticus
 %   while keeping |ego| as an |xml:id| for the \texttt{TEI xml} output
@@ -2075,7 +2268,7 @@
 % \end{alignment}
 %
 % \texttt{TEI xml} output:---
-%
+% \enlargethispage{\baselineskip}
 % \iffalse
 %<*example>
 % \fi
@@ -2111,7 +2304,7 @@
 % \item[<***>] conjectured lacuna.
 % \item[\{\}] editorial deletion.
 % \item[\dag\dag] text judged by the editor to be corrupt. Note that if
-% only one word is suspect, only one crux is needed. 
+% only one word be suspect, only one crux is needed. 
 % \end{description}
 %
 % \DescribeMacro{\SetCritSymbols}\newfeature[v1.1]
@@ -2163,7 +2356,7 @@
 % \danger If modified, brackets can be adapted to languages that are
 % written from right to left. To that effect, \pkg{ekdosis} provides a
 % boolean expression |al at rlmode| which is evaluated as |true| if the
-% writing direction is set from right to left and as |false|
+% writing direction be set from right to left and as |false|
 % otherwise. As the \pkg{etoolbox} package is loaded by \pkg{ekdosis},
 % \cs{ifboolean}|{al at rlmode}|\marg{rtl symbol}\marg{ltr symbol} can be
 % used to perform the test.
@@ -2246,7 +2439,7 @@
     \lem[resp=egomute, type=emendation, nosep]{\supplied{τῶν πυρετῶν}}
     \note[post=\ekdsep]{addidi (\arb{^gamI`a 'l-.hummayAti}
       \getsiglum{Gal})}
-    \rdg[nordg, source=Gal]{\arb{^gamI`a 'l-.hummayAti}}
+    \rdg[nordg, source=Gal]{\arb{al-.hummayAti}}
     \rdg[wit=codd, source=edd, alt=om.]{}
   },
 \end{ekdosis}
@@ -2283,7 +2476,7 @@
 %    \lem[resp=egomute, type=emendation, nosep]{\supplied{τῶν πυρετῶν}}
 %    \note[post=\ekdsep]{addidi (\arb{^gamI`a 'l-.hummayAti}
 %      \getsiglum{Gal})}
-%    \rdg[nordg, source=Gal]{\arb{^gamI`a 'l-.hummayAti}}
+%    \rdg[nordg, source=Gal]{\arb{al-.hummayAti}}
 %    \rdg[wit=hcodd, source=hedd, alt=om.]{}
 %  },
 %   \end{specimen}
@@ -2325,7 +2518,7 @@
   <ref target="#Gal">Gal.</ref>)</note>
   <rdg source="#Gal">
     <foreign xml:lang="ar-Latn" type="transliterated"
-    subtype="arabtex">^gamI`a 'l-.hummayAti</foreign>
+    subtype="arabtex">al-.hummayAti</foreign>
   </rdg>
   <rdg wit="#V #I #R #H" source="#Lit #Erm #Sm" />
 </app>,</p>
@@ -2351,7 +2544,7 @@
 %
 % \paragraph{The \env{alignment} Environment}
 % \DescribeEnv{alignment} \cs{begin}|{alignment}|\oarg{options}\dots
-% \cs{end}|{alignment}|\label{ref:alignment-syntax}\\
+% \cs{end}|{alignment}|\phts\label{ref:alignment-syntax}\\
 % This environment can be used as it is provided to typeset a standard
 % critical edition, namely an edition text, equipped with an apparatus
 % criticus and laid out on the left-hand pages, accompanied by a
@@ -2387,12 +2580,13 @@
 %</example>
 % \fi
 %
-% \DescribeEnv{edition*}\DescribeEnv{translation*}
-% \label{ref:starred-envs} Furthermore, so-called \enquote{starred}
-% versions of these environments can be used at any point to
-% synchronize texts, that is to print them in such a way that the tops
-% of all paragraphs are vertically aligned. To that effect, it must be
-% noted that merely applying this command on a single
+% \DescribeEnv{edition*}
+% \DescribeEnv{translation*}
+% \phts\label{ref:starred-envs} Furthermore, so-called
+% \enquote{starred} versions of these environments can be used at any
+% point to synchronize texts, that is to print them in such a way that
+% the tops of all paragraphs are vertically aligned. To that effect,
+% it must be noted that merely applying this command on a single
 % environment\---for instance the leftmost one\---will have all other
 % associated paragraphs printed aligned.
 %
@@ -2403,8 +2597,7 @@
 % encoding allows not to lose sight of paragraphs that are meant to be
 % read together, but it is also the only way to align paragraphs in
 % print, and it is much more suitable to mark up correspondence
-% between spans of texts as will be demonstrated below in
-% \vref{ref:segmentation}.
+% between spans of texts.
 %
 % As an illustration, a short extract of Caesar's \emph{Gallic War},
 % VI, XIII.1 follows.\footnote{Latin text: \cite{Caesar-BG-v2};
@@ -2455,6 +2648,7 @@
 %</example>
 % \fi
 %
+% \begingroup
 % \needspace{7\baselineskip}
 % \resetlinenumber
 % \FormatDiv{2}{}{.}
@@ -2488,6 +2682,7 @@
 %       and is admitted to no deliberation.
 %   \end{translation}
 % \end{alignment}
+% \endgroup
 %
 % \begin{remarks}
 % \item As can be seen from the apparatus entry related to l.~4 above,
@@ -2505,6 +2700,7 @@
 % \end{remarks}
 %
 % Finally, the corresponding \texttt{TEI xml} output follows:---
+% 
 % \iffalse
 %<*example>
 % \fi
@@ -2590,7 +2786,7 @@
 %   \item[\dbend] The colon at the end of line~3 closes the whole
 %     value of |text| and acts as a higher level separator.
 %   \end{enumerate}
-% \item \label{it:lang-subopt} Each name may be followed by a
+% \item \phts\label{it:lang-subopt} Each name may be followed by a
 %   \enquote*{suboptional} argument between square brackets which will
 %   then be used to insert \texttt{TEI xml} attributes in the
 %   corresponding |<div>| element. For example, \iffalse
@@ -2642,7 +2838,7 @@
 % \DescribeOption{paired} |paired|$=$\verb+true|false+%
 % \hfill\tcboxverb{Default: true (initially not set)}\\
 % This named argument does not need a value as it defaults to |true|
-% if it is used. By default, \pkg{ekdosis} follows the \LaTeX{} page
+% if used. By default, \pkg{ekdosis} follows the \LaTeX{} page
 % numbering scheme when multiple texts are arranged on facing
 % pages. The |paired| option leaves every right-hand page number
 % unchanged, so that both facing pages hold the same page number.\\
@@ -2655,7 +2851,7 @@
 % \DescribeOption{flush} |flush|$=$\verb+true|false+
 % \hfill\tcboxverb{Default: false}\\
 % This named argument does not need a value as it defaults to |true|
-% if it is used. This option applies when two or more distinct
+% if used. This option applies when two or more distinct
 % \env{alignment} environments are started on the same page. Should
 % this happen, any subsequent \env{alignment} environment must be set
 % with the |flush| option so that every one of them carry its own
@@ -2696,9 +2892,9 @@
 %
 % \DescribeMacro{\SetAlignment}
 % \cs{SetAlignment}\marg{alignment settings}\\
-% If the same alignment settings are to be shared by several
-% \env{alignment} environments, common settings can be collected in
-% the argument of \cs{SetAlignment}, like
+% If the same alignment settings be shared by several \env{alignment}
+% environments, common settings can be collected in the argument of
+% \cs{SetAlignment}, like
 % so:---\\
 % \iffalse
 %<*example>
@@ -2871,8 +3067,9 @@
 % at the bottom of the page.
 %
 % \danger Regular footnotes are printed above the block of critical
-% notes. Places can be interchanged by just loading the \pkg{fnpos}
-% package in the preamble.\footcite{fnpos}
+% notes. The respective places of these blocks can be interchanged by
+% just loading the \pkg{fnpos} package in the
+% preamble.\footcite{fnpos}
 %
 % \section{Laying Out the Apparatus Criticus}
 % \label{sec:apparatus-layout}
@@ -2883,9 +3080,9 @@
 % the apparatus criticus (e.g. sources, testimonia, variant readings
 % \emph{\&c.})
 %
-% \DescribeMacro{\SetHooks}
-% \cs{SetHooks}\marg{csv list of hooks} can be used either in
-% the preamble or at any point of the document. The list of accepted
+% \DescribeMacro{\SetHooks} \cs{SetHooks}\marg{csv list of hooks} can
+% be used either in the preamble or at any point of the document. The
+% list of accepted
 % hooks at the time of writing follows:---\\
 % \DescribeOption{appfontsize} |appfontsize|$=$\meta{command}
 % \hfill\tcboxverb{Default: \footnotesize}\\
@@ -2898,8 +3095,8 @@
 % font used to print references to line numbers in the apparatus
 % criticus. By default, numbers are printed in bold face. As an
 % example, |refnumstyle=\normalfont| will have them printed in the
-% font and shape selected by default for the
-% document, while |refnumstyle=\bfseries\itshape| will have them
+% font and shape selected by default for the document, while
+% |refnumstyle=\bfseries\itshape| will have them
 % printed in bold and italic.\\
 % \DescribeOption{postrefnum} |postrefnum|$=$\meta{command \textbar\
 % chars}\hfill\tcboxverb{Default: ~}\\
@@ -2907,8 +3104,34 @@
 % reference to line numbers. By default, it is |~|, namely an
 % unbreakable space. As an example, |postrefnum=\hskip 0.5em| will
 % insert a \unit[0.5]{em} space between the numerals and the beginning
-% of all subsequent notes.
+% of all subsequent notes.\\
+% \DescribeOption{lemmastyle} |lemmastyle|$=$\meta{command}
+% \hfill\tcboxverb{Default: not set}\\
+% \newfeature[v1.2] |lemmastyle| can be used to set the family, series
+% or shape of the font used to print lemma texts in the apparatus
+% criticus. For example, |lemmastyle=|\cs{bfseries} will print all
+% instances of lemma text in bold while
+% |lemmastyle=|\cs{color}|{blue}| will print them in blue.
+% \DescribeOption{readingstyle} |readingstyle|$=$\meta{command}
+% \hfill\tcboxverb{Default: not set}\\
+% \newfeature[v1.2] |readingstyle| operates in the same way as
+% |lemmastyle| but applies to variant readings.\\
+% \DescribeOption{initialrule} |initialrule|$=$\meta{command}
+% \phts\label{ref:initialrule}\hfill\bgroup\footnotesize
+% \tcboxverb{Default: \rule{0.4\columnwidth}{0.4pt} (initially not set)}%
+% \egroup
+% \newfeature[v1.2] |initialrule| draws a separating rule between the
+% edition text and all subsequent layers of critical notes. Of course,
+% this option only makes sense when multiple-layer apparatus criticus
+% are set. Therefore, it has no effect on single-layer apparatus
+% criticus.\\
+% \DescribeOption{noinitialrule}\hfill\tcboxverb{Default: not set}\\
+% This is a no-value option. It removes any previously set
+% |initialrule|.
 %
+% An example of the way these hooks may be used is provided below in
+% \vref{lst:shak-sonnet1}.
+%
 % \subsection{Single-Layer Apparatus Criticus}
 % \label{sec:single-layer-app}
 % \paragraph{Specific Commands}
@@ -2936,13 +3159,12 @@
 % block, while |\SetBeginApparatus{\hskip 1em}| will set an
 % indentation of one em.
 %
-% \DescribeMacro{\SetEndApparatus}
-% \label{ref:setendapparatus}
+% \DescribeMacro{\SetEndApparatus}\phts\label{ref:setendapparatus}
 % \cs{SetEndApparatus}\marg{characters} can be used to append
 % \meta{characters} at the end of the apparatus block. By default,
-% nothing is appended. \label{ref:ending-dot}As an example of use,
-% |\SetEndApparatus{.}| will have a period printed at the end of the
-% apparatus as it is customary in some
+% nothing is appended. \phts\label{ref:ending-dot}As an example of
+% use, |\SetEndApparatus{.}| will have a period printed at the end of
+% the apparatus as it is customary in some
 % editions.\footnote{\label{fn:rm-dots}See also below
 % \vpageref{sec:superfluous-dots} on how to remove superfluous dots.}
 %
@@ -2962,9 +3184,15 @@
 % document to change the default setting. Leaving this argument empty
 % as in \cs{SetDefaultRule}|{}| removes the line.
 %
+% \DescribeMacro{\SetApparatusLanguage}
+% \phts\label{ref:app-lang}\newfeature[v1.2]
+% \cs{SetApparatusLanguage}\marg{languagename} can be used when it is
+% needed to apply in the apparatus criticus a language different from
+% the one that is selected in the edition text.
+% 
 % \paragraph{General Command}
 % \DescribeMacro{\SetApparatus} \cs{SetApparatus}\marg{csv list of
-% apparatus settings}\label{ref:apparatus-settings-b}\\
+% apparatus settings}\phts\label{ref:apparatus-settings-b}\\
 % Finally, all the settings described above can also be collected in
 % the argument of \cs{SetApparatus}. \cs{SetApparatus} accepts the
 % following list of comma-separated |key=value| options:---\\
@@ -2994,14 +3222,23 @@
 % also be used to remove the line.\\
 % \DescribeOption{norule}\hfill\tcboxverb{Default: not set}\\
 % |norule| does not accept any value and has the same effect as
-% |rule=none|.\label{ref:apparatus-settings-e}
-%
+% |rule=none|.\phts\label{ref:apparatus-settings-e}\\
+% \DescribeOption{lang} |lang|$=$\meta{languagename}
+% \newfeature[v1.2]\phts\label{ref:app-lang-opt}
+% \hfill\tcboxverb{Default: not set}\\
+% \needspace{3\baselineskip}\noindent
+% |lang=<languagename>| is used as described
+% \vpageref[above]{ref:app-lang} when it is needed to apply in the
+% apparatus criticus a language different from the one that is
+% selected in the edition text. |languagename| can be any value
+% accepted by \pkg{babel} or \pkg{polyglossia}.
+% 
 % As an example, an apparatus criticus with references to line numbers
 % printed in normal font, a colon as a separator between lemma texts
 % and variant readings, a broad space as a delimiter between entries
 % and a \unit[0.7]{in} line above could be laid out as follows:---
 %
-% \label{ex:single-layer-app-layout}
+% \phts\label{ex:single-layer-app-layout}
 % \iffalse
 %<*example>
 % \fi
@@ -3044,7 +3281,7 @@
 % internally. If any additional layer of notes be declared in the
 % preamble, this |default| layer must be included in the list of
 % declared layers.\\
-% \DescribeMacro{\SetDefaultApparatus}\label{ref:ekd-default-app}
+% \DescribeMacro{\SetDefaultApparatus}\phts\label{ref:ekd-default-app}
 % \cs{SetDefaultApparatus}\marg{name} can be used at any point of the
 % document to change the name to be used as the default one by
 % \pkg{ekdosis}.
@@ -3089,6 +3326,7 @@
 % \DescribeOption{ehook}
 % \DescribeOption{rule}
 % \DescribeOption{norule}
+% \DescribeOption{lang}\phts\label{ref:apps-lang-opt}
 % With regard to layout, any declared layer inherits the default values
 % described above in \vref{sec:single-layer-app}. That said, as the
 % optional argument of \cs{DeclareApparatus} accepts the exact same
@@ -3107,27 +3345,39 @@
 % \iffalse
 %<*example>
 % \fi
-\begin{minted}[linenos=false]{latex}
+\begin{minted}{latex}
 \SetHooks{
-  refnumstyle=\normalfont
+  refnumstyle=\normalfont,
+  initialrule=\rule{0.7in}{0.4pt}
 }
 \DeclareApparatus{testium}[
   sep={] },
   delim=\hskip 1em,
-  rule=\rule{0.7in}{0.4pt}
+  norule
 ]
 \DeclareApparatus{default}[
   sep={: },
   delim=\hskip 1em,
-  norule
+  rule=\relax
 ]
 \end{minted}
 % \iffalse
 %</example>
 % \fi
-% 
+%
+% \begin{remarks}
+% \item The general hook \texttt{initialrule} used here (l.~3) is
+%   described above \vpageref{ref:initialrule}.
+% \item \cs{relax} (l.~13) is a \TeX\ primitive that instructs to do
+%   nothing. Therefore, |rule=\relax| is not strictly equivalent to
+%   |norule|: with the former, \cs{relax} removes the rule but leaves
+%   untouched the subsequent carriage return: as a result, the layers
+%   are visually separated from one another by a blank line. With the
+%   latter everything is removed, carriage return included.
+% \end{remarks}
+%
 % \paragraph{Limiting the Number of Entries per Page}
-% \label{ref:maxentries}
+% \phts\label{ref:maxentries}
 % In some instances, it can be useful to set a limit to the number of
 % entries per page that a given layer of critical notes may accept,
 % notably when entries are so abundant in number that \pkg{ekdosis}
@@ -3141,7 +3391,7 @@
 % the apparatus criticus this option is related to. As a result, the
 % page will actually break at the end of the current line. The
 % particulars of this technique will be discussed below in
-% \vref{sec:tricks-of-trade}.
+% \vref{sec:oscillating-problem}.
 %
 % \section{Inserting Notes in Multiple-Layer Apparatus}
 % \label{sec:notes-in-multilayer-app}
@@ -3184,7 +3434,7 @@
 %</example>
 % \fi
 %
-% If one wishes to refer to |rec1| as the default layer, then
+% Should one wish to refer to |rec1| as the default layer, then
 % \cs{SetDefaultApparatus} must be used, like so:---
 % 
 % \iffalse
@@ -3223,7 +3473,7 @@
 % \fi
 %
 % \danger At any rate, |type=default| or |type=rec1|, depending on
-% what has been chosen, must be used if the editor wishes to retain
+% what has been chosen, must be used should the editor wish to retain
 % that information in the \texttt{TEI xml} output file.
 %
 % \subsection{Other Notes for Comments, Sources or Testimonia}
@@ -3262,7 +3512,7 @@
 % The separator between the lemma text and the contents of the note.\\
 % \DescribeOption{nosep} |nosep|$=$\verb+true|false+\\
 % This named argument does not need a value as it defaults to |true|
-% if it is used. Obviously, |nosep| removes the separator mentioned
+% if used. Obviously, |nosep| removes the separator mentioned
 % above.\\
 % \DescribeOption{lem} |lem|$=$\meta{lemma text}\\
 % |lem| is the span of text the note is about. It may consist of one
@@ -3278,8 +3528,8 @@
 % \DescribeOption{labele} |labele|$=$\meta{label}\\
 % |labele| is the unique label to serve as a reference for the point
 % immediately following the lemma text. Contrary to |labelb|, |labele|
-% may be left unspecified if the note is only about one word. If it is
-% about a span, then |labele| ought to be specified.\\
+% may be left unspecified if the note be only about one word. If the
+% note be about a span, then |labele| must be specified.\\
 % \DescribeMacro{\linelabel} \cs{linelabel}\marg{label}\\
 % If |labele|$=$\meta{some\_label} be specified in the optional
 % argument of \cs{note}, \cs{linelabel}\marg{some\allowbreak\_label}
@@ -3366,12 +3616,12 @@
 % \fi
 %
 % \paragraph{\cs{note} or \cs{linelabel} inside \cs{lem}}
-% It may happen that \cs{note} or \cs{linelabel} commands be found
-% inside the argument of \cs{lem}. Obviously, inserting such commands
+% It may happen that the \cs{note} or \cs{linelabel} command is found
+% inside the argument of \cs{lem}. Obviously, inserting such a command
 % in the apparatus criticus in print makes no sense and will lead to
 % an error. The solution is to insert in the value of the |alt|
 % optional argument of \cs{lem} a duplicate of the lemma text devoid
-% of those commands, like so:---
+% of that command, like so:---
 % 
 % \iffalse
 %<*example>
@@ -3379,7 +3629,7 @@
 \begin{minted}[linenos=false]{latex}
 This is some \app{
   \lem[alt=dummy]{\note[type=fontium, labelb=bnote, labele=enote,
-    lem=dummy... command]{Text of the note}
+    lem=dummy... command]{Text of the note.}
     dummy}
   \rdg{pseudo}}
 text to demonstrate how to insert a note in the argument of the
@@ -3398,7 +3648,7 @@
 %   \begin{specimen}
 % This is some \app{
 %   \lem[alt=dummy]{\note[type=fontium, labelb=bnote, labele=enote,
-%     lem=dummy... command]{Text of the note}
+%     lem=dummy... command]{Text of the note.}
 %     dummy}
 %   \rdg{pseudo}}
 % text to demonstrate how to insert a note in the argument of the
@@ -3418,7 +3668,7 @@
   <anchor xml:id="bnote" />dummy</lem>
   <note type="fontium"
   target="#range(right(bnote),left(enote))">Text of the
-  note</note>
+  note.</note>
   <rdg>pseudo</rdg>
 </app>text to demonstrate how to insert a note in the
 argument of the 
@@ -3436,6 +3686,697 @@
 % element (ll.~5--7). Otherwise, the \texttt{TEI} output would not be
 % valid.
 %
+% \section{Poetry}
+% \label{sec:poetry}
+% \subsection[The Standard \textsf{verse} Environment]{The Standard
+% \env{verse} Environment}
+% \label{sec:stand-verse-env}
+%
+% In order to typeset verse texts or poems, \LaTeX\ provides the
+% standard \env{verse} environment. Within this environment, |\\| is
+% normally used to end lines, with the exception of the last line. As
+% a result, stanzas are separated from one another by a blank line.
+%
+% \pkg{ekdosis} provides \env{ekdverse} which is recommended for use
+% in place of the standard \env{verse} environment. By default,
+% \env{ekdverse} produces the same result as \env{verse}.  However,
+% \pkg{ekdosis} deviates a little from the standard usage for it needs
+% all lines of poetry to be ended by |\\| as a distinct marker. In the
+% following listing, stanzas are visually separated from one another
+% by an additional vertical space of \unit[2]{ex} (l.~5). Between
+% stanzas, |%| is used to prevent \TeX\ from
+% introducing a blank line. But a blank line\===or even no blank
+% line\===would produce the exact same result:---
+% 
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}{latex}
+\begin{ekdverse}
+  It is an ancient Mariner,\\
+  And he stoppeth one of three.\\
+  ‘By thy long grey beard and glittering eye,\\
+  Now wherefore stopp'st thou me?\\[2ex]
+  %
+  The Bridegroom's doors are opened wide,\\
+  And I am next of kin;\\
+  The guests are met, the feast is set:\\
+  May'st hear the merry din.’\\
+\end{ekdverse}
+\end{minted}
+% \iffalse
+%</example>
+% \fi
+%
+% PDF output:---
+% \medskip
+% \SetLineation{vmodulo=0}
+% \begingroup
+% \needspace{7\baselineskip}
+% \resetlinenumber\resetvlinenumber
+% \begin{alignment}[flush,tcols=1,texts=coleridge,apparatus=coleridge]
+%   \begin{coleridge}
+%     \begin{verse}
+%       It is an ancient Mariner,\\
+%       And he stoppeth one of three.\\
+%       ‘By thy long grey beard and glittering eye,\\
+%       Now wherefore stopp'st thou me?\\[2ex]
+%
+%       The Bridegroom's doors are opened wide,\\
+%       And I am next of kin;\\
+%       The guests are met, the feast is set:\\
+%       May'st hear the merry din.’\\
+%     \end{verse}
+%   \end{coleridge}
+% \end{alignment}
+% \endgroup
+% \SetLineation{vmodulo=1}
+% \medskip
+% 
+% \indent\texttt{TEI xml} output:---
+% 
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}[linenos=false]{xml}
+<lg>
+  <l>It is an ancient Mariner,</l>
+  <l>And he stoppeth one of three.</l>
+  <l>‘By thy long grey beard and glittering eye,</l>
+  <l>Now wherefore stopp'st thou me?</l>
+  <l>The Bridegroom's doors are opened wide,</l>
+  <l>And I am next of kin;</l>
+  <l>The guests are met, the feast is set:</l>
+  <l>May'st hear the merry din.’</l>
+</lg>
+\end{minted}
+% \iffalse
+%</example>
+% \fi
+%
+% One would have expected here the |<lg>| element to be used as
+% delimiter to encode the stanzaic verse forms. But as can be seen,
+% only the outermost level of line group has been converted into
+% \texttt{TEI xml}, let alone the vertical spacing between stanzas
+% which has been ignored.  This is because it is about as much as the
+% standard \env{verse} environment provides.
+%
+% \subsection[The \textsf{verse} Package]{The \pkg{verse} Package}
+% \label{sec:verse-package}
+% \newfeature[v1.2]
+% \pkg{ekdosis} can use the facilities offered by the excellent
+% \pkg{verse} package\footcite{verse} to which it adds a specific
+% environment for the encoding of line groups such as
+% stanzas. Furthermore, as the \pkg{verse} package provides its own
+% numbering mechanism, the lines can be numbered independently of
+% prose text.\footnote{See \vpageref{ref:verse-lineation} for
+% details.}
+%
+% \danger For what is described in this section to operate,
+% \pkg{ekdosis} must be loaded with the global option |poetry=verse|
+% as explained above \vpageref{ref:poetry-opt}. Simply loading the
+% \pkg{verse} package by means of \cs{usepackage} will have no effect.
+%
+% \danger The foregoing does not apply if the \cls{memoir} class be
+% used.\footcite{memoir} In this case, \pkg{ekdosis} automatically
+% uses the code provided by this class without the need to set
+% the global option |poetry=verse|.
+%
+% \paragraph{Compatible Verse Commands}
+% The reader is invited to refer to the documentation of the
+% \env{verse} package for detailed information.  Within the
+% \env{ekdverse} environment, |\\| \emph{must be used} at the end of
+% each line, as follows:---
+% \begin{enumerate}
+% \item |\\| is the standard command to be used at the end of each
+%   line.
+% \item |\\!| must be used at the end of stanzas or line groups
+%   instead of |\\|.
+% \item |\\*| does the same as |\\| except that it prohibits a page
+%   break after the line.
+% \item |\\>| is for line breaks within a verse line.
+% \end{enumerate}
+%
+% All of these commands can take a dimension as optional argument,
+% like so: |\\[30pt]|, |\\![30pt]|, |\\*[30pt]| or |\\>[30pt]|. If
+% |\\|, |\\!| or |\\*| be used, a vertical space of the dimension
+% specified is added between lines, whereas |\\>[...]| adds an
+% horizontal space after the line break.
+%
+% \DescribeMacro{\vin} \phts\label{ref:verse-vin}\cs{vin} indents a
+% verse line by a length which is by default \unit[1.5]{em}. This
+% length is stored as \cs{vgap} and can be changed by \cs{setlength}
+% or \cs{addtolength}.
+%
+% \paragraph{The \env{ekdverse} Environment}
+% \DescribeEnv{ekdverse} \cs{begin}|{ekdverse}|\oarg{options} \dots\
+% \cs{end}|{ekdverse}|\phts\label{ref:ekdverse-syntax}\\
+% This environment is used to hold verse lines as described above and
+% may receive an optional argument in which the following
+% \enquote{name$=$value} arguments are accepted:---\\
+% \DescribeOption{width} |width|$=$\meta{length}
+% \hfill\tcboxverb{Default: \linewidth}\\
+% If |width| be supplied, it is taken as a length in relation to which
+% the entire contents of the environment is to be horizontally
+% centered. If given, this dimension may correspond to an average line
+% or to the longest line of the line group. To this end, the standard
+% \LaTeX\ command \cs{settowidth} can be used, like so:--- %
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}[linenos=false]{latex}
+\settowidth{\versewidth}{This is the average line,}
+\begin{ekdverse}[width=\versewidth]
+...
+\end{ekdverse}
+\end{minted}
+% \iffalse
+%</example>
+% \fi %
+% \begin{remarks}
+% \item[\textsc{Rem.}] \cs{versewidth} is provided by the \env{verse}
+%   package as a convenience and can be used by \env{ekdosis}.
+% \end{remarks}
+% \DescribeOption{type} |type|$=$\meta{type}
+% \hfill\tcboxverb{Default: not set}\\
+% This named argument is used in the \texttt{TEI xml} output to
+% name the type of unit encoded within the |<lg>| element, viz.\
+% \enquote{sonnet}, \enquote{quatrain}, \enquote{couplet} and the
+% like.
+%
+% \danger Unlike the \texttt{TEI xml} element |<lg>|, \env{ekdverse}
+% may not nest hiearchichally. Within this environment,
+% \env{ekdstanza} must be used instead to encode stanzas as described
+% \vpageref[below][below]{ref:ekdstanza}.
+%
+% As an example, the first five lines of Homer's \emph{Odyssey} could
+% be encoded like so:\footcite{HomerMurray}---
+% 
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}[linenos=false]{latex}
+\begin{alignment}[tcols=2,
+                  lcols=2,
+                  texts=homer[xml:lang="grc"];murray[xml:lang="en"],
+                  apparatus=homer]
+  \begin{homer}
+    \begin{ekdverse}
+       Ἄνδρα μοι ἔννεπε, Μοῦσα, πολύτροπον, ὃς μάλα πολλὰ \\
+       πλάγχθη, ἐπεὶ Τροίης ἱερὸν πτολίεθρον ἔπερσεν· \\
+       πολλῶν δ' ἀνθρώπων ἴδεν ἄστεα καὶ
+                     \app{\lem{νόον}
+                          \rdg[resp=Zen]{νόμον}
+                          \note{Cf. Schol.}} ἔγνω, \\
+       πολλὰ δ' ὅ γ' ἐν πόντῳ πάθεν ἄλγεα ὃν κατὰ θυμόν, \\ 
+       ἀρνύμενος ἥν τε ψυχὴν καὶ νόστον ἑταίρων. \\
+     \end{ekdverse}
+  \end{homer}
+  \begin{murray}
+    Tell me, O Muse, of the man of many devices, who wandered full
+    many ways after he had sacked the sacred citadel of Troy. Many
+    were the men whose cities he saw and whose mind he learned, aye,
+    and many the woes he suffered in his heart upon the sea, seeking
+    to win his own life and the return of his
+    comrades.
+  \end{murray}
+\end{alignment}
+\end{minted}
+% \iffalse
+%</example>
+% \fi
+%
+% PDF output:---
+% \medskip
+% \begingroup
+% \setcolumnwidth{0.6\textwidth}
+% \setlength{\leftmargini}{0em}
+% \needspace{7\baselineskip}
+% \resetlinenumber\resetvlinenumber
+% \begin{alignment}[flush,
+%   lcols=2,
+%   texts=homer[xml:lang="grc"];murray[xml:lang="en"],
+%   apparatus=homer]
+%   \AtBeginEnvironment{homer}{\selectlanguage{greek}}
+%   \setlength{\vrightskip}{0.25em}
+%   \begin{homer}
+%     \begin{ekdverse}
+%        Ἄνδρα μοι ἔννεπε, Μοῦσα, πολύτροπον, ὃς μάλα πολλὰ \\
+%        πλάγχθη, ἐπεὶ Τροίης ἱερὸν πτολίεθρον ἔπερσεν· \\
+%        πολλῶν δ' ἀνθρώπων ἴδεν ἄστεα καὶ
+%                      \app{\lem{νόον}
+%                           \rdg[resp=hZen]{νόμον}
+%                           \note{Cf. Schol.}} ἔγνω, \\
+%        πολλὰ δ' ὅ γ' ἐν πόντῳ πάθεν ἄλγεα ὃν κατὰ θυμόν, \\ 
+%        ἀρνύμενος ἥν τε ψυχὴν καὶ νόστον ἑταίρων. \\
+%      \end{ekdverse}
+%   \end{homer}
+%   \begin{murray}
+%     Tell me, O Muse, of the man of many devices, who wandered full
+%     many ways after he had sacked the sacred citadel of Troy. Many
+%     were the men whose cities he saw and whose mind he learned, aye,
+%     and many the woes he suffered in his heart upon the sea, seeking
+%     to win his own life and the return of his comrades.
+%   \end{murray}
+% \end{alignment}
+% \endgroup
+% \medskip
+%
+% \texttt{TEI xml} output:---
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}[linenos=false]{xml}
+<div xml:id="div-homer_1" xml:lang="grc">
+  <lg>
+    <l>Ἄνδρα μοι ἔννεπε, Μοῦσα, πολύτροπον, ὃς μάλα πολλὰ</l>
+    <l>πλάγχθη, ἐπεὶ Τροίης ἱερὸν πτολίεθρον ἔπερσεν·</l>
+    <l>πολλῶν δ' ἀνθρώπων ἴδεν ἄστεα καὶ 
+    <app>
+      <lem>νόον</lem>
+      <rdg resp="#Zen">νόμον</rdg>
+      <note>Cf. Schol.</note>
+    </app>ἔγνω,</l>
+    <l>πολλὰ δ' ὅ γ' ἐν πόντῳ πάθεν ἄλγεα ὃν κατὰ θυμόν,</l>
+    <l>ἀρνύμενος ἥν τε ψυχὴν καὶ νόστον ἑταίρων.</l>
+  </lg>
+</div>
+<div xml:id="div-murray_1" xml:lang="en">
+  <p>Tell me, O Muse, of the man of many devices, who
+  wandered full many ways after he had sacked the sacred
+  citadel of Troy. Many were the men whose cities he saw and
+  whose mind he learned, aye, and many the woes he suffered
+  in his heart upon the sea, seeking to win his own life and
+  the return of his comrades.</p>
+</div>
+\end{minted}
+% \iffalse
+%</example>
+% \fi
+%
+% \paragraph{Stanzas}
+% As can be seen above, the \LaTeX\ \env{ekdverse} environment is
+% translated into the \texttt{TEI xml} |<lg>| element. The |type|
+% attribute may then be used to name the type of unit encoded by this
+% element.
+%
+% \DescribeEnv{ekdstanza} \cs{begin}|{ekdstanza}|\oarg{options} \dots\
+% \cs{end}|{ekdstanza}| \phts\label{ref:ekdstanza}\\
+% This environment is used within \env{ekdverse} to encode succeeding
+% stanzaic forms. Within \env{ekdstanza}, the last line is ended by
+% |\\!| or |\\| depending on whether an additional vertical space is
+% required between stanzas. This environment may receive an optional
+% argument in which the following \enquote{name$=$value} argument is
+% accepted:---\\
+% \DescribeOption{type} |type|$=$\meta{type}
+% \hfill\tcboxverb{Default: not set}\\
+% As in the case of \env{ekdverse}, this named argument is used in the
+% \texttt{TEI xml} output to name the type of unit encoded within the
+% |<lg>| element, viz.\ \enquote{quatrain}, \enquote{couplet} and the
+% like.
+%
+% \paragraph{Indentation Patterns}
+% \pkg{ekdosis} can use the \env{patverse} environment and its
+% associated command \cs{indentpattern} that are provided by the
+% \pkg{verse} package. As described in the documentation of this
+% package,\footcite[6]{verse} the indentation pattern consists of an
+% array of digits, \emph{d\textsubscript{1}} to
+% \emph{d\textsubscript{n}}, where the \emph{n\textsuperscript{th}}
+% line is indented by \emph{d\textsubscript{n}} times the amount of
+% \cs{vgap} described above \vpageref{ref:verse-vin}.
+%
+% The overall structure of lines grouped into stanzas may look as
+% follows:---
+% 
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}[escapeinside=++]{latex}
+\begin{ekdverse}[type={+\emph{overall type}+}]
+  \identpattern{+\emph{digits}+}
+  \begin{patverse}
+    \begin{ekdstanza}[type={+\emph{stanza 1 type}+}]
+      line 1 \\
+      line 2 \\
+      [...]
+      final line \\!
+    \end{ekdstanza}
+  \end{patverse}
+\end{ekdverse}
+\end{minted}
+% \iffalse
+%</example>
+% \fi
+%
+% Of course, if no indentation pattern be required or be only required
+% occasionally, \env{patverse} (ll.~3 and 10) and \cs{indentpattern}
+% (l.~2) are of no use:---
+% 
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}[escapeinside=++]{latex}
+\begin{ekdverse}[type={+\emph{overall type}+}]
+  \begin{ekdstanza}[type={+\emph{stanza 1 type}+}]
+    line 1 \\
+    line 2 \\
+    \vin indented line 3 \\
+    [...]
+    final line \\!
+  \end{ekdstanza}
+\end{ekdverse}
+\end{minted}
+% \iffalse
+%</example>
+% \fi
+%
+% A detailed example follows. It is taken from
+% \citename{McDonald1916}{editor}'s edition of Shakespeare's
+% \emph{Sonnets} from the Quarto of 1609 with variorum
+% readings.\footcite[Sonnet~1, \pno~15]{McDonald1916} Compared to
+% \citename{McDonald1916}{shorteditor}'s edition, an effort has been
+% made to use the typography and punctuation of the original edition
+% which can be consulted online at the British Library's
+% website.\footnote{Shake-speares \emph{Sonnets}. Neuer before
+% Imprinted. (A Louers Complaint. By William
+% Shake-speare.). \url{https://www.bl.uk/collection-items/first-edition-of-shakespeares-sonnets-1609}.
+% Call number \texttt{C.21.c.44}, fol.~B.} However, this typographical
+% refinement has been retained for the sonnet only. For the sake of
+% clarity, the line numbers and the apparatus criticus use modern
+% typography. The references to line numbers in the apparatus criticus
+% have been made consistent with
+% \citename{McDonald1916}{shorteditor}'s edition, as have the entries
+% in the apparatus criticus, namely the bare line number followed by a
+% dot, then the lemma text in bold face, then the variant in italic
+% shape:---
+%
+% \captof{Poetry: Shakespeare's Sonnet~1}[\label{lst:shak-sonnet1}]
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}{latex}
+\junicode % Use the Junicode font with 'hist' feature enabled for
+          % long-s
+% MacDonald's style for numbers and entries in the apparatus
+% criticus:
+\SetHooks{
+  refnumstyle=\normalfont,
+  postrefnum=.~,
+  lemmastyle=\bfseries,
+  readingstyle=\itshape
+}
+% The lines are to be centered horizontally:
+\settowidth{\versewidth}{Feed'st thy lights flame with selfe
+substantiall fewell,}
+% Format of the outermost <div> element:
+\NewDocumentEnvironment{ekdcenter}{}{\par\centering}{\nobreak\par}
+\FormatDiv{1}{\begin{ekdcenter}}{\end{ekdcenter}}
+\begin{ekdosis}
+  \ekddiv{type=sonnets, n=1, head=1}
+  \begin{ekdverse}[type=sonnet, width=\versewidth]
+    \indentpattern{00000000000011}
+    \begin{patverse}
+      \begin{ekdstanza}[type=quatrain]
+        \ekdlettrine{F}{r}om fairest creatures we desire
+        increase,\\
+        That thereby beauties \emph{Rose}
+        \app{
+          \lem{might}
+          \rdg[source={Gildon1710, Sewell1725, Ewing1771}]{may}
+        } neuer die,\\
+        But as the riper should by time
+        \app{
+          \lem{decease}
+          \rdg[source=Hudson1856]{decrease}
+        },\\
+        His tender heire might beare his memory:\\
+      \end{ekdstanza}
+      \begin{ekdstanza}[type=quatrain]
+        But thou contracted to thine owne bright eyes,\\
+        Feed'st thy
+        \app{
+          \lem{lights}
+          \rdg[source={Butler1899, Walsh1908}]{life's}
+        } flame with
+        \app{
+          \lem{selfe substantiall}
+          \rdg[source=Gildon1714,
+          alt={\textnormal{Hyphened by}}]{selfe-substantiall}
+          \note{etc.}} fewell,\\
+        Making a famine where aboundance lies,\\
+        Thy selfe thy foe,to thy sweet selfe too cruell:\\
+      \end{ekdstanza}
+      \begin{ekdstanza}[type=quatrain]
+        Thou that art now the worlds fresh ornament,\\
+        And
+        \app{
+          \lem{only}
+          \rdg[resp=God, type=conjecture]{early}
+          \note{conj.}
+        } herauld to the gaudy spring,\\
+        Within thine owne bud buriest thy content,\\
+        And tender
+        \app{
+          \lem{chorle}
+          \rdg[source=Gildon1710]{churl}
+          \note{etc.}
+        } makst wast in niggarding:\\
+      \end{ekdstanza}
+      \begin{ekdstanza}[type=couplet]
+        Pitty the world,or else this glutton be,\\
+        To eate the worlds due,\app{
+          \lem{by the}
+          \rdg[resp=Stee, type=conjecture]{be thy}
+          \note{conj.}
+          \rdg[resp=God, type=conjecture]{by thy}
+          \note{conj.}
+        } graue
+        \app{
+          \lem{and}
+          \rdg[resp=God, type=conjecture]{as}
+          \note{conj.}
+        } thee.\\!
+      \end{ekdstanza}
+    \end{patverse}
+  \end{ekdverse}
+\end{ekdosis}
+\end{minted}
+% \iffalse
+%</example>
+% \fi
+% 
+% \begin{remarks}
+% \item |Gildon1710|, |Gildon1714|, |Sewell1725|, |Ewing1771|,
+%   |Hudson1856|, |Butler1899| and |Walsh1908| have been declared as
+%   sources.\footnote{See above \vpageref{ref:declare-source} and
+%   below \vref{sec:references-cited-works}.}  |God| and |Stee|,
+%   resp.\ Godwin and Steevens, have been decalred as
+%   scholars.\footnote{See above \vpageref{ref:declare-scholar}.}
+% \item \cs{ekdlettrine} (l.~23) is a specific command for the
+%   \pkg{lettrine} package does not work in list
+%   environments. \cs{TeXtoTEIPat} has been used as described below
+%   \vpageref{ref:textoteipat} to instruct \pkg{ekdosis} to convert
+%   this command into an acceptable \texttt{TEI} equivalent. The
+%   definition of \cs{ekdlettrine} follows:---
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}[linenos=false]{latex}
+% Preamble:
+\usepackage{adjustbox}
+% This basic command actually requires an adjustment of the vertical
+% space at the end of the current line (eg. \\[-1.875ex]) and \vin at
+% the beginning of the next line:---
+\NewDocumentCommand{\ekdlettrine}{mm}{%
+\adjustbox{valign=t,raise=-0.75ex}{\Huge #1}\textsc{#2}%
+}
+\TeXtoTEIPat{\ekdlettrine {#1}{#2}}{<hi rend="smallcaps">#1#2</hi>}
+\end{minted}
+% \iffalse
+%</example>
+% \fi
+% \end{remarks}
+%
+% PDF output:---
+% \medskip
+%
+% \begingroup
+% \junicode
+% \SetHooks{
+%   refnumstyle=\normalfont,
+%   postrefnum=.~,
+%   lemmastyle=\bfseries,
+%   readingstyle=\itshape
+% }
+% \renewcommand\thelinenumber{}
+% \settowidth{\versewidth}{Feed'st thy lights flame with selfe
+% substantiall fewell,}
+% \FormatDiv{1}{\begin{ekdcenter}}{\end{ekdcenter}}
+% \needspace{7\baselineskip}
+% \resetlinenumber\resetvlinenumber
+% \begin{alignment}[flush,
+%   tcols=1,
+%   texts=shakespeare[xml:lang="en"],
+%   apparatus=shakespeare]
+%   \setlength{\vrightskip}{-0.75in}
+%   \begin{shakespeare}
+%    \ekddiv{type=sonnets, n=1, head=1}
+%    \begin{ekdverse}[type=sonnet, width=\versewidth]
+%      \indentpattern{00000000000011}
+%      \begin{patverse}
+%        \begin{ekdstanza}[type=quatrain]
+%          \ekdlettrine{F}{r}om fairest creatures we desire
+%          increase,\\[-1.875ex] 
+%          \vin That thereby beauties \emph{Rose}
+%            \app{
+%              \lem{might}
+%              \rdg[source={shGildon1710, shSewell1725, shEwing1771}]{may}
+%           } neuer die,\\
+%          But as the riper should by time
+%            \app{
+%              \lem{decease}
+%              \rdg[source=shHudson1856]{decrease}
+%            },\\
+%          His tender heire might beare his memory:\\
+%        \end{ekdstanza}
+%        \begin{ekdstanza}[type=quatrain]
+%          But thou contracted to thine owne bright eyes,\\
+%          Feed'st thy
+%            \app{
+%              \lem{lights}
+%              \rdg[source={shButler1899, shWalsh1908}]{life's}
+%            } flame with
+%            \app{
+%              \lem{selfe substantiall}
+%              \rdg[source=shGildon1714,
+%                   alt={\textnormal{Hyphened by}}]{selfe-substantiall}
+%              \note{etc.}} fewell,\\
+%          Making a famine where aboundance lies,\\
+%          Thy selfe thy foe,to thy sweet selfe too cruell:\\
+%        \end{ekdstanza}
+%        \begin{ekdstanza}[type=quatrain]
+%          Thou that art now the worlds fresh ornament,\\
+%          And
+%            \app{
+%              \lem{only}
+%              \rdg[resp=shGod, type=conjecture]{early}
+%              \note{conj.}
+%            } herauld to the gaudy spring,\\
+%          Within thine owne bud buriest thy content,\\
+%          And tender
+%            \app{
+%              \lem{chorle}
+%              \rdg[source=shGildon1710]{churl}
+%              \note{etc.}
+%            } makst wast in niggarding:\\
+%        \end{ekdstanza}
+%        \begin{ekdstanza}[type=couplet]
+%          Pitty the world,or else this glutton be,\\
+%          To eate the worlds due,\app{
+%            \lem{by the}
+%            \rdg[resp=shStee, type=conjecture]{be thy}
+%            \note{conj.}
+%            \rdg[resp=shGod, type=conjecture]{by thy}
+%            \note{conj.}
+%            } graue
+%              \app{
+%                \lem{and}
+%                \rdg[resp=shGod, type=conjecture]{as}
+%                \note{conj.}
+%              } thee.\\!
+%        \end{ekdstanza}
+%      \end{patverse}
+%    \end{ekdverse}
+%   \end{shakespeare}
+% \end{alignment}
+% \endgroup
+%
+% \texttt{TEI xml} output:---
+% \medskip
+% 
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}[linenos=false]{xml}
+<div type="sonnets" n="1">
+  <head>1</head>
+  <lg type="sonnet">
+    <lg type="quatrain">
+      <l>
+      <hi rend="smallcaps">Fr</hi>om fairest creatures we
+      desire increase,</l>
+      <l>That thereby beauties 
+      <emph>Rose</emph>
+      <app>
+        <lem>might</lem>
+        <rdg source="#Gildon1710 #Sewell1725 #Ewing1771">
+        may</rdg>
+      </app>neuer die,</l>
+      <l>But as the riper should by time 
+      <app>
+        <lem>decease</lem>
+        <rdg source="#Hudson1856">decrease</rdg>
+      </app>,</l>
+      <l>His tender heire might beare his memory:</l>
+    </lg>
+    <lg type="quatrain">
+      <l>But thou contracted to thine owne bright eyes,</l>
+      <l>Feed'st thy 
+      <app>
+        <lem>lights</lem>
+        <rdg source="#Butler1899 #Walsh1908">
+        life's</rdg>
+      </app>flame with 
+      <app>
+        <lem>selfe substantiall</lem>
+        <rdg source="#Gildon1714">
+        selfe-substantiall</rdg>
+        <note>etc.</note>
+      </app>fewell,</l>
+      <l>Making a famine where aboundance lies,</l>
+      <l>Thy selfe thy foe,to thy sweet selfe too
+      cruell:</l>
+    </lg>
+    <lg type="quatrain">
+      <l>Thou that art now the worlds fresh ornament,</l>
+      <l>And 
+      <app>
+        <lem>only</lem>
+        <rdg resp="#God" type="conjecture">early</rdg>
+        <note>conj.</note>
+      </app>herauld to the gaudy spring,</l>
+      <l>Within thine owne bud buriest thy content,</l>
+      <l>And tender 
+      <app>
+        <lem>chorle</lem>
+        <rdg source="#Gildon1710">churl</rdg>
+        <note>etc.</note>
+      </app>makst wast in niggarding:</l>
+    </lg>
+    <lg type="couplet">
+      <l>Pitty the world,or else this glutton be,</l>
+      <l>To eate the worlds due,
+      <app>
+        <lem>by the</lem>
+        <rdg resp="#Stee" type="conjecture">be thy</rdg>
+        <note>conj.</note>
+        <rdg resp="#God" type="conjecture">by thy</rdg>
+        <note>conj.</note>
+      </app>graue 
+      <app>
+        <lem>and</lem>
+        <rdg resp="#God" type="conjecture">as</rdg>
+        <note>conj.</note>
+      </app>thee.</l>
+    </lg>
+  </lg>
+</div>
+\end{minted}
+% \iffalse
+%</example>
+% \fi
+%
 % \section{Lineation Settings}
 % \label{sec:lineation}
 % \danger \pkg{ekdosis} uses \pkg{lineno} internally for line
@@ -3454,6 +4395,7 @@
 % options} may be used in the preamble or at any point of the document
 % to set lineation preferences. Its argument processes the |key=value|
 % options that follow:---\\
+% \textbf{General Options}\\
 % \DescribeOption{lineation} |lineation|$=$\verb+page|document+
 % \hfill\tcboxverb{Default: document}\\
 % |lineation=document| has the lines numbered continuously throughout
@@ -3479,15 +4421,37 @@
 % elides the last number of a range to the fewest number of figures
 % possible\---viz. 35--7, 129--31 \emph{\&c.}\---without eliding
 % digits in the group 10 to 19 in each hundred\---viz. 17--19, 115--18
-% \emph{\&c.} |numbers=full| leaves the numbers untouched.
-%
+% \emph{\&c.} |numbers=full| leaves the numbers untouched.\\
 % \DescribeMacro{\innerlinenumbers} \DescribeMacro{\outerlinenumbers}
 % \cs{innerlinenumbers} and \cs{outerlinenumbers} are equivalent to
 % \cs{SetLineation}|{numb|\allowbreak|ers=outer}| and
 % \cs{SetLineation}|{numbers=inner}| respectively. Both commands are
 % complementary to \cs{rightlinenumbers} and \cs{leftlinenumbers}
-% already provided by the \pkg{lineno} package.
+% already provided by the \pkg{lineno} package.\\
+% \textbf{Options Specific to the |poetry=verse| Global
+% Setting}\footnote{See above
+% \vref{sec:verse-package}.}\phts\label{ref:verse-lineation}\\
+% \DescribeOption{vlineation} |vlineation|$=$\verb+page|document+
+% \hfill\tcboxverb{Default: document}\\
+% |vlineation| operates on verse texts in the same way as |lineation|
+% on prose texts.\\
+% \DescribeOption{vmodulo} |vmodulo|$=$\emph{n} (where \emph{n} is
+% an integer)\hfill\tcboxverb{Initially: 1, Default: 5}\\
+% |vmodulo|$=$\emph{n} has every \emph{n\textsuperscript{th}} lines of
+% verse printed in the margin. If used without value, this option is
+% equivalent to |vmodulo=5|. |vmodulo=0| prevents the
+% numbers from being printed.\\
+% \DescribeOption{vmargin} |vmargin|$=$\verb+right|left+
+% \hfill\tcboxverb{Default: right}\\
+% |vmargin| sets the margin in which the verse line numbers are to be
+% printed.\\
+% \DescribeOption{continuousvnum}\hfill\tcboxverb{Default: not set}\\
+% The |poetry=verse| global option has the succeeding lines of verse
+% numbered independently of prose text. |continuousvnum| has all lines
+% numbered continuously, irrespective of whether they are lines of
+% prose or poetry text.
 %
+%
 % \paragraph{Useful Lineation Commands}
 % As implied above, pretty much all commands that are provided by the
 % \enquote{running} mode of operation of the \pkg{lineno} package will
@@ -3504,14 +4468,33 @@
 % \DescribeMacro{\linenumbersep} \cs{linenumbersep} is the distance
 % between the numbers and the margin. By default, this distance is set
 % to \unit[10]{pt}. It can be redefined like so:
-% \cs{setlength}\cs{linenumbersep}\marg{length}.\\
-% \DescribeMacro{\linelabel} \DescribeMacro{\lineref}
-% \cs{linelabel}\marg{label} sets a line label that can be referred to
-% with \cs{lineref}\marg{label}.
+% \cs{setlength}\cs{linenumbersep}\marg{length}.
 %
-% The reader is invited to refer to the documentation of the
-% \pkg{lineno} package for more information.
+% \paragraph{Poetry Lineation Commands}
+% In addition to these commands, if \pkg{ekdosis} be loaded with the
+% global option |poetry=verse| as described above in
+% \vref{sec:verse-package}, the commands dedicated to line numbering
+% that are provided by the \pkg{verse} package can be used.\\
+% \DescribeMacro{\resetvlinenumber} \cs{resetvlinenumber}\oarg{n} has
+% for lines of verse the same effect as \cs{resetlinenumber} for
+% lines of prose text.\\
+% \DescribeMacro{\verselinenumfont}
+% \cs{verselinenumfont}\marg{commands} can be used to set the font
+% used for lines of verse. By default, the definition is
+% |\normalfont\footnotesize|. \danger If the \cls{memoir} class be
+% loaded, this command is replaced with \cs{linenumberfont} described
+% above.\\
+% \DescribeMacro{\vrightskip} The \pkg{verse} package prints the
+% numbers at the distance \cs{vrightskip} into the right margin. This
+% distance can be redefined by means of \cs{setlength} like so:
+% \cs{setlength}\cs{vrightskip}\allowbreak\marg{length}.
 %
+%
+% \paragraph{Labels}
+% \DescribeMacro{\linelabel} \DescribeMacro{\ref} In prose as well
+% as in poetry texts, \cs{linelabel}\marg{label} sets a line label
+% that can be referred to with \cs{ref}\marg{label}.
+%
 % As an example, what follows has every fifth line number printed in
 % the inner margins. Additionally, the numbering shall start afresh at
 % the top of each page:---
@@ -3556,6 +4539,14 @@
 % file, the reader is invited to refer to point \vref{it:lang-subopt}
 % and \vref{sec:teixml-output}.
 %
+% \danger In some cases, it may be needed to apply in the apparatus
+% criticus a language different from the one that is selected in the
+% edition text.  To this end, \pkg{ekdosis} provides a set of
+% facilities which are described
+% \vpagerefrange{ref:app-lang}{ref:app-lang-opt} for single-layer
+% apparatus and \vpageref{ref:apps-lang-opt} for multiple-layer
+% apparatus.
+%
 % \subsection{Languages Written From Right to Left}
 % \label{sec:rtl-languages}
 % As said above, \pkg{polyglossia} is not supported by \pkg{ekdosis}
@@ -3633,7 +4624,7 @@
 % \cs{setLR} are two argument-less commands provided by \pkg{ekdosis}
 % that can be used to change the writing direction of running
 % paragraphs. The former sets the direction from right to left and the
-% latter form left to right. If \pkg{babel} has been set as above,
+% latter form left to right. If \pkg{babel} be set as above,
 % \cs{setRL} \dots\ \cs{setLR} can be used in place of
 % \cs{begin}|{Arabic}| \dots\ \cs{end}|{Arabic}|.
 % 
@@ -4096,7 +5087,8 @@
 %
 % PDF output:---
 % \medskip
-% 
+%
+% \begingroup
 % \needspace{7\baselineskip}
 % \resetlinenumber
 % \FormatDiv{1}{\begin{center}\Large}{\end{center}}
@@ -4131,7 +5123,8 @@
 %       θερινοὶ ἐν Κραννῶνι· [...]
 %     \end{hippocrates}
 % \end{alignment}
-%
+% \endgroup
+% 
 % \texttt{TEI xml} output:---
 %
 % \iffalse
@@ -4185,6 +5178,8 @@
 % \hologo{LuaLaTeX} to be run three more times to get everything to
 % the right place with the right numbers.
 %
+% \subsection{The Oscillating Problem}
+% \label{sec:oscillating-problem}
 % In some instances, notably when on a given page entries are very
 % abundant in number, specifically when the edition text is getting
 % close to the bottom of the page, \pkg{ekdosis} may oscillate
@@ -4192,7 +5187,7 @@
 % able to settle down. The condition may be typically illustrated as
 % follows: after Lua\LaTeX\ has been run, an entry is attached to the
 % last line of the page. As said above, this entry does not show
-% yet. But when it does, if it results in an additional line being
+% yet. But when it does, should it result in an additional line being
 % printed in the apparatus criticus, the last line of the edition
 % text\---the one the entry was previously attached to\---goes to the
 % next page. As a result, this entry also moves to the next page with
@@ -4205,11 +5200,25 @@
 %
 % An alert reader may have guessed that inserting a \cs{pagebreak} is
 % a good way to get out of the vicious circle. And surely, if only a
-% few pages are at stake, this is the way to go. However,
+% few pages be at stake, this is the way to go. However,
 % \cs{pagebreak} commands should only be inserted when the whole
 % edition text is ready for any substantial change in the preceding
 % pages may result in pages that break just after they begin.
 %
+% \paragraph{Conditional page breaks}
+% \DescribeMacro{\ekdpb} \cs{ekdpb}\oarg{page no}\marg{line no}
+% \newfeature[v1.2]\\
+% One way to avoid this inconvenience is to use \cs{ekdpb} instead of
+% the standard \cs{pagebreak} command provided by \LaTeX\ to insert
+% conditional page breaks. \cs{ekdpb} takes as mandatory argument the
+% line number, as it is printed in the margin, where the page break
+% should take place. An optional argument allows to further specify
+% the page number where the page break should occur. The value that is
+% expected is the page number as it is printed\===e.g.\ an Arabic,
+% Roman or alphanumeric number. If the specified conditions be not
+% met, then the page break is not triggered.
+%
+% \paragraph{Using \texttt{maxentries}}
 % Another way\---should the edition text fall into the vicious circle
 % too often\---is to limit the number of entries per page that a given
 % layer of apparatus criticus may accept as described above
@@ -4223,8 +5232,8 @@
 % should entries overflow on a given page, the edition text and the
 % apparatus criticus may clash again. As said above, a couple of
 % clashes can be managed with a couple of manually inserted page
-% breaks. But if there are too many of them, it is a good indication
-% that the selected value of |maxentries| is too to high.
+% breaks. But if there be too many of them, it is a good indication
+% that the selected value of |maxentries| is too high.
 %
 % Complex edition texts do have a magic number. An advisable way to
 % figure it out would be to start from a sample of only a few pages,
@@ -4262,9 +5271,9 @@
 % circumstantially arise.
 %
 % \paragraph{Superfluous Dots}
-% \label{sec:superfluous-dots}
-% As said above \vpageref{ref:ending-dot}, it is customary in some
-% editions to have a full stop printed at the end of the apparatus
+% \phts\label{sec:superfluous-dots} As said above
+% \vpageref{ref:ending-dot}, it is customary in some editions to have
+% a full stop printed at the end of the apparatus
 % criticus. \pkg{ekdosis} provides specific commands to achieve this
 % in a straightforward way, such as \cs{SetEndApparatus} and the
 % |ehook| optional argument of \cs{SetApparatus} and
@@ -4273,9 +5282,9 @@
 % if the last word of the apparatus criticus on a given page be an
 % abbreviation followed by a dot, such a setting will have two dots
 % printed at the end of the apparatus instead of one. The solution is
-% to define a command to have a dot printed only if it is not followed
-% by a dot, and append this command to the abbreviated form of the
-% word, like so:---
+% to define a command to have a dot printed only if not followed by a
+% dot, and append this command to the abbreviated form of the word,
+% like so:---
 % 
 % \iffalse
 %<*example>
@@ -4306,7 +5315,7 @@
 %   \cs{makeatletter} \dots\ \cs{makeatother}.
 % \item Line~10: \cs{ekddot} will only work with multiple-layer
 %   apparatus criticus. Therefore, \cs{DeclareAppa{\allowbreak}ratus}
-%   must be used even if only one layer of critical notes is needed.
+%   must be used even if only one layer of critical notes be needed.
 % \end{remarks}
 %
 % \paragraph{Backup of Essential Files}
@@ -4314,8 +5323,8 @@
 % the |.aux| corresponding \LaTeX\ auxiliary file and its own |.ekd|
 % auxiliary file so as to process labels and collect entries of the
 % apparatus criticus. If for whatever reason\---e.g.\ some unknown
-% command has been inserted\---the compilation freezes and so must be
-% aborted, it may happen that most of the edition text has to be
+% command has been inserted\---the compilation be frozen and so must
+% be aborted, it may happen that most of the edition text has to be
 % reconstructed page after page. For large and complex editions, this
 % makes advisable to have current versions of those files backed up
 % each time a new compilation begins, which can be achieved by
@@ -4496,20 +5505,21 @@
 % of options} can be used in the preamble or at any point of the
 % document, except inside environments set to receive an apparatus
 % criticus, namely the \env{ekdosis} environment or any other similar
-% environment declared by means of \cs{DeclareApparatus}.\footnote{See
-% above \vref{sec:declaring-layers}.} At the time of writing, there is
+% environment declared by means of the \env{alignment} environment or
+% \cs{SetAlignment}.\footnote{See above
+% \vref{sec:multiple-alignment}.}  At the time of writing, there is
 % only one option, as follows:---\\
 % \DescribeOption{autopar} |autopar|$=$\verb+true|false+
 % \hfill\tcboxverb{Default: true}\\
 % The algorithm described above applies for edition texts composed in
-% running paragraphs or in lines of poetry, but it may fail to produce
-% a valid \texttt{TEI xml} output with other arrangements, such as
+% running paragraphs or lines of poetry, but it may fail to produce a
+% valid \texttt{TEI xml} output with other arrangements, such as
 % performance texts or transcriptions of speech for which the
 % \texttt{TEI} Guidelines define specific rules.  |autopar=false|
 % instructs \pkg{ekdosis} to ignore blank lines in the |.tex| source
 % file as markers for paragraph boundaries. As a result, each
 % paragraph of the edition text must be found within an environment
-% associated with the \texttt{xml} |<p>| element, such as \env{ekdpar}
+% associated with the \texttt{xml} element |<p>|, such as \env{ekdpar}
 % or any other environment declared as such by means of \cs{EnvtoTEI}
 % described below in \vref{sec:new-cmds-envs}. A typical use case of
 % |autopar=false| is provided below in
@@ -4541,8 +5551,8 @@
 %
 % \danger It must be noted that \LaTeX\ labels that are provided in
 % commands such as \cs{label}, \cs{cite} and the like must also be
-% unique in the document. As \LaTeX\ will issue warnings if it finds
-% duplicates, \cs{ekdosis} does not check their uniqueness but will
+% unique in the document. As \LaTeX\ will issue warnings if duplicates
+% be found, \cs{ekdosis} does not check their uniqueness but will
 % issue warnings if such labels contain invalid strings.
 %
 % \subsection{Routine \LaTeX\ Commands and Environments}
@@ -4576,6 +5586,12 @@
 %     \cs{vpageref}|{label}| & |<ptr ="#label"/>| \\
 %     \cs{pagebreak}\meta{\oarg{1-4}} & no output \\
 %     \cs{mbox}\marg{text} &  \meta{text} \\
+%     \midrule
+%     \multicolumn{2}{c}{From the \pkg{extdash}\footcite{extdash}
+%     package:}\\
+%     \cs{---} or \cs{===} & --- \\
+%     \cs{--} or \cs{==} & -- \\
+%     \cs{-/} or \cs{=/} & ‐ \\
 %     \bottomrule
 % \end{xltabular}
 %
@@ -4590,8 +5606,6 @@
 %     |center| & |<p rend="align(center)"></p>| \\
 %     |quotation| & |<quote></quote>| \\
 %     |quoting| & |<quote></quote>| \\
-%     |ekdpar| & |<p></p>| \\
-%     |ekdverse| & |<lg></lg>| \\
 %     |verse| & |<lg></lg>| \\
 %     \bottomrule
 % \end{xltabular}
@@ -4603,7 +5617,7 @@
 % \cs{begin}|{quote}| \dots\ \cs{end}|{quote}| will result in
 % |<emph></emph>| and |<quote></quote>| respectively.
 %
-% For the same simple reason, if one wishes to have words within a
+% For the same simple reason, should one wish to have words within a
 % \texttt{TEI xml} element that does not have any \LaTeX\ equivalent,
 % all is needed is to define an inoperative \LaTeX\ command named
 % after the \texttt{TEI} element, like so:---
@@ -4816,6 +5830,7 @@
 % \fi
 %
 % \DescribeMacro{\TeXtoTEIPat}
+% \phts\label{ref:textoteipat}
 % \cs{TeXtoTEIPat}\marg{\TeX\ pattern}\marg{TEI pattern}\\
 % Finally, this more flexible\---and more delicate to
 % handle\---command uses pattern matching to instruct \pkg{ekdosis}
@@ -5055,7 +6070,7 @@
 %</example>
 % \fi
 %
-% \label{ref:ekdverse-ex}
+% \phts\label{ref:ekdverse-ex}
 % Finally, an extract of Silius Italicus' \emph{Punica}, Book~9,
 % ll.~30-2 follows (|.tex| source file, PDF output and \texttt{TEI}
 % output files):---
@@ -5106,7 +6121,7 @@
 %
 % \needspace{7\baselineskip}
 % \begin{alignment}[flush,tcols=1,texts=specimen,apparatus=specimen]
-% \setverselinenums{30}{0}
+% \resetlinenumber\resetvlinenumber[30]
 % \setlength{\vrightskip}{-1.5in}
 %   \begin{specimen}
 %     \begin{ekdverse}
@@ -5360,23 +6375,24 @@
 %   \item Text structure: milestone elements.
 %   \item Marginal edition texts: It may happen that the marginalia of
 %     manuscripts contain texts worth editing in addition to and along
-%     the main text to which they are linked by reference
-%     signs. 
+%     the main text to which they are linked by reference signs.
 %   \item Headers and footers: \cs{ekddiv} will provide top and bottom
 %     marks to be used in headers and footers.
 %   \end{enumerate}
 % \item Short-term (months):---
 %   \begin{enumerate}
-%   \item Poetry: The standard \env{verse} environment is supported by
-%     the current version of \pkg{ekdosis}, in addition to
-%     \env{ekdverse} an example of which has been provided above
-%     \vpageref{ref:ekdverse-ex}. \env{ekdverse} will provide refined
-%     options, such as metrical analysis, stanzaic forms, \emph{\&c.}
-%     Arabic poetry through the environments and commands provided by
-%     the \pkg{arabluatex} package will also be supported.
+%   \item Poetry: \pkg{ekdosis} is now able to load and use the
+%     facilities provided by the \pkg{verse} package. Refined options
+%     will be added, such as metrical analysis.  Arabic poetry through
+%     the environments and commands provided by the \pkg{arabluatex}
+%     package will also be supported. Other packages will also be
+%     considered for inclusion, such as \pkg{poetry} or
+%     \pkg{teubner}. In the end, \pkg{ekdosis} will provide a way for
+%     the typesetting of poetry which will allow for more flexibility
+%     and compatibility with \texttt{TEI xml}.
 %   \item Correspondence and alignment, segmentation: The functions
-%     are being tested at the time of writing and will be included
-%     shortly in \pkg{ekdosis}.
+%     are being tested at the time of writing and will be included in
+%     \pkg{ekdosis}.
 %   \end{enumerate}
 % \item Medium-term: Indexing, commands and environments for specific
 %   modules of the \texttt{TEI}.
@@ -6022,6 +7038,7 @@
 \newif\if at parnotesroman
 \newif\if at pkg@parnotes
 \newif\iftei at export
+\newif\if at pkg@poetry at verse
 \ekvdefinekeys{ekdosis}{
   choice layout = {float = {\@pkg at floattrue},
     footins = {\@pkg at floatfalse\@pkg at footinstrue}},
@@ -6034,7 +7051,9 @@
   initial divs = ekdosis,
   unknown-choice divs = \PackageError{ekdosis}{unknown divs=#1}{`divs'
     must be either `ekdosis' or `latex'.},
-  bool verse = \if at pkg@verse,
+  choice poetry = {verse = {\@pkg at poetry@versetrue}},
+  unknown-choice poetry = \PackageError{ekdosis}{unknown
+    poetry=#1}{`poetry' must be `verse' for now.},
   choice parnotes = {false = {},
     true = {\@pkg at parnotestrue},
     roman = {\@pkg at parnotestrue\@parnotesromantrue}},
@@ -6055,6 +7074,9 @@
     `tidy'.}
 }
 \ekvoProcessLocalOptions{ekdosis}
+\newif\ifekd at memoir@loaded
+\@ifclassloaded{memoir}{%
+  \ekd at memoir@loadedtrue\@pkg at poetry@versetrue}{}
 %    \end{macrocode}
 % \paragraph{Required Packages} \label{ref:ekdrequirements} In
 % addition to \pkg{iftex}, \pkg{expkv-opt} and \pkg{expkv-def}, a list
@@ -6074,7 +7096,7 @@
 \RequirePackage{ltxcmds}
 \RequirePackage{pdftexcmds}
 \RequirePackage{ifoddpage}
-\if at pkg@verse
+\if at pkg@poetry at verse
   \RequirePackage{verse}
 \fi
 \if at pkg@parnotes
@@ -6094,14 +7116,25 @@
 %   hooks meant to be shared by all declared apparatuses, such as the
 %   font size, the format of numerals, \emph{\&c.} This command can be
 %   used in the preamble or at any point of the document.
+%   \changes{v1.2}{2021/04/02}{general hooks: new option
+%   \texttt{lemmastyle}}
+%   \changes{v1.2}{2021/04/02}{general hooks: new option
+%   \texttt{readingstyle}}
 %    \begin{macrocode}
 \ekvdefinekeys{ekd at hooks}{
   store appfontsize = \ekd at appfontsize,
   store refnumstyle = \ekd at refnumstyle,
   store postrefnum = \ekd at postrefnum,
+  store lemmastyle = \ekd at lemmastyle,
+  store readingstyle = \ekd at readingstyle,
+  code initialrule = \def\ekd at initial@rule{#1\NLS},
+  default initialrule = \rule{0.4\columnwidth}{0.4pt},
+  noval noinitialrule = \undef\ekd at initial@rule,
   initial appfontsize = \footnotesize,
   initial refnumstyle = \bfseries,
-  initial postrefnum = ~
+  initial postrefnum = ~,
+  initial lemmastyle = {},
+  initial readingstyle = {}
 }
 \NewDocumentCommand{\SetHooks}{m}{\ekvset{ekd at hooks}{#1}}
 %    \end{macrocode}
@@ -6378,6 +7411,7 @@
   store bhook = \bhook at val,
   store ehook = \ehook at val,
   store maxentries = \limit at val,
+  store lang = \lang at val,
   initial direction = LR,
   initial delim = {},
   initial ehook = {\csname ekd at end@apparatus\endcsname}
@@ -6409,12 +7443,14 @@
     \luastringO{\sep at val},
     \luastringO{\bhook at val},
     \luastringO{\ehook at val},
-    \luastringO{\limit at val}
+    \luastringO{\limit at val},
+    \luastringO{\lang at val}
     )}
   \egroup
 }
 \@onlypreamble\DeclareApparatus
 %    \end{macrocode}
+% \end{macro}
 % \begin{macro}{\addentries}
 % \changes{v1.1}{2020/11/04}{modifies the number of accepted entries
 % on the current page.}
@@ -6432,6 +7468,37 @@
 }
 %    \end{macrocode}
 % \end{macro}
+% \begin{macro}{\ekdpb}
+% \changes{v1.2}{2021/04/02}{conditional page breaks}
+% \cs{ekdpk}\oarg{page no}\marg{line no} is used to insert conditional
+% page breaks by specifying that the page break should occur only on a
+% given line and optionally a given page. If the specified conditions
+% are met then this command triggers \cs{pagebreak}.
+%    \begin{macrocode}
+\NewDocumentCommand{\ekdpb}{o m}{%
+  \def\@tmpoarg{#1}%
+  \def\@tmpmarg{#2}%
+  \luadirect{ekdosis.dolnlab(\luastringN{#2})}%
+  \linelabel{\luadirect{tex.sprint(ekdosis.getlnlab())}}%
+  \def\tmp at ln{%
+    \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}}}%
+  \def\tmp at pg{%
+    \getpagerefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}}}%
+  \IfNoValueTF{#1}
+  {\ifnum
+    \pdf at strcmp{\@tmpmarg}{\tmp at ln} = 0
+    \pagebreak
+    \fi}
+  {\ifnum
+    \pdf at strcmp{\@tmpoarg}{\tmp at pg} = 0
+    \ifnum
+    \pdf at strcmp{\@tmpmarg}{\tmp at ln} = 0
+    \pagebreak
+    \fi
+    \fi
+  }\ignorespaces
+}
+%    \end{macrocode}
 % \end{macro}
 % Apparatus-related settings and functions. Some booleans to check if
 % an apparatus should be inserted and what is the current environment.
@@ -6471,8 +7538,8 @@
 % global optional argument |layout| be set to |footins|. Therefore, it
 % is not documented.
 %    \begin{macrocode}
- % \def\blfootnote{\gdef\@thefnmark{\relax}\@footnotetext}
-\def\blfootnote{\gdef\@thefnmark{}\@blfootnotetext}
+\def\blfootnote{\gdef\@thefnmark{\relax}\@footnotetext}
+ % \def\blfootnote{\gdef\@thefnmark{}\@blfootnotetext}
 \long\def\@blfootnotetext#1{\insert\footins{%
     \reset at font\footnotesize
     \interlinepenalty\interfootnotelinepenalty
@@ -6512,7 +7579,9 @@
   initial delim = {},
   store rule = \ekd at default@rule,
   initial rule = \rule{0.4\columnwidth}{0.4pt},
-  noval norule = \def\ekd at default@rule{\mbox{}}
+  noval norule = \def\ekd at default@rule{\mbox{}},
+  store lang = \ekd at singleapp@lang,
+  initial lang = \ltx at ifpackageloaded{babel}{\languagename}{}
 }
 %    \end{macrocode}
 % \begin{macro}{\SetApparatus}
@@ -6570,6 +7639,17 @@
 \NewDocumentCommand{\SetUnitDelimiter}{m}{\def\ekd at unit@delim{#1}}
 %    \end{macrocode}
 % \end{macro}
+% \begin{macro}{\SetApparatusLanguage}
+% \changes{v1.2}{2021/04/02}{defines an alternate language to be
+% applied in apparatus entries}
+% \cs{SetApparatusLang}\marg{languagename} can be used when
+% it is needed to apply in the apparatus criticus a language
+% different from the one that is selected in the edition text.
+%    \begin{macrocode}
+\NewDocumentCommand{\SetApparatusLanguage}{m}{%
+  \def\ekd at singleapp@lang{#1}}
+%    \end{macrocode}
+% \end{macro}
 % \begin{macro}{\footnoteruletrue}
 % \begin{macro}{\footnoterulefalse}
 % As \pkg{ekdosis} takes care of drawing a rule separating the main
@@ -6614,17 +7694,20 @@
 %    \end{macrocode}
 % \end{macro}
 % \begin{macro}{\NLS}
-% \cs{NLS} is adapted from a snippet written by Heiko Oberdiek. It is
-% used by \pkg{ekdosis} internally to prevent page breaks between
-% separating rules and subsequent notes. Therefore, it is not
-% documented.
+% \cs{NLS} was previously adapted from a snippet written by Heiko
+% Oberdiek. It is used by \pkg{ekdosis} internally to prevent page
+% breaks between separating rules and subsequent notes. Therefore, it
+% is not documented.
 %    \begin{macrocode}
 \newcommand*{\NLS}{%
-  \par%
-  \nobreak%
-  \vspace{-\parskip}%
-  \noindent%
-  \ignorespaces}
+  \nobreak\@normalcr\relax
+  % \par
+  % \nobreak
+  % \vspace{-\parskip}%
+  % \leavevmode
+  % \noindent
+  % \ignorespaces
+}
 %    \end{macrocode}
 % \end{macro}
 % This boolean is used to test if a given entry is to be preceded by a
@@ -6641,34 +7724,53 @@
 %    \begin{macrocode}
 \newif\ifekd at inside@app
 \def\add@@apparatus{%
-  \if at pkg@parnotes\parnotes\else\fi%
-  \if at pkg@footins%
-  \bgroup%
-  \ifrtl at app\setRL\else\setLR\fi%
+  \if at pkg@parnotes\parnotes\else\fi
+  \if at pkg@footins
+  \bgroup
+    \unless\ifekd at mapps
+      \ifrtl at app\pardir TRT\leavevmode\textdir TRT\else
+        \pardir TLT\leavevmode\textdir TLT\fi
+    \fi
   \blfootnote{%
-    \if at pkg@parnotes%
-    \if at parnotesroman%
-    \renewcommand*{\theparnotemark}{\roman{parnotemark}}\else\fi%
-    \parnoteclear\else\fi%
+    \if at pkg@parnotes
+    \if at parnotesroman
+    \renewcommand*{\theparnotemark}{\roman{parnotemark}}\else\fi
+    \parnoteclear\else\fi
     \ekd at inside@apptrue
-    \footnotesize\apparatus\unless\ifekd at mapps\ekd at end@apparatus\fi%
+    \ekd at appfontsize
+    \ifekd at mapps
+      \ifdefined\ekd at initial@rule
+        \ekd at initial@rule
+      \fi
+    \fi
+    \apparatus\unless\ifekd at mapps\ekd at end@apparatus\fi
     \ekd at inside@appfalse
     \if at pkg@parnotes\parnotes\parnotereset\else\fi
   }%
-  \egroup%
-  \fi%
-  \if at pkg@float%
-  \keyparbox[!b]{}{\ifrtl at app\setRL\else\setLR\fi%
-    \if at pkg@parnotes%
-    \if at parnotesroman%
-    \renewcommand*{\theparnotemark}{\roman{parnotemark}}\else\fi%
-    \parnoteclear\else\fi%
+  \egroup
+  \fi
+  \if at pkg@float
+  \keyparbox[!b]{}{%
+    \unless\ifekd at mapps
+      \ifrtl at app\pardir TRT\leavevmode\textdir TRT\else
+        \pardir TLT\leavevmode\textdir TLT\fi
+    \fi
+    \if at pkg@parnotes
+    \if at parnotesroman
+    \renewcommand*{\theparnotemark}{\roman{parnotemark}}\else\fi
+    \parnoteclear\else\fi
     \ekd at inside@apptrue
-    \ekd at appfontsize\apparatus\unless\ifekd at mapps\ekd at end@apparatus\fi%
+    \ekd at appfontsize
+    \ifekd at mapps
+      \ifdefined\ekd at initial@rule
+        \ekd at initial@rule
+      \fi
+    \fi
+    \apparatus\unless\ifekd at mapps\ekd at end@apparatus\fi
     \ekd at inside@appfalse
-    \if at pkg@parnotes\parnotes\parnotereset\else\fi%
+    \if at pkg@parnotes\parnotes\parnotereset\else\fi
   }%
-  \fi%
+  \fi
 }
 %    \end{macrocode}
 % Before inserting any new entry, \cs{add at apparatus} calls
@@ -6709,8 +7811,8 @@
 % addition to \cs{rightlinenum{\allowbreak}bers} and
 % \cs{leftlinenumbers}.
 %    \begin{macrocode}
-\def\outerlinenumbers{
-  \def\makeLineNumberRunning{
+\def\outerlinenumbers{%
+  \def\makeLineNumberRunning{%
     \checkoddpage
     \ifoddpage
     \linenumberfont\hskip\linenumbersep\hskip\textwidth
@@ -6718,10 +7820,10 @@
     \else
     \hss\linenumberfont\LineNumber\hskip\linenumbersep
     \fi
-  }
+  }%
 }
-\def\innerlinenumbers{
-  \def\makeLineNumberRunning{
+\def\innerlinenumbers{%
+  \def\makeLineNumberRunning{%
     \checkoddpage
     \ifoddpage
     \hss\linenumberfont\LineNumber\hskip\linenumbersep
@@ -6729,7 +7831,7 @@
     \linenumberfont\hskip\linenumbersep\hskip\textwidth
     \hbox to\linenumberwidth{\hss\LineNumber}\hss
     \fi
-  }
+  }%
 }
 %    \end{macrocode}
 % \end{macro}
@@ -6739,6 +7841,7 @@
 % numbering should start afresh at the top of each page.
 %    \begin{macrocode}
 \newif\ifekd at pagelineation
+\newif\ifekd at pagevlineation
 \NewDocumentCommand{\ekdatbegshihook}{}{%
   \ifekd at pagelineation\resetlinenumber\fi
 }
@@ -6749,11 +7852,17 @@
     document = \ekd at pagelineationfalse},
   unknown-choice lineation = \PackageError{ekdosis}{unknown
     lineation=#1}{`lineation' must be either `page' or `document'.},
+  choice vlineation = {page = \ekd at pagevlineationtrue,
+    document = \ekd at pagevlineationfalse},
+  unknown-choice vlineation = \PackageError{ekdosis}{unknown
+    vlineation=#1}{`vlineation' must be either `page' or `document'.},
   code modulonum = \chardef\c at linenumbermodulo#1\relax,
   noval modulo = \modulolinenumbers,
-  code vmodulonum = \if at pkg@verse\poemlines{#1}\fi,
-  initial vmodulonum = 1,
-  noval vmodulo = \if at pkg@verse\poemlines{5}\fi,
+  code vmodulo = \ifekd at memoir@loaded\linenumberfrequency{#1}
+                 \else\if at pkg@poetry at verse\poemlines{#1}\fi\fi,
+  initial vmodulo = 1,
+  default vmodulo = 5,
+  bool continuousvnum = \if at continuous@vnum,
   choice numbers = {elided = \ekd at elidednumberstrue,
     full = \ekd at elidednumbersfalse},
   unknown-choice numbers = \PackageError{ekdosis}{unknown
@@ -6765,7 +7874,12 @@
     outer = \outerlinenumbers},
   unknown-choice margin = \PackageError{ekdosis}{unknown
     margin=#1}{`margin' must be either `left', `right', \MessageBreak
-    `inner' or `outer'}
+    `inner' or `outer'},
+  choice vmargin = {
+    right = \if at pkg@poetry at verse\verselinenumbersright\fi,
+    left = \if at pkg@poetry at verse\verselinenumbersleft\fi},
+  unknown-choice vmargin = \PackageError{ekdosis}{unknown
+    vmargin=#1}{`margin' must be either `left' ot `right'}
 }
 %    \end{macrocode}
 % \begin{macro}{\SetLineation}
@@ -6830,52 +7944,55 @@
     =
     0
     \ifnum%
-    \getrefnumber{#1}
+    \pdf at strcmp{\getrefnumber{#1}}{\getrefnumber{#2}}
     =
-    \getrefnumber{#2}
-    % 
+    0
+    %
     \ifekd at mapps%
     \ifbool{subsq at unit@\ekdan at type}{%
       \ifnum%
-      \getrefnumber{#1}
+      \pdf at strcmp{\getrefnumber{#1}}{%
+        \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevnotelab())}}}
       =
-      \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevnotelab())}}
+      0
       \else
-      \LRnum{\getrefnumber{#1}}% issue the no
+      \LRnum{\getrefnumber{#1}}\unexpanded\expandafter{\ekd at postrefnum}% issue the no
       \fi%
     }%
-    {\LRnum{\getrefnumber{#1}}}% issue the no
+    {\LRnum{\getrefnumber{#1}}\unexpanded\expandafter{\ekd at postrefnum}}% issue the no
     \else
     \ifsubsq at unit%
-    % 
+    %
     \ifnum%
-    \getrefnumber{#1}
+    \pdf at strcmp{\getrefnumber{#1}}{%
+      \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevnotelab())}}}
     =
-    \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevnotelab())}}
+    0
     \else
-    \LRnum{\getrefnumber{#1}}% issue the no
+    \LRnum{\getrefnumber{#1}}\unexpanded\expandafter{\ekd at postrefnum}% issue the no
     \fi
-    % 
+    %
     \else
-    \LRnum{\getrefnumber{#1}}% issue the no
+    \LRnum{\getrefnumber{#1}}\unexpanded\expandafter{\ekd at postrefnum}% issue the no
     \fi
     \fi
-    % 
+    %
     \else
     \ifekd at elidednumbers
     \luadirect{tex.sprint(ekdosis.numrange(\luastring{\getrefnumber{#1}},
       \luastring{\getrefnumber{#2}}))}%
+        \unexpanded\expandafter{\ekd at postrefnum}% issue the nos
     \else
     \LRnum{\getrefnumber{#1}}--%
-    \LRnum{\getrefnumber{#2}}% issue the nos
+    \LRnum{\getrefnumber{#2}}\unexpanded\expandafter{\ekd at postrefnum}% issue the nos
     \fi
     \fi%
     \else
     \LRnum{\getrefnumber{#1}}--%
     \LRnum{\getpagerefnumber{#2}}.%
-    \LRnum{\getrefnumber{#2}}% issue pg and ln nos
+    \LRnum{\getrefnumber{#2}}\unexpanded\expandafter{\ekd at postrefnum}% issue pg and ln nos
     \fi%
-  }\unexpanded\expandafter{\ekd at postrefnum}%
+  }%
 }
 %    \end{macrocode}
 % \cs{current at ref} is pretty much the same as \cs{current at reg@arg},
@@ -6891,52 +8008,63 @@
     =
     0
     \ifnum%
-    \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}
+    \pdf at strcmp{%
+      \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+      {\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}
     =
-    \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}
-    % 
+    0
+    %
     \ifekd at mapps%
     \ifbool{subsq at unit@\ekdan at type}{%
       \ifnum%
-      \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}
+      \pdf at strcmp{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+      {\getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b}}
       =
-      \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b}
+      0
       \else
-      \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% issue the no
+      \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+        \unexpanded\expandafter{\ekd at postrefnum}% issue the no
       \fi%
-    }{\LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}}% issue the no
+    }{\LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+      \unexpanded\expandafter{\ekd at postrefnum}}% issue the no
     \else
     \ifsubsq at unit%
-    % 
+    %
     \ifnum%
-    \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}
+    \pdf at strcmp{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+    {\getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b}}
     =
-    \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b}
+    0
     \else
-    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% issue the no
+    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+      \unexpanded\expandafter{\ekd at postrefnum}% issue the no
     \fi
-    % 
+    %
     \else
-    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% issue the no
+    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+      \unexpanded\expandafter{\ekd at postrefnum}% issue the no
     \fi
     \fi
-    % 
+    %
     \else
     \ifekd at elidednumbers
     \luadirect{tex.sprint(ekdosis.numrange(
       \luastring{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}},
-      \luastring{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}))}% issue the nos
+      \luastring{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}))}%
+        \unexpanded\expandafter{\ekd at postrefnum}% issue the nos
     \else
     \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}--%
-    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}% issue the nos
+    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}%
+        \unexpanded\expandafter{\ekd at postrefnum}% issue the nos
     \fi
     \fi%
     \else
     \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}--%
     \LRnum{\getpagerefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}.%
-    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}% issue pg and ln nos
+    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}%
+      \unexpanded\expandafter{\ekd at postrefnum}% issue pg and ln nos
     \fi%
-  }\unexpanded\expandafter{\ekd at postrefnum}%
+  }%
 }
 %    \end{macrocode}
 % Define keys to be used by the optional arguments of \cs{lem} and
@@ -6984,6 +8112,19 @@
 }
 %    \end{macrocode}
 % \end{macro}
+% \begin{macro}{\app at lang}
+% This macro is used internally by \cs{lem}, \cs{rdg} and \cs{note} to
+% set the language for apparatus entries.
+%    \begin{macrocode}
+\def\app at lang{%
+  \ifekd at mapps
+  \luadirect{tex.sprint(ekdosis.getapplang(\luastring{\ekdan at type}))}%
+  \else
+  \ekd at singleapp@lang
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
 % \begin{macro}{\lem}
 % \cs{lem}\oarg{options}\marg{lemma text} inserts \meta{lemma text}
 % both in the edition text and in the apparatus criticus by default,
@@ -7031,13 +8172,15 @@
       \ifdefined\ekdlr at alt%
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
-        {\textdir TRT\unexpanded\expandafter{\ekdlr at alt}}%
+          {\textdir TRT\unexpanded\expandafter{\ekd at lemmastyle}%
+            \unexpanded\expandafter{\ekdlr at alt}}%
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
       \else
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
-        {\textdir TRT\unexpanded{#2}}%
+          {\textdir TRT\unexpanded\expandafter{\ekd at lemmastyle}%
+            \unexpanded{#2}}%
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
       \fi
@@ -7065,9 +8208,11 @@
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
         \ltx at ifpackageloaded{babel}%
-          {\noexpand\selectlanguage{\languagename}%
-            \unexpanded\expandafter{\ekdlr at alt}}%
-          {\unexpanded\expandafter{\ekdlr at alt}}%
+        {{\unexpanded\expandafter{\ekd at lemmastyle}%
+            \noexpand\selectlanguage{\app at lang}%
+            \unexpanded\expandafter{\ekdlr at alt}}}%
+        {\unexpanded\expandafter{\ekd at lemmastyle}%
+          \unexpanded\expandafter{\ekdlr at alt}}%
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
       \else
@@ -7074,8 +8219,10 @@
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
           \ltx at ifpackageloaded{babel}%
-          {{\noexpand\selectlanguage{\languagename}\unexpanded{#2}}}{%
-            {\unexpanded{#2}}}%
+          {{\unexpanded\expandafter{\ekd at lemmastyle}%
+              \noexpand\selectlanguage{\app at lang}%
+              \unexpanded{#2}}}{%
+            {\unexpanded\expandafter{\ekd at lemmastyle}\unexpanded{#2}}}%
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
       \fi
@@ -7125,13 +8272,15 @@
       \ifdefined\ekdlr at alt%
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
-        {\textdir TRT\unexpanded\expandafter{\ekdlr at alt}}%
+          {\textdir TRT\unexpanded\expandafter{\ekd at readingstyle}%
+            \unexpanded\expandafter{\ekdlr at alt}}%
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
       \else
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
-        {\textdir TRT\unexpanded{#2}}%
+          {\textdir TRT\unexpanded\expandafter{\ekd at readingstyle}%
+            \unexpanded{#2}}%
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
       \fi
@@ -7150,9 +8299,11 @@
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
         \ltx at ifpackageloaded{babel}%
-          {\noexpand\selectlanguage{\languagename}%
-            \unexpanded\expandafter{\ekdlr at alt}}%
-          {\unexpanded\expandafter{\ekdlr at alt}}%
+        {{\unexpanded\expandafter{\ekd at readingstyle}%
+            \noexpand\selectlanguage{\app at lang}%
+            \unexpanded\expandafter{\ekdlr at alt}}}%
+        {\unexpanded\expandafter{\ekd at readingstyle}%
+          \unexpanded\expandafter{\ekdlr at alt}}%
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
       \else
@@ -7159,8 +8310,9 @@
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
           \ltx at ifpackageloaded{babel}%
-          {{\noexpand\selectlanguage{\languagename}\unexpanded{#2}}}{%
-            {\unexpanded{#2}}}%
+          {{\unexpanded\expandafter{\ekd at readingstyle}%
+              \noexpand\selectlanguage{\app at lang}\unexpanded{#2}}}{%
+            {\unexpanded\expandafter{\ekd at readingstyle}\unexpanded{#2}}}%
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
       \fi
@@ -7241,7 +8393,8 @@
       \fi%
       \current at ref@arg{\ekdn at labelb}{\ekdn at labele}%\hskip .25em
       \ifdefined\ekdn at lem%
-          {\textdir TRT\unexpanded\expandafter{\ekdn at lem}}%
+      {\textdir TRT\unexpanded\expandafter{\ekd at lemmastyle}%
+        \unexpanded\expandafter{\ekdn at lem}}%
           \unless\ifekdn at nosep
           \unexpanded\expandafter{\ekdn at sep}\fi
           \else\fi%
@@ -7257,14 +8410,16 @@
       \current at ref@arg{\ekdn at labelb}{\ekdn at labele}%\hskip .25em
       \ifdefined\ekdn at lem
         \ltx at ifpackageloaded{babel}%
-          {\noexpand\selectlanguage{\languagename}%
+        {{\unexpanded\expandafter{\ekd at lemmastyle}%
+            \noexpand\selectlanguage{\app at lang}%
+              \unexpanded\expandafter{\ekdn at lem}}}%
+          {\unexpanded\expandafter{\ekd at lemmastyle}%
             \unexpanded\expandafter{\ekdn at lem}}%
-          {\unexpanded\expandafter{\ekdn at lem}}%
           \unless\ifekdn at nosep
           \unexpanded\expandafter{\ekdn at sep}\fi
           \else\fi%
           \ltx at ifpackageloaded{babel}%
-          {{\noexpand\selectlanguage{\languagename}\unexpanded{#2}}}{%
+          {{\noexpand\selectlanguage{\app at lang}\unexpanded{#2}}}{%
             {\unexpanded{#2}}}}}%
   \ifekd at mapps%
   \unconditional at appin[\ekdan at type]{\note at contents}%
@@ -7303,7 +8458,11 @@
     \ekvifdefinedNoVal{ekd at note}{post}{}{%
       \unexpanded\expandafter{\post at value}}%
   }%
+  \ifekd at mapps%
+  \append at app[\ekdan at type]{\note at contents}%
+  \else%
   \append at app{\note at contents}%
+  \fi%
   \egroup%
 }
 \NewDocumentCommand{\ekd at note@star}{O{} m}{%
@@ -7320,7 +8479,11 @@
       \append at app{\note at contents}%
     \egroup%
   \else
-    \append at app{\unskip\footnote{#2}}%
+    \ifekd at mapps%
+    \append at app[\ekdan at type]{\note at contents}%
+    \else%
+    \append at app{\note at contents}%
+    \fi%
   \fi%
 }
 \NewDocumentCommand{\note at app}{s O{} +m}{%
@@ -7721,19 +8884,67 @@
 }
 %    \end{macrocode}
 % \end{macro}
+% \paragraph{Poetry Settings}
 % \begin{environment}{ekdverse}
 %   \env{ekdverse} provides an implementation of poetry lines. It is
 %   set to use either the \pkg{lineno} or the \pkg{verse} package
 %   depending on the value that is passed to the global option
-%   |verse|:---
+%   |poetry|.
+% \begin{macro}{\test at vpnum}
+% \cs{test at vpnum} is used internally when |ekdosis| needs to know
+% whether two subsequent lines are printed on the same page or not.
 %    \begin{macrocode}
-\if at pkg@verse
-\verselinenumfont{\normalfont\footnotesize}
+\newif\ifekd at test@vpnum
+\newcounter{ekd at vpnum}
+\globalcounter{ekd at vpnum}
+\NewDocumentCommand{\test at vpnum}{}{%
+  \ifekd at test@vpnum
+    \edef\@tempa{\theekd at vpnum}%
+    \stepcounter{ekd at vpnum}%
+    \label{vpnum:\theekd at vpnum}%
+    \ifnum
+      \pdf at strcmp{\getpagerefnumber{vpnum:\@tempa}}%
+        {\getpagerefnumber{vpnum:\theekd at vpnum}}
+        = 0
+      \else
+        \resetvlinenumber
+    \fi
+  \else
+  \label{vpnum:\theekd at vpnum}%
+  \global\ekd at test@vpnumtrue
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% A small patch is applied to the \pkg{verse} package, then
+% \env{ekdverse} is defined:---
+%    \begin{macrocode}
+\if at pkg@poetry at verse
+\patchcmd{\start at vsline}{%
+  \ifaltindent}{%
+  \ifekd at pagevlineation\test at vpnum\fi
+  \ifaltindent}{}{}
+\ekvdefinekeys{ekd at verse}{
+  dimen width = \vwidth at val,
+  initial width = \linewidth,
+  code type = \def\type at value{#1},
+}
+\ifekd at memoir@loaded
+  \linenumberfont{\normalfont\footnotesize}
+\else
+  \verselinenumfont{\normalfont\footnotesize}
+\fi
 \setcounter{poemline}{1}
-\NewDocumentEnvironment{ekdverse}{O{\linewidth}}{%
+\NewDocumentEnvironment{ekdverse}{!O{}}{%
+  \ekvset{ekd at verse}{#1}%
+  \if at continuous@vnum\setverselinenums{\thelinenumber}{0}\fi
   \nolinenumbers
   \let\linelabel\label
-  \stepcounter{verse at envctr}%
+  \ifekd at memoir@loaded
+    \refstepcounter{verse}%
+  \else
+    \stepcounter{verse at envctr}%
+  \fi
   \addtocounter{poemline}{-1}\refstepcounter{poemline}%
   \setcounter{vslineno}{1}%
   \let\\=\@vscentercr
@@ -7744,22 +8955,26 @@
           \setlength{\itemsep}{0pt}%
           \setlength{\topsep}{0pt}%
           \setlength{\partopsep}{0pt}%
-          \ifdim #1 < \linewidth
+          \ifdim\vwidth at val < \linewidth
             \rightmargin        \z@
             \setlength{\leftmargin}{\linewidth}%
-            \addtolength{\leftmargin}{-#1}%
+            \addtolength{\leftmargin}{-\vwidth at val}%
             \addtolength{\leftmargin}{-0.5\leftmargin}%
           \else
             \rightmargin        \leftmargin
           \fi
           \addtolength{\leftmargin}{\vindent}}%
-  \item[]%
+  \item[]\ifekd at pagevlineation\test at vpnum\fi%
 }
-{\endlist}
+{\endlist
+  \if at continuous@vnum\resetlinenumber[\thepoemline]\fi}
+%    \end{macrocode}
+% Finally, this is the standard \env{verse} environment:---
+%    \begin{macrocode}
 \else
 \newlength{\ekdverseindentlength}
 \setlength{\ekdverseindentlength}{\parindent}
-\NewDocumentEnvironment{ekdverse}{O{\ekdverseindentlength}}{
+\NewDocumentEnvironment{ekdverse}{!O{\ekdverseindentlength}}{
   \begin{list}{}{%
       \setlength{\leftmargin}{#1}
       \setlength{\itemsep}{0pt}
@@ -7771,6 +8986,35 @@
 \fi
 %    \end{macrocode}
 % \end{environment}
+% \begin{macro}{\resetvlinenumber}
+% \changes{v1.2}{2021/04/02}{resets line numbers in poetry environments}
+% This command is the equivalent of \cs{resetlinenumber} for lines of
+% poetry. It takes an integer as optional argument, which is |1| by
+% default.
+%    \begin{macrocode}
+\NewDocumentCommand{\resetvlinenumber}{O{1}}{%
+  \if at pkg@poetry at verse
+  \setverselinenums{#1}{0}%
+  \fi
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{ekdstanza}
+%   \changes{v1.2}{2021/04/02}{new environment for stanzas}
+%   \env{ekdstanza} is needed when lines are grouped into stanzas,
+%   which can be further named by means of the |type| optional
+%   argument:---
+%    \begin{macrocode}
+\ekvdefinekeys{ekd at stanza}{
+  code type = \def\type at value{#1}
+}
+\NewDocumentEnvironment{ekdstanza}{!O{}}{%
+  \leavevmode\unskip
+  \ekvset{ekd at stanza}{#1}%
+  \ignorespaces
+}{}
+%    \end{macrocode}
+% \end{environment}
 % \begin{environment}{ekdpar}
 %   When |autopar| is set to |false| by means of \cs{SetTEIxmlExport},
 %   \env{ekdpar}\---or any other environment set to be inserted within
@@ -7780,7 +9024,14 @@
 \NewDocumentEnvironment{ekdpar}{}{\par}{\par}
 %    \end{macrocode}
 % \end{environment}
-%
+% \paragraph{Configuration File} Finally, if a configuration file
+% named |\jobname-ekd.cfg| can be found, this file is read and its
+% contents loaded into the document preamble. This provides a
+% convenient way to gather all the settings related to the critical
+% edition in a separate file.
+%    \begin{macrocode}
+\IfFileExists{\jobname-ekd.cfg}{\input{\jobname-ekd.cfg}}{}
+%    \end{macrocode}
 % \iffalse
 %</package>
 % \fi
@@ -7821,14 +9072,17 @@
 local lemrdg = lpeg.Cs(lpeg.Cs("lem") + lpeg.Cs("rdg"))
 local note = lpeg.Cs("note")
 local lnbrk = lpeg.Cs("\\\\")
-local poemline = lpeg.Cs(lnbrk * bsqbrackets^-1)
-local endpoem = lpeg.Cs(lnbrk * lpeg.S("*!") * bsqbrackets^-1)
+local poemline = lpeg.Cs(lnbrk * spcenc^-1 * lpeg.S("*!")^-1 * bsqbrackets^-1 * spcenc^-1)
+local poemlinebreak = lpeg.Cs(lnbrk * spcenc^-1 * lpeg.P(">") * bsqbrackets^-1 * spcenc^-1)
+local linegroup = lpeg.Cs{ "<lg" * ((1 - lpeg.S"<>") + lpeg.V(1))^0 * ">" }
+local bclinegroup = lpeg.Cs(linegroup + lpeg.P("</lg>"))
+local endpoem = lpeg.Cs(lnbrk * lpeg.S("*!") * bsqbrackets^-1) -- not used
 local sections = lpeg.Cs(lpeg.P("book") + lpeg.P("part") + lpeg.P("chapter")
 			    + lpeg.P("section") + lpeg.P("subsection")
 			    + lpeg.P("subsubsection"))
 local par =  lpeg.P(lpeg.P("\\par") * spce^0)
-local parb = lpeg.P(lpeg.Cs("\\p at rb") * spce^0)
-local para = lpeg.P(lpeg.Cs("\\p at ra") * spce^0)
+local parb = lpeg.P(lpeg.P("\\p at rb") * spce^0)
+local para = lpeg.P(lpeg.P("\\p at ra") * spce^0)
 local labelrefcmds = lpeg.Cs(lpeg.P("label")
 			       + lpeg.P("linelabel")
 			       + lpeg.P("lineref")
@@ -8170,8 +9424,12 @@
    {a="\\addentries%s+%[(.-)%]{(.-)}", b=""},
    {a="\\addentries%s+{(.-)}", b=""},
    {a="\\setverselinenums%s+{(.-)}{(.-)}", b=""},
+   {a="\\resetvlinenumber%s+%[(.-)%]", b=""},
+   {a="\\resetvlinenumber%s+", b=""},
    {a="\\resetlinenumber%s+%[(.-)%]", b=""},
    {a="\\resetlinenumber%s+", b=""},
+   {a="\\indentpattern%s+{(.-)}", b=""},
+   {a="\\settowidth%s+{(.-)}{(.-)}", b=""},
    {a="\\poemlines%s+{(.-)}", b=""},
    {a="\\pagebreak%s+%[[1-4]%]", b=""},
    {a="\\pagebreak%s+", b=""},
@@ -8178,7 +9436,14 @@
    {a="\\altrfont%s+", b=""},
    {a="\\mbox%s+{(.-)}", b="%1"},
    {a="\\LR%s+{(.-)}", b="%1"},
-   {a="\\RL%s+{(.-)}", b="%1"}
+   {a="\\RL%s+{(.-)}", b="%1"},
+   {a="\\%=%=%=%s?", b="—"},
+   {a="\\%-%-%-%s?", b="—"},
+   {a="\\%=%=%s?", b="–"},
+   {a="\\%-%-%s?", b="–"},
+   {a="\\%=%/%s?", b="‐"},
+   {a="\\%-%/%s?", b="‐"},
+   {a="\\vin%s+", b=""}
 }
 
 local envtotags = {
@@ -8185,13 +9450,11 @@
    {a="flushright", b="p", c=" rend=\"align(right)\""},
    {a="flushleft", b="p", c=" rend=\"align(left)\""},
    {a="quotation", b="quote", c=""},
-   {a="ekdverse", b="lg", c=""},
    {a="txarabtr", b="p", c=" xml:lang=\"ar-Latn\" type=\"transliterated\""},
    {a="quoting", b="quote", c=""},
    {a="ekdpar", b="p", c=""},
    {a="txarab", b="p", c=" xml:lang=\"arb\""},
    {a="center", b="p", c=" rend=\"align(center)\""},
-   {a="verse", b="lg", c=""},
    {a="arab", b="p",
     c=" xml:lang=\"ar-Latn\" type=\"transliterated\" subtype=\"arabtex\""}
 }
@@ -8226,8 +9489,16 @@
    pat = string.gsub(pat, "([%[%]])", "%%%1")
    pat = string.gsub(pat, "%#[1-9]", "(.-)")
    repl = string.gsub(repl, "%#([1-9])", "%%%1")
-   table.insert(texpatttotags, { a = pat, b = repl })
-   table.sort(texpatttotags, function(a ,b) return(#a.a > #b.a) end)
+   if isintable(texpatttotags, pat)
+   then
+      local index = get_a_index(pat, texpatttotags)
+      table.remove(texpatttotags, index)
+      table.insert(texpatttotags, { a = pat, b = repl })
+      table.sort(texpatttotags, function(a ,b) return(#a.a > #b.a) end)
+   else
+      table.insert(texpatttotags, { a = pat, b = repl })
+      table.sort(texpatttotags, function(a ,b) return(#a.a > #b.a) end)
+   end
    return true
 end
 
@@ -8401,32 +9672,69 @@
 end
 
 local function linestotei(str)
---   str = "\n<l>"..str
-   str = string.gsub(str, "^%s?(.-)\\\\[%!%*]?%s?$", "\n<l>%1</l>\n")
---   str = gsub(str, endpoem, "</l>\n")
-   str = gsub(str, poemline * spcenc^-1 * lpeg.P(">"), "\n<lb/>")
-   str = gsub(str, poemline * spcenc^-1, "</l>\n<l>")
---   str = str.."</l>\n"
+   if not string.find(str, "^%s?<lg")
+   then
+      str = "\n<l>"..str
+   end
+   str = gsub(str, poemline * spcenc^0 * bclinegroup, "</l>\n%2")
+   str = gsub(str, linegroup * -(spcenc^0 * bclinegroup), "%1\n<l>")
+   str = gsub(str, lpeg.Cs("</lg>") * -(spcenc^0 * (bclinegroup + -1)), "%1\n<l>")
+   -- str = gsub(str, poemline * spcenc^-1 * -1, "</l>\n")
+   str = gsub(str, poemlinebreak, "<lb/> ")
+   -- str = gsub(str, poemline * spcenc^-1 * lpeg.Cs("<lg"), "</l>%2")
+   -- str = gsub(str, lpeg.Cs("</lg>") * spcenc^1 * -lpeg.P("<l"), "%1\n<l>")
+   str = gsub(str, poemline, "</l>\n<l>")
    return str
 end
 
+local function stanzatotei(str)
+   str = string.gsub(str, "\\begin%s?%{ekdstanza%}(%b[])(.-)\\end%s?%{ekdstanza%}", function(opt, arg)
+			arg = string.gsub(arg, "\\par%s?", "")
+			opt = string.sub(opt, 2, -2)
+			teitype = get_attr_value(opt, "type")
+			if teitype ~= "" then teitype = " type=\""..teitype.."\"" else end
+			if opt == ""
+			then
+			   return string.format("<lg>%s</lg>", arg)
+			else
+			   return string.format("<lg%s>%s</lg>", teitype, arg)
+			end
+   end)
+   str = string.gsub(str, "\\begin%s?%{ekdstanza%}(.-)\\end%s?%{ekdstanza%}", function(arg)
+			arg = string.gsub(arg, "\\par%s?", "")
+			return string.format("<lg>%s</lg>", arg)
+   end)
+   return str
+end
+
 -- better use lpeg: look into this later
 local function versetotei(str)
-   str = string.gsub(str, "(\\begin%s?%{ekdverse%})(%b[])(.-)(\\end%s?%{ekdverse%})", function(benv, opt, arg, eenv)
-			arg = linestotei(arg)
-			return string.format("%s%s%s%s", benv, opt, arg, eenv)
+   str = string.gsub(str, "\\begin%s?%{ekdverse%}(%b[])(.-)\\end%s?%{ekdverse%}", function(opt, arg)
+			arg = string.gsub(arg, "\\par%s?", "")
+			arg = string.gsub(arg, "\\begin%s?%{patverse%*?%}", "")
+			arg = string.gsub(arg, "\\end%s?%{patverse%*?%}", "")
+			arg = string.gsub(arg, "\\indentpattern%s?%b{}", "")
+			opt = string.sub(opt, 2, -2)
+			teitype = get_attr_value(opt, "type")
+			if teitype ~= "" then teitype = " type=\""..teitype.."\"" else end
+			if opt == ""
+			then
+			   return "\\p at rb "..linestotei(string.format("<lg>%s</lg>", arg)).."\\p at ra "
+			else
+			   return "\\p at rb "..linestotei(string.format("<lg%s>%s</lg>", teitype, arg)).."\\p at ra "
+			end
    end)
-   str = string.gsub(str, "(\\begin%s?%{ekdverse%})(.-)(\\end%s?%{ekdverse%})", function(benv, arg, eenv)
-			arg = linestotei(arg)
-			return string.format("%s%s%s", benv, arg, eenv)
+   str = string.gsub(str, "\\begin%s?%{ekdverse%}(.-)\\end%s?%{ekdverse%}", function(arg)
+			arg = string.gsub(arg, "\\par%s?", "")
+			return "\\p at rb "..linestotei(string.format("<lg>%s</lg>", arg)).."\\p at ra "
    end)
-   str = string.gsub(str, "(\\begin%s?%{verse%})(%b[])(.-)(\\end%s?%{verse%})", function(benv, opt, arg, eenv)
-			arg = linestotei(arg)
-			return string.format("%s%s%s%s", benv, opt, arg, eenv)
+   str = string.gsub(str, "\\begin%s?%{verse%}%b[](.-)\\end%s?%{verse%}", function(arg)
+			arg = string.gsub(arg, "\\par%s?", "")
+			return "\\p at rb "..linestotei(string.format("<lg>%s</lg>", arg)).."\\p at ra "
    end)
-   str = string.gsub(str, "(\\begin%s?%{verse%})(.-)(\\end%s?%{verse%})", function(benv, arg, eenv)
-			arg = linestotei(arg)
-			return string.format("%s%s%s", benv, arg, eenv)
+   str = string.gsub(str, "\\begin%s?%{verse%}(.-)\\end%s?%{verse%}", function(arg)
+			arg = string.gsub(arg, "\\par%s?", "")
+			return "\\p at rb "..linestotei(string.format("<lg>%s</lg>", arg)).."\\p at ra "
    end)
    return str
 end
@@ -8897,7 +10205,7 @@
    end
    for ndivi = 1, maxdepth
    do
-      str = string.gsub(str, "(<div .-depth%=\")("..ndivi..")(\".->)(.-)(<div .-depth%=\")(%d)(\".->)",
+      str = string.gsub(str, "(<div [^%>]-[Dd]epth%=\")("..ndivi..")(\".->)(.-)(<div [^%>]-depth%=\")(%d)(\".->)",
 			function(bdivi, ndivi, edivi, between, bdivii, ndivii, edivii)
 			   local firstdiv = ndivi
 			   local lastdiv = ndivii
@@ -8914,11 +10222,17 @@
 				 firstdivindex = firstdivindex - 1
 			      end
 			   end
+			   bdivii = string.gsub(bdivii, "depth", "Depth")
 			   return string.format("%s%s%s%s%s%s%s%s",
-						bdivi, ndivi, edivi, between, closedivs, bdivii, ndivii, edivii)
+						bdivi, ndivi, edivi, between,
+						closedivs, bdivii, ndivii, edivii)
       end)
    end
-   str = string.gsub(str, "(<div.-)(%sdepth%=\"%d\")(.->)", "%1%3")
+   return str
+end
+
+local function clean_ekddivs(str)
+   str = string.gsub(str, "(<div.-)(%s[Dd]epth%=\"%d\")(.->)", "%1%3")
    used_ndivs = {}
    return str
 end
@@ -8926,7 +10240,7 @@
 local function close_ndivs_in_between(str)
    for ndivi = 1, 6
    do
-      str = string.gsub(str, "(<div)("..ndivi..")(.->)(.-)(<div)([1-6])(.->)",
+      str = string.gsub(str, "(<[Dd]iv)("..ndivi..")(.->)(.-)(<div)([1-6])(.->)",
 			function(bdivi, ndivi, edivi, between, bdivii, ndivii, edivii)
 			   local firstdiv = ndivi
 			   local lastdiv = ndivii
@@ -8943,11 +10257,17 @@
 			   	 firstdivindex = firstdivindex - 1
 			      end
 			   end
+			   bdivii = string.gsub(bdivii, "div", "Div")
 			   return string.format("%s%s%s%s%s%s%s%s",
-						bdivi, ndivi, edivi, between, closedivs, bdivii, ndivii, edivii)
-			
+						bdivi, ndivi, edivi, between,
+						closedivs, bdivii, ndivii, edivii)
    end)
    end
+   return str
+end
+
+local function clean_latexdivs(str)
+   str = string.gsub(str, "(<Div)([1-6])(.->)", "<div%2%3")
    used_ndivs = {}
    return str
 end
@@ -8960,6 +10280,7 @@
    str = rdgGrp_totei(str)
    str = lem_rdg_totei(str)
    str = relocate_notes(str)
+   str = stanzatotei(str)
    str = versetotei(str)
    str = envtotei(str)
    str = ekddivs_totei(str)
@@ -8972,9 +10293,13 @@
    then
       str = close_ekddivs_at_end(str)
       str = close_ekddivs_in_between(str)
+      str = close_ekddivs_in_between(str)
+      str = clean_ekddivs(str)
    else
       str = close_ndivs_at_end(str)
       str = close_ndivs_in_between(str)
+      str = close_ndivs_in_between(str)
+      str = clean_latexdivs(str)
    end
    return str
 end
@@ -9478,7 +10803,8 @@
 			      appsep,
 			      appbhook,
 			      appehook,
-			      applimit)
+			      applimit,
+			      applang)
    if isintable(apparatuses, teitype)
    then
       tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\""
@@ -9492,12 +10818,23 @@
 				 sep = appsep,
 				 bhook = appbhook,
 				 ehook = appehook,
-				 limit = applimit})
+				 limit = applimit,
+				 lang = applang})
    end
    bagunits[teitype] = 1
    return true
 end
 
+function ekdosis.getapplang(teitype)
+   i = get_a_index(teitype, apparatuses)
+   if apparatuses[i].lang ~= ""
+   then
+      return apparatuses[i].lang
+   else
+      return "\\languagename"
+   end
+end
+
 function ekdosis.getappdelim(str)
    for i = 1,#apparatuses
    do
@@ -9593,7 +10930,7 @@
       local output = {}
       if next(apparatuses) == nil then
 	 -- table.insert(output, "BEGIN")
-	 table.insert(output, "\\noindent\\csname ekd at default@rule\\endcsname\\NLS")
+	 table.insert(output, "\\csname ekd at default@rule\\endcsname\\NLS")
 	 table.insert(output, "\\csname ekd at begin@apparatus\\endcsname\\ignorespaces")
 --	 table.insert(output, "\\noindent ")
 	 for i in string.gmatch(t,
@@ -9608,6 +10945,7 @@
 	 end
 	 -- table.insert(output, "END")
       else
+	 local appinserted = false
 	 local n = 1
 	 while apparatuses[n]
 	 do
@@ -9622,16 +10960,19 @@
 	       table.insert(output, "\\bgroup{}")
 	       if apparatuses[n].direction == "LR"
 	       then
-		  table.insert(output, "\\pardir TLT\\textdir TLT{}")
+		  table.insert(output, "\\pardir TLT\\leavevmode\\textdir TLT{}")
 	       elseif apparatuses[n].direction == "RL"
 	       then
-		  table.insert(output, "\\pardir TRT\\textdir TRT{}")
+		  table.insert(output, "\\pardir TRT\\leavevmode\\textdir TRT{}")
 	       end
 	       if apparatuses[n].rule == "none"
 	       then
 		  if n > 1
 		  then
-		     table.insert(output, "\\NLS{}")
+		     if appinserted
+		     then
+			table.insert(output, "\\NLS{}")
+		     end
 		  else
 		     table.insert(output, "\\noindent ")
 		  end
@@ -9639,7 +10980,12 @@
 	       then
 		  if n > 1
 		  then
-		     table.insert(output, "\\NLS{}" .. apparatuses[n].rule .. "\\NLS{}")
+		     if appinserted
+		     then
+			table.insert(output, "\\NLS{}" .. apparatuses[n].rule .. "\\NLS{}")
+		     else
+			table.insert(output, apparatuses[n].rule .. "\\NLS{}")
+		     end
 		  else
 --		     table.insert(output, "\\noindent ")
 		     table.insert(output, apparatuses[n].rule .. "\\NLS{}")
@@ -9647,7 +10993,12 @@
 	       else
 		  if n > 1
 		  then
-		     table.insert(output, "\\NLS\\csname ekd at default@rule\\endcsname\\NLS{}")
+		     if appinserted
+		     then
+			table.insert(output, "\\NLS\\csname ekd at default@rule\\endcsname\\NLS{}")
+		     else
+			table.insert(output, "\\csname ekd at default@rule\\endcsname\\NLS{}")
+		     end
 		  else
 --		     table.insert(output, "\\noindent ")
 		     table.insert(output, "\\csname ekd at default@rule\\endcsname\\NLS{}")
@@ -9673,6 +11024,7 @@
 					 ..curcol.."%-"..n..">")
 	       do
 		  table.insert(output, i)
+		  appinserted = true
 	       end
 	       if apparatuses[n].ehook ~= ""
 	       then

Modified: trunk/Master/texmf-dist/source/lualatex/ekdosis/ekdosis.ins
===================================================================
--- trunk/Master/texmf-dist/source/lualatex/ekdosis/ekdosis.ins	2021-04-04 01:52:15 UTC (rev 58720)
+++ trunk/Master/texmf-dist/source/lualatex/ekdosis/ekdosis.ins	2021-04-04 01:53:22 UTC (rev 58721)
@@ -12,7 +12,7 @@
 This file is part of the `ekdosis' package
 
 ekdosis -- Typesetting TEI xml compliant critical editions
-Copyright (C) 2020  Robert Alessi
+Copyright (C) 2020--2021  Robert Alessi
 
 Please send error reports and suggestions for improvements to Robert
 Alessi <alessi at robertalessi.net>

Modified: trunk/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.lua
===================================================================
--- trunk/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.lua	2021-04-04 01:52:15 UTC (rev 58720)
+++ trunk/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.lua	2021-04-04 01:53:22 UTC (rev 58721)
@@ -2,7 +2,7 @@
 This file is part of the `ekdosis' package
 
 ekdosis -- Typesetting TEI xml-compliant critical editions
-Copyright (C) 2020  Robert Alessi
+Copyright (C) 2020--2021  Robert Alessi
 
 Please send error reports and suggestions for improvements to Robert
 Alessi <alessi at robertalessi.net>
@@ -52,14 +52,17 @@
 local lemrdg = lpeg.Cs(lpeg.Cs("lem") + lpeg.Cs("rdg"))
 local note = lpeg.Cs("note")
 local lnbrk = lpeg.Cs("\\\\")
-local poemline = lpeg.Cs(lnbrk * bsqbrackets^-1)
-local endpoem = lpeg.Cs(lnbrk * lpeg.S("*!") * bsqbrackets^-1)
+local poemline = lpeg.Cs(lnbrk * spcenc^-1 * lpeg.S("*!")^-1 * bsqbrackets^-1 * spcenc^-1)
+local poemlinebreak = lpeg.Cs(lnbrk * spcenc^-1 * lpeg.P(">") * bsqbrackets^-1 * spcenc^-1)
+local linegroup = lpeg.Cs{ "<lg" * ((1 - lpeg.S"<>") + lpeg.V(1))^0 * ">" }
+local bclinegroup = lpeg.Cs(linegroup + lpeg.P("</lg>"))
+local endpoem = lpeg.Cs(lnbrk * lpeg.S("*!") * bsqbrackets^-1) -- not used
 local sections = lpeg.Cs(lpeg.P("book") + lpeg.P("part") + lpeg.P("chapter")
 			    + lpeg.P("section") + lpeg.P("subsection")
 			    + lpeg.P("subsubsection"))
 local par =  lpeg.P(lpeg.P("\\par") * spce^0)
-local parb = lpeg.P(lpeg.Cs("\\p at rb") * spce^0)
-local para = lpeg.P(lpeg.Cs("\\p at ra") * spce^0)
+local parb = lpeg.P(lpeg.P("\\p at rb") * spce^0)
+local para = lpeg.P(lpeg.P("\\p at ra") * spce^0)
 local labelrefcmds = lpeg.Cs(lpeg.P("label")
 			       + lpeg.P("linelabel")
 			       + lpeg.P("lineref")
@@ -401,8 +404,12 @@
    {a="\\addentries%s+%[(.-)%]{(.-)}", b=""},
    {a="\\addentries%s+{(.-)}", b=""},
    {a="\\setverselinenums%s+{(.-)}{(.-)}", b=""},
+   {a="\\resetvlinenumber%s+%[(.-)%]", b=""},
+   {a="\\resetvlinenumber%s+", b=""},
    {a="\\resetlinenumber%s+%[(.-)%]", b=""},
    {a="\\resetlinenumber%s+", b=""},
+   {a="\\indentpattern%s+{(.-)}", b=""},
+   {a="\\settowidth%s+{(.-)}{(.-)}", b=""},
    {a="\\poemlines%s+{(.-)}", b=""},
    {a="\\pagebreak%s+%[[1-4]%]", b=""},
    {a="\\pagebreak%s+", b=""},
@@ -409,7 +416,14 @@
    {a="\\altrfont%s+", b=""},
    {a="\\mbox%s+{(.-)}", b="%1"},
    {a="\\LR%s+{(.-)}", b="%1"},
-   {a="\\RL%s+{(.-)}", b="%1"}
+   {a="\\RL%s+{(.-)}", b="%1"},
+   {a="\\%=%=%=%s?", b="—"},
+   {a="\\%-%-%-%s?", b="—"},
+   {a="\\%=%=%s?", b="–"},
+   {a="\\%-%-%s?", b="–"},
+   {a="\\%=%/%s?", b="‐"},
+   {a="\\%-%/%s?", b="‐"},
+   {a="\\vin%s+", b=""}
 }
 
 local envtotags = {
@@ -416,13 +430,11 @@
    {a="flushright", b="p", c=" rend=\"align(right)\""},
    {a="flushleft", b="p", c=" rend=\"align(left)\""},
    {a="quotation", b="quote", c=""},
-   {a="ekdverse", b="lg", c=""},
    {a="txarabtr", b="p", c=" xml:lang=\"ar-Latn\" type=\"transliterated\""},
    {a="quoting", b="quote", c=""},
    {a="ekdpar", b="p", c=""},
    {a="txarab", b="p", c=" xml:lang=\"arb\""},
    {a="center", b="p", c=" rend=\"align(center)\""},
-   {a="verse", b="lg", c=""},
    {a="arab", b="p",
     c=" xml:lang=\"ar-Latn\" type=\"transliterated\" subtype=\"arabtex\""}
 }
@@ -457,8 +469,16 @@
    pat = string.gsub(pat, "([%[%]])", "%%%1")
    pat = string.gsub(pat, "%#[1-9]", "(.-)")
    repl = string.gsub(repl, "%#([1-9])", "%%%1")
-   table.insert(texpatttotags, { a = pat, b = repl })
-   table.sort(texpatttotags, function(a ,b) return(#a.a > #b.a) end)
+   if isintable(texpatttotags, pat)
+   then
+      local index = get_a_index(pat, texpatttotags)
+      table.remove(texpatttotags, index)
+      table.insert(texpatttotags, { a = pat, b = repl })
+      table.sort(texpatttotags, function(a ,b) return(#a.a > #b.a) end)
+   else
+      table.insert(texpatttotags, { a = pat, b = repl })
+      table.sort(texpatttotags, function(a ,b) return(#a.a > #b.a) end)
+   end
    return true
 end
 
@@ -632,32 +652,69 @@
 end
 
 local function linestotei(str)
---   str = "\n<l>"..str
-   str = string.gsub(str, "^%s?(.-)\\\\[%!%*]?%s?$", "\n<l>%1</l>\n")
---   str = gsub(str, endpoem, "</l>\n")
-   str = gsub(str, poemline * spcenc^-1 * lpeg.P(">"), "\n<lb/>")
-   str = gsub(str, poemline * spcenc^-1, "</l>\n<l>")
---   str = str.."</l>\n"
+   if not string.find(str, "^%s?<lg")
+   then
+      str = "\n<l>"..str
+   end
+   str = gsub(str, poemline * spcenc^0 * bclinegroup, "</l>\n%2")
+   str = gsub(str, linegroup * -(spcenc^0 * bclinegroup), "%1\n<l>")
+   str = gsub(str, lpeg.Cs("</lg>") * -(spcenc^0 * (bclinegroup + -1)), "%1\n<l>")
+   -- str = gsub(str, poemline * spcenc^-1 * -1, "</l>\n")
+   str = gsub(str, poemlinebreak, "<lb/> ")
+   -- str = gsub(str, poemline * spcenc^-1 * lpeg.Cs("<lg"), "</l>%2")
+   -- str = gsub(str, lpeg.Cs("</lg>") * spcenc^1 * -lpeg.P("<l"), "%1\n<l>")
+   str = gsub(str, poemline, "</l>\n<l>")
    return str
 end
 
+local function stanzatotei(str)
+   str = string.gsub(str, "\\begin%s?%{ekdstanza%}(%b[])(.-)\\end%s?%{ekdstanza%}", function(opt, arg)
+			arg = string.gsub(arg, "\\par%s?", "")
+			opt = string.sub(opt, 2, -2)
+			teitype = get_attr_value(opt, "type")
+			if teitype ~= "" then teitype = " type=\""..teitype.."\"" else end
+			if opt == ""
+			then
+			   return string.format("<lg>%s</lg>", arg)
+			else
+			   return string.format("<lg%s>%s</lg>", teitype, arg)
+			end
+   end)
+   str = string.gsub(str, "\\begin%s?%{ekdstanza%}(.-)\\end%s?%{ekdstanza%}", function(arg)
+			arg = string.gsub(arg, "\\par%s?", "")
+			return string.format("<lg>%s</lg>", arg)
+   end)
+   return str
+end
+
 -- better use lpeg: look into this later
 local function versetotei(str)
-   str = string.gsub(str, "(\\begin%s?%{ekdverse%})(%b[])(.-)(\\end%s?%{ekdverse%})", function(benv, opt, arg, eenv)
-			arg = linestotei(arg)
-			return string.format("%s%s%s%s", benv, opt, arg, eenv)
+   str = string.gsub(str, "\\begin%s?%{ekdverse%}(%b[])(.-)\\end%s?%{ekdverse%}", function(opt, arg)
+			arg = string.gsub(arg, "\\par%s?", "")
+			arg = string.gsub(arg, "\\begin%s?%{patverse%*?%}", "")
+			arg = string.gsub(arg, "\\end%s?%{patverse%*?%}", "")
+			arg = string.gsub(arg, "\\indentpattern%s?%b{}", "")
+			opt = string.sub(opt, 2, -2)
+			teitype = get_attr_value(opt, "type")
+			if teitype ~= "" then teitype = " type=\""..teitype.."\"" else end
+			if opt == ""
+			then
+			   return "\\p at rb "..linestotei(string.format("<lg>%s</lg>", arg)).."\\p at ra "
+			else
+			   return "\\p at rb "..linestotei(string.format("<lg%s>%s</lg>", teitype, arg)).."\\p at ra "
+			end
    end)
-   str = string.gsub(str, "(\\begin%s?%{ekdverse%})(.-)(\\end%s?%{ekdverse%})", function(benv, arg, eenv)
-			arg = linestotei(arg)
-			return string.format("%s%s%s", benv, arg, eenv)
+   str = string.gsub(str, "\\begin%s?%{ekdverse%}(.-)\\end%s?%{ekdverse%}", function(arg)
+			arg = string.gsub(arg, "\\par%s?", "")
+			return "\\p at rb "..linestotei(string.format("<lg>%s</lg>", arg)).."\\p at ra "
    end)
-   str = string.gsub(str, "(\\begin%s?%{verse%})(%b[])(.-)(\\end%s?%{verse%})", function(benv, opt, arg, eenv)
-			arg = linestotei(arg)
-			return string.format("%s%s%s%s", benv, opt, arg, eenv)
+   str = string.gsub(str, "\\begin%s?%{verse%}%b[](.-)\\end%s?%{verse%}", function(arg)
+			arg = string.gsub(arg, "\\par%s?", "")
+			return "\\p at rb "..linestotei(string.format("<lg>%s</lg>", arg)).."\\p at ra "
    end)
-   str = string.gsub(str, "(\\begin%s?%{verse%})(.-)(\\end%s?%{verse%})", function(benv, arg, eenv)
-			arg = linestotei(arg)
-			return string.format("%s%s%s", benv, arg, eenv)
+   str = string.gsub(str, "\\begin%s?%{verse%}(.-)\\end%s?%{verse%}", function(arg)
+			arg = string.gsub(arg, "\\par%s?", "")
+			return "\\p at rb "..linestotei(string.format("<lg>%s</lg>", arg)).."\\p at ra "
    end)
    return str
 end
@@ -1128,7 +1185,7 @@
    end
    for ndivi = 1, maxdepth
    do
-      str = string.gsub(str, "(<div .-depth%=\")("..ndivi..")(\".->)(.-)(<div .-depth%=\")(%d)(\".->)",
+      str = string.gsub(str, "(<div [^%>]-[Dd]epth%=\")("..ndivi..")(\".->)(.-)(<div [^%>]-depth%=\")(%d)(\".->)",
 			function(bdivi, ndivi, edivi, between, bdivii, ndivii, edivii)
 			   local firstdiv = ndivi
 			   local lastdiv = ndivii
@@ -1145,11 +1202,17 @@
 				 firstdivindex = firstdivindex - 1
 			      end
 			   end
+			   bdivii = string.gsub(bdivii, "depth", "Depth")
 			   return string.format("%s%s%s%s%s%s%s%s",
-						bdivi, ndivi, edivi, between, closedivs, bdivii, ndivii, edivii)
+						bdivi, ndivi, edivi, between,
+						closedivs, bdivii, ndivii, edivii)
       end)
    end
-   str = string.gsub(str, "(<div.-)(%sdepth%=\"%d\")(.->)", "%1%3")
+   return str
+end
+
+local function clean_ekddivs(str)
+   str = string.gsub(str, "(<div.-)(%s[Dd]epth%=\"%d\")(.->)", "%1%3")
    used_ndivs = {}
    return str
 end
@@ -1157,7 +1220,7 @@
 local function close_ndivs_in_between(str)
    for ndivi = 1, 6
    do
-      str = string.gsub(str, "(<div)("..ndivi..")(.->)(.-)(<div)([1-6])(.->)",
+      str = string.gsub(str, "(<[Dd]iv)("..ndivi..")(.->)(.-)(<div)([1-6])(.->)",
 			function(bdivi, ndivi, edivi, between, bdivii, ndivii, edivii)
 			   local firstdiv = ndivi
 			   local lastdiv = ndivii
@@ -1174,11 +1237,17 @@
 			   	 firstdivindex = firstdivindex - 1
 			      end
 			   end
+			   bdivii = string.gsub(bdivii, "div", "Div")
 			   return string.format("%s%s%s%s%s%s%s%s",
-						bdivi, ndivi, edivi, between, closedivs, bdivii, ndivii, edivii)
-			
+						bdivi, ndivi, edivi, between,
+						closedivs, bdivii, ndivii, edivii)
    end)
    end
+   return str
+end
+
+local function clean_latexdivs(str)
+   str = string.gsub(str, "(<Div)([1-6])(.->)", "<div%2%3")
    used_ndivs = {}
    return str
 end
@@ -1191,6 +1260,7 @@
    str = rdgGrp_totei(str)
    str = lem_rdg_totei(str)
    str = relocate_notes(str)
+   str = stanzatotei(str)
    str = versetotei(str)
    str = envtotei(str)
    str = ekddivs_totei(str)
@@ -1203,9 +1273,13 @@
    then
       str = close_ekddivs_at_end(str)
       str = close_ekddivs_in_between(str)
+      str = close_ekddivs_in_between(str)
+      str = clean_ekddivs(str)
    else
       str = close_ndivs_at_end(str)
       str = close_ndivs_in_between(str)
+      str = close_ndivs_in_between(str)
+      str = clean_latexdivs(str)
    end
    return str
 end
@@ -1709,7 +1783,8 @@
 			      appsep,
 			      appbhook,
 			      appehook,
-			      applimit)
+			      applimit,
+			      applang)
    if isintable(apparatuses, teitype)
    then
       tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\""
@@ -1723,12 +1798,23 @@
 				 sep = appsep,
 				 bhook = appbhook,
 				 ehook = appehook,
-				 limit = applimit})
+				 limit = applimit,
+				 lang = applang})
    end
    bagunits[teitype] = 1
    return true
 end
 
+function ekdosis.getapplang(teitype)
+   i = get_a_index(teitype, apparatuses)
+   if apparatuses[i].lang ~= ""
+   then
+      return apparatuses[i].lang
+   else
+      return "\\languagename"
+   end
+end
+
 function ekdosis.getappdelim(str)
    for i = 1,#apparatuses
    do
@@ -1824,7 +1910,7 @@
       local output = {}
       if next(apparatuses) == nil then
 	 -- table.insert(output, "BEGIN")
-	 table.insert(output, "\\noindent\\csname ekd at default@rule\\endcsname\\NLS")
+	 table.insert(output, "\\csname ekd at default@rule\\endcsname\\NLS")
 	 table.insert(output, "\\csname ekd at begin@apparatus\\endcsname\\ignorespaces")
 --	 table.insert(output, "\\noindent ")
 	 for i in string.gmatch(t,
@@ -1839,6 +1925,7 @@
 	 end
 	 -- table.insert(output, "END")
       else
+	 local appinserted = false
 	 local n = 1
 	 while apparatuses[n]
 	 do
@@ -1853,16 +1940,19 @@
 	       table.insert(output, "\\bgroup{}")
 	       if apparatuses[n].direction == "LR"
 	       then
-		  table.insert(output, "\\pardir TLT\\textdir TLT{}")
+		  table.insert(output, "\\pardir TLT\\leavevmode\\textdir TLT{}")
 	       elseif apparatuses[n].direction == "RL"
 	       then
-		  table.insert(output, "\\pardir TRT\\textdir TRT{}")
+		  table.insert(output, "\\pardir TRT\\leavevmode\\textdir TRT{}")
 	       end
 	       if apparatuses[n].rule == "none"
 	       then
 		  if n > 1
 		  then
-		     table.insert(output, "\\NLS{}")
+		     if appinserted
+		     then
+			table.insert(output, "\\NLS{}")
+		     end
 		  else
 		     table.insert(output, "\\noindent ")
 		  end
@@ -1870,7 +1960,12 @@
 	       then
 		  if n > 1
 		  then
-		     table.insert(output, "\\NLS{}" .. apparatuses[n].rule .. "\\NLS{}")
+		     if appinserted
+		     then
+			table.insert(output, "\\NLS{}" .. apparatuses[n].rule .. "\\NLS{}")
+		     else
+			table.insert(output, apparatuses[n].rule .. "\\NLS{}")
+		     end
 		  else
 --		     table.insert(output, "\\noindent ")
 		     table.insert(output, apparatuses[n].rule .. "\\NLS{}")
@@ -1878,7 +1973,12 @@
 	       else
 		  if n > 1
 		  then
-		     table.insert(output, "\\NLS\\csname ekd at default@rule\\endcsname\\NLS{}")
+		     if appinserted
+		     then
+			table.insert(output, "\\NLS\\csname ekd at default@rule\\endcsname\\NLS{}")
+		     else
+			table.insert(output, "\\csname ekd at default@rule\\endcsname\\NLS{}")
+		     end
 		  else
 --		     table.insert(output, "\\noindent ")
 		     table.insert(output, "\\csname ekd at default@rule\\endcsname\\NLS{}")
@@ -1904,6 +2004,7 @@
 					 ..curcol.."%-"..n..">")
 	       do
 		  table.insert(output, i)
+		  appinserted = true
 	       end
 	       if apparatuses[n].ehook ~= ""
 	       then

Modified: trunk/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.sty
===================================================================
--- trunk/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.sty	2021-04-04 01:52:15 UTC (rev 58720)
+++ trunk/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.sty	2021-04-04 01:53:22 UTC (rev 58721)
@@ -15,7 +15,7 @@
 %% This file is part of the `ekdosis' package
 %% 
 %% ekdosis -- Typesetting TEI xml compliant critical editions
-%% Copyright (C) 2020  Robert Alessi
+%% Copyright (C) 2020--2021  Robert Alessi
 %% 
 %% Please send error reports and suggestions for improvements to Robert
 %% Alessi <alessi at robertalessi.net>
@@ -41,7 +41,7 @@
 %% Running "make inst" installs the files in the user's TeX tree.
 \NeedsTeXFormat{LaTeX2e}[1999/12/01]
 \ProvidesPackage{ekdosis}
-    [2020/11/04 v1.1 Typesetting TEI xml-compliant critical editions]
+    [2021/04/02 v1.2 Typesetting TEI xml-compliant critical editions]
 \RequirePackage{iftex}
 \RequireLuaTeX
 \RequirePackage{expkv-opt}
@@ -52,6 +52,7 @@
 \newif\if at parnotesroman
 \newif\if at pkg@parnotes
 \newif\iftei at export
+\newif\if at pkg@poetry at verse
 \ekvdefinekeys{ekdosis}{
   choice layout = {float = {\@pkg at floattrue},
     footins = {\@pkg at floatfalse\@pkg at footinstrue}},
@@ -64,7 +65,9 @@
   initial divs = ekdosis,
   unknown-choice divs = \PackageError{ekdosis}{unknown divs=#1}{`divs'
     must be either `ekdosis' or `latex'.},
-  bool verse = \if at pkg@verse,
+  choice poetry = {verse = {\@pkg at poetry@versetrue}},
+  unknown-choice poetry = \PackageError{ekdosis}{unknown
+    poetry=#1}{`poetry' must be `verse' for now.},
   choice parnotes = {false = {},
     true = {\@pkg at parnotestrue},
     roman = {\@pkg at parnotestrue\@parnotesromantrue}},
@@ -85,6 +88,9 @@
     `tidy'.}
 }
 \ekvoProcessLocalOptions{ekdosis}
+\newif\ifekd at memoir@loaded
+\@ifclassloaded{memoir}{%
+  \ekd at memoir@loadedtrue\@pkg at poetry@versetrue}{}
 \RequirePackage{luacode}
 \RequirePackage{paracol}
 \RequirePackage{etoolbox}
@@ -96,7 +102,7 @@
 \RequirePackage{ltxcmds}
 \RequirePackage{pdftexcmds}
 \RequirePackage{ifoddpage}
-\if at pkg@verse
+\if at pkg@poetry at verse
   \RequirePackage{verse}
 \fi
 \if at pkg@parnotes
@@ -110,9 +116,16 @@
   store appfontsize = \ekd at appfontsize,
   store refnumstyle = \ekd at refnumstyle,
   store postrefnum = \ekd at postrefnum,
+  store lemmastyle = \ekd at lemmastyle,
+  store readingstyle = \ekd at readingstyle,
+  code initialrule = \def\ekd at initial@rule{#1\NLS},
+  default initialrule = \rule{0.4\columnwidth}{0.4pt},
+  noval noinitialrule = \undef\ekd at initial@rule,
   initial appfontsize = \footnotesize,
   initial refnumstyle = \bfseries,
-  initial postrefnum = ~
+  initial postrefnum = ~,
+  initial lemmastyle = {},
+  initial readingstyle = {}
 }
 \NewDocumentCommand{\SetHooks}{m}{\ekvset{ekd at hooks}{#1}}
 \ekvdefinekeys{ekd at witness}{
@@ -237,6 +250,7 @@
   store bhook = \bhook at val,
   store ehook = \ehook at val,
   store maxentries = \limit at val,
+  store lang = \lang at val,
   initial direction = LR,
   initial delim = {},
   initial ehook = {\csname ekd at end@apparatus\endcsname}
@@ -255,7 +269,8 @@
     \luastringO{\sep at val},
     \luastringO{\bhook at val},
     \luastringO{\ehook at val},
-    \luastringO{\limit at val}
+    \luastringO{\limit at val},
+    \luastringO{\lang at val}
     )}
   \egroup
 }
@@ -264,6 +279,29 @@
   \luadirect{ekdosis.addto_bagunits(\luastringO{#1}, \luastringN{#2})}%
   \ignorespaces
 }
+\NewDocumentCommand{\ekdpb}{o m}{%
+  \def\@tmpoarg{#1}%
+  \def\@tmpmarg{#2}%
+  \luadirect{ekdosis.dolnlab(\luastringN{#2})}%
+  \linelabel{\luadirect{tex.sprint(ekdosis.getlnlab())}}%
+  \def\tmp at ln{%
+    \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}}}%
+  \def\tmp at pg{%
+    \getpagerefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}}}%
+  \IfNoValueTF{#1}
+  {\ifnum
+    \pdf at strcmp{\@tmpmarg}{\tmp at ln} = 0
+    \pagebreak
+    \fi}
+  {\ifnum
+    \pdf at strcmp{\@tmpoarg}{\tmp at pg} = 0
+    \ifnum
+    \pdf at strcmp{\@tmpmarg}{\tmp at ln} = 0
+    \pagebreak
+    \fi
+    \fi
+  }\ignorespaces
+}
 \newbool{do at app}
 \newif\ifekd at state
 \newif\ifekd at isinapp
@@ -281,8 +319,8 @@
   {\luadirect{ekdosis.appin(\luastringO{#2})}}
   {\luadirect{ekdosis.appin(\luastringO{#2}, \luastringO{#1})}}%
 }
- % \def\blfootnote{\gdef\@thefnmark{\relax}\@footnotetext}
-\def\blfootnote{\gdef\@thefnmark{}\@blfootnotetext}
+\def\blfootnote{\gdef\@thefnmark{\relax}\@footnotetext}
+ % \def\blfootnote{\gdef\@thefnmark{}\@blfootnotetext}
 \long\def\@blfootnotetext#1{\insert\footins{%
     \reset at font\footnotesize
     \interlinepenalty\interfootnotelinepenalty
@@ -316,7 +354,9 @@
   initial delim = {},
   store rule = \ekd at default@rule,
   initial rule = \rule{0.4\columnwidth}{0.4pt},
-  noval norule = \def\ekd at default@rule{\mbox{}}
+  noval norule = \def\ekd at default@rule{\mbox{}},
+  store lang = \ekd at singleapp@lang,
+  initial lang = \ltx at ifpackageloaded{babel}{\languagename}{}
 }
 \NewDocumentCommand{\SetApparatus}{m}{
   \ekvset{default at app}{#1}
@@ -327,6 +367,8 @@
 \NewDocumentCommand{\SetBeginApparatus}{m}{\edef\ekd at begin@apparatus{#1}}
 \NewDocumentCommand{\SetEndApparatus}{m}{\edef\ekd at end@apparatus{#1}}
 \NewDocumentCommand{\SetUnitDelimiter}{m}{\def\ekd at unit@delim{#1}}
+\NewDocumentCommand{\SetApparatusLanguage}{m}{%
+  \def\ekd at singleapp@lang{#1}}
 \newif\iffootnoterule
 \footnoteruletrue
 \let\dflt at footnoterule\footnoterule
@@ -348,43 +390,65 @@
   \def\ekd at default@rule{#1}%
   \fi}
 \newcommand*{\NLS}{%
-  \par%
-  \nobreak%
-  \vspace{-\parskip}%
-  \noindent%
-  \ignorespaces}
+  \nobreak\@normalcr\relax
+  % \par
+  % \nobreak
+  % \vspace{-\parskip}%
+  % \leavevmode
+  % \noindent
+  % \ignorespaces
+}
 \newif\ifsubsq at unit
 \subsq at unittrue
 \newif\ifekd at inside@app
 \def\add@@apparatus{%
-  \if at pkg@parnotes\parnotes\else\fi%
-  \if at pkg@footins%
-  \bgroup%
-  \ifrtl at app\setRL\else\setLR\fi%
+  \if at pkg@parnotes\parnotes\else\fi
+  \if at pkg@footins
+  \bgroup
+    \unless\ifekd at mapps
+      \ifrtl at app\pardir TRT\leavevmode\textdir TRT\else
+        \pardir TLT\leavevmode\textdir TLT\fi
+    \fi
   \blfootnote{%
-    \if at pkg@parnotes%
-    \if at parnotesroman%
-    \renewcommand*{\theparnotemark}{\roman{parnotemark}}\else\fi%
-    \parnoteclear\else\fi%
+    \if at pkg@parnotes
+    \if at parnotesroman
+    \renewcommand*{\theparnotemark}{\roman{parnotemark}}\else\fi
+    \parnoteclear\else\fi
     \ekd at inside@apptrue
-    \footnotesize\apparatus\unless\ifekd at mapps\ekd at end@apparatus\fi%
+    \ekd at appfontsize
+    \ifekd at mapps
+      \ifdefined\ekd at initial@rule
+        \ekd at initial@rule
+      \fi
+    \fi
+    \apparatus\unless\ifekd at mapps\ekd at end@apparatus\fi
     \ekd at inside@appfalse
     \if at pkg@parnotes\parnotes\parnotereset\else\fi
   }%
-  \egroup%
-  \fi%
-  \if at pkg@float%
-  \keyparbox[!b]{}{\ifrtl at app\setRL\else\setLR\fi%
-    \if at pkg@parnotes%
-    \if at parnotesroman%
-    \renewcommand*{\theparnotemark}{\roman{parnotemark}}\else\fi%
-    \parnoteclear\else\fi%
+  \egroup
+  \fi
+  \if at pkg@float
+  \keyparbox[!b]{}{%
+    \unless\ifekd at mapps
+      \ifrtl at app\pardir TRT\leavevmode\textdir TRT\else
+        \pardir TLT\leavevmode\textdir TLT\fi
+    \fi
+    \if at pkg@parnotes
+    \if at parnotesroman
+    \renewcommand*{\theparnotemark}{\roman{parnotemark}}\else\fi
+    \parnoteclear\else\fi
     \ekd at inside@apptrue
-    \ekd at appfontsize\apparatus\unless\ifekd at mapps\ekd at end@apparatus\fi%
+    \ekd at appfontsize
+    \ifekd at mapps
+      \ifdefined\ekd at initial@rule
+        \ekd at initial@rule
+      \fi
+    \fi
+    \apparatus\unless\ifekd at mapps\ekd at end@apparatus\fi
     \ekd at inside@appfalse
-    \if at pkg@parnotes\parnotes\parnotereset\else\fi%
+    \if at pkg@parnotes\parnotes\parnotereset\else\fi
   }%
-  \fi%
+  \fi
 }
 \def\add at apparatus{%
   \test at apparatus%
@@ -403,8 +467,8 @@
   {\luadirect{tex.sprint(ekdosis.mdvappend(\luastringO{#2}))}}
   {\luadirect{tex.sprint(ekdosis.mdvappend(\luastringO{#2},
       \luastringO{#1}))}}}
-\def\outerlinenumbers{
-  \def\makeLineNumberRunning{
+\def\outerlinenumbers{%
+  \def\makeLineNumberRunning{%
     \checkoddpage
     \ifoddpage
     \linenumberfont\hskip\linenumbersep\hskip\textwidth
@@ -412,10 +476,10 @@
     \else
     \hss\linenumberfont\LineNumber\hskip\linenumbersep
     \fi
-  }
+  }%
 }
-\def\innerlinenumbers{
-  \def\makeLineNumberRunning{
+\def\innerlinenumbers{%
+  \def\makeLineNumberRunning{%
     \checkoddpage
     \ifoddpage
     \hss\linenumberfont\LineNumber\hskip\linenumbersep
@@ -423,9 +487,10 @@
     \linenumberfont\hskip\linenumbersep\hskip\textwidth
     \hbox to\linenumberwidth{\hss\LineNumber}\hss
     \fi
-  }
+  }%
 }
 \newif\ifekd at pagelineation
+\newif\ifekd at pagevlineation
 \NewDocumentCommand{\ekdatbegshihook}{}{%
   \ifekd at pagelineation\resetlinenumber\fi
 }
@@ -436,11 +501,17 @@
     document = \ekd at pagelineationfalse},
   unknown-choice lineation = \PackageError{ekdosis}{unknown
     lineation=#1}{`lineation' must be either `page' or `document'.},
+  choice vlineation = {page = \ekd at pagevlineationtrue,
+    document = \ekd at pagevlineationfalse},
+  unknown-choice vlineation = \PackageError{ekdosis}{unknown
+    vlineation=#1}{`vlineation' must be either `page' or `document'.},
   code modulonum = \chardef\c at linenumbermodulo#1\relax,
   noval modulo = \modulolinenumbers,
-  code vmodulonum = \if at pkg@verse\poemlines{#1}\fi,
-  initial vmodulonum = 1,
-  noval vmodulo = \if at pkg@verse\poemlines{5}\fi,
+  code vmodulo = \ifekd at memoir@loaded\linenumberfrequency{#1}
+                 \else\if at pkg@poetry at verse\poemlines{#1}\fi\fi,
+  initial vmodulo = 1,
+  default vmodulo = 5,
+  bool continuousvnum = \if at continuous@vnum,
   choice numbers = {elided = \ekd at elidednumberstrue,
     full = \ekd at elidednumbersfalse},
   unknown-choice numbers = \PackageError{ekdosis}{unknown
@@ -452,7 +523,12 @@
     outer = \outerlinenumbers},
   unknown-choice margin = \PackageError{ekdosis}{unknown
     margin=#1}{`margin' must be either `left', `right', \MessageBreak
-    `inner' or `outer'}
+    `inner' or `outer'},
+  choice vmargin = {
+    right = \if at pkg@poetry at verse\verselinenumbersright\fi,
+    left = \if at pkg@poetry at verse\verselinenumbersleft\fi},
+  unknown-choice vmargin = \PackageError{ekdosis}{unknown
+    vmargin=#1}{`margin' must be either `left' ot `right'}
 }
 \NewDocumentCommand{\SetLineation}{m}{
   \ekvset{ekd at lineation}{#1}
@@ -484,34 +560,36 @@
     =
     0
     \ifnum%
-    \getrefnumber{#1}
+    \pdf at strcmp{\getrefnumber{#1}}{\getrefnumber{#2}}
     =
-    \getrefnumber{#2}
+    0
     %
     \ifekd at mapps%
     \ifbool{subsq at unit@\ekdan at type}{%
       \ifnum%
-      \getrefnumber{#1}
+      \pdf at strcmp{\getrefnumber{#1}}{%
+        \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevnotelab())}}}
       =
-      \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevnotelab())}}
+      0
       \else
-      \LRnum{\getrefnumber{#1}}% issue the no
+      \LRnum{\getrefnumber{#1}}\unexpanded\expandafter{\ekd at postrefnum}% issue the no
       \fi%
     }%
-    {\LRnum{\getrefnumber{#1}}}% issue the no
+    {\LRnum{\getrefnumber{#1}}\unexpanded\expandafter{\ekd at postrefnum}}% issue the no
     \else
     \ifsubsq at unit%
     %
     \ifnum%
-    \getrefnumber{#1}
+    \pdf at strcmp{\getrefnumber{#1}}{%
+      \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevnotelab())}}}
     =
-    \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevnotelab())}}
+    0
     \else
-    \LRnum{\getrefnumber{#1}}% issue the no
+    \LRnum{\getrefnumber{#1}}\unexpanded\expandafter{\ekd at postrefnum}% issue the no
     \fi
     %
     \else
-    \LRnum{\getrefnumber{#1}}% issue the no
+    \LRnum{\getrefnumber{#1}}\unexpanded\expandafter{\ekd at postrefnum}% issue the no
     \fi
     \fi
     %
@@ -519,17 +597,18 @@
     \ifekd at elidednumbers
     \luadirect{tex.sprint(ekdosis.numrange(\luastring{\getrefnumber{#1}},
       \luastring{\getrefnumber{#2}}))}%
+        \unexpanded\expandafter{\ekd at postrefnum}% issue the nos
     \else
     \LRnum{\getrefnumber{#1}}--%
-    \LRnum{\getrefnumber{#2}}% issue the nos
+    \LRnum{\getrefnumber{#2}}\unexpanded\expandafter{\ekd at postrefnum}% issue the nos
     \fi
     \fi%
     \else
     \LRnum{\getrefnumber{#1}}--%
     \LRnum{\getpagerefnumber{#2}}.%
-    \LRnum{\getrefnumber{#2}}% issue pg and ln nos
+    \LRnum{\getrefnumber{#2}}\unexpanded\expandafter{\ekd at postrefnum}% issue pg and ln nos
     \fi%
-  }\unexpanded\expandafter{\ekd at postrefnum}%
+  }%
 }
 \def\current at ref{{%\textdir TLT%
     \unexpanded\expandafter{\ekd at refnumstyle}%
@@ -540,33 +619,41 @@
     =
     0
     \ifnum%
-    \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}
+    \pdf at strcmp{%
+      \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+      {\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}
     =
-    \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}
+    0
     %
     \ifekd at mapps%
     \ifbool{subsq at unit@\ekdan at type}{%
       \ifnum%
-      \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}
+      \pdf at strcmp{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+      {\getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b}}
       =
-      \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b}
+      0
       \else
-      \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% issue the no
+      \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+        \unexpanded\expandafter{\ekd at postrefnum}% issue the no
       \fi%
-    }{\LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}}% issue the no
+    }{\LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+      \unexpanded\expandafter{\ekd at postrefnum}}% issue the no
     \else
     \ifsubsq at unit%
     %
     \ifnum%
-    \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}
+    \pdf at strcmp{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+    {\getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b}}
     =
-    \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b}
+    0
     \else
-    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% issue the no
+    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+      \unexpanded\expandafter{\ekd at postrefnum}% issue the no
     \fi
     %
     \else
-    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% issue the no
+    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+      \unexpanded\expandafter{\ekd at postrefnum}% issue the no
     \fi
     \fi
     %
@@ -574,18 +661,21 @@
     \ifekd at elidednumbers
     \luadirect{tex.sprint(ekdosis.numrange(
       \luastring{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}},
-      \luastring{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}))}% issue the nos
+      \luastring{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}))}%
+        \unexpanded\expandafter{\ekd at postrefnum}% issue the nos
     \else
     \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}--%
-    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}% issue the nos
+    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}%
+        \unexpanded\expandafter{\ekd at postrefnum}% issue the nos
     \fi
     \fi%
     \else
     \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}--%
     \LRnum{\getpagerefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}.%
-    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}% issue pg and ln nos
+    \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}%
+      \unexpanded\expandafter{\ekd at postrefnum}% issue pg and ln nos
     \fi%
-  }\unexpanded\expandafter{\ekd at postrefnum}%
+  }%
 }
 \ekvdefinekeys{lem}{
   code wit = \def\ekdlr at wit{#1},
@@ -617,6 +707,13 @@
 \NewDocumentCommand{\rdgGrp}{O{} > {\TrimSpaces } m}{%
   \luadirect{tex.sprint(ekdosis.removesp(\luastringN{#2}))}%
 }
+\def\app at lang{%
+  \ifekd at mapps
+  \luadirect{tex.sprint(ekdosis.getapplang(\luastring{\ekdan at type}))}%
+  \else
+  \ekd at singleapp@lang
+  \fi
+}
 \NewDocumentCommand{\lem}{O{} m}{%
   \ekd at isinlemtrue%
   \luadirect{ekdosis.dolnlab(\luastringN{#2})}%
@@ -657,13 +754,15 @@
       \ifdefined\ekdlr at alt%
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
-        {\textdir TRT\unexpanded\expandafter{\ekdlr at alt}}%
+          {\textdir TRT\unexpanded\expandafter{\ekd at lemmastyle}%
+            \unexpanded\expandafter{\ekdlr at alt}}%
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
       \else
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
-        {\textdir TRT\unexpanded{#2}}%
+          {\textdir TRT\unexpanded\expandafter{\ekd at lemmastyle}%
+            \unexpanded{#2}}%
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
       \fi
@@ -691,9 +790,11 @@
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
         \ltx at ifpackageloaded{babel}%
-          {\noexpand\selectlanguage{\languagename}%
-            \unexpanded\expandafter{\ekdlr at alt}}%
-          {\unexpanded\expandafter{\ekdlr at alt}}%
+        {{\unexpanded\expandafter{\ekd at lemmastyle}%
+            \noexpand\selectlanguage{\app at lang}%
+            \unexpanded\expandafter{\ekdlr at alt}}}%
+        {\unexpanded\expandafter{\ekd at lemmastyle}%
+          \unexpanded\expandafter{\ekdlr at alt}}%
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
       \else
@@ -700,8 +801,10 @@
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
           \ltx at ifpackageloaded{babel}%
-          {{\noexpand\selectlanguage{\languagename}\unexpanded{#2}}}{%
-            {\unexpanded{#2}}}%
+          {{\unexpanded\expandafter{\ekd at lemmastyle}%
+              \noexpand\selectlanguage{\app at lang}%
+              \unexpanded{#2}}}{%
+            {\unexpanded\expandafter{\ekd at lemmastyle}\unexpanded{#2}}}%
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
       \fi
@@ -743,13 +846,15 @@
       \ifdefined\ekdlr at alt%
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
-        {\textdir TRT\unexpanded\expandafter{\ekdlr at alt}}%
+          {\textdir TRT\unexpanded\expandafter{\ekd at readingstyle}%
+            \unexpanded\expandafter{\ekdlr at alt}}%
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
       \else
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
-        {\textdir TRT\unexpanded{#2}}%
+          {\textdir TRT\unexpanded\expandafter{\ekd at readingstyle}%
+            \unexpanded{#2}}%
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
       \fi
@@ -768,9 +873,11 @@
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
         \ltx at ifpackageloaded{babel}%
-          {\noexpand\selectlanguage{\languagename}%
-            \unexpanded\expandafter{\ekdlr at alt}}%
-          {\unexpanded\expandafter{\ekdlr at alt}}%
+        {{\unexpanded\expandafter{\ekd at readingstyle}%
+            \noexpand\selectlanguage{\app at lang}%
+            \unexpanded\expandafter{\ekdlr at alt}}}%
+        {\unexpanded\expandafter{\ekd at readingstyle}%
+          \unexpanded\expandafter{\ekdlr at alt}}%
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
       \else
@@ -777,8 +884,9 @@
         \ifdefined\ekdlr at pre%
           \space\unexpanded\expandafter{\ekdlr at pre}\space\else\fi
           \ltx at ifpackageloaded{babel}%
-          {{\noexpand\selectlanguage{\languagename}\unexpanded{#2}}}{%
-            {\unexpanded{#2}}}%
+          {{\unexpanded\expandafter{\ekd at readingstyle}%
+              \noexpand\selectlanguage{\app at lang}\unexpanded{#2}}}{%
+            {\unexpanded\expandafter{\ekd at readingstyle}\unexpanded{#2}}}%
         \ifdefined\ekdlr at post%
           \space\unexpanded\expandafter{\ekdlr at post}\space\else\fi
       \fi
@@ -845,7 +953,8 @@
       \fi%
       \current at ref@arg{\ekdn at labelb}{\ekdn at labele}%\hskip .25em
       \ifdefined\ekdn at lem%
-          {\textdir TRT\unexpanded\expandafter{\ekdn at lem}}%
+      {\textdir TRT\unexpanded\expandafter{\ekd at lemmastyle}%
+        \unexpanded\expandafter{\ekdn at lem}}%
           \unless\ifekdn at nosep
           \unexpanded\expandafter{\ekdn at sep}\fi
           \else\fi%
@@ -861,14 +970,16 @@
       \current at ref@arg{\ekdn at labelb}{\ekdn at labele}%\hskip .25em
       \ifdefined\ekdn at lem
         \ltx at ifpackageloaded{babel}%
-          {\noexpand\selectlanguage{\languagename}%
+        {{\unexpanded\expandafter{\ekd at lemmastyle}%
+            \noexpand\selectlanguage{\app at lang}%
+              \unexpanded\expandafter{\ekdn at lem}}}%
+          {\unexpanded\expandafter{\ekd at lemmastyle}%
             \unexpanded\expandafter{\ekdn at lem}}%
-          {\unexpanded\expandafter{\ekdn at lem}}%
           \unless\ifekdn at nosep
           \unexpanded\expandafter{\ekdn at sep}\fi
           \else\fi%
           \ltx at ifpackageloaded{babel}%
-          {{\noexpand\selectlanguage{\languagename}\unexpanded{#2}}}{%
+          {{\noexpand\selectlanguage{\app at lang}\unexpanded{#2}}}{%
             {\unexpanded{#2}}}}}%
   \ifekd at mapps%
   \unconditional at appin[\ekdan at type]{\note at contents}%
@@ -894,7 +1005,11 @@
     \ekvifdefinedNoVal{ekd at note}{post}{}{%
       \unexpanded\expandafter{\post at value}}%
   }%
+  \ifekd at mapps%
+  \append at app[\ekdan at type]{\note at contents}%
+  \else%
   \append at app{\note at contents}%
+  \fi%
   \egroup%
 }
 \NewDocumentCommand{\ekd at note@star}{O{} m}{%
@@ -911,7 +1026,11 @@
       \append at app{\note at contents}%
     \egroup%
   \else
-    \append at app{\unskip\footnote{#2}}%
+    \ifekd at mapps%
+    \append at app[\ekdan at type]{\note at contents}%
+    \else%
+    \append at app{\note at contents}%
+    \fi%
   \fi%
 }
 \NewDocumentCommand{\note at app}{s O{} +m}{%
@@ -1147,13 +1266,52 @@
   \fi
   \endgroup
 }
-\if at pkg@verse
-\verselinenumfont{\normalfont\footnotesize}
+\newif\ifekd at test@vpnum
+\newcounter{ekd at vpnum}
+\globalcounter{ekd at vpnum}
+\NewDocumentCommand{\test at vpnum}{}{%
+  \ifekd at test@vpnum
+    \edef\@tempa{\theekd at vpnum}%
+    \stepcounter{ekd at vpnum}%
+    \label{vpnum:\theekd at vpnum}%
+    \ifnum
+      \pdf at strcmp{\getpagerefnumber{vpnum:\@tempa}}%
+        {\getpagerefnumber{vpnum:\theekd at vpnum}}
+        = 0
+      \else
+        \resetvlinenumber
+    \fi
+  \else
+  \label{vpnum:\theekd at vpnum}%
+  \global\ekd at test@vpnumtrue
+  \fi
+}
+\if at pkg@poetry at verse
+\patchcmd{\start at vsline}{%
+  \ifaltindent}{%
+  \ifekd at pagevlineation\test at vpnum\fi
+  \ifaltindent}{}{}
+\ekvdefinekeys{ekd at verse}{
+  dimen width = \vwidth at val,
+  initial width = \linewidth,
+  code type = \def\type at value{#1},
+}
+\ifekd at memoir@loaded
+  \linenumberfont{\normalfont\footnotesize}
+\else
+  \verselinenumfont{\normalfont\footnotesize}
+\fi
 \setcounter{poemline}{1}
-\NewDocumentEnvironment{ekdverse}{O{\linewidth}}{%
+\NewDocumentEnvironment{ekdverse}{!O{}}{%
+  \ekvset{ekd at verse}{#1}%
+  \if at continuous@vnum\setverselinenums{\thelinenumber}{0}\fi
   \nolinenumbers
   \let\linelabel\label
-  \stepcounter{verse at envctr}%
+  \ifekd at memoir@loaded
+    \refstepcounter{verse}%
+  \else
+    \stepcounter{verse at envctr}%
+  \fi
   \addtocounter{poemline}{-1}\refstepcounter{poemline}%
   \setcounter{vslineno}{1}%
   \let\\=\@vscentercr
@@ -1164,22 +1322,23 @@
           \setlength{\itemsep}{0pt}%
           \setlength{\topsep}{0pt}%
           \setlength{\partopsep}{0pt}%
-          \ifdim #1 < \linewidth
+          \ifdim\vwidth at val < \linewidth
             \rightmargin        \z@
             \setlength{\leftmargin}{\linewidth}%
-            \addtolength{\leftmargin}{-#1}%
+            \addtolength{\leftmargin}{-\vwidth at val}%
             \addtolength{\leftmargin}{-0.5\leftmargin}%
           \else
             \rightmargin        \leftmargin
           \fi
           \addtolength{\leftmargin}{\vindent}}%
-  \item[]%
+  \item[]\ifekd at pagevlineation\test at vpnum\fi%
 }
-{\endlist}
+{\endlist
+  \if at continuous@vnum\resetlinenumber[\thepoemline]\fi}
 \else
 \newlength{\ekdverseindentlength}
 \setlength{\ekdverseindentlength}{\parindent}
-\NewDocumentEnvironment{ekdverse}{O{\ekdverseindentlength}}{
+\NewDocumentEnvironment{ekdverse}{!O{\ekdverseindentlength}}{
   \begin{list}{}{%
       \setlength{\leftmargin}{#1}
       \setlength{\itemsep}{0pt}
@@ -1189,7 +1348,21 @@
   \item[]
   }{\end{list}}
 \fi
+\NewDocumentCommand{\resetvlinenumber}{O{1}}{%
+  \if at pkg@poetry at verse
+  \setverselinenums{#1}{0}%
+  \fi
+}
+\ekvdefinekeys{ekd at stanza}{
+  code type = \def\type at value{#1}
+}
+\NewDocumentEnvironment{ekdstanza}{!O{}}{%
+  \leavevmode\unskip
+  \ekvset{ekd at stanza}{#1}%
+  \ignorespaces
+}{}
 \NewDocumentEnvironment{ekdpar}{}{\par}{\par}
+\IfFileExists{\jobname-ekd.cfg}{\input{\jobname-ekd.cfg}}{}
 \endinput
 %%
 %% End of file `ekdosis.sty'.



More information about the tex-live-commits mailing list.