% \iffalse meta-comment % % ekdosis -- Typesetting TEI xml compliant critical editions % Copyright (C) 2020 Robert Alessi % % Please send error reports and suggestions for improvements to Robert % Alessi % % This program is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation, either version 3 of the License, or % (at your option) any later version. % % This program is distributed in the hope that it will be useful, but % WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU % General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program. If not, see % . % %<*internal> \iffalse % %<*luapre> --[[ This file is part of the `ekdosis' package ekdosis -- Typesetting TEI xml compliant critical editions Copyright (C) 2020 Robert Alessi Please send error reports and suggestions for improvements to Robert Alessi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . --]] % %<*internal> \fi % % \fi % % \iffalse %<*driver> \ProvidesFile{ekdosis.dtx} % %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\ProvidesPackage{ekdosis} %<*package> [2020/08/14 v1.0 Typesetting TEI xml compliant critical editions] % %<*driver> \begin{filecontents}[noheader,overwrite]{bibdata.xml} Scribes and Scholars L. D. Reynolds N. G. Wilson 3 Oxford Clarendon Press 1991 \end{filecontents} \begin{filecontents}[overwrite]{\jobname.bib} @Article{Alessi2020, author = {Alessi, Robert}, title = {ekdosis: Using Lua\LaTeX{} for Producing \texttt{TEI xml} Compliant Critical Editions and Highlighting Parallel Writings}, journaltitle = {Journal of Data Mining and Digital Humanities}, date = 2020, pubstate = {submitted}, issuetitle = {Collecting, Preserving, and Disseminating Endangered Cultural Heritage for New Understandings through Multilingual Approaches}, eprinttype = {hal}, eprint = {hal-02779803} } @Book{Caesar-BG-v2, author = {{Caesar}}, title = {Gallic War}, origtitle = {Guerre des Gaules}, date = 1987, origdate = 1926, editor = {Constans, L.-A.}, volume = 2, pagination = {none}, series = {Collection des Universités de France}, publisher = {Les Belles Lettres}, location = {Paris} } @Book{CaesarTr, author = {{Caesar}}, title = {Gallic War}, date = 1869, editor = {McDevitte, W. A., and Bohn, W. S.}, edition = 1, series = {Harper's New Classical Library}, publisher = {Harper \& Brothers}, location = {New York}} @Book{ReynoldsWilson1991, author = {Reynolds, L. D. and Wilson, N. G}, title = {Scribes and Scholars}, year = {1991}, subtitle = {A Guide to the Translation of Greek and Latin Literature}, edition = {3}, publisher = {Clarendon Press}, location = {Oxford} } @Book{West1973, author = {West, Martin L.}, title = {Textual Criticism and Editorial Technique}, date = 1973, titleaddon = {Applicable to Greek and Latin Texts}, publisher = {B. G. Teubner}, location = {Stuttgart} } @Online{DLL-TC, author = {{Digital Latin Library}}, title = {Textual Criticism}, url = {https://digitallatin.org/library-digital-latin-texts/textual-criticism}, urldate = {2020-05-24} } @Online{Mastronarde.Tarrant2017, author = {Mastronarde, Donald J. and Tarrant, Richard J.}, title = {Review: Guidelines for Encoding Critical Editions for the Library of Digital Latin Texts}, date = {2017-12-04}, url = {https://classicalstudies.org/scs-blog/donald-j-mastronarde/review-guidelines-encoding-critical-editions-library-digital-latin}, organization = {Society for Classical Studies} } @Online{TBE, author = {Van den Branden, Ron and Terras, Melissa and Vanhoutte, Edward}, title = {TEI by Example}, urldate = {2020-08-04}, url = {http://www.teibyexample.org} } @Software{lineno, title = {The Lineno package}, titleaddon = {Line numbers on paragraphs}, author = {Lück, Uwe and Böttcher, Stephan}, url = {http://www.ctan.org/pkg/lineno}, date = {2005-11-02}, version = {4.41} } @Software{polyglossia, title = {The Polyglossia package}, titleaddon = {An alternative to babel for XeLaTeX and LuaLaTeX}, author = {Charette, François and Reutenauer, Arthur}, url = {http://www.ctan.org/pkg/polyglossia}, date = {2020-04-08}, version = {1.49} } @Software{babel, title = {The Babel package}, titleaddon = {Multilingual support for Plain TeX or LaTeX}, author = {Bezos López, Javier and Braams, Johannes L.}, url = {http://www.ctan.org/pkg/babel}, date = {2020-07-13}, version = {3.47} } @Software{arabluatex, title = {The Arabluatex package}, titleaddon = {ArabTeX for LuaLaTeX}, author = {Alessi, Robert}, url = {http://ctan.org/pkg/arabluatex}, date = {2020-03-23}, version = {1.20} } @Software{icite, title = {The Icite package}, subtitle = {Indices locorum citatorum}, author = {Alessi, Robert}, url = {http://ctan.org/pkg/icite}, date = {2020-03-05}, version = {1.3a} } @Software{arabtex, title = {The Arabtex package}, titleaddon = {Macros and fonts for typesetting Arabic}, author = {Lagally, Klaus}, url = {http://baobab.informatik.uni-stuttgart.de/ifi/bs/research/arab_e.html}, date = {2004-03-11}, version = {4.00} } \end{filecontents} \begin{filecontents}[overwrite]{\jobname-cfg.tex} \footnotelayout{m} \EnvtoTEI{ancientgreek}{p}[xml:lang="grc"] \DeclareApparatus{fontium}[ delim=\hskip0.75em, bhook=\textbf{Sources:}] \DeclareApparatus{default}[ delim=\hskip0.75em] \DeclareApparatus{ltr}[ delim=\hskip0.75em] \DeclareApparatus{rtl}[ direction=RL, sep={[ }, delim=\hskip0.75em] \DeclareWitness{M}{M}{\emph{Marcianus Gr.} 269}[ settlement=Venice, institution=Marciana Library, msName=Marcianus Gr., idno=269, origDate=s. X] \DeclareHand{M1}{M}{M\textsuperscript{1}}[Emendatio scribae ipsius] \DeclareHand{M2}{M}{M\textsuperscript{2}}[Manus posterior] % Peter and John Story: \DeclareWitness{pjA}{A}{Manuscript A Call No 123} \DeclareWitness{pjB}{B}{Manuscript B Call No 456} % Caesar's Gallic War: \DeclareWitness{cA}{A}{\emph{Bongarsianus} 81}[ msName=Bongarsianus, settlement=Amsterdam, idno=81, institution=University Library, origDate=s. IX--X] \DeclareHand{cA1}{cA}{A\textsuperscript{1}}[\emph{Emendationes scribae ipsius}] \DeclareWitness{cM}{M}{\emph{Parisinus Lat.} 5056}[ origDate={s. XII}] \DeclareWitness{cB}{B}{\emph{Parisinus Lat.} 5763}[ origDate={s. IX--X}] \DeclareWitness{cR}{R}{\emph{Vaticanus Lat.} 3864}[ origDate={s. X}] \DeclareWitness{cS}{S}{\emph{Laurentianus} R 33}[ origDate={s. X}] \DeclareWitness{cL}{L}{\emph{Londinensis} Br. Mus. 10084}[ origDate={s. XI}] \DeclareWitness{cN}{N}{\emph{Neapolitanus} IV, c. 11}[ origDate={s. XII}] \DeclareWitness{cT}{T}{\emph{Parisinus Lat.} 5764}[ origDate={s. XI}] \DeclareWitness{cf}{\emph{f}}{\emph{Vindobonensis} 95}[ origDate={s. XII}] \DeclareWitness{cU}{U}{\emph{Vaticanus Lat.} 3324}[ origDate={s. XI}] \DeclareWitness{cl}{\emph{l}}{\emph{Laurentianus} Riccard. 541}[ origDate={s. XI--XII}] \DeclareShorthand{ca}{α}{cA,cM,cB,cR,cS,cL,cN} \DeclareShorthand{cb}{β}{cT,cf,cU,cl} % Hippocrates Epidemics, Book 2: \DeclareWitness{hV}{V}{\emph{Vaticanus Gr.} 276} \DeclareWitness{hI}{I}{\emph{Parisinus Gr.} 2140} \DeclareHand{hIac}{hI}{I\textsuperscript{ac}}[Lectio ante correctionem] \DeclareHand{hIpc}{hI}{I\textsuperscript{pc}}[Lectio post correctionem] \DeclareWitness{hR}{R}{\emph{Vaticanus Gr.} 277} \DeclareWitness{hH}{H}{\emph{Parisinus Gr.} 2142} \DeclareSource{Lit}{Littré} \DeclareSource{Erm}{Ermerins} \DeclareSource{Sm}{Smith} \DeclareSource{Gal}{Gal.} \DeclareScholar{ego}{ego}[ forename=Robert, surname=Alessi] \DeclareShorthand{egomute}{\unskip}{ego} \DeclareShorthand{hcodd}{codd.}{hV,hI,hR,hH} \DeclareShorthand{hedd}{edd.}{Lit,Erm,Sm} \DeclareShorthand{hegoscr}{\emph{scripsi}}{ego} % Silius Italicus' Punica, IX, 30--2: \DeclareWitness{sL}{L}{Laurentianus, plut, XXXVII, cod. 16}[ origDate=s. XV] \DeclareWitness{sF}{F}{Florentianus, Bibl. Aed. Fl. Eccl. CXCVI}[ origDate=s. XV] \DeclareWitness{sO}{O}{Oxoniensis Collegii Reginensis CCCXIV}[ origDate=s. XV] \DeclareWitness{sV}{V}{Vaticanus lat. 1652}[ origDate=s. XV] \DeclareSource{sDrak}{\emph{Drakenborch}} \end{filecontents} \documentclass{ltxdoc} %\usepackage[letterpaper,margin=25mm,left=50mm,nohead]{geometry} \usepackage[letterpaper,margin=1.25in,left=50mm,nohead]{geometry} \usepackage{dox} \doxitem{Option}{option}{options} \usepackage{microtype} \usepackage[no-math]{fontspec} \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{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} \babelfont[greek]{sf}[Script=Greek]{NewComputerModern Sans} \babelfont[greek]{tt}[Script=Greek]{NewComputerModern Mono} \babeltags{ancientgreek = greek} \def\sg#1{\textancientgreek{#1}} \usepackage[Old Standard]{mathfont} \usepackage{arabluatex} \usepackage[parnotes=roman,teiexport=tidy]{ekdosis} \input{ekdosis-cfg} \AddxmlBibResource{bibdata.xml} \usepackage{booktabs} \usepackage{xltabular} \usepackage[prevent-all]{widows-and-orphans} \usepackage[shortcuts,nospacearound]{extdash} \usepackage[american]{isodate} \usepackage{nextpage} \usepackage{spacingtricks} \usepackage{csquotes} \usepackage{relsize} \usepackage{enumitem} \setlist{nosep} \setlist[itemize]{label=\textendash} \setlist[enumerate,1]{label=(\alph*)} \newlist{remarks}{enumerate}{10} \setlist[remarks]{ label*=\textsc{Rem.} \arabic*, left=0.25in, before=\smaller} \usepackage{manfnt} \usepackage{lettrine} \newcommand\danger{\lettrine[loversize=-.5]{\textdbend}{\hskip6pt}} \usepackage{metalogox} \usepackage{hologo} \usepackage{xcolor} \newbool{nocolordoc} \definecolor{ekdcolor}{RGB}{243,241,235} \definecolor{cinnamon}{rgb}{0.82, 0.41, 0.12} \ifbool{nocolordoc}{ \colorlet{ekdcolor}{white} \colorlet{cinnamon}{black}}{} \definecolor{gainsboro}{RGB}{222,222,222} \PassOptionsToPackage{bookmarks=true}{hyperref} \usepackage{xurl} \usepackage[numbered]{hypdoc} \usepackage[loadlang=en]{metastr} \hypersetup{ colorlinks, allcolors=cinnamon, linktocpage=true, pdftype={Text} } \usepackage{uri} \labelformat{section}{sect.~#1} \labelformat{subsection}{sect.~#1} \labelformat{subsubsection}{sect.~#1} \labelformat{figure}{fig.~#1} \usepackage[defaultindex=none,citecmd=autocite]{icite} \bibinput{ekdosis} \usepackage[nospace,american]{varioref} \usepackage[style=oxnotes-inote,dashed]{biblatex} \DeclareSourcemap{ \maps[datatype=bibtex]{ \map{ \step[fieldsource=issuetitle] \step[fieldset=journalsubtitle,origfieldval] } } } \ifbool{nocolordoc} { \usepackage{academicons} \def\oasymbol{\aiOpenAccess} \usepackage{biblatex-ext-oa} } {\usepackage[symbolpackage=tikz]{biblatex-ext-oa}} \DeclareDelimFormat[bib,biblist]{nametitledelim}{\addcomma\space} \DeclareDelimFormat[bib,biblist]{innametitledelim}{\addcomma\space} \renewcommand*\newunitpunct{\addcomma\space} \newcommand*{\halurl}[1]{http://hal.archives-ouvertes.fr/#1} \DeclareFieldFormat{eprint:hal}{% \ifhyperref {\href{\halurl{#1}}{hal:~\nolinkurl{#1}}} {hal:~\nolinkurl{#1}}} \DeclareFieldAlias{eprint:HAL}{eprint:hal} \DeclareOpenAccessEprintUrl[always]{hal}{% http://hal.archives-ouvertes.fr/\thefield{eprint}} \DeclareOpenAccessEprintAlias{HAL}{hal} \addbibresource{ekdosis.bib} \metaset{titletext}{% \metapick[#1]{title}% \metacompose[#1]{subtitle}{\metaget[sep]{subtitle}}{}{}} \metaset[print]{titletext}{% \metatitleline[print]{title}% \metatitleline[print]{subtitle}% \metatitleline[print]{author}% \metatitleline[print]{contactemail}% \metatitlelinetwo[print]{date}[print]{draft}} \metaset[skip]{subtitle}{\vspace{1ex}} \metaset[skip]{author}{\vspace{2ex}} \metaset[skip]{date}{\vspace{1ex}} \metaset[style]{title}{\LARGE} \metaset[style]{author}{\large} \metaset[sep]{draft}{ -- } \metasetlang{en-US} \metaset{title}{ἔκδοσις} \metaset{date}{\filedate} \metaset{draft}{\fileversion} \metaset{subject}{TEI xml compliant critical editions} \metaset{subtitle}{Typesetting TEI xml Compliant Critical Editions} \metaset[print]{subtitle}{Typesetting \texttt{TEI xml} Compliant Critical Editions} \metaset{author}{Robert Alessi} \metaset{keywords}{LaTeX, Lua, TEI xml, multilingual critical editions, alignment, segmentation} \metaset{contactemail}{alessi@roberalessi.net} \metaset[print]{contactemail}{\mailto[ekdosis]{alessi@robertalessi.net}} \metaset{contacturl}{http://www.roberalessi.net} \metaset{partof}{The ekdosis Package} \metaset[print]{partof}{The \textsf{ekdosis} Package} \metaset{copyrightowner}{\metapick[#1]{author}} \metaset{copyrightdate}{2020} \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 the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''.} \metaset{licenseurl}{https://www.gnu.org/licenses/fdl-1.3.html} \metaset[print]{licenseurl}{% \url{https://www.gnu.org/licenses/fdl-1.3.html}} \metaset[cmd]{licenselogo}{\includegraphics[scale=0.75]{#1}} \metawritepdfinfo \metawritepdfaux \metawritepdfpreamble \metawritepdfcontact \metawritepdfrights \usepackage{multicol} \setlength\IndexMin{100pt} \usepackage{tocloft} \newlistof{listing}{lol}{List of listings} \renewcommand\cfttocprehook{\begin{multicols}{2}} \renewcommand\cfttocposthook{\end{multicols}} \renewcommand\cfttoctitlefont{\Large\bfseries} \renewcommand\cftlolprehook{\begin{multicols}{2}} \renewcommand\cftlolposthook{\end{multicols}} \renewcommand\cftloltitlefont{\Large\bfseries} \usepackage{units} \newcommand*\tred[1]{\textcolor{red}{#1}} \usepackage{fbox} \usepackage{tikz} \usetikzlibrary{tikzmark} \NewDocumentCommand{\pointto}{m}{% \tikz[remember picture] \draw[>->,color=blue,overlay] (0em,0.5ex) to ([shift={(0.5em,0pt)}]pic cs:#1);% \tikz[remember picture] \draw[color=gray, overlay] ([shift={(0.5em,0.5ex)}]pic cs:#1) circle [radius=8pt];} \NewDocumentCommand{\pointtol}{m}{% \tikz[remember picture] \draw[>->,color=blue,overlay] (0em,0.5ex) to [bend left] ([shift={(0.5em,0pt)}]pic cs:#1);% \tikz[remember picture] \draw[color=gray, overlay] ([shift={(0.5em,0.5ex)}]pic cs:#1) circle [radius=8pt];} \NewDocumentCommand{\pointtor}{m}{% \tikz[remember picture] \draw[>->,color=blue,overlay] (0em,0.5ex) to [bend right] ([shift={(0.5em,0pt)}]pic cs:#1);% \tikz[remember picture] \draw[color=gray, overlay] ([shift={(0.5em,0.5ex)}]pic cs:#1) circle [radius=8pt];} \NewDocumentCommand{\pointtoer}{m}{% \tikz[remember picture] \draw[>->,color=blue,overlay] (0em,0.5ex) to [bend right] ([shift={(0em,0pt)}]pic cs:#1);% \tikz[remember picture] \draw[color=gray, overlay] ([shift={(-0.5em,0.5ex)}]pic cs:#1) ellipse [x radius=45pt, y radius=6pt];} \usepackage[breakable, skins, xparse]{tcolorbox} \tcbset{colback=white, boxrule=0.4pt, colframe=cinnamon, breakable} \usepackage[newfloat]{minted} \labelformat{listing}{listing~#1} \ifbool{nocolordoc}{\usemintedstyle{bw}}{} \setminted{bgcolor=ekdcolor,linenos, fontsize=\small} \newminted[ekdlua]{lua}{bgcolor={}, linenos, fontsize=\relsize{-0.5}, xleftmargin=12pt, breaklines, numberblanklines=false, numbersep=3pt, firstnumber=last} \renewcommand{\theFancyVerbLine}{\normalfont\smaller\arabic{FancyVerbLine}} \usepackage[contents]{colordoc} \newcommand{\pkg}[1]{\textsf{#1}\index{#1=#1 (package)}} \newcommand{\env}[1]{\texttt{#1}\index{#1=#1 (environment)}} \backgroundcolor{c}{ekdcolor} \usepackage{caption} \captionsetup[listing]{position=above,skip=-1ex} \usepackage{needspace} \NewDocumentCommand{\captof}{O{listing} m O{}}{% \bgroup \needspace{5\baselineskip}% \vskip 1ex plus 2pt minus 2pt% \captionof{#1}{#2}% #3% \egroup} \NewDocumentCommand{\newfeature}{o}{% \leavevmode \IfNoValueTF{#1} {\marginpar{\hfill\emph{New feature}}} {\marginpar{\hfill\emph{New feature} #1}}% \ignorespaces } % \usepackage{etoc} % \etocsettocdepth{paragraph} % \newcommand{\ekdtableofcontents}{% % \begingroup % \etocsetstyle{section}{}{} % {\etocsavedsectiontocline{% % \numberline{\etocnumber}\etocname}{\etocpage}}{} % \etocsetstyle{subsection}{}{} % {\etocsavedsubsectiontocline{% % \numberline{\etocnumber}\etocname}{\etocpage}}{}% % \etocsetstyle{subsubsection}{}{} % {\etocsavedsubsubsectiontocline{% % \numberline{\etocnumber}\etocname}{\etocpage}}{}% % \etocsetstyle{paragraph}{}{\leftskip2cm\rightskip 2.2em \parfillskip % 0pt plus 1fil\relax \nobreak} % {\noindent\etocname{} \etocpage{} }{\par}% % \etocmulticolstyle[2]{\section*{Contents}} % \pdfbookmark[1]{Contents}{toc} % \tableofcontents % \endgroup} \EnableCrossrefs \CodelineIndex \RecordChanges %\OnlyDescription \begin{document} \DocInput{\jobname.dtx} \PrintChanges \PrintIndex \end{document} % % \fi % % \CheckSum{0} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % \GetFileInfo{\jobname.dtx} % \DoNotIndex{\newcommand,\newenvironment,\begin,\begingroup} % \DoNotIndex{\bgroup,\def,\edef,\egroup,\else,\expandafter,\endgroup} % \DoNotIndex{\fi,\ifdefined,\luadirect,\luastring,\luastringN} % \DoNotIndex{\luastringO,\NewDocumentCommand,\space,\unexpanded} % % \pdfbookmark[1]{\metaterm{title}}{title} % \begin{tcolorbox}[ % colframe=black, % enhanced, % drop lifted shadow, % colback=white, % boxrule=.25mm, % halign=center, % center % ] % \metapick[print]{titletext} % \end{tcolorbox} % % \tableofcontents % \listoflistings % % \changes{v0.99a}{2020/07/08}{First public release (documentation in % progress)} % \changes{v1.0}{2020/08/14}{Documentation complete} % % \begin{abstract} % \pkg{ekdosis} is a Lua\LaTeX{} package designed for % multilingual critical editions. It can be used to typeset texts % and different layers of critical notes in any direction accepted % by Lua\TeX. Texts can be arranged in running paragraphs or on % facing pages, in any number of columns which in turn can be % synchronized or not. In addition to printed texts, % \pkg{ekdosis} can convert \texttt{.tex} source files so as to % produce \texttt{TEI xml} compliant critical % editions. Database-driven encoding under \LaTeX{} then allows % extraction of texts entered segment by segment according to % various criteria: main edited text, variant readings, translations % or annotated borrowings between texts. It is published under the % terms of the GNU General Public License (GPL) version 3. % \end{abstract} % % \section*{License and Disclaimer} % \addcontentsline{toc}{section}{License and disclamer} % \subsection*{License Applicable to this Document} % \pdfbookmark[2]{Licence applicable to this document}{copyright-doc} % \leavevmode\marginpar{\hfill\texttt{fdl1.3}} % \metapick[print]{rightstext} (See below \vref{sec:fdl}.) % % \subsection*{License Applicable to the Software} % \pdfbookmark[2]{Licence applicable to the software}{copyright-soft} % \label{sec:license-software} % % \pkg{ekdosis} --- \metapick[print]{subtitle} % \metapick[print]{copyrightstatement} % % Please send error reports and suggestions for improvements to Robert % Alessi: % \begin{itemize} % \item email: \mailto[ekdosis package]{alessi@roberalessi.net} % \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} % \end{itemize} % % \leavevmode\marginpar{\hfill\texttt{gpl3+}} % This program is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation, either version 3 of the License, or % (at your option) any later version. % % This program is distributed in the hope that it will be useful, but % WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU % General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program. If not, see % \href{http://www.gnu.org/licenses}% % {\texttt{}}. % % This release of \pkg{ekdosis} consists of the following % source files: % \begin{itemize} % \item |ekdosis.ins| % \item |ekdosis.dtx| % \item |ekdosis.el| % \item |Makefile| % \end{itemize} % % \section{Introduction} % \label{sec:introduction} % \begin{comment} % \begin{keyfigure}{l={fig:grid-typesetting},c={Grid Typesetting % (which never came into existence)}, t={Each square in the grid % has a side length of \unit[10]{pt}. Therefore, the distance % between the last line of the text and the first line of the % apparatus is here approximately \unit[25]{pt}.}} % \centering % \begin{tikzpicture} % \draw[gainsboro,thin] (0.5,0.5) grid [step=10pt] (10,5); % % \path node [align=justify, text width=8cm] at (5.5,3) {% % I saw my friend Peter at the station yesterday. We were both % in a great mood. \enquote{How nice to find you here!} he % said. I chuckled to myself, recalling the last time we % met.\par % \rule{3cm}{0.01cm}\par\footnotesize% % \textbf{1}~saw A] met B\hskip1em Peter A] John B \hskip1em % \textbf{2}~great A] good B\hskip1em \textbf{2--3}~How % nice... said A] \emph{om.} B\hskip1em \textbf{4} \emph{post} % met \emph{add.} there B.}; \node at (0,3) {\scriptsize % $\approx$ \unit[25]{pt}}; \draw [->] (0,2.875) -- (0,2.025); % \end{tikzpicture} % \end{keyfigure} % \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 % \mkbibemph{\citefield{Alessi2020}{journaltitle}} as a contribution % to a Digital Humanities workshop held at Stanford University % (\printdate{2019-04-15}).\footcite{Alessi2020} % % The name of this package, \pkg{ekdosis}, derives from a Greek % action noun\---\sg{ἔκδοσις}\---the meaning of which is: % \enquote{publishing a book}, and also in concrete sense: \enquote{a % publication, treatise}. For us moderns, this term refers to a long % tradition of scholarly work consisting in establishing from % manuscript evidence the texts of Greek and Latin classics that were % handled down through the Middle Ages to the time of the first % printed editions. Of course, this definition is extendible to other % languages as well. The basic premise is that critical editions % exhibit reconstructed texts from manuscript evidence either under % the title of the edited text (direct tradition) or from explicit % citations or parallel passages or translations in other languages % (indirect tradition). % % Whether in print or digital, critical editions come with an % apparatus criticus in which is mentioned all the evidence that was % used to build the edited text. Arguably, it is precisely on this % common point that the two kind of editions part ways for reading a % traditional, well written apparatus criticus is only meant for % experienced readers. Getting oneself familiarized with its many % conventional rules is not unrelated to learning a language, equipped % with technical terms, grammar rules and style embellishments, which % came into existence out of over three centuries of scholarly % attainments. Nevertheless, whereas this language is immediately % accessible to human mind's ability to use language and interpret % conventional symbols, it is quite inaccessible to a computer unless % every item of information has been encoded in the rather dumb format % that is suited to machines. % % On the other hand, editions in print have their own limitations. For % example, every detail that editors of classical texts decide to % discard to save space, regardless to its relevance to the purpose of % the edition, is lost permanently as in the case of dialectal % coloring of ancient books. Furthermore, passages collected as % indirect tradition are only available as references in the % \emph{apparatus testium} and cannot be referred to the original % text. As a result, the reader is refrained from bestowing attention % upon major parallel passages to understand better difficult passages. % % To conclude on these issues, print publications and digital editions % are often contrasted as they belonged to two different % worlds.\footnote{For a good illustration of this point, see % \cite[\mkbibquote{Content, not Display}]{DLL-TC}.} It is commonly % said that the content of editions in print is the result of the % binding of the book itself as an object, whereas digital editions, % in which format and presentation are by definition separated from % content, are free from limitations coming from such bindings. To sum % up from the foregoing considerations, this statement is likely to be % qualified: as already seen above, the apparatus criticus must be % looked at as a brilliant production of mind refined by centuries of % scholarly tradition\---and surely tradition must go on\---arguably % not as compact paragraphs that require special and painful training % to be \enquote*{decoded}. On the other hand, what editions in print % do not provide are what \citename{Mastronarde.Tarrant2017}{author} % have called \enquote{actionable texts for use in digital research},% % {\interfootnotelinepenalty=10000\footcite{Mastronarde.Tarrant2017}} % namely database-driven texts allowing the reader to select % annotations and display or arrange translations, parallel passages % or borrowings in a variety of ways. % % \pkg{ekdosis} can be seen as an attempt at combining the two % approaches. % % \subsection{Requirements} % \label{sec:requirements} % Please refer to \vref{ref:ekdrequirements}. % % \subsection{Features} % \label{sec:features} % A list of the main features of \pkg{ekdosis} follows:--- % \begin{enumerate} % \item \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, % either on single or facing pages, which in turn can be % 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\/}: % 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 % text), apparatus testium (to collect testimonia or parallel % passages), or any kind of short notes to be printed on the same % page as the edited text, \emph{\&c}. % \item \texttt{TEI xml} output: \pkg{ekdosis} can be instructed to % output both PDF and \texttt{TEI xml} files at the same time. % \item \emph{Database-driven encoding} under \LaTeX{} of texts % entered segment by segment allows for alignment of parallel texts % from multilingual corpora. % \end{enumerate} % % Before going into detail, the following simple example will give the % reader a general idea of the method of encoding with % \pkg{ekdosis} authoritative texts composed of lemmata, in a way % that is very close to \texttt{TEI xml} encoding:--- % % \captof{The \enquote{Peter/John} basic example}[\label{lst:pj1}] % \iffalse %<*example> % \fi \begin{minted}{latex} \begin{ekdosis} I \app{ \lem{saw} \rdg{met} } my friend \app{\lem{Peter}\rdg{John}} at the station yesterday. \end{ekdosis} \end{minted} % \iffalse % % \fi % % PDF output:--- % \medskip % % \needspace{7\baselineskip} % \begin{alignment}[flush,tcols=1,texts=specimen,apparatus=specimen] % \begin{specimen} % I % \app{ % \lem{saw} % \rdg{met} % } % my friend % \app{ % \lem{Peter} % \rdg{John} % } % at the station yesterday. % \end{specimen} % \end{alignment} % % \texttt{TEI xml} output:--- % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml}

I saw met my friend Peter John at the station yesterday.

\end{minted} % \iffalse % % \fi % % As can be seen from \vref{lst:pj1}, the edition text is inserted in % the \env{ekdosis} environment (l.~1 to 8). Then two % \cs{app}\marg{apparatus entry} commands (ll.~3 and 7) contain the % lemma (\cs{lem}\marg{lemma}), namely the reading that is accepted by % the editor, and at least one variant reading % (\cs{rdg}\marg{reading}, ll.~5 and 7). As the listing shows, the % editor is free to lay out the code in a legible manner to the eye: % the first lemma above spans several lines whereas the second one is % written in sequence without spaces. % % In the PDF ouput, the edition text is printed in the upper part of % the page, above the line, and naturally shows the accepted % readings. The margins are used for numeration. In the apparatus % criticus, below the line, reference to the text is made by % specifying the number of the line and if several entries refer to % the same line, numbers are not repeated. Instead, entries are % separated from one another by a broad horizontal space. Finally, a % square bracket is used inside entries to distinguish the lemma from % the variant readings. % % Furthermore, as said above, if a \texttt{TEI xml} output be % required, \pkg{ekdosis} compiles an additional |.xml| file an % excerpt of which is provided above. % % \section{The Basics of \pkg{ekdosis}} % \label{sec:ekdosis-basics} % %\subsection{Loading the Package\---General Options} %\label{sec:load-general-options} % % \pkg{ekdosis} is loaded in the preamble like so:--- % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \usepackage{ekdosis} \end{minted} % \iffalse % % \fi % % \pkg{ekdosis} may be loaded with four optional \enquote*{named % arguments} either of which is set using the syntax % \meta{key}$=$\meta{value}. The description of the optional arguments % follows. % % \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} % |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| % can be set to insert critical notes in the default footnote block % which can be considered to be a special kind of float that is % printed at the bottom of pages. In this case, the apparatus criticus % will be inserted between regular numbered footnotes, but will carry % no footnote mark of its own. % % \DescribeOption{divs}\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 % divisions of which may depend on many different received % traditions. \pkg{ekdosis} provides a flexible mechanism in which % format and presentation have been carefully separated from % content. It is designed to build un-numbered \texttt{TEI} divisions % allowed to nest recursively.\footnote{See below, % \vref{sec:body-divisions}.} However, if |divs| be set to |latex|, % \LaTeX{} standard textual divisions can be used and will be % translated into \texttt{TEI} numbered |
| elements. % % \danger It must be noted that the two styles are mutually exclusive. % \vskip\baselineskip % % \DescribeOption{parnotes}\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. % % \DescribeOption{teiexport}\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 % 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 % raw |.xml| file that is produced by \pkg{ekdosis} can be further % processed by the \textsf{tidy} console application.\footnote{See % \url{http://www.html-tidy.org}.} To make this happen, \textsf{tidy} % must be installed and the |.tex| source file must be compiled with % the |--shell-escape| facility so that spawning programs from % \LaTeX{} can be allowed.\footnote{See % \url{https://texfaq.org/FAQ-spawnprog} for more information on how % to do this.} % % As an example, the following line loads \pkg{ekdosis} and instructs % it to output a \texttt{TEI xml} file (in addition to the PDF one) % and to use \pkg{parnotes} to format with Roman numerals the footnotes % that are inserted in the apparatus criticus:--- % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \usepackage[teiexport, parnotes=roman]{ekdosis} \end{minted} % \iffalse % % \fi % % \subsection{Witnesses, Hands, Sources, Scholars \& Shorthands} % \label{sec:declarations} % \paragraph{Terminology} % \label{sec:terminology} % Strictly speaking, the term \enquote{witness} should apply to any % manuscript evidence dating back to the Middle Ages used by the % editor to establish the edition text. That said, editors often % consult many other types of documents, such as modern editions, % articles, notes, correspondence and the like, all of which fall into % the category of \enquote{sources}. Furthermore, unpublished % conjectures are also taken into account, not to mention the % corrections and emendations that are proposed in many places by the % editor of the text. As it is necessary to refer to scholars as % individuals, \enquote{scholars} naturally emerges as a third % category. % % Any reference that is to be used in the apparatus criticus must be % \enquote{declared} in the preamble beforehand, namely: manuscript % sigla (either for single manuscripts or manuscript families, primary % or later hands, \emph{\&c.}), abbreviated last names of sources % and scholars. To that effect, \pkg{ekdosis} provides the following % preamble-only commands:--- % % \paragraph{Witnesses} % \DescribeMacro{\DeclareWitness} \cs{DeclareWitness}\marg{unique % id}\marg{rendition}\marg{description}\oarg{options} % \label{ref:declarewitness}\\ % This command requires three mandatory arguments enclosed between % curly braces used to specify consecutively: % \begin{enumerate} % \item The unique identifier of the witness to be used both in the % |.tex| source file and as an |xml:id| in the \texttt{TEI xml} % output if any. % \item The rendition to be used in the printed apparatus criticus, % which also will be found within the || element of the % \texttt{TEI} header where the description of the witness occurs, % within a || element. % \item A basic description of the manuscript to be found in a typical % printed Conspectus Siglorum, namely: the name of the manuscript % followed by its call number. % \end{enumerate} % Finally, the optional argument of \cs{DeclareWitness} accepts a % comma-separated list of the following \enquote{name=value} arguments % that are used to collect items of information to be found within % the || element in the \texttt{TEI} % header:---\footnote{See % \url{https://tei-c.org/release/doc/tei-p5-doc/en/html/MS.html\#msid} % 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 % of an institution such as a university or library.\\ % \DescribeOption{repository} |repository|$=$\meta{name}: The name of % the repository within which the witness is stored.\\ % \DescribeOption{collection} |collection|$=$\meta{name}: The name of % a collection of manuscripts.\\ % \DescribeOption{idno} |idno|$=$\meta{call \#}: Any form of call % number.\\ % \DescribeOption{msName} |msName|$=$\meta{name}: The name commonly % used for the witness.\\ % \DescribeOption{origDate} |origDate|$=$\meta{date}: Any form of date % used to identify the date of origin for the witness. % % \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 from Hippocrates, could be % declared as follows:--- \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \DeclareWitness{M}{M}{\emph{Marcianus Gr.} 269}[ settlement=Venice, institution=Marciana Library, msName=Marcianus Gr., idno=269, origDate=s. X] \end{minted} % \iffalse % % \fi % % \paragraph{Hands} % \DescribeMacro{\DeclareHand} \cs{DeclareHand}\marg{unique % id}\marg{base ms.}\marg{rendition}\oarg{note}\\ % This command requires three mandatory arguments enclosed between % curly braces and one optional argument between square brackets used % to specify consecutively:--- % \begin{enumerate} % \item The unique identifier of the hand to be used both in the % |.tex| source file and as an |xml:id| in the \texttt{TEI xml} output % if any. % \item The unique idendifier of the witness the hand is related % to. Of course, this witness must have been declared beforehand. % \item The rendition to be used in the printed apparatus criticus, % which also will be found within the || element of the % \texttt{TEI} header where the description of the hand occurs, within % a || element. % \item Some further information about the hand. % \end{enumerate} % % To continue the preceding example, here is how additions and % corrections found in the \emph{Marcianus Gr.}~269 could be declared % after this witness has been declared itself:--- % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \DeclareHand{M1}{M}{M\textsuperscript{1}}[Emendatio scribae ipsius] \DeclareHand{M2}{M}{M\textsuperscript{2}}[Manus posterior] \end{minted} % \iffalse % % \fi % % As can be seen, values such as |M|, |M1| and |M2| in the |.tex| % source file will be printed as \getsiglum{M}, \getsiglum{M1} and % \getsiglum{M2} respectively. Not only the code gains legibility, but % also flexibility for simply changing any declared rendition will % update corresponding sigla throughout the entire edition. % % As a final example, here is how \pkg{ekdosis} would encode % information as declared above for the \emph{Marcianus Gr.}~269 % should a \texttt{TEI} output be required:--- % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml} M Marcianus Gr.269 Venice Marciana Library 269 Marcianus Gr. M 1

Emendatio scribae ipius

M 2

Manus posterior

s. X
\end{minted} % \iffalse % % \fi % \label{ref:marcianus-e} % % \paragraph{Sources} % \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 % text is traditionally divided into two parts: a)~\emph{Codices}, % which provides the list of sigla used in the apparatus, % b)~\emph{Editiones uel Studia}, which provides references to % sources, either published or unpublished, which contain conjectures % used in the apparatus criticus. \cs{DeclareSource} takes two % mandatory arguments used to specify consecutively:--- % \begin{enumerate} % \item A unique label used in the |.tex| source file to refer to the % work where the conjecture is found. % \item The rendition to be used in the printed apparatus criticus. % \end{enumerate} % % \danger As \pkg{ekdosis} can include and use \texttt{TEI xml} % compliant lists of references,\footnote{See below % \vref{sec:references-cited-works}.} it is advisable to use % Bib\hologo{(La)TeX} labels in the first argument of % \cs{DeclareSource}. Otherwise, the unique label used to declare the % source would point to no |xml:id| and the \texttt{TEI xml} would not % be valid. Likewise, shorthands fields from the bibliographical % database can be recalled from within the second argument of % \cs{DeclareSource}:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \DeclareSource{Wil}{Wilamowitz} % or for example: \DeclareSource{Wil}{\citename{Wil}{shorteditor}} \end{minted} % \iffalse % % \fi % \label{sec:declarations-end} % % \paragraph{Scholars} % \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 % example, corrections and conjectures are commonly inserted as % self-references to the editor of the text in the apparatus criticus % in print with such words as \emph{scripsi}, \emph{addidi}, % \emph{correxi} and the like. Other examples come from unpublished % conjectures of other scholars found in private % libraries. \cs{DeclareScholar} takes two mandatory arguments to % specify consecutively:--- % \begin{enumerate} % \item The unique identifier of the scholar to be used both in the % |.tex| source file and as an |xml:id| in the \texttt{TEI xml} output % if any. % \item The rendition to be used in the apparatus criticus in print, % which also will be found within the || element of the % \texttt{TEI} header where the description of the persons cited % occurs, within an || element. % \end{enumerate} % Finally, the optional argument of \cs{DeclareScholar} accepts the % following comma-separated list of |key-value| arguments:---\\ % \DescribeOption{rawname}|rawname|$=$\meta{name}\\ % |rawname| refers to a name that is not to be dissected into name % part components such as forename, surname and the like. If |rawname| % be used, then \pkg{ekdosis} will ignore the following three optional % arguments: |forename|, |surname| and |addname|.\\ % \DescribeOption{forename}|forename|$=$\meta{forename}\\ % |forename| refers to first and middle names or initials.\\ % \DescribeOption{surname}|surname|$=$\meta{surname}\\ % |surname| stores the last name.\\ % \DescribeOption{addname} |addname|$=$\meta{additional name}\\ % |addname| refers to an additional or alternate name by which the % scholar is known viz.\ a Latinized form of the name, a nickname, an % epithet or alias.\\ % \DescribeOption{note} |note|$=$\meta{note}\\ % |note| may hold any relevant information about the material used by % the editor. For example, a note may specify that this material has % been found as marginal notes by the hand of the scholar in some % edition in print. % % \paragraph{Shorthands} % \DescribeMacro{\DeclareShorthand} \cs{DeclareShorthand}\marg{unique % id}\marg{rendition}\marg{csv list of identifiers}\\ % This command provides a convenient way to declare \emph{families} of % witnesses. It takes three mandatory arguments used to specify % consecutively:--- % \begin{enumerate} % \item The unique identifier of the family to be used in the |.tex| % source file. % \item The rendition to be used in the printed apparatus criticus. % \item A comma-separated list of previously declared witnesses. % \end{enumerate} % % As an example, the manuscripts of Caesar's \emph{Gallic War} are % divided into two families: α, which includes mss.\ A, M, B, R, S, L % 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} % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \DeclareShorthand{a}{α}{A,M,B,R,S,L,N} \DeclareShorthand{b}{β}{T,f,U,l} \end{minted} % \iffalse % % \fi % % Then, symbols |a| and |b| can be used in the |.tex| source file in % place of manuscripts that belong to either family. % % That said, \cs{DeclareShorthand} is not meant to be restricted to % declared witnesses. On the contrary, it also applies to any declared % sources and scholars by means of \cs{DeclareSource} and % \cs{DeclareScholar}. As an example, assuming that a self-reference % to the person responsible for the edition has been set in the % preamble, an associated shorthand can be defined like so:--- % % \iffalse %<*example> % \fi \begin{minted}{latex} \DeclareScholar{ego}{ego}[ forename=John, surname=Smith, note=Main editor of the text] \DeclareShorthand{egoscr}{\emph{scripsi}}{ego} \end{minted} % \iffalse % % \fi % % Then, the shorthand |egoscr| (l.~5) can be used to print in the % apparatus criticus the technical term \emph{scripsi} and use at the % same time the pointer |#ego| that is expected in the \texttt{TEI % xml} output file. Detailed examples of this technique will be % provided below in \vref{sec:emendations-conjectures}. % % \subsubsection{Printing Formatted Witnesses % --- Conspectus Siglorum} % \label{sec:print-witnesses} % Once witnesses, hands, scholars and sources have been declared, % \pkg{ekdosis} provides two commands to have them printed as declared % from their indentifiers. % % \DescribeMacro{\getsiglum} \cs{getsiglum}\marg{csv list of witnesses % or single witness} behaves exactly as the |wit| optional argument of % \cs{lem} and \cs{rdg} described below on pages~\pageref{ref:lem-wit} % and \pageref{ref:rdg-wit}. From a single identifier or from a % comma-separated list of identifiers, it returns their formatted % counterparts. To return to the example provided % \vpagerefrange{ref:marcianus-b}{ref:marcianus-e}, |\getsiglum{M}| % would return \getsiglum{M}, while |\getsiglum{M1}| would return % \getsiglum{M1}. % % \DescribeMacro{\SigLine} \cs{SigLine}\marg{unique id} returns from % \meta{unique id} used in the first argument of % \cs{DeclareWitness}\footnote{See above % \vpageref{ref:declarewitness}.} a line ready to be inserted in a % table set to print a Conspectus Siglorum with the following items of % information separated by the symbol |&|: the siglum referring to the % witness, the contents of the |description| field and the contents of % the |origDate| field. An example of how one could print the % Conspectus Siglorum of the manuscripts of Caesar's \emph{Gallic War} % from the list provided \vpageref{ref:caesar-bg-sigla} follows:--- % % \captof{Conspectus Siglorum of Caesar's \emph{Gallic War}} % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \begin{xltabular}[c]{0.75\linewidth}{lXl} \caption*{\textbf{Conspectus siglorum}}\\ \multicolumn{3}{c}{\emph{Familia} \getsiglum{a}}\\ \SigLine{A}\\ & \getsiglum{A1} \emph{Emendationes scribae ipsius} & \\ \SigLine{M}\\ [...] \SigLine{N}\\ \multicolumn{3}{c}{\emph{Familia} \getsiglum{b}}\\ \SigLine{T}\\ [...] \SigLine{l}\\ \end{xltabular} \end{minted} % \iffalse % % \fi % % \begin{xltabular}[c]{0.75\linewidth}{lXl} % \caption*{\textbf{Conspectus siglorum}}\\ % \multicolumn{3}{c}{\emph{Familia} \getsiglum{ca}}\\ % \SigLine{cA}\\ % & \getsiglum{cA1} \emph{Emendationes scribae ipsius} & \\ % \SigLine{cM}\\ % \SigLine{cB}\\ % \SigLine{cR}\\ % \SigLine{cS}\\ % \SigLine{cL}\\ % \SigLine{cN}\\ % \multicolumn{3}{c}{\emph{Familia} \getsiglum{cb}}\\ % \SigLine{cT}\\ % \SigLine{cf}\\ % \SigLine{cU}\\ % \SigLine{cl}\\ % \end{xltabular} % % \subsection{Editing a Single Text With No Translation} % \label{sec:single-text-editing} % \DescribeEnv{ekdosis} % Running paragraphs of one single text to be edited should be % inserted in the \env{ekdosis} environment, like so:\footnote{See % above \vref{lst:pj1}.}--- % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \begin{ekdosis} Edition text goes here. \end{ekdosis} \end{minted} % \iffalse % % \fi % % \paragraph{Apparatus Entries} % \DescribeMacro{\app} \cs{app}|[type=|\meta{type}|]|\marg{apparatus % entries}\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 % \ref{sec:declarations} % \vpagerefrange{sec:declarations}{sec:declarations-end}, the \cs{app} % command is used for inserting entries in the apparatus criticus, % either lemmata, readings or notes, like so:--- % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} I saw my friend \app{\lem{Peter}\rdg{John}} yesterday. or: I saw my friend \app{ \lem{Peter} \rdg{John} } yesterday. \end{minted} % \iffalse % % \fi % \cs{app} accepts one further optional argument:---\\ % \DescribeOption{type} |type|$=$\meta{type}\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| % layer\---in the apparatus criticus. This layer is fit to receive % notes related to variant readings from witnesses and sources used by % the editor to establish the edition text. Additional layers can be % defined to receive other kinds of notes, such as references to texts % quoted or cited in the text of the edition (\emph{apparatus % fontium}), references to testimonia, or quotations of the edited % text by other authors (\emph{apparatus testium}), explanatory notes, % and so forth.\footnote{See below, \vref{ref:type-note}.} Once % additional layers have been defined and assigned to new % \enquote*{types}, such as \enquote*{testium} and the like, these % types can be used as values appended to the |type| \enquote*{named % option}. For more information about inserting notes in % multiple-layer apparatus, see \vref{sec:notes-in-multilayer-app}. % % \paragraph{Base text and variants} As can be seen in the example % above, there are two kinds of individual readings: the \emph{lemma}, % which contains the base text accepted by the editor, and the % \emph{reading}, which contains deviant readings rejected by the % editor. % % \danger What follows refers to the notions of \enquote{witness}, % \enquote{source} and \enquote{scholar} as defined above % \vpageref{sec:terminology}. % % \paragraph{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} % accepts the following % comma-separated list of \enquote{name$=$value} arguments:---\\ % \DescribeOption{wit} |wit|$=$\meta{csv list of % witnesses}\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 % 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 % 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]\\ % 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 % criticus.\footnote{For edition texts used as sources, see examples % 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]\\ % |resp| refers to scholars responsible for the emendations, % conjectures and corrections that are cited in the apparatus % criticus.\footnote{See detailed examples in % \vref{sec:emendations-conjectures}.}\\ % \DescribeOption{alt} |alt|$=$\meta{alternate lemma}\\ % While the mandatory argument of \cs{lem}, \meta{lemma text}, is % always used to print the edition text in the upper part of the page, % \meta{alternate lemma}, if specified, supersedes what is printed in % the related entry of the apparatus criticus. This mechanism is % useful in more than one respect. For instance, it can be used to % insert abbreviated lemmata in the apparatus criticus, or to % introduce an alternate way of writing entries with Latin technical % terms in the apparatus criticus as will be demonstrated below in the % example % provided by \vref{lst:pj2}.\\ % \DescribeOption{sep} |sep|$=$\meta{separator}\\ % |sep| allows to change the symbol used to separate the lemma text % from deviant readings, which is by default the closing square % 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.\\ % \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 % entry in the apparatus criticus.\\ % \DescribeOption{type} |type|$=$\meta{value}\\ % This named argument has no effect on the apparatus criticus of the % edition in print, but it is used in the \texttt{TEI xml} ouput to % classify the variation recorded in the entry according to some % convenient typology. Categories such as lexical, morphological, % orthographical and the like may apply. Obviously, |type=emendation| % should be restricted to lemma texts and |type=conjecture| to variant % readings recorded by means of \cs{rdg} described below. % % \needspace{11\baselineskip} % Finally, four named arguments can be used to insert words at the % following specific places in the lemma text:\\ % \noindent % \fparbox*{\centered{\textbf{1} \tikzmark{pre}\tred{pre} Peter % \tikzmark{post}\tred{post} \tikzmark{prewit}\tred{prewit} % \getsiglum{pjA} % \tikzmark{postwit}\tred{postwit}] John \getsiglum{pjB}}}\\ % \DescribeOption{pre} |pre|$=$\meta{words}\pointtol{pre}\\ % |pre| inserts \meta{words} \emph{before} the lemma text.\\ % \DescribeOption{post} |post|$=$\meta{words}\pointto{post}\\ % |post| inserts \meta{words} \emph{after} the lemma text.\\ % \DescribeOption{prewit} |prewit|$=$\meta{words}\pointto{prewit}\\ % |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} % % \paragraph{Readings} \DescribeMacro{\rdg} % \cs{rdg}\oarg{options}\marg{variant reading}\\ % As \meta{reading} is a word or a phrase judged by the editor to be % unsatisfactory or corrupted, \cs{rdg} prints it by default in the % last part of the corresponding entry in the apparatus criticus, % after the symbol that is used to separate words of the base text % (the lemma text) from words rejected by the editor. The optional % argument of \cs{rdg} accepts a comma-separated list of % \enquote{name$=$value} arguments that is almost identical to % \cs{app}. Therefore, emphasis will be placed here only on the % differences. The reader is invited to refer to the description % 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}\\ % \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 % the related entry in the apparatus criticus.\\ % \DescribeOption{type} |type|$=$\meta{value}\\ % Obviously, |type=conjecture| should be restricted to variant % readings and |type=emendation| to lemma texts recorded by means of % \cs{lem} described above.\\ % \DescribeOption{pre} |pre|$=$\meta{words}\\ % \DescribeOption{post} |post|$=$\meta{words}\\ % \DescribeOption{prewit} |prewit|$=$\meta{words}\\ % \DescribeOption{postwit} |postwit|$=$\meta{words}\\ % % \paragraph{Notes} % \DescribeMacro{\note}\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 % 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{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 % \enquote{name$=$value} % arguments:---\\ % \DescribeOption{pre} |pre|$=$\meta{words}\\ % |pre| inserts \meta{words} immediately before the note.\\ % \DescribeOption{post} |post|$=$\meta{words}\\ % |post| inserts \meta{words} immediately after the note.\\ % % \danger Under no circumstances is it permitted to insert this % command \cs{note} or \cs{note*} inside the argument of \cs{lem} or % \cs{rdg}. \cs{note}/\cs{note*} must go \emph{between} these % commands. As a general rule, within \cs{app}|{}| elements, notes are % inserted immediately \emph{after} the lemma or the variant reading % they are related to. However, as will be described below in % \vref{ref:type-note}, the command \cs{note}\---with no star % appended\---that is used to insert explanatory notes or references % to sources or testimonia is permitted within the mandatory argument % of \cs{lem}|{}|, although it is subject to a very strict syntax. % % \Vref{lst:pj2} provides an illustration of some of the possibilities % afforded by the commands just described:--- % % \captof{The \enquote{Peter/John} full example}[\label{lst:pj2}] % \iffalse %<*example> % \fi \begin{minted}{latex} \begin{ekdosis} I \app{ \lem[wit=A]{saw} \rdg[wit=B]{met}} my friend \app{ \lem{Peter} \rdg{John} } at the station yesterday. We were both in a \app{ \lem[wit=A]{great} \rdg[wit=B]{good}} mood. \app{ \lem[wit=A, alt={How nice... said}]{\enquote{How nice to find you here!} he said.} \note*{There are no quotation marks in the mss.} \rdg[wit=B, alt=\emph{om.}]{}} I chuckled to myself, recalling the last time we \app{ \lem[wit=A,nolem]{met} \rdg[wit=B, alt={\emph{post} met \emph{add.} there}]{met there} \note*{Ms. \getsiglum{B} provides other additions of this kind.}}. \end{ekdosis} \end{minted} % \iffalse % % \fi % % \needspace{7\baselineskip} % \resetlinenumber % \begin{alignment}[flush,tcols=1,texts=specimen,apparatus=specimen] % \begin{specimen} % I \app{\lem[wit=pjA]{saw}\rdg[wit=pjB]{met}} my friend % \app{ % \lem{Peter} % \rdg{John} % } % at the station yesterday. We were both in a % \app{ % \lem[wit=pjA]{great} % \rdg[wit=pjB]{good}} % mood. % \app{ % \lem[wit=pjA, alt={\textooquote How nice... said}]{\enquote{How % nice to find you here!} he said.} % \note*{There are no quotation marks in the mss.} % \rdg[wit=pjB, alt=\emph{om.}]{}} % I chuckled to myself, recalling the last time we % \app{ % \lem[wit=pjA,nolem]{met} % \rdg[wit=pjB, alt={\emph{post} met \emph{add.} there}]{met % there} % \note*{Ms. \getsiglum{pjB} provides other additions of this kind.}}. % \end{specimen} % \end{alignment} % % \begin{remarks} % \item Close examination of lines~17--8 from \vref{lst:pj2} shows how % |alt| has been used to insert an abridged lemma text in the % apparatus criticus in print while keeping safe what is to be found % in the \texttt{TEI xml} output. % \item The same technique has been used at line~24 to insert % alternate words, including Latin technical terms, in place of the % variant reading. Hence the use of |nolem| at line~23 to remove the % lemma text from the apparatus criticus in print. % \item \cs{note*} has been used to insert short annotations in two % places (ll.~19 and 26). % \item For an example of the use of |nordg|, see below % \vref{lst:caesar-bg}, l.~11. % \end{remarks} % % The corresponding \texttt{TEI xml} output produced by \pkg{ekdosis} % from the \LaTeX{} source file follows:--- % % \captof{The \enquote{Peter/John} full example: \texttt{TEI xml} % output}[\label{lst:pj2-tei}] % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml}

I saw met my friend Peter John at the station yesterday. We were both in a great good mood. How nice to find you here! he said. There are no quotation marks in the mss. I chuckled to myself, recalling the last time we met met there Ms. Bprovides other additions of this kind. .

\end{minted} % \iffalse % % \fi % % \section{Emendations and Conjectures} % \label{sec:emendations-conjectures} % 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 % 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 || % or || elements. However, as both come from editions or % scholars, not from manuscripts, they are naturally associated with % |source| or |resp| attributes as described above % \vpagerefrange{ref:lem-source}{ref:lem-resp},\footnote{See also % \vpagerefrange{ref:declare-source}{ref:declare-scholar}.} and can be % distinguished from one another by the |type| attribute, eg.\ either % |emendation| or |conjecture|. % % As an example, the representation of witnesses, editors and % shorthands of Hippocrates' \emph{Epidemics}, Book~2 could be % summarized as follows:--- % % \iffalse %<*example> % \fi \begin{minted}{latex} % Witnesses: \DeclareWitness{V}{V}{\emph{Vaticanus Gr.} 276} \DeclareWitness{I}{I}{\emph{Parisinus Gr.} 2140} \DeclareHand{Iac}{I}{I\textsuperscript{ac}}[Lectio ante correctionem] \DeclareHand{Ipc}{I}{I\textsuperscript{pc}}[Lectio post correctionem] \DeclareWitness{R}{R}{\emph{Vaticanus Gr.} 277} \DeclareWitness{H}{H}{\emph{Parisinus Gr.} 2142} % Sources (the first arguments below must refer to biblatex labels and % an xml bibliographical database must be supplied): \DeclareSource{Lit}{Littré} \DeclareSource{Erm}{Ermerins} \DeclareSource{Sm}{Smith} % Persons: \DeclareScholar{ego}{ego}[ forename=Robert, surname=Alessi] % Useful shorthands: \DeclareShorthand{codd}{codd.}{V,I,R,H} \DeclareShorthand{edd}{edd.}{Lit,Erm,Sm} \DeclareShorthand{egoscr}{\emph{scripsi}}{ego} \end{minted} % \iffalse % % \fi % % As can be seen from lines~18--20, three useful shorthands have been % defined: |codd| prints \enquote{codd.} for Latin pl.\ \emph{codices} % viz.\ \enquote{all manuscripts} and refers to the three \texttt{xml} % identifiers |V|, |I|, |R| and |H| declared at ll.~2--3 and 6--7; % |edd| prints \enquote{edd.} for Latin pl.\ \emph{editores} viz.\ % \enquote{all editors} and refers to the three \texttt{xml} % identifiers |Lit|, |Erm| and |Sm| declared at % ll.~10--12;\footnote{For detailed information on how to use % \cs{DeclareSource} and insert references to cited works, the reader % is invited to refer to \vref{sec:references-cited-works}.} finally, % |egoscr| (l.~20) is used to print the technical Latin term % \enquote{\emph{scripsi}}, \enquote{I wrote}, to denote a personal % conjecture. Then, the |.tex| source file can be structured as % follows:--- % % \iffalse %<*example> % \fi \begin{minted}{latex} \begin{ekdosis} καὶ ἐγίνετο μᾶλλον \app{ \lem[wit={V, Ipc,R,H}]{νότῳ} \rdg[wit=Iac]{νότου} \rdg[source=Erm, type=conjecture]{ἐν νώτῳ}}· [...] % conjecture εἰ \app{ \lem[resp=egoscr, type=emendation]{μὲν} % emendation \rdg[wit=codd, source=edd]{μὴ} } εἴη διὰ ταῦτα [...] \end{ekdosis} \end{minted} % \iffalse % % \fi % % \begin{remarks} % \item Line~5 introduces a \emph{conjecture} which has been annotated % with |type=conjecture| to facilitate its identification. Other % optional arguments could have been used, such as % |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 % \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} ouput % file. Other strategies could have been used. For example, one % could have defined a specific shorthand to print nothing in place % of |ego| and leave the insertion of technical terms to the |post| % optional argument of \cs{lem}, like so:--- % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} % Preamble: % (\unskip is for removing the space left by the empty 2nd argument % below.) \DeclareShorthand{egomute}{\unskip}{ego} % Document: \app{ \lem[resp=egomute, post=\emph{scripsi}, type=emendation]{μὲν} \rdg[wit=codd, source=edd]{μὴ} } εἴη διὰ ταῦτα [...] \end{minted} % \iffalse % % \fi % \end{remarks} % % PDF output:--- % \medskip % % \needspace{7\baselineskip} % \resetlinenumber % \begin{alignment}[flush,tcols=1,texts=specimen,apparatus=specimen] % \begin{specimen} % \begin{ancientgreek} % καὶ ἐγίνετο μᾶλλον \app{ % \lem[wit={hV, hIpc,hR,hH}]{νότῳ} % \rdg[wit=hIac]{νότου} % \rdg[source=Erm, type=conjecture]{ἐν νώτῳ}}· [...] % % εἰ \app{ % \lem[resp=hegoscr, type=emendation]{μὲν} % \rdg[wit=hcodd, source=hedd]{μὴ} % } εἴη διὰ ταῦτα [...] % \end{ancientgreek} % \end{specimen} % \end{alignment} % % \texttt{TEI xml} output:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml}

καὶ ἐγίνετο μᾶλλον νότῳ νότου ἐν νώτῳ · [...]

εἰ μὲν μὴ εἴη διὰ ταῦτα [...]

\end{minted} % \iffalse % % \fi % % \subsection{Editorial Addition and Deletion} % \label{sec:editorial-add-del} % \pkg{ekdosis} provides a set of commands to indicate that text has % been supplied or removed by conjecture. As regards critical % symbols conventionally used for representing emendations, lacunae, % omissions, gaps, editorial deletions or additions and the like, % \pkg{ekdosis} follows the standards as described by % \textcite[80--82]{West1973}:--- % \begin{description}[font=\ttfamily] % \item[<>] text added by conjecture or from a parallel source. % \item[***] lacuna in the whole textual tradition. % \item[<***>] conjectured lacuna. % \item[\{\}] editorial deletion. % \item[\dag\dag] text juged by the editor to be corrupt. Note that if % only one word is suspect, only one crux is needed. % \end{description} % % \DescribeMacro{\SetCritSymbols}\newfeature[v1.1] % \cs{SetCritSymbols}\marg{csv list of options} can be used to change % the critical symbols described above. This command accepts the % following list of |key-value| % optional arguments:---\\ % \DescribeOption{suppbegin}|suppbegin|$=$\meta{symbol} % \hfill\tcboxverb{Default: <}\\ % The opening symbol used to mark the text that is supplied.\\ % \DescribeOption{suppend}|suppend|$=$\meta{symbol} % \hfill\tcboxverb{Default: >}\\ % The closing symbol used to mark the text that is supplied.\\ % \DescribeOption{delbegin}|delbegin|$=$\meta{symbol} % \hfill\tcboxverb|Default: {|\\ % The opening symbol used to mark the text that is deleted.\\ % \DescribeOption{delend}|delend|$=$\meta{symbol} % \hfill\tcboxverb|Default: }|\\ % The closing symbol used to mark the text that is deleted.\\ % \DescribeOption{sicbegin}|sicbegin|$=$\meta{symbol} % \hfill\tcboxverb{Default: †}\\ % The opening symbol used to mark the text that is deemed to be % suspect.\\ % \DescribeOption{sicend}|sicend|$=$\meta{symbol} % \hfill\tcboxverb{Default: †}\\ % The closing symbol used to mark the text that is deemed to be % suspect.\\ % \DescribeOption{gapmark}|gapmark|$=$\meta{symbols} % \hfill\tcboxverb{Default: ***}\\ % The symbols used to mark lacunae.\\ % % As an example, what follows sets |[]| for deletions and |...| for % lacunae:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \SetCritSymbols{ delbegin = [, delend = ], gapmark = \dots } \end{minted} % \iffalse % % \fi % % \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@rlmode| which is evaluated as |true| if the % writing direction is set from right to left and as |false| % otherwise. As the \pkg{etoolbox} package is loaded by \pkg{ekdosis}, % \cs{ifboolean}|{al@rlmode}|\marg{rtl symbol}\marg{ltr symbol} can be % used to perform the test. % % \paragraph{Editorial Addition} % \DescribeMacro{\supplied}\newfeature[v1.1]\cs{supplied}\marg{text} % is used to mark \meta{text} that is by definition missing from the % tradition as supplied by the editor or some other scholar. This % command is normally expected in \cs{lem}|{}| or \cs{rdg}|{}|. % % \paragraph{Editorial Deletion} % \DescribeMacro{\surplus}\newfeature[v1.1] \cs{surplus}\marg{text} % is used to mark \meta{text} that is deemed to be inauthentic, but % nevertheless retained between braces in the edition text as it is % transmitted by all witnesses. This command is normally expected in % \cs{lem}|{}| or \cs{rdg}|{}|. % % \paragraph{Crux} % \DescribeMacro{\sic}\newfeature[v1.1] \cs{sic}\marg{text} takes as % mandatory argument the text deemed by the editor to be readable but % not understandable. \cs{sic} inserts \meta{text} between cruces % while \cs{sic*} prints only one crux before \meta{text}. % % \paragraph{Lacuna} % \DescribeMacro{\gap}\newfeature[v1.1] \cs{gap}\marg{csv list of % options} indicates that some amount of text has fallen away from the % entire tradition. It takes as mandatory argument a comma-separated % list of options that can be used to further specify the reason for % omission, the unit of measurement, the quantity or the extent, as % follows:---\\ % \DescribeOption{reason}|reason|$=$\meta{reason}\\ % |reason| gives the reason for omission.\\ % \DescribeOption{unit} |unit|$=$\meta{unit}\\ % |unit| provides some regularized measurement, such as |character|, % |word|, |line| and the like. % \DescribeOption{quantity} |quantity|$=$\meta{n}\\ % |quantity| specifies the number of the given unit that comprise the % measurement.\\ % \DescribeOption{extent} |extent|$=$\meta{description}\\ % |extent| describes the size, including quantity and unit in a single % string of words. % % \paragraph{Conjectured Lacuna} % Assumably, the conjectured lacuna should be enclosed by % \cs{supplied} and as such contained by \cs{lem} with % |type=emendation| to indicate that the lacuna has been accepted by % the editor. % % Examples follow:\footnote{On the use of \texttt{egomute} (l.~2), see % above \vref{it:egomute}.}--- % % \captof{Emendations, conjectures and % corrections}[\label{lst:emend-coni-corr}] % \iffalse %<*example> % \fi \begin{minted}{latex} % Preamble: \DeclareShorthand{egomute}{\unskip}{ego} % Document: \begin{ekdosis} σχεδὸν \app{ \lem[resp=egomute, nosep, post={post σχεδὸν quattuor uerba excidisse uid.}, type=emendation]{\supplied{\gap{reason=lost, unit=word, quantity=4}}} } οὗτοι subsidiis magnis \sic*{epicuri} constabilitas declinare quis est qui \sic{possit cernere sese}. \app{ \lem[resp=egomute, type=emendation, nosep, post={ante ὑπογίν.}]{\surplus{καὶ}} \note{deleui e Gal.P} } ὑπογίνονται Πάντων δὲ \app{ \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[wit=codd, source=edd, alt=om.]{} }, \end{ekdosis} \end{minted} % \iffalse % % \fi % % PDF output:--- % \medskip % % \needspace{7\baselineskip} % \resetlinenumber % \begin{alignment}[flush,tcols=1,texts=specimen,apparatus=specimen] % \begin{specimen} % σχεδὸν \app{ % \lem[resp=egomute, nosep, post={post σχεδὸν quattuor uerba % excidisse uid.}, type=emendation]{\supplied{\gap{reason=lost, % unit=word, quantity=4}}} % } οὗτοι % % subsidiis magnis \sic*{epicuri} constabilitas % % declinare quis est qui \sic{possit cernere sese}. % % \app{ % \lem[resp=egomute, type=emendation, nosep, post={ante % ὑπογίν.}]{\surplus{καὶ}} % \note{deleui e Gal.P} % } ὑπογίνονται % % % Πάντων δὲ \app{ % \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[wit=hcodd, source=hedd, alt=om.]{} % }, % \end{specimen} % \end{alignment} % % \texttt{TEI xml} ouput:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml}

σχεδὸν οὗτοι

subsidiis magnis epicuri constabilitas

declinare quis est qui possit cernere sese.

καὶ deleui e Gal.P ὑπογίνονται

Πάντων δὲ τῶν πυρετῶν addidi ( ^gamI`a 'l-.hummayAti Gal.) ^gamI`a 'l-.hummayAti ,

\end{minted} % \iffalse % % \fi % % \section{Alignment of Parallel Texts} % \label{sec:alignment-basic} % As already said above,\footnote{See point % \vref{it:multicol-feature}.} \pkg{ekdosis} can arrange sundry texts % in parallel columns\---synchronized or not\---either on the same % page or on facing pages. Depending on what is needed, any text can % be equipped with an apparatus criticus. The most common example is % that of an edition of a classical text with an apparatus criticus % accompanied by a translation into a modern language on the facing % page. One can also imagine an edition of two classical texts or two % different recensions of the same text, each of which provides % variants recorded in separate apparatus crititus, laid out on the % left-hand pages, with one or more translations on the corresponding % right-hand pages, and so forth. % % \paragraph{The \env{alignment} Environment} % \DescribeEnv{alignment} \cs{begin}|{alignment}|\oarg{options}\dots % \cs{end}|{alignment}|\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 % translation into a modern language on the facing pages. % % \DescribeEnv{edition}\DescribeEnv{translation} Within % \env{alignment}, two environments are available by default: % \cs{begin}|{edition}|\allowbreak\dots % \cs{end}|{ed|\allowbreak|ition}| and \cs{begin}|{translation}|\dots % \cs{end}|{translation}|. Obviously, the former is used to typeset % the edition text with an apparatus criticus on the left, while the % latter is used to typeset the translation on the right, like so:--- % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \begin{alignment} \begin{edition} First § of the edition text. \end{edition} \begin{translation} First § of the translation. \end{translation} \begin{edition} Second § of the edition text. \end{edition} \begin{translation} Second § of the translation. \end{translation} \end{alignment} \end{minted} % \iffalse % % \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 % environment\---for instance the leftmost one\---will have all other % associated paragraphs printed aligned. % % \danger While the whole edition text and the whole translation can % be inserted in a single \env{edition}/\env{translation} environment % respectively, it is recommended to enter both texts paragraph by % paragraph as shown in the example above. Not only this method of % 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}. % % As an illustration, a short extract of Caesar's \emph{Gallic War}, % VI, XIII.1 follows.\footnote{Latin text: \cite{Caesar-BG-v2}; % English translation: \cite{CaesarTr}.} See the list of sigla for % manuscripts and manuscript families above % \vpageref{ref:caesar-bg-sigla}. As this document is not set for % duplex printing, both texts have been put together on the same % page. However, the reader will find the full |.tex| source file % in \vref{sec:caesar-gw-tex} and \texttt{TEI xml} output in % \vref{sec:caesar-gw-tei}. The corresponding PDF output is available % in \href{samples/Caesar_BG-6-13-1.pdf}{a separate file}:--- % % \captof{Caesar's \emph{Gallic War}, VI, 13.1}[\label{lst:caesar-bg}] % \iffalse %<*example> % \fi \begin{minted}{latex} \begin{alignment} \begin{edition} \ekddiv{head=XIII, depth=2, n=6.13, type=section} In omni Gallia eorum hominum qui \app{ \lem[wit=a]{aliquo} \rdg[wit=b, alt=in al-]{in aliquo}} sunt numero atque honore genera sunt duo. Nam plebes paene seruorum habetur loco, quae \app{ \lem[wit={A,M}, alt={nihil audet (aut et \getsiglum{A1}) per se}]{nihil audet per se} \rdg[wit=A1,nordg]{nihil aut et per se} \rdg[wit={R,S,L,N}]{nihil habet per se} \rdg[wit=b]{per se nihil audet}}, \app{ \lem[wit=a]{nullo} \rdg[wit=b]{nulli}} adhibetur \app{ \lem{consilio} \rdg[wit={T, U}, alt=conc-]{concilio}}. \end{edition} \begin{translation} \ekddiv{head=XIII, depth=2, n=6.13, type=section} Throughout all Gaul there are two orders of those men who are of any rank and dignity: for the commonality is held almost in the condition of slaves, and dares to undertake nothing of itself, and is admitted to no deliberation. \end{translation} \end{alignment} \end{minted} % \iffalse % % \fi % % \needspace{7\baselineskip} % \resetlinenumber % \FormatDiv{2}{}{.} % \begin{alignment}[flush,lcols=2, % texts=edition[xml:lang="la"]; % translation[xml:lang="en"]] % \AtBeginEnvironment{edition}{\selectlanguage{latin}} % \AtBeginEnvironment{translation}{\selectlanguage{american}} % \begin{edition} % \ekddiv{head=XIII, depth=2, n=6.13, type=section} % In omni Gallia eorum hominum qui \app{ % \lem[wit=ca]{aliquo} % \rdg[wit=cb, alt=in al-]{in aliquo}} % sunt numero atque honore genera sunt duo. Nam plebes paene % seruorum habetur loco, quae \app{ % \lem[wit={cA,cM}, alt={nihil audet (aut et \getsiglum{cA1}) % per se}]{nihil audet per se} % \rdg[wit=cA1,nordg]{nihil aut et per se} % \rdg[wit={cR,cS,cL,cN}]{nihil habet per se} % \rdg[wit=cb]{per se nihil audet}}, \app{ % \lem[wit=ca]{nullo} % \rdg[wit=cb]{nulli}} adhibetur \app{ % \lem{consilio} % \rdg[wit={cT, cU}, alt=conc-]{concilio}}. % \end{edition} % \begin{translation} % \ekddiv{head=XIII, depth=2, n=6.13, type=section} % Throughout all Gaul there are two orders of those men who are of % any rank and dignity: for the commonality is held almost in the % condition of slaves, and dares to undertake nothing of itself, % and is admitted to no deliberation. % \end{translation} % \end{alignment} % % \begin{remarks} % \item As can be seen from the apparatus entry related to l.~4 above, % a subvariant has been inserted in the lemma part: \enquote{(aut et % \getsiglum{cA1})}. This was done by using |alt| in % \vref{lst:caesar-bg}, ll.~9--10. But as this variant is already % recorded\---and printed\---in the lemma part, it was necessary to % remove the entire otherwise redundant variant from the apparatus % criticus in print. Hence the use of |nordg| at l.~11. % \item For examples of abbreviations, see ll.~6 and 17. % \item Line~17 shows how mss.\ T and U (which belong to two distinct % subfamilies) have been separated from one another: % % \verb*+wit={T, U}+. See above \vpageref{ref:mss-sep-families} for % more information on this technique. % \end{remarks} % % Finally, the corresponding \texttt{TEI xml} output follows:--- % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml}
XIII

In omni Gallia eorum hominum qui aliquo in aliquo sunt numero atque honore genera sunt duo. Nam plebes paene seruorum habetur loco, quae nihil audet per se nihil aut et per se nihil habet per se per se nihil audet , nullo nulli adhibetur consilio concilio .

XIII

Throughout all Gaul there are two orders of those men who are of any rank and dignity: for the commonality is held almost in the condition of slaves, and dares to undertake nothing of itself, and is admitted to no deliberation.

\end{minted} % \iffalse % % \fi % % \subsection{Alignment of Several Texts} % \label{sec:multiple-alignment} % As described above \vpageref{ref:alignment-syntax}, the % \env{alignment} environment may receive an optional argument in % which % the following \enquote{name$=$value} arguments are accepted:---\\ % \DescribeOption{tcols} % |tcols|$=$\meta{number}\hfill\tcboxverb{Default: 2}\\ % |tcols| stores the \underLine{t}otal number of % \underLine{col}umn\underLine{s} of text to be aligned.\\ % \DescribeOption{lcols} % |lcols|$=$\meta{number}\hfill\tcboxverb{Default: 1}\\ % |lcols| stores the number of \underLine{col}umn\underLine{s} to be % printed on the \underLine{l}eft-hand page, \emph{out of the total % number} of columns specified with |tcols|. As can be seen from the % preceding two default values, \env{alignment} initially sets two % columns of text on facing pages. Of course, for this setting to work % properly, one must ensure that the \env{alignment} environment is % started on a % left page.\\ % \DescribeOption{texts} % |texts|$=$\meta{\underLine{semicolon}-separated % values}\hfill\tcboxverb{Default: edition;translation}\\ % Depending on the total number of columns that has been specified % with |tcols| above, |texts| is then used to define the names of the % environments that shall receive edition texts, translations, % \emph{\&c.} Furthermore, as described \vpageref{ref:starred-envs}, % \pkg{ekdosis} also defines \enquote{starred} versions of these % environments to be used to synchronize columns so that corresponding % paragraphs are printed vertically aligned. Some very important % points need to be emphasized in this respect:--- % \begin{enumerate} % \item Only unaccented letters of the alphabet (whatever the case) % are allowed to compose the names of \LaTeX{} environments. % \item These names must be separated from one another by % \emph{semicolons}, as shown in red in the listing below at the end % of lines~1 and 2. % \begin{enumerate} % \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 % \enquote*{suboptional} argument between square brackets which will % then be used to insert \texttt{TEI xml} attributes in the % corresponding |
| element. For example, \iffalse %<*example> % \fi \begin{minted}[escapeinside=++]{latex} texts=latin[xml:lang="la"]+\textcolor{red}{;}+ english[xml:lang="en"]+\textcolor{red}{;}+ french[xml:lang="fr"]+\textcolor{red}{,}+ \end{minted} % \iffalse % % \fi % will be converted into \texttt{TEI xml} as follows:--- % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml}
...
...
...
\end{minted} % \iffalse % % \fi % \begin{enumerate} % \item[\dbend] As can be seen, \pkg{ekdosis} takes care of % computing and inserting the |xml:id| attributes which are % therefore not accepted in the \enquote*{suboptional} arguments % of |texts|. % \end{enumerate} % \item The names of the environments must be specified in exactly the % same order as they are supposed to appear in the print edition, % from left to right. % \end{enumerate} % \DescribeOption{apparatus} % |apparatus|$=$\meta{\underLine{semicolon}-separated % values}\hfill\tcboxverb{Default: edition}\\ % Then, the |apparatus| option, just as |texts|, takes a % \underLine{semicolon}-separated list of previously defined % environments that shall receive at least one layer of apparatus % criticus.\\ % \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 % 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.\\ % \DescribeOption{lineation} |lineation|$=$\verb+page|document+ % \hfill\tcboxverb{Default: document}\\ % This option applies to edition texts initially set to receive an % apparatus criticus. By default, lines are continuously numbered % throughout the document. |lineation=page| sets the numbering to % start afresh at the top of each page.\\ % \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 % \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 % apparatus criticus. % % As an example, the alignment of the Latin edition text of Caesar's % \emph{Gallic War}, printed on left-hand pages, along with two % translations into English and French, printed on right-hand pages, % can be set as follows:--- % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \begin{alignment}[tcols=3, lcols=1, texts=latin[xml:lang="la"]; english[xml:lang="en"]; french[xml:lang="fr"], apparatus=latin, lineation=page] \begin{latin} Gallia est omnis divisa in partes tres quarum unam incolunt Belgae, [...] \end{latin} \begin{english} All Gaul is divided into three parts, one of which the Belgae inhabit, [...] \end{english} \begin{french} L'ensemble de la Gaule est divisé en trois parties: l'une est habitée par les Belges, [...] \end{french} \end{alignment} \end{minted} % \iffalse % % \fi % % \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 % so:---\\ % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \SetAlignment{ tcols=3, lcols=1, texts=latin[xml:lang="la"]; english[xml:lang="en"]; french[xml:lang="fr"], apparatus=latin, lineation=page } \begin{alignment} ... \end{alignment} \end{minted} % \iffalse % % \fi % % \cs{SetAlignment} can be used either in the preamble or at % any point of the document to set or to modify alignment settings. % % \subsubsection{Appending Hooks to Environments} % \label{sec:alignment-hooks} % \DescribeMacro{\AtBeginEnvironment} Once environments corresponding % to texts to be aligned have been defined, it is advisable to use the % \cs{AtBeginEnvironment}\marg{environment}\marg{code} command to % further adjust languages, hyphenation rules, and/or fonts to be % applied in each environment. To return to the example provided % above, once \cs{SetAlignment} has been used, the languages can be % set as follows:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \AtBeginEnvironment{latin}{\selectlanguage{latin}} \AtBeginEnvironment{english}{\selectlanguage{english}} \AtBeginEnvironment{french}{\selectlanguage{french}} \end{minted} % \iffalse % % \fi % % \section{Laying Out the Apparatus Criticus } % \label{sec:apparatus-layout} % % \subsection{General Hooks} % \label{sec:general-hooks} % Some hooks are shared by all layers of notes that are inserted in % 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 % hooks at the time of writing follows:---\\ % \DescribeOption{appfontsize} |appfontsize|$=$\meta{command} % \hfill\tcboxverb{Default: \footnotesize}\\ % This option sets the size of the font to be used in the whole % apparatus criticus. By default, it is the same as the size used for % footnotes.\\ % \DescribeOption{refnumstyle} |refnumstyle|$=$\meta{command} % \hfill\tcboxverb{Default: \bfseries}\\ % |refnumstyle| can be used to set the family, series or shape of the % 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 % printed in bold and italic.\\ % \DescribeOption{postrefnum} |postrefnum|$=$\meta{command \textbar\ % chars}\hfill\tcboxverb{Default: ~}\\ % |postrefnum| can be used to set what immediately follows the % 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. % % \subsection{Single-Layer Apparatus Criticus} % \label{sec:single-layer-app} % \paragraph{Specific Commands} % Single-layer apparatus criticus can be laid out in a variety of % ways with the following specialized commands, all of which can be % used in the preamble or at any point of the document:--- % % \DescribeMacro{\SetLTRapp} % \DescribeMacro{\SetRTLapp} % \cs{SetLTRapp} and \cs{SetRTLapp} are two argument-less commands to % set the direction of the apparatus criticus, either left-to-right or % right-to-left. % % \DescribeMacro{\SetSeparator} \cs{SetSeparator}\marg{separator} is % used to change the separator between lemma texts and variants % readings. By default, the separator is a closing square bracket % followed by a space (\verb*+] +). % % \DescribeMacro{\SetBeginApparatus} % \cs{SetBeginApparatus}\marg{characters\textbar commands} can be used % to append \meta{characters} or \meta{commands} at the beginning of % the apparatus block. By default, nothing is appended. For instance, % |\SetBeginApparatus{\textbf{Apparatus:}}| will append % \enquote{\textbf{Apparatus:}} at the beginning of the apparatus % block, while |\SetBeginApparatus{\hskip 1em}| will set an % indentation of one em. % % \DescribeMacro{\SetEndApparatus} % \cs{SetEndApparatus}\marg{characters} can be used to append % \meta{characters} at the end of the apparatus block. By default, % nothing is appended. As an example of use, |\SetEndApparatus{.}| % will have a period printed at the end of the apparatus as it is % customary in some editions. % % \DescribeMacro{\SetUnitDelimiter} % \cs{SetUnitDelimiter}\marg{delimiter} can be used to set the % delimiter between entries in the apparatus criticus. By default, % there is no delimiter except a simple space. \meta{delimiter} can be % a broad space (such as |\hskip 0.75em| for instance as in the OCT % series) or the divider-sign (‖, as in the Budé series). % % \DescribeMacro{\SetDefaultRule} % By default, \pkg{ekdosis} draws a separating line between the % edition text and the apparatus criticus. This line is initially % defined as % |\rule{0.4\columnwidth}{0.4pt}|. \cs{SetDefaultRule}\marg{line % definition} can be used in the preamble or at any point of the % document to change the default setting. Leaving this argument empty % as in \cs{SetDefaultRule}|{}| removes the line. % % \paragraph{General Command} % \DescribeMacro{\SetApparatus} \cs{SetApparatus}\marg{csv list of % apparatus settings}\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:---\\ % \DescribeOption{direction} |direction|$=$\verb+LR|RL+ % \hfill\tcboxverb{Default: LR}\\ % The writing direction of the apparatus criticus, either % left-to-right (|LR|) or right-to-left (|LR|).\\ % \DescribeOption{sep} |sep|$=$\meta{command \textbar\ chars} % \hfill\tcboxverb{Default: ]␣}\\ % The separator between lemma texts and variant readings.\\ % \DescribeOption{delim} |delim|$=$\meta{delimiter} % \hfill\tcboxverb{Default: not set}\\ % The delimiter between entries in the apparatus criticus. As said % above, there is no default delimiter except a simple space.\\ % \DescribeOption{bhook} |bhook|$=$\meta{characters\textbar commands} % \hfill\tcboxverb{Default: empty}\\ % The characters or commands to be appended at the beginning of the % apparatus block.\\ % \DescribeOption{ehook} |ehook|$=$\meta{characters} % \hfill\tcboxverb{Default: empty}\\ % The characters to be appended at the end of the apparatus block.\\ % \DescribeOption{rule} |rule|$=$\meta{command}\verb+|+|none| % \hfill\tcboxverb{Default: \rule{0.4\columnwidth}{0.4pt}}\\ % As described above, |rule| is used to draw the separating line % between the edition text and the apparatus criticus. |rule=none| can % 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} % % 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} % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \SetHooks{ refnumstyle=\normalfont } \SetApparatus{ sep={: }, delim=\hskip 1em, rule=\rule{0.7in}{0.4pt} } \end{minted} % \iffalse % % \fi % % \paragraph{Footnote Separator} % \DescribeMacro{\footnoteruletrue} \DescribeMacro{\footnoterulefalse} % As already seen above, \pkg{ekdosis} takes care of drawing a % separating line between the edition text and the apparatus % criticus. Therefore, it may be not desirable to have the standard % \LaTeX\ \enquote{footnoterule} printed on every page where regular % footnotes are found. \cs{footnoterulefalse} removes it while % \cs{footnoteruletrue} leaves it untouched. The latter is set by % default. % % \subsection{Multiple-Layer Apparatus Criticus} % \label{sec:multilayer-apparatus} % As said above in \vref{it:multilayer-feature}, \pkg{ekdosis} can % print edition texts equipped with multiple-layer apparatus % criticus. To take an example, most classical editions provide at % least two layers of notes: one to collect references to testimonia % or parallel passages (apparatus testium) and the other to record % variant readings (the apparatus criticus \emph{stricto sensu}). The % former is always printed above the latter. % % \danger The default single-layer apparatus criticus that is % described above in \vref{sec:single-layer-app} is called |default| % 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} % \cs{SetDefaultApparatus}\marg{name} can be used at any point of % the document to change the default name that is used by % \pkg{ekdosis}. % % \subsubsection{Declaring Additional Layers} % \label{sec:declaring-layers} % \DescribeMacro{\DeclareApparatus} % \cs{DeclareApparatus}\marg{name}\oarg{csv list of apparatus % settings} is a preamble-only command. As a mandatory argument, it % takes the name of the new layer of notes to be inserted in the % apparatus block. Declared layers are then printed one below the % other in the exact same order as they are declared in the % preamble. Therefore, one additional layer meant to print the % testimonia above the variant readings (apparatus testium) can be % declared as follows:--- % % \iffalse %<*example> % \fi \begin{minted}{latex} % preamble: \DeclareApparatus{testium} \DeclareApparatus{default} \end{minted} % \iffalse % % \fi % % In this example, |testium| is a new name for |default|, as said % just above, is already known to \pkg{ekdosis} and used as the % default layer of notes. Furthermore, as |testium| is declared before % |default|, \pkg{ekdosis} will print the testimonia at the top of the % apparatus block. % % \subsubsection{Laying Out Layers With The Optional Argument % of \cs{DeclareApparatus}} % \label{sec:layout-layers} % \DescribeOption{direction} % \DescribeOption{sep} % \DescribeOption{delim} % \DescribeOption{bhook} % \DescribeOption{ehook} % \DescribeOption{rule} % \DescribeOption{norule} % With regard to layout, any declared layer inherits the defaut values % described above in \vref{sec:single-layer-app}. That said, as the % optional argument of \cs{DeclareApparatus} accepts the exact same % |key-value| options as \cs{SetApparatus} described % \vpagerefrange{ref:apparatus-settings-b}{ref:apparatus-settings-e}, % \pkg{ekdosis} provides a straightforward mechanism to have any layer % printed in a distinct layout. % % To return to the example provided % \vpageref[above]{ex:single-layer-app-layout}, one could keep the % same settings as above for the variant readings, declare an % apparatus testium with a closing square bracket as a separator and % finally remove the line between the testimonia and the variant % readings like so:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \SetHooks{ refnumstyle=\normalfont } \DeclareApparatus{testium}[ sep={] }, delim=\hskip 1em, rule=\rule{0.7in}{0.4pt} ] \DeclareApparatus{default}[ sep={: }, delim=\hskip 1em, norule ] \end{minted} % \iffalse % % \fi % % \paragraph{Limiting the Number of Entries per Page} % \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} % may oscillate indefinitely between different sets of page decisions % without being able to settle down.\\ % \DescribeOption{maxentries} |maxentries|=\meta{n} (where $n \geq % 10$) \hfill\tcboxverb{Default: not set}\\ % If |maxentries|$=$\meta{n} be set, then \pkg{ekdosis} will issue % \cs{pagebreak} (namely \cs{penalty}|-10000|) just after the % \emph{n\textsuperscript{th}} entry has been inserted in the layer of % 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}. % % \section{Inserting Notes in Multiple-Layer Apparatus} % \label{sec:notes-in-multilayer-app} % As said above in \vref{sec:multilayer-apparatus}, \pkg{ekdosis} % initially sets one layer of notes that is called the % \textooquote|default|\textcoquote\ layer. As a result, any note % inserted within the argument of \cs{app}|{}| as described % \vpageref{ref:app-cmd} will go into that layer of the apparatus, % unless \cs{SetDefaultApparatus} has been used to set another % name for the default layer (see above % \vpageref{ref:ekd-default-app}). % % \subsection{Variant Readings} % \label{sec:variant-readings} % In most cases, all variant readings go into the % \textooquote|default|\textcoquote\ layer of the apparatus % criticus. But in some other cases, for example when the manuscripts % used refer to different recensions, it may happen that one wishes to % record the related variants in separate layers. As already described % \vpageref{ref:app-type}, the |type| optional argument of the % \cs{app} command can be used to insert lemma texts and associated % variants in any other \enquote*{declared} layer of the apparatus % criticus. % % The following example assumes that some edition text is received in % two different recensions and the variant readings that belong to the % first recension are recorded in the default layer of notes while % those of the second recension are to be printed in a second layer, % below the default one. First, both layers must be declared in the % preamble in sequence, like so:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \DeclareApparatus{default} % default layer \DeclareApparatus{rec2} % additional layer below the default one \end{minted} % \iffalse % % \fi % % If one wishes to refer to |rec1| as the default layer, then % \cs{SetDefaultApparatus} must be used, like so:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \SetDefaultApparatus{rec1} \DeclareApparatus{rec1} % new layer set as default \DeclareApparatus{rec2} % additional layer below the default one \end{minted} % \iffalse % % \fi % % Then, whatever option has been chosen, lemma texts and variants % inserted with \cs{app}|{}| will go into the upper, default layer of % notes, while those inserted with \cs{app}|[type=rec2]{}| will go % into the lower one:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} Some \app{ \lem{word} \rdg{reading} } to go into the default layer of notes. Some \app[type=rec2]{ \lem{note} \rdg{comment} } to be recorded as part of the second recension. \end{minted} % \iffalse % % \fi % % At any rate, |type=default| or |type=rec1|, depending on what has % been chosen, must be used if the editor wishes to retain that % information in the \texttt{TEI xml} output file. % % \subsection{Other Notes for Comments, Sources or Testimonia} % \label{ref:type-note} % Additional layers of notes can be used to print short comments or to % record references to texts quoted by the author of the edited text % or references to the edited text by other authors or % translators. The former set is called an \emph{apparatus fontium} % while the latter is called an \emph{apparatus testium}. % % \danger From a technical standpoint, these notes are very different % from the short editorial notes inserted between lemma texts and % variant readings that have been described above % \vpageref{ref:editorial-notes}. However, for the sake of consistency % with \texttt{TEI xml} encoding, \pkg{ekdosis} uses the same command % \cs{note} to insert both kinds of notes. % % \danger One must also keep in mind that the notes that are described % in this section refer either to a single word or to a span of % text. By consequence, as boundaries must always be set outside spans % of text, notes must be inserted immediately before the word or words % they are related to. As a result of this rule, all spaces subsequent % to \cs{note} are ignored. % % \DescribeMacro{\note} \cs{note}\oarg{options}\marg{text}\\ % As said above, \cs{note}, when found outside \cs{app}|{}|, is used % to insert in additional layers of the apparatus short comments or % references to texts quoted or cited in the edition text. It accepts % the following comma-separated list of |key-value| optional % arguments:---\\ % \DescribeOption{type} |type|$=$\meta{type}\\ % |type| is used to specify the name of the layer where the note is to % be printed.\footnote{See \vref{sec:declaring-layers} to learn how to % declare and lay out new layers of notes.}\\ % \DescribeOption{sep} |sep|$=$\meta{command \textbar\ chars}\\ % 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 % above.\\ % \DescribeOption{lem} |lem|$=$\meta{lemma text}\\ % |lem| is the span of text the note is about. It may consist of one % or more words, or of an abridged lemma text.\\ % \DescribeOption{labelb} |labelb|$=$\meta{label} % \hfill\tcboxverb{Mandatory}\\ % |labelb| is the unique label to serve as a reference for the point % immediately preceding the lemma text. \danger |labelb| is used by % \pkg{ekdosis} to print the line numbers in the apparatus criticus % and to set the |left()| XPointer should \texttt{TEI} output be % required. Therefore, it must be specified. Otherwise, \pkg{ekdosis} % will issue an error message.\\ % \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.\\ % \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} % must be inserted immediately after the span of text that the note is % about so that \pkg{ekdosis} can locate the exact point where the % lemma text addressed by the note ends, like so:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} % Preamble: % \DeclareApparatus{fontium}[ % delim=\hskip0.75em, % bhook=\textbf{Sources:}, % ehook=.] % \DeclareApparatus{default}[ % delim=\hskip0.75em, % ehook=.] % Document: \begin{ekdosis} The oldest monument of the Germans is their language, which, before untold centuries, was the companion of their travels from central Asia; a language, copious, elastic, inviting self-explaining combinations and independent development; lending itself alike to daily life and imagination, to description and abstract thought. \note[type=fontium, labelb=B61e, labele=B62a, lem={They had... slave}]{Waitz, \emph{Deutsche Verfassungs Geschichte}, i. 86} They had a class of nobles, but their tongue knew no word for slave.\linelabel{B62a}\footnote{George Bancroft, \emph{History of the United States from the Discovery of the American Continent}, II.61--2.} \end{ekdosis} \end{minted} % \iffalse % % \fi % % PDF output:--- % \medskip % % \needspace{7\baselineskip} % \resetlinenumber % \begin{alignment}[flush,tcols=1,texts=specimen,apparatus=specimen] % \begin{specimen} % The oldest monument of the Germans is their language, which, % before untold centuries, was the companion of their travels from % central Asia; a language, copious, elastic, inviting % self-explaining combinations and independent development; % lending itself alike to daily life and imagination, to % description and abstract thought. \note[type=fontium, % labelb=B61e, labele=B62a, lem={They had... slave}]{Waitz, % \emph{Deutsche Verfassungs Geschichte}, i. 86} They had a class % of nobles, but their tongue knew no word for % slave.\linelabel{B62a}\footnote{George Bancroft, \emph{History of % the United States from the Discovery of the American Continent}, % II.61--2.} % \end{specimen} % \end{alignment} % % \texttt{TEI xml} output:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml}

The oldest monument of the Germans is their language, which, before untold centuries, was the companion of their travels from central Asia; a language, copious, elastic, inviting self-explaining combinations and independent development; lending itself alike to daily life and imagination, to description and abstract thought. Waitz, Deutsche Verfassungs Geschichte, i. 86 They had a class of nobles, but their tongue knew no word for slave. George Bancroft, History of the United States from the Discovery of the American Continent, II.61--2.

\end{minted} % \iffalse % % \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 % 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:--- % % \iffalse %<*example> % \fi \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} dummy} \rdg{pseudo}} text to demonstrate how to insert a note in the argument of the \emph{lem} command.\linelabel{enote} \end{minted} % \iffalse % % \fi % % PDF output:--- % \medskip % % \needspace{7\baselineskip} % \resetlinenumber % \begin{alignment}[flush,tcols=1,texts=specimen,apparatus=specimen] % \begin{specimen} % This is some \app{ % \lem[alt=dummy]{\note[type=fontium, labelb=bnote, labele=enote, % lem=dummy... command]{Text of the note} % dummy} % \rdg{pseudo}} % text to demonstrate how to insert a note in the argument of the % \emph{lem} command.\linelabel{enote} % \end{specimen} % \end{alignment} % % \texttt{TEI xml} output:--- % % \iffalse %<*example> % \fi \begin{minted}{xml}

This is some dummy Text of the note pseudo text to demonstrate how to insert a note in the argument of the lemcommand.

\end{minted} % \iffalse % % \fi % % As can be seen from the \texttt{TEI xml} output above, the span of % text the note is about has been carefully delimited by two anchors % (ll.~4 and 12), the first of which falls within || (l.~4), but % \pkg{ekdosis} has taken care of moving the note itself out of this % element (ll.~5--7). Otherwise, the \texttt{TEI} output would not be % valid. % % \section{Lineation Settings} % \label{sec:lineation} % \danger \pkg{ekdosis} uses \pkg{lineno} internally for line % numbering.\footcite{lineno} But it must be noted that \pkg{ekdosis} % strictly prohibits the \enquote{pagewise} mode of operation that is % provided by \pkg{lineno}. As a result of this hinderance, all % \enquote{margin switching} functions of \pkg{lineno} are disabled % within the environments that are specific to \pkg{ekdosis}, % viz. \env{ekdosis} and \env{alignment}. % % That said, \pkg{ekdosis} provides equivalents of its own to handle % the line numbers the same way as \pkg{lineno}'s \enquote{pagewise} % mode of operation does. % % \DescribeMacro{\SetLineation} \cs{SetLineation}\marg{csv list of % 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:---\\ % \DescribeOption{lineation} |lineation|$=$\verb+page|document+ % \hfill\tcboxverb{Default: document}\\ % |lineation=document| has the lines numbered continuously throughout % the document while |lineation=page| instructs \pkg{ekdosis} that the % numbering should start afresh at the top of each page.\\ % \DescribeOption{modulo} |modulo| \hfill\tcboxverb{Default: not set}\\ % |modulo| does not accept any value. When this option is set, every % fifth line is numbered.\\ % \DescribeOption{modulonum} |modulonum|$=$\emph{n} (where \emph{n} is % an integer)\hfill\tcboxverb{Default: not set}\\ % |modulonum| allows to modify the interval between the numbers that % are printed. |modulo| must be set for this option to have effect. As % examples, |modulo, modulonum=3| has every third line numbered and % |modulonum=1| disables modulo numbering.\\ % \DescribeOption{margin} |margin|$=$\verb+right|left|inner|outer+ % \hfill\tcboxverb{Default: left}\\ % |margin| sets the margin in which the line numbers are to be % printed.\\ % \DescribeOption{numbers} |numbers|$=$\verb+elided|full+ % \hfill\tcboxverb{Default: elided}\\ % This option only has effect on the numbers that are printed in the % apparatus criticus. |numbers=elided| applies on spans of numbers and % 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. % % \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. % % \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 % work with \pkg{ekdosis}, notably the following:---\\ % \DescribeMacro{\modulolinenumbers} \cs{modulolinenumbers}\oarg{n} % can be used to enable modulo line numbering as described above.\\ % \DescribeMacro{\resetlinenumber} \cs{resetlinenumber}\oarg{n} resets % the line number to one or to \emph{n} if specified.\\ % \DescribeMacro{\linenumberfont} % \cs{renewcommand}|{\linenumberfont}|\marg{commands} can be used to % set the font used for the line numbers that are printed in the % margins. By default, the definition is % \cs{normalfont}\cs{footnotesize}.\\ % \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}. % % The reader is invited to refer to the documentation of the % \pkg{lineno} package for more information. % % 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:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \SetLineation{ lineation=page, modulo, margin=inner } \end{minted} % \iffalse % % \fi % % \section{Languages} % \label{sec:languages} % \danger \pkg{ekdosis} is fully compatible with \pkg{babel}. % \enquote{Fully compatible} means that all features provided by % \pkg{babel}, including language switching commands, are supported by % \pkg{ekdosis}. \pkg{ekdosis} is also compatible with % \pkg{polyglossia} with one notable exception: \pkg{luabidi}, which % \pkg{polyglossia} loads for languages written from right to left, is % not supported by \pkg{ekdosis}, and most probably never will % be. That said, as far as the author could see, single-layer % apparatus, as described in \vref{sec:single-layer-app}, can be % typeset within the Arabic environment that is provided by % \pkg{polyglossia}. Unfortunately, the same cannot be said for % multiple-layer apparatus. % % Whether \pkg{babel} or \pkg{polyglossia} is used, \pkg{ekdosis} % automatically applies the current language to the entries of the % apparatus criticus, including the fonts that may have been % associated to the languages in the preamble. In this respect, as % \pkg{polyglossia} can use the same language switching commands as % \pkg{babel},\footcite[See][3.2 \pno~14]{polyglossia} the general % advice given above in \vref{sec:alignment-hooks} applies in all % cases. As regards setting languages in the \texttt{TEI xml} output % file, the reader is invited to refer to point \vref{it:lang-subopt} % and \vref{sec:teixml-output}. % % \subsection{Languages Written From Right to Left} % \label{sec:rtl-languages} % As said above, \pkg{polyglossia} is not supported by \pkg{ekdosis} % for languages that are written and read from right to left, like % Arabic, Hebrew or Syriac. However, as \pkg{babel} is supported and % can be loaded concurrently with \pkg{polyglossia}, an easy way is to % use \pkg{babel} to print such languages. % % \danger The reader is invited to refer to and become acquainted with % the relevant parts of the documentation of the \pkg{babel} % package.\footcite{babel} % % \paragraph{\pkg{babel} Only} % In the following example, \pkg{babel} is used exclusively to set % three different languages: Arabic, ancient Greek and English:--- % % \captof{Multilingual editions with \pkg{babel} only} % \iffalse %<*example> % \fi \begin{minted}{latex} \usepackage{fontspec} \usepackage[greek.ancient,english]{babel} \babelprovide[onchar=fonts]{arabic} \babelfont{rm}{Old Standard} \babelfont[greek]{rm}[RawFeature={+ss05;+ss06}]{Old Standard} \babelfont[*arabic]{rm}{Amiri} \babeltags{ancientgreek = greek} \newcommand{\sg}[1]{\textancientgreek{#1}} \newcommand{\RL}[1]{\bgroup\textdir TRT#1\egroup} \newenvironment{Arabic}{\par\pardir TRT\textdir TRT}{\par} \end{minted} % \iffalse % % \fi % % \begin{remarks} % \item As can be seen, \pkg{fontspec} has been loaded before % \pkg{babel}. To the author's knowledge, this gives better results % when \cs{babelfont} is used. % \item Line~3 loads \pkg{babel} and instructs it to use English as % the default language and ancient Greek as a second optional % language. The built-in |bidi| mechanism provided by \pkg{babel} is % not enabled. As a result, specific language switching commands for % Arabic must be defined just as it must be for every other % language. % \item Line~4 does not load any Arabic, but instructs \pkg{babel} % that it should use the Arabic font that is set below with % \cs{babelfont} whenever an Arabic letter is encountered. % \item Lines~6--8 select the fonts: |Old Standard| is the default % font to be used for Roman shape (l.~6); the same font is used for % Greek, with some additional Open Type features enabled; finally, % the |Amiri| font is used for Arabic. % \item Lines~10--11 define so-called \enquote{tags} for easier access % to ancient Greek through \cs{begin}|{ancient|\allowbreak|greek}| % \dots\ \cs{end}|{ancientgreek}| for running paragraphs and % \cs{textancientgreek}\marg{text} for short insertions of Greek in % English text. \cs{sg}\marg{text} is just a shorthand for this % latter command. % \item Finally, lines~13--14 define simple language switching % commands for Arabic. As can be seen, no commands other than the % \LuaTeX\ primitives \cs{pardir} and \cs{textdir} have been used % for \pkg{babel} already takes care of selecting the Arabic % font. \cs{RL} is for short insertions of Arabic words in English % paragraphs while \cs{begin}|{Arabic}| \dots\ \cs{end}|{Arabic}| is % for running paragraphs of Arabic text. % \end{remarks} % % \paragraph{Changing the Writing Direction} % \DescribeMacro{\setRL} \DescribeMacro{\setLR} \cs{setRL} and % \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, % \cs{setRL} \dots\ \cs{setLR} can be used in place of % \cs{begin}|{Arabic}| \dots\ \cs{end}|{Arabic}|. % % \paragraph{\pkg{polyglossia} Associated With \cs{babelprovide}} % What follows illustrates how \pkg{babel} can be used conjointly with % \pkg{polyglossia} for the same three languages as above without % having to load \pkg{luabidi}:--- % % \captof{Multilingual editions with \pkg{babel} and % \pkg{polyglossia}} % \iffalse %<*example> % \fi \begin{minted}{latex} \usepackage{fontspec} \usepackage{babel} \babelprovide[onchar=fonts]{arabic} \setmainfont{Old Standard} \newfontfamily\greekfont{Old Standard}[RawFeature={+ss05;+ss06}] \babelfont[*arabic]{rm}{Amiri} \usepackage{polyglossia} \setdefaultlanguage{english} \setotherlanguage[variant=ancient]{greek} \newcommand{\textarabic}[1]{\bgroup\textdir TRT#1\egroup} \newenvironment{Arabic}{\par\pardir TRT\textdir TRT}{\par} \end{minted} % \iffalse % % \fi % % \begin{remarks} % \item Line~3 just loads \pkg{babel} with no default language. % \item Lines~4 and 8 are used to have the Arabic font automatically % selected as above. % \item Lines~14--15 define the exact language switching commands that % would have been defined if \pkg{polyglossia} and \pkg{luabidi} had % been used for Arabic. % \end{remarks} % % As one can see, the important points about languages written from % right to left are to use \pkg{babel} only to select the Arabic % fonts, avoid using the bidirectional mechanism it provides and % define commands and environments that use only \LuaTeX\ primitives % to set the writing direction. Then, an Arabic edition text\---to % continue with this example\---can be entered as plainly as % follows:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false,escapeinside=++]{latex} \begin{ekdosis} \begin{Arabic} +\txarb{إِنَّ أَبِي كَانَ مِنَ}+ \app{ \lem{+\txarb{ٱلْمُقَاتِلَةِ}+} \rdg{+\txarb{ٱلْمُقَاتِلِينَ}+} } +\txarb{وَ كَانَتْ أُمِّي مِنْ عُظَمَآءِ بُيُوتِ ٱلزَّمَازِمَةِ۔}+ \end{Arabic} \end{ekdosis} \end{minted} % \iffalse % % \fi % % It should be reminded that the writing direction of the apparatus % criticus itself is independent of that of the edition text and must % be set either with \cs{Set(LTR{\textbar}RTL)app} or with the % |direction| optional argument of \cs{SetApparatus} for single-layer % apparatus criticus, or by means of \cs{DeclareApparatus} for % multiple-layer apparatus criticus.\footnote{See above % \vref{sec:single-layer-app} (single-layer apparatus criticus) and % \vref{sec:multilayer-apparatus} (multiple-layer apparatus % criticus).} % % The PDF output with left-to-right apparatus criticus follows:--- % \medskip % % \needspace{7\baselineskip} % \resetlinenumber % \begin{alignment}[flush,tcols=1,texts=specimen,apparatus=specimen] % \begin{specimen} % \begin{arab}[fullvoc] % 'inna 'abI kAna mina \app[type=ltr]{ % \lem{'l-muqAtilaTi} % \rdg{'l-muqAtilIna}} % wa-kAnat 'ummI min `u.zamA'i buyUti 'l-zamAzimaTi. % \end{arab} % \end{specimen} % \end{alignment} % % \needspace{5\baselineskip} % And here follows the PDF output with right-to-left apparatus % criticus:--- % \medskip % % \needspace{7\baselineskip} % \resetlinenumber % \begin{alignment}[flush,tcols=1,texts=specimen,apparatus=specimen] % \begin{specimen} % \begin{arab}[fullvoc] % 'inna 'abI kAna mina \app[type=rtl]{ % \lem{'l-muqAtilaTi} % \rdg{'l-muqAtilIna}} % wa-kAnat 'ummI min `u.zamA'i buyUti 'l-zamAzimaTi. % \end{arab} % \end{specimen} % \end{alignment} % % \subsection{Using \pkg{arabluatex}} % \label{sec:using-arabluatex} % \pkg{arabluatex} is a \hologo{LuaLaTeX} package that provides % commands and environments which return Arabic writing from an ASCII % transliteration (either Arab\TeX\ or Buckwalter % scheme).\footcite{arabluatex} It is particularly well-suited for % complex documents such as critical editions where a lot of commands % intertwine with Arabic writing. \pkg{arabluatex} can output Unicode % Arabic in the same modes as \pkg{arabtex}\footcite{arabtex} or in % different accepted standards of romanization. It is also able to % produce a duplicate of the original |.tex| source file in which all % |arabtex| or |buckwalter| strings are replaced with Unicode % equivalents, either in Arabic script or in any accepted standard of % transliteration.\footcite[\mkbibquote{Exporting Unicode Arabic % to an External File}]{arabluatex} % % \pkg{arabluatex} is fully supported by \pkg{ekdosis}. The following % example illustrates how \pkg{arabluatex} and \pkg{ekdosis} interact % with each other to produce distinct \texttt{TEI xml} outputs from a % single |.tex| source file:--- % % \captof{\pkg{ekdosis} and \pkg{arabluatex}}[\label{lst:arabluatex-ekd}] % \iffalse %<*example> % \fi \begin{minted}{latex} % Preamble: % load ekdosis and ask for TEI xml output: \usepackage[teiexport]{ekdosis} % load arabluatex and request a LaTeX ouput with Unicode Arabic: \usepackage[export,fullvoc]{arabluatex} % document: \begin{arabexport} % export arabtex strings to Unicode Arabic \begin{ekdosis} \begin{arab} 'inna 'abI kAna mina \app{ \lem{'l-muqAtilaTi} \rdg{'l-muqAtilIna} } wa-kAnat 'ummI min `u.zamA'i buyUti 'l-zamAzimaTi. \end{arab} \end{ekdosis} \end{arabexport} \end{minted} % \iffalse % % \fi % % The PDF output with left-to-right apparatus criticus is of course % the same as above:--- % \medskip % % \needspace{7\baselineskip} % \resetlinenumber % \begin{alignment}[flush,tcols=1,texts=specimen,apparatus=specimen] % \begin{specimen} % \begin{arab}[fullvoc] % 'inna 'abI kAna mina \app[type=ltr]{ % \lem{'l-muqAtilaTi} % \rdg{'l-muqAtilIna}} % wa-kAnat 'ummI min `u.zamA'i buyUti 'l-zamAzimaTi. % \end{arab} % \end{specimen} % \end{alignment} % % However, assuming that the source file is called |source.tex|, % \pkg{ekdosis} produces as instructed from this file an additional % |source-tei.xml| as follows:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml}

'inna 'abI kAna mina 'l-muqAtilaTi 'l-muqAtilIna wa-kAnat 'ummI min `u.zamA'i buyUti 'l-zamAzimaTi.

\end{minted} % \iffalse % % \fi % % At the same time, \pkg{arabluatex} is instructed to produce on its % own from the same |source.tex| an additional |source_out.tex| in % which all |arabtex| strings found within \cs{begin}|{arabexport}| % \dots\ \cs{end}|{arabexport}| (see \vref{lst:arabluatex-ekd}, % ll.~9--19) are replaced with full-vocalized Arabic Unicode % script. Finally, compiling this latter file produces the following % |sample-arabic_out-tei.xml| an extract of which follows:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false,escapeinside=++]{xml}

+\txarb{إِنَّ أَبِي كَانَ مِنَ}+ +\txarb{ٱلْمُقَاتِلَةِ}+ +\txarb{ٱلْمُقَاتِلِينَ}+ +\txarb{وَكَانَتْ أُمِّي مِنْ عُظَمَآءِ بُيُوتِ}+ +\txarb{ٱلزَّمَازِمَةِ.}+

\end{minted} % \iffalse % % \fi % % The reader will find the full |arabic-sample.tex| source file with % instructions in \vref{sec:arabic-sample}, and is invited to refer to % the documentation of the \pkg{arabluatex} package for more % information on the way to use its Arabic environments and built-in % functions dedicated to export |arabtex| ASCII strings to % Unicode.\footcite{arabluatex} % % \section{Divisions of the Body} % \label{sec:body-divisions} % The features that are described in this section call for one general % remark. \pkg{ekdosis} is designed to figure out where any \LaTeX\ % command that is converted to a \texttt{TEI} opening element allowed % to nest recursively, such as |
|, || and the like, is to be % closed, even though there is no explicit indication of the point % where the closure occurs. Thoroughly scanning \LaTeX\ source files % with \textsf{Lua} functions which involve complex string matching % and recursions was required, as \LaTeX\ \enquote*{open} commands % such as \cs{chapter} or \cs{section} only act as milestones, % contrary to \texttt{TEI} elements. % % \danger It must be noted that the two styles described hereinafter % are mutually exclusive. \texttt{TEI xml} forbids that both be % combined within a single || element.\footnote{See % \url{https://tei-c.org/release/doc/tei-p5-doc/en/html/DS.html\#DSDIV}.} % As a result, \pkg{ekdosis} will disregard whichever one is not % selected. % \vskip\baselineskip % % \subsection{\LaTeX\ Standard Divisions} % \label{sec:latex-divs} % \pkg{ekdosis} can use the \LaTeX\ standard textual divisions, such % as \cs{book}, \cs{chapter}, \cs{section} and the like. % % \danger However, to have these divisions properly translated into % \texttt{TEI} numbered |
| elements, the |divs| general option % must be set to |latex| explicitly\---viz. |divs=latex|\---as % described above \vpageref{ref:divs-opt}. % % \danger As the \env{alignment} environment that is provided by % \pkg{ekdosis} places all aligned texts within \texttt{TEI xml} % un-numbered |
| elements and \LaTeX\ textual divisions are % converted into numbered || elements, % inserting such divisions in texts to be aligned will result in an % invalid \texttt{TEI xml} output. Instead, un-numbered divisions % through \cs{ekddiv} must be used as described below in % \vref{sec:ekddiv}. % % Once |divs| has been set to |latex|, \pkg{ekdosis} converts % \cs{book}, \cs{part}, \cs{chapter}, \cs{section}, \cs{subsection} % and \cs{subsubsection} into corresponding \texttt{TEI} % \enquote*{numbered} || elements, % where $1\leq n\leq 6$. % % \paragraph{Adjusting the Levels of Textual Subdivisions} % \DescribeMacro{\MkBodyDivs} % \cs{MkBodyDivs}\marg{div1}\marg{div2}\marg{div3}\allowbreak\marg{div4}\marg{div5}\marg{div6} % takes six mandatory arguments. This command can be used in the % preamble or at any point of the document to make the number of the % first-level subdivision of the edition text, viz.\ ||, match % to any \LaTeX\ command other than \cs{book}. For example, if % \cs{section} be the highest-level sectional command used, then % \cs{MkBodyDivs}|{section}{subsection}{subsubsection}{}{}|\allowbreak|{}| % will have \cs{section}, \cs{subsection} and \cs{subsubsection} % converted into ||, || and || respectively. % % \paragraph{Inserting Variants in Headings} % Variant readings can be inserted in headings. In this case, the % optional argument of the \LaTeX\ sectional command must naturally be % used to prevent variants from going into headers, footers or the % table of contents, like so:\footnote{On the use of \texttt{egomute} % (l.~13), see above \vref{it:egomute}.}--- % % \iffalse %<*example> % \fi \begin{minted}{latex} % Preamble: \usepackage[teiexport=tidy, divs=latex]{ekdosis} \MkBodyDivs{chapter}{section}{}{}{}{} % Document: \chapter[Ἱπποκράτους ἐπιδημιῶν βιβλίον δεύτερον]{Ἱπποκράτους ἐπιδημιῶν \app{ \lem[wit={I,R,H}]{βιβλίον δεύτερον} \rdg[wit=V]{λόγος β’}}} \section[Τμῆμα πρῶτον]{ \app{ \lem[resp=egomute, type=emendation, nosep, post=suppleui]{\supplied{Τμῆμα πρῶτον}} }} Ἄνθρακες θερινοὶ ἐν Κραννῶνι· [...] \end{minted} % \iffalse % % \fi % % \texttt{TEI xml} output:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml} Ἱπποκράτους ἐπιδημιῶν βιβλίον δεύτερον λόγος β’ Τμῆμα πρῶτον

Ἄνθρακες θερινοὶ ἐν Κραννῶνι· [...]

\end{minted} % \iffalse % % \fi % % \subsection{Using \texttt{TEI} Un-numbered Divisions} % \label{sec:ekddiv} % \danger As already described \vpageref{ref:divs-opt}, the % un-numbered style of division is the one that is set by default. It % is congruous to the general option |divs=ekdosis|. % % This style provides a flexible mechanism in which format and % presentation are separated from content. It is designed to meet the % requirements of classical and literary texts the divisions of which % may depend on many different received traditions. % % \DescribeMacro{\ekddiv} \cs{ekddiv}\marg{key-value arguments} is the % unique sectional command provided by \pkg{ekdosis}. This command % converts the divisions into un-numbered \texttt{TEI} |
| % elements allowed to nest recursively and takes one mandatory % argument in which the following |key-value| arguments are % accepted:---\\ % \DescribeOption{type} |type|$=$\meta{name} % \hfill\tcboxverb{Default: none}\\ % |type| corresponds to the \texttt{TEI} class |att.typed| and can be % used to classify the element in which it is found in any % way. Suitable values here can be |book|, |chapter|, |section| and % the like.\\ % \DescribeOption{n} |n|$=$\meta{value} \hfill % \tcboxverb{Default: none}\\ % |n| is meant to provide a number or any kind of label for the % division and does not have to be unique in the document.\\ % \DescribeOption{head} |head|$=$\meta{name} % \hfill\tcboxverb{Default: none}\\ % |head| holds the title of the division and may further contain % variant readings.\\ % \DescribeOption{barehead} |barehead|$=$\meta{name} % \hfill\tcboxverb{Default: none}\\ % |barehead| is supposed to be used to prevent unwanted commands from % going into such places as headers, footers and the table of % contents.\\ % \DescribeOption{depth} |depth|$=$\meta{n} where $1\leq n\leq 9$ % \hfill\tcboxverb{Default: 1}\\ % As \texttt{TEI} un-numbered divisions are simply |
| elements % allowed to nest recursively to indicate their hierarchic depth and % \cs{ekddiv} is an \enquote*{open} \LaTeX\ command, |n| is needed to % indicate the depth of the division within the hierarchy, the largest % being |1| and the smallest being |9|.\\ % \DescribeOption{toc} % |toc|$=$\verb+|book|part|chapter|section|subsection|subsubsection|paragraph+\\ % |subparagraph|\hfill\tcboxverb{Default: not set}\\ % If |toc| be set, the title of the division goes into the table of % contents at the hierarchic level that is specified as value. % % \paragraph{Formatting the Titles} % \DescribeMacro{\FormatDiv} By design, \pkg{ekdosis} does % not format the titles. Instead, depending on what is needed for the % edition text, \cs{FormatDiv}\marg{n}\marg{code % before}\marg{code after} is provided to lay out the titles of any % hierarchic depth of division. This command takes three mandatory % arguments as follows: \meta{n}, which is the number referring to the % particular depth of division to be formatted and some \LaTeX\ % commands to go before and after the title itself. The following % example illustrates how the titles of the largest division can be % printed horizontally centered in a larger size:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \FormatDiv{1}{\begin{center}\Large}{\end{center}} \end{minted} % \iffalse % % \fi % % To elaborate on the example provided above in \vref{sec:latex-divs}, % here follows how the first three hierarchical levels could be % formatted as un-numbered divisions:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} % Preamble: \FormatDiv{1}{\begin{center}\Large}{\end{center}} \FormatDiv{2}{\begin{center}\large}{\end{center}} \FormatDiv{3}{\bfseries}{.} % Document: \begin{ekdosis} \ekddiv{ head={Ἱπποκράτους ἐπιδημιῶν \app{ \lem[wit={I,R,H}]{βιβλίον δεύτερον} \rdg[wit=V]{λόγος β’}}}, type=book, depth=1, n=II } \ekddiv{ head={\app{ \lem[resp=egomute, post=suppleui, type=emendation]{\supplied{Τμῆμα πρῶτον}} \rdg[wit=codd, alt=om.]{}}}, type=section, depth=2, n=II.1 } \ekddiv{head=1, type=paragraph, depth=3, n=II.1.1} Ἄνθρακες θερινοὶ ἐν Κραννῶνι· [...] \end{ekdosis} \end{minted} % \iffalse % % \fi % % PDF output:--- % \medskip % % \needspace{7\baselineskip} % \resetlinenumber % \FormatDiv{1}{\begin{center}\Large}{\end{center}} % \FormatDiv{2}{\begin{center}\large}{\end{center}} % \FormatDiv{3}{\bfseries}{.} % \begin{alignment}[flush, % tcols=1, % texts=hippocrates[xml:lang="grc"], % apparatus=hippocrates] % \AtBeginEnvironment{hippocrates}{\selectlanguage{greek}} % \begin{hippocrates} % \ekddiv{ % head={Ἱπποκράτους ἐπιδημιῶν % \app{ % \lem[wit={hI,hR,hH}]{βιβλίον δεύτερον} % \rdg[wit=hV]{λόγος β’}}}, % type=book, % depth=1, % n=II} % % \ekddiv{ % head={\app{ % \lem[resp=egomute, post=suppleui, % type=emendation]{\supplied{Τμῆμα πρῶτον}} % \rdg[wit=hcodd, alt=om.]{}}}, % type=section, % depth=2, % n=II.1 % } % % \ekddiv{head=1, type=paragraph, depth=3, n=II.1.1} Ἄνθρακες % θερινοὶ ἐν Κραννῶνι· [...] % \end{hippocrates} % \end{alignment} % % \texttt{TEI xml} output:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml}
Ἱπποκράτους ἐπιδημιῶν βιβλίον δεύτερον λόγος β’
Τμῆμα πρῶτον
1

Ἄνθρακες θερινοὶ ἐν Κραννῶνι· [...]

\end{minted} % \iffalse % % \fi % % \section{The Tricks of the Trade} % \label{sec:tricks-of-trade} % As the |.tex| source file is compiled, \pkg{ekdosis} has to compute % a tremendous amount of data. Most of this work is performed by % \textsf{Lua} functions. An edition text narrowed down to a single % page needs to be compiled at least three times. On the first run, % the apparatus criticus does not show. Instead, \pkg{ekdosis} % produces an auxiliary file named \cs{jobname}|.ekd| in which all the % entries of the apparatus criticus are collected. Then, on the second % run a test is performed on this auxliary file to determine whether % there are entries\---and if so, which ones\---to be printed on the % current page. At the same time, references to the line numbers are % updated if necessary. Then, on the third run, the apparatus criticus % is printed. % % Of course, every change made to the input may similarly require % \hologo{LuaLaTeX} to be run three more times to get everything to % the right place with the right numbers. % % 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 % indefinitely between different sets of page decisions without being % 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 % 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 % the line it belongs to. This point is literally critical, because % unless a \cs{pagebreak} is inserted just here so as to keep the % contentious line on the next page, \pkg{ekdosis} enters a vicious % circle from which it cannot escape, not to mention that right % entries with right line numbers cannot come on pages that follow a % wrong page either. % % 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, % \cs{pagebreak} commands should only be inserted when the whole % edition text is ready for any subtantial change in the preceding % pages may result in pages that break just after they begin. % % 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 % \vpageref{ref:maxentries}. As a result, \pkg{ekdosis} will take care % of inserting automatic breakpoints between pages whenever the number % of entries on a given page reaches the value set as |maxentries|. % % |maxentries| must not be too small: otherwise offensive to look at % vertical spaces may come between the edition text and the apparatus % criticus. Conversely, |maxentries| must not be too big: otherwise, % should entries overflow on a given page, the edition text and the % apparatus criticus may clash. As said above, a couple of clashes can % be managed with a couple of manually inserted page breaks. But if % there are too many ot them, it is a good indication that the % selected value of |maxentries| is too to 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, % selected as evidence for the complexity of the whole. As only a few % pages would need to be compiled, the magic number should emerge % quite rapidly. % % \section{\texttt{TEI xml} Output} % \label{sec:teixml-output} % Several examples of \texttt{TEI xml} output have been provided % hitherto. Before proceeding, the reader is invited to return to % every one of them. In this respect, it may be of interest to review % carefully the excerpt of Caesar's \emph{Gallic War} of which the % \LaTeX\ source file and its corresponding \texttt{TEI xml} output % are printed in full below in \vref{sec:caesar-gw-6-1-13}. Once % \pkg{ekdosis} has been instructed to convert the edition text into % \texttt{TEI xml} (l.~11), the preamble of this file shows how to set % languages and fonts to be used in the document (ll.~2--6), format % the titles (l.~16) and lay out the alignment of an edition text % associated with two translations (ll.~18--25) in modern % languages. Furthermore, it shows how information related to each % language (Latin, English and French) is to be found in two different % places, namely for \texttt{TEI xml} output (ll.~21--3) and for PDF % output through \LaTeX\ (ll.~27--9). Finally, it provides examples of % declaring witnesses, hands and shorthands (ll.~31--60). As to the % document itself, it shows how to lay out a conspectus siglorum in a % table (ll.~64--80), before giving detailed examples of how the % edition text is entered (ll.~85--101) and sectional commands % provided by \pkg{ekdosis} are used (ll.~86, 103 and % 110).\footnote{The PDF output is available as % \href{samples/Caesar_BG-6-13-1.pdf}{a separate file}.} % % \subsection{Requesting \texttt{TEI xml} Output} % \label{sec:request-tei-output} % \texttt{TEI xml} output is requested by means of the |teiexport| % global option as described above % \vpageref{ref:teiexport-option}. Once instructed to output % \texttt{TEI}, \pkg{ekdosis} converts and exports in sequence the % contents of \env{ekdosis} environments (see above % \vref{sec:single-text-editing}). As regards the contents of % \env{alignment} environments (see above \vref{sec:alignment-basic}), % \pkg{ekdosis} first collates the contents of the environments that % have been declared as values of the |texts| optional argument of % \env{alignment} or \cs{SetAlignment},\footnote{See above % \vref{sec:multiple-alignment}.} then places each of the % corresponding \texttt{TEI xml} outputs within distinct |
| % elements named after the declared environments themselves. For % example, to return to Caesar's text, the Latin edition text is found % between a \cs{begin}|{latin}| \dots\ \cs{end}|{latin}| environment % (see the |.tex| source file, \vref{sec:caesar-gw-tex}, ll.~85--101) % which is declared at l.~21. Then, the corresponding \texttt{xml} % output is found within a |
| element, the |xml:id| of which has % been given by \pkg{ekdosis} the value |div-latin_1| (see % \vref{sec:caesar-gw-tei}, ll.~176--200). % % \paragraph{\texttt{TEI} File Name} \DescribeMacro{\SetTEIFilename} % \cs{SetTEIFilename}\marg{basename} is a preamble-only command. It % can be used to set the base name of the \texttt{TEI xml} output % file, to which the suffix |.xml| is appended. By default, the base % name is \cs{jobname}|-tei|. % % \subsection{General Principles} % \label{sec:totei-general-principles} % \paragraph{Validation of the \texttt{TEI xml} Structure} % The reference tool that the author relies on is that provided by the % \emph{\texttt{TEI} by Example Project}.\footnote{\cite{TBE}. % The \texttt{TEI} validator is here: % \url{http://teibyexample.com/xquery/TBEvalidator.xq}.} As for % \pkg{ekdosis}, it is designed to produce on request, in addition to % an edition in print, a \texttt{TEI xml} compliant output file. That % said, one must keep in mind that the \LaTeX\ packages that are part % of {\TeX}Live can be counted in thousands, and the commands they % provide in tens of thousands. There may even be grounds in asserting % that the possibilities offered by \TeX\ and \LaTeX\ quite exceed % what can be afforded by \texttt{TEI xml}. On another hand, many % \LaTeX\ commands make no sense in \texttt{TEI}. Therefore, a % sensible choice is to keep them out of the environments the contents % of which are to be translated into \texttt{xml} elements, as will be % illustrated by the following. % % Converting a \LaTeX\ document into \texttt{TEI xml} can be quite an % intricate business. In many cases, however, \LaTeX\ strings are % found within environments or groups that are easy to convert into % \texttt{TEI} equivalents: unless instructed otherwise, whether such % groups are delimited by opening and closing braces or by explicit % \cs{begin} \dots\ \cs{end} commands, \pkg{ekdosis} translates them % into |xml| so that for example \cs{emph}|{word}| and % \cs{begin}|{quote}| \meta{quoted words} \cs{end}|{quote}| become % || \meta{word} || and || \meta{quoted words} % || respectively. % % But \LaTeX\ does not place everything into groups or % environments. To take here but a few examples, sectional divisions % are marked in \LaTeX\ with \enquote{open} commands such as % \cs{chapter} or \cs{section} with no clear indication where the % closure of divisions occurs, contrary to \texttt{TEI xml} markup % with numbered or un-numbered |
| elements allowed to nest % recursively. As regards running paragraphs of text, the situation is % even worse than in the latter case, as the following simple example % shows:--- % % \iffalse %<*example> % \fi \begin{minted}{latex} \begin{document} \begin{ekdosis} ... ... These are the final words of some section in the body text. \section{New Section} Here is how some new section begins... ... Final words. \section{Other Section} Opening words of the section... ... Final words \section{Other Section} Opening words... ... Final words. \end{ekdosis} \end{document} \end{minted} % \iffalse % % \fi % % Obviously, construing this \LaTeX\ source file into \texttt{TEI xml} % is a fairly complex task. For example, line~6 only closes a % paragraph for line~7 opens a division (hence |

|), line~8 % only opens a paragraph just after the heading of the section (hence % |

|) while line~14 both closes the foregoing paragraph and % opens a new one (hence |

|), contrary to line~16 which both % closes a paragraph and a sectional division (hence |

|), % not to mention lines~20--1, where notwithstanding the absence of % blank line or any other indication, % |

| is needed. % % \pkg{ekdosis} has been designed to implement this task through % \textsf{Lua} functions which involve string matching (both forward % and reverse matching) and recursions. % % \paragraph{\texttt{TEI xml} Export Settings} % \label{ref:setteixmlexport} % \DescribeMacro{\SetTEIxmlExport} \cs{SetTEIxmlExport}\marg{csv list % 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 % 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 % 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} |

| element, 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 % \vref{sec:specific-tei-modules}. % % \DescribeEnv{ekdpar} \cs{begin}|{ekdpar}| \dots\ \cs{end}|{ekdpar}| % is a simple environment that does nothing but insert \cs{par} % primitives. It can be used to instruct \pkg{ekdosis} to place % paragraphs within |

| elements when |autopar| has been set to % |false| by means of \cs{SetTEIxmlExport} described above. % % \paragraph{The \texttt{xml:id} Attribute} % As a general rule, the |xml:id| global attribute must be unique for % the element that bears the attribute. Furthermore, it must begin % with a letter or an underscore and contain no characters other that % letters, digits, hyphens, underscores and full stops. \pkg{ekdosis} % issues a warning when it finds that any \meta{unique id} of % \meta{unique label} expected in the first argument of % \cs{DeclareWitness}, \cs{DeclareHand}, \cs{DeclareSource} or % \cs{DeclareScholar} is not unique or breaks the rules just % described, but does not prevent the |.tex| source file from % compiling. Instead, it prints the string || in place of the % expected formatted siglum so that the error in the |.tex| source % file can be easily spotted and corrected. % % \danger As the \meta{unique id} declared with \cs{DeclareShorthand} % is not to be exported in the \texttt{TEI xml} outputfile, % \pkg{ekdosis} checks neither its uniqueness nor its validness. % % \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 % issue warnings if such labels contain invalid strings. % % \subsection{Routine \LaTeX\ Commands and Environments} % \label{sec:routine-cmds} % The list of \LaTeX\ commands known by \pkg{ekdosis} at the time of % writing follows. To this list must be added the \LaTeX\ standard % commands that are used for sectional divisions as described above in % \vref{sec:latex-divs} and most of the commands provided by the % \pkg{arabluatex} and \pkg{icite}\footcite{icite} packages. Standard % citation commands are also supported as will be described below in % \vref{sec:citation-cmds}:--- % % \begin{xltabular}{0.825\linewidth}{XX} % \toprule % \LaTeX\ command & \texttt{TEI xml} element\\ % \midrule\endhead % \cs{textsuperscript}|{}| & || \\ % \cs{textsubscript}|{}| & || \\ % \cs{textbf}|{}| & || \\ % \cs{textit}|{}| & || \\ % \cs{textsc}|{}| & || \\ % \cs{textsf}|{}| & || \\ % \cs{footnote}|{}| & || \\ % \cs{enquote}\meta{*}|{}| & || \\ % \cs{label}|{label}| & || \\ % \cs{linelabel}|{label}| & || \\ % \cs{ref}|{label}| & || \\ % \cs{pageref}|{label}| & || \\ % \cs{vref}|{label}| & || \\ % \cs{vpageref}|{label}| & || \\ % \cs{pagebreak}\meta{\oarg{1-4}} & no output \\ % \cs{mbox}|{}| & no output \\ % \bottomrule % \end{xltabular} % % As for environments:--- % % \begin{xltabular}{0.825\linewidth}{XX} % \toprule % \LaTeX\ environment & \texttt{TEI xml} element\\ % \midrule\endhead % |flushright| & |

| \\ % |flushleft| & |

| \\ % |center| & |

| \\ % |quotation| & || \\ % |quoting| & || \\ % |ekdpar| & |

| \\ % |ekdverse| & || \\ % |verse| & || \\ % \bottomrule % \end{xltabular} % % Regarding other, very frequently used commands or environments, some % do not need to be inserted in the translation tables: as already % said above, \pkg{ekdosis} converts by default the original names of % these into \texttt{xml} elements. For instance, \cs{emph}|{}| and % \cs{begin}|{quote}| \dots\ \cs{end}|{quote}| will result in % || and || respectively. % % For the same simple reason, if one wishes 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:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} % Preamble: \newcommand{\mentioned}[1]{#1} % Document: Our usage corresponds to the \mentioned{aggregate} of many mathematical writings and to the sense of \mentioned{class} found in older logical writings. \end{minted} % \iffalse % % \fi % % \texttt{TEI xml} output:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml}

Our usage corresponds to the aggregate of many mathematical writings and to the sense of class found in older logical writings.

\end{minted} % \iffalse % % \fi % % Of course, it is also possible to have the \enquote{mentioned} words % printed in a different font family:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \newcommand{\mentioned}[1]{\textsf{#1}} \end{minted} % \iffalse % % \fi % % This command will print them in a sans serif font family, with the % exact same \texttt{TEI xml} output as above. % % \subsection{Processing New Commands or Environments} % \label{sec:new-cmds-envs} % The following three commands are provided to instruct \pkg{ekdosis} % how to convert unknown or unusual \hologo{(La)TeX} commands or % environments into \texttt{TEI xml} equivalents. % % \DescribeMacro{\TeXtoTEI} \cs{TeXtoTEI}\marg{csname}\marg{TEI % element}\oarg{TEI attribute(s)}\\ % \cs{TeXtoTEI} takes two mandatory arguments and one optional % argument, namely: the control sequence name to be converted, the % \texttt{TEI} element it is to be converted into and any additional % \texttt{xml} attributes to be appended to the opening \texttt{TEI} % element. For example, the \cs{sidenote} command that is provided by % the \pkg{sidenotes} package can be processed like so:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} % Preamble: \TeXtoTEI{sidenote}{note}[place="margin"] % Document: \begin{ekdosis} \begin{ekdverse} The self-same moment I could pray;\sidenote{The spell begins to break}\footnote{The turning point of the poem...} \end{ekdverse} \end{ekdosis} \end{minted} % \iffalse % % \fi % % \texttt{TEI xml} output:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml} The self-same moment I could pray; The spell begins to break The turning point of the poem... \end{minted} % \iffalse % % \fi % % Even more subtly, provided that the code |#STC| points to some more % information identifying the agency concerned:\footnote{At the time % of writing, \enquote*{sources} can be declared with % \cs{DeclareSource} as described above % \vpageref{ref:declare-source}. Then the unique identifier used in % the first argument of this command can point to the list of % references inserted by \pkg{ekdosis} in the back matter section of % the \texttt{TEI} ouput file. See below % \vref{sec:references-cited-works} for more information on how to do % this. Scholars can also be referred to as individuals by means of % the \cs{DeclareScholar} command. See above % \vpageref{ref:declare-source}.}--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} % Preamble: \usepackage{sidenotes} \usepackage[teiexport=tidy]{ekdosis} \TeXtoTEI{sidenote}{note}[place="margin"] \newcommand{\STCsnote}[1]{\sidenote{#1}} \TeXtoTEI{STCsnote}{note}[place="margin" resp="#STC"] % Document: \begin{ekdosis} \begin{ekdverse} The self-same moment I could pray;\STCsnote{The spell begins to break}\footnote{The turning point of the poem...} \end{ekdverse} \end{ekdosis} \end{minted} % \iffalse % % \fi % % \texttt{TEI xml} output:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml} The self-same moment I could pray; The spell begins to break The turning point of the poem... \end{minted} % \iffalse % % \fi % % \DescribeMacro{\EnvtoTEI} \DescribeMacro{\EnvtoTEI*} % \cs{EnvtoTEI}\meta{*}\marg{env name}\marg{TEI element}\oarg{TEI % attribute(s)}\\ % \cs{EnvtoTEI} instructs \pkg{ekdosis} how to convert \LaTeX\ % environments into \texttt{TEI xml} equivalents. It takes two % mandatory arguments and one optional argument, namely the name of % the \LaTeX\ environment to be converted, the \texttt{TEI} element it % is to be converted into and any additional attributes to be appended % to the \texttt{TEI} opening element. \cs{EnvtoTEI*} is restricted to % \texttt{TEI} elements that must never appear within |

| elements, % such as |

| itself, |

|, || and the like. The following % example illustrates how \cs{EnvtoTEI} can be used conjointly with % \pkg{babel} to convey information about the languages used from % \LaTeX\ to \texttt{TEI}:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} % Preamble: % Use babel and babeltags: \usepackage[greek.ancient, english]{babel} \babeltags{ancientgreek = greek} \EnvtoTEI{ancientgreek}{p}[xml:lang="grc"] % Document: \begin{ekdosis} \begin{ancientgreek} περὶ πολλοῦ ἂν ποιησαίμην, ὦ ἄνδρες, τὸ τοιούτους ὑμᾶς ἐμοὶ δικαστὰς περὶ τούτου τοῦ πράγματος γενέσθαι, οἷοίπερ ἂν ὑμῖν αὐτοῖς εἴητε τοιαῦτα πεπονθότες... \end{ancientgreek} \end{ekdosis} \end{minted} % \iffalse % % \fi % % \texttt{TEI xml} output:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml}

περὶ πολλοῦ ἂν ποιησαίμην, ὦ ἄνδρες, τὸ τοιούτους ὑμᾶς ἐμοὶ δικαστὰς περὶ τούτου τοῦ πράγματος γενέσθαι, οἷοίπερ ἂν ὑμῖν αὐτοῖς εἴητε τοιαῦτα πεπονθότες...

\end{minted} % \iffalse % % \fi % % \DescribeMacro{\TeXtoTEIPatt} % \cs{TeXtoTEIPatt}\marg{\TeX\ pattern}\marg{TEI pattern}\\ % Finally, this more flexible\---and more delicate to % handle\---command uses pattern matching to instruct \pkg{ekdosis} % how to convert \hologo{(La)TeX} commands into \texttt{TEI} % equivalents. In the first mandatory argument, strings to be captured % are marked in sequence with numbers prefixed by |#|, like so: |#1|, % |#2|, |#3| and so forth. Then, in the second mandatory argument, the % strings captured are inserted where each of them is expected in % the \texttt{TEI} element. % % \danger Strings must be entered exactly as \pkg{ekdosis} will find % them as the |.tex| source file is compiled. Specifically, % \emph{control sequences}, namely the coded commands immediately % preceded by `\verb+\+' are always found followed by a space. For % instance, |\emph{}| will be seen and processed by \pkg{ekdosis} as % \verb*|\emph {}|. % % The following example illustrates how \pkg{ekdosis} can be % instructed to process the % \cs{textcolor}\allowbreak\marg{color}\marg{text} command:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \TeXtoTEIPatt{\textcolor␣{#1}{#2}}{#2} Sample text with a \textcolor{red}{word} in red. \end{minted} % \iffalse % % \fi % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml}

Sample text with a wordin red.

\end{minted} % \iffalse % % \fi % % \subsection{Specific \texttt{TEI} Modules} % \label{sec:specific-tei-modules} % The following example illustrates how \pkg{ekdosis} can be adapted % in a straightforward way to modules provided by the \texttt{TEI} for % encoding specific texts such as transcriptions of % speech.\footnote{See % \url{https://tei-c.org/release/doc/tei-p5-doc/en/html/TS.html}.} The % technique applied below uses \cs{EnvtoTEI} conjointly with % \cs{SetTEIxmlExport}|{autopar=|\allowbreak|false}| described above % \vpageref{ref:setteixmlexport}:--- % % \iffalse %<*example> % \fi \begin{minted}{latex} % Preamble: \newenvironment{speech}{\par}{\par} \newcommand{\speaker}[1]{\textbf{#1}\par} \EnvtoTEI{speech}{sp} \SetTEIxmlExport{autopar=false} % Document: \begin{ekdosis} \begin{speech} \speaker{Σωκράτης} \begin{ekdpar} κατέβην χθὲς εἰς Πειραιᾶ μετὰ Γλαύκωνος τοῦ Ἀρίστωνος προσευξόμενός τε τῇ θεῷ καὶ ἅμα τὴν ἑορτὴν βουλόμενος θεάσασθαι τίνα τρόπον ποιήσουσιν ἅτε νῦν πρῶτον ἄγοντες. καλὴ μὲν οὖν μοι καὶ ἡ τῶν ἐπιχωρίων πομπὴ ἔδοξεν εἶναι, οὐ μέντοι ἧττον ἐφαίνετο πρέπειν ἣν οἱ Θρᾷκες ἔπεμπον. \end{ekdpar} \end{speech} \end{ekdosis} \end{minted} % \iffalse % % \fi % % \begin{remarks} % \item Lines~2--3 define a basic environment meant to contain % indivivual speeches and a command to hold the name of the % speaker. This name is printed in bold face and followed by a new % paragraph in the PDF output. % \item Line~4 instructs \pkg{ekdosis} to convert \env{speech} \LaTeX\ % environments into || \texttt{TEI xml} elements. % \item Line~6 disables the |autopar| algorithm that \pkg{ekdosis} % provides by default for running paragraphs of text. As a % consequence, \env{ekdpar} is used to mark the paragraphs. % \end{remarks} % % PDF output:--- % \medskip % % \needspace{7\baselineskip} % \SetTEIxmlExport{autopar=false} % \begingroup % \newenvironment{speech}{\par\selectlanguage{greek}}{\par} % \newcommand{\speaker}[1]{\textbf{#1}\par} % \EnvtoTEI{speech}{sp} % \resetlinenumber % \begin{alignment}[flush,tcols=1,texts=specimen,apparatus=specimen] % \begin{specimen} % \begin{speech} % \speaker{Σωκράτης} % \begin{ekdpar} % κατέβην χθὲς εἰς Πειραιᾶ μετὰ Γλαύκωνος τοῦ Ἀρίστωνος % προσευξόμενός τε τῇ θεῷ καὶ ἅμα τὴν ἑορτὴν βουλόμενος θεάσασθαι % τίνα τρόπον ποιήσουσιν ἅτε νῦν πρῶτον ἄγοντες. καλὴ μὲν οὖν μοι % καὶ ἡ τῶν ἐπιχωρίων πομπὴ ἔδοξεν εἶναι, οὐ μέντοι ἧττον ἐφαίνετο % πρέπειν ἣν οἱ Θρᾷκες ἔπεμπον. % \end{ekdpar} % \end{speech} % \end{specimen} % \end{alignment} % \endgroup % \SetTEIxmlExport{autopar=true} % % \texttt{TEI xml} output:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml} Σωκράτης

κατέβην χθὲς εἰς Πειραιᾶ μετὰ Γλαύκωνος τοῦ Ἀρίστωνος προσευξόμενός τε τῇ θεῷ καὶ ἅμα τὴν ἑορτὴν βουλόμενος θεάσασθαι τίνα τρόπον ποιήσουσιν ἅτε νῦν πρῶτον ἄγοντες. καλὴ μὲν οὖν μοι καὶ ἡ τῶν ἐπιχωρίων πομπὴ ἔδοξεν εἶναι, οὐ μέντοι ἧττον ἐφαίνετο πρέπειν ἣν οἱ Θρᾷκες ἔπεμπον.

\end{minted} % \iffalse % % \fi % % \subsection{References to Cited Works} % \label{sec:references-cited-works} % A full example of what is technically called a \emph{Conspectus % Siglorum} can be found above in \vref{sec:print-witnesses}. Such a % list of manuscript sigla should be found immediately before the % edition text. Traditionally, this section is followed by a list of % other sources used to establish the text, so that the edited text is % in the end established both from manuscript evidence (the % \enquote{witnesses}) and other works based on a scholarly approach % of the text (the \enquote{sources}) which are called in Latin % \emph{Editiones uel Studia}. As a consequence of this classification % as \enquote{witness} or \enquote{source}, the former must go within % the || element of the \texttt{TEI} header, whereas the % latter is to be found within the || element. % % \DescribeMacro{\AddxmlBibResource} % \cs{AddxmlBibResource}\marg{basename or name.xml} is a preamble-only % command. If a base name (either suffixed with |.xml| or not) for a % \texttt{TEI xml} compliant bibliographical database be provided, % \pkg{ekdosis} will use it and insert formatted data in the back % matter section of its own \texttt{TEI xml} output file, as % || elements within a |listBibl| section. % % As an example, the following Bib\hologo{(La)TeX} entry and its % \texttt{TEI} equivalent are provided:\footnote{\label{fn:zotero}To % the author's knowledge, \textsf{Zotero} % (\url{https://www.zotero.org}) provides excellent \texttt{TEI xml} % output from Bib\hologo{(La)TeX} input files.}--- % % \iffalse %<*example> % \fi \begin{minted}{bibtex} @Book{Drak, title = {Punicorum Libri Septemdecim}, author = {Silius Italicus, Tiberius Catius}, editor = {Drakenborch, Arnold}, date = {1717}, publisher = {Trajecti ad Rhenum}, location = {Utrecht} } \end{minted} % \iffalse % % \fi % % \iffalse %<*example> % \fi \begin{minted}{xml} Punicorum libri septemdecim Tiberius Catius Silius Italicus Arnold Drakenborch Utrecht Trajecti ad Rhenum 1717 \end{minted} % \iffalse % % \fi % % \danger As can be seen, the same string |Drak| is used as a label in % the Bib\hologo{(La)TeX} file (l.~1) and an |xml:id| in the % \texttt{TEI} file (l.~3). This same label must be used again in the % preamble of the |.tex| source file to declare Arnold Drakenborch as a % source,\footnote{See above \vpageref{ref:declare-source}.} like % so:--- % % \iffalse %<*example> % \fi \begin{minted}{latex} % Use 'bibl.xml' as a TEI xml bibliographical database: \AddxmlBibResource{bibdata.xml} % Declare A. Drakenborch as source: \DeclareSource{Drak}{\emph{Drakenborch}} \end{minted} % \iffalse % % \fi % % \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):--- % % \iffalse %<*example> % \fi \begin{minted}{latex} % Preamble: \usepackage[style=oxnotes]{biblatex} \addbibresource{bibdata.bib} \usepackage[teiexport=tidy]{ekdosis} % basename of the .xml bibliographical database: \AddxmlBibResource{bibdata.xml} % Witnesses: \DeclareWitness{L}{L}{Laurentianus, plut, XXXVII, cod. 16}[ origDate=s. XV] % Other witnesses [...] % Sources: \DeclareSource{Drak}{\emph{Drakenborch}} % Alternatively, use BibLaTeX for the rendition: % \DeclareSource{Drak}{\citename{Drak}{editor}} % Other sources [...] % Document: \begin{ekdosis} \begin{ekdverse} Sed uos, quorum oculos atque ora humentia uidi,\\ uertere cum consul terga et remeare iuberet,\\ \app{ \lem[source=Drak, type=emendation]{ne morem} \rdg[wit={L, F}]{me morem} \rdg[wit={O, V}]{memorem} } et pugnae signum exspectate petendae: \end{ekdverse} \end{ekdosis} \end{minted} % \iffalse % % \fi % % PDF output:--- % \medskip % % \needspace{7\baselineskip} % \begin{alignment}[flush,tcols=1,texts=specimen,apparatus=specimen] % \resetlinenumber[30]\rightlinenumbers % \setlength{\linenumbersep}{-1.5in} % \begin{specimen} % \begin{ekdverse} % Sed uos, quorum oculos atque ora humentia uidi,\\ % uertere cum consul terga et remeare iuberet,\\ % \app{ % \lem[source=sDrak, type=emendation]{ne morem} % \rdg[wit={sL, sF}]{me morem} % \rdg[wit={sO, sV}]{memorem} % } et pugnae signum exspectate petendae: % \end{ekdverse} % \end{specimen} % \end{alignment} % % \texttt{TEI xml} output file produced by \pkg{ekdosis} (narrowed % down to the || element):--- % % \iffalse %<*example> % \fi \begin{minted}{xml} Sed uos, quorum oculos atque ora humentia uidi, uertere cum consul terga et remeare iuberet, ne morem me morem memorem et pugnae signum exspectate petendae: Punicorum libri septemdecim Tiberius Catius Silius Italicus Arnold Drakenborch Utrecht Trajecti ad Rhenum 1717 \end{minted} % \iffalse % % \fi % % \subsection{Citation Commands} % \label{sec:citation-cmds} % \pkg{ekdosis} can also convert into \texttt{TEI xml} references to % cited works. Depending on the optional arguments used in the % citation command, references will be converted into || or % || elements with the appropriate identifier supplied by means % of the |target| attribute. % % Of course, for this mechanism to work, Bib\TeX\ or Bib\LaTeX\ must % be used and connected to some |.bib| bibliographical database % file. Additionally, this |.bib| file must have been converted into a % \texttt{TEI xml} compliant file where all the Bib\hologo{(La)TeX} % entries that are used in the document are found within % || elements.\footnote{See above n.~\vref{fn:zotero} for % information on how to do this.} Finally, this |.xml| bibliographical % database must have been connected to the |.tex| source file by means % of \cs{AddxmlBibResource} described above in % \vref{sec:references-cited-works}. % % As an example, the following |sample.bib| file is used:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{bibtex} @Book{ReynoldsWilson1991, author = {Reynolds, L. D. and Wilson, N. G}, title = {Scribes and Scholars}, year = {1991}, subtitle = {A Guide to the Translation of Greek and Latin Literature}, edition = {3}, publisher = {Clarendon Press}, location = {Oxford} } \end{minted} % \iffalse % % \fi % % It has been converted into |sample.xml| as follows:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml} Scribes and Scholars L. D. Reynolds N. G. Wilson 3 Oxford Clarendon Press 1991 \end{minted} % \iffalse % % \fi % % Once both files have been prepared, inserting references and % exporting them into the \texttt{TEI xml} ouput file can be achieved % in a straightforward way. (The full |sample.tex| is provided % below.)--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} \documentclass{article} \usepackage[teiexport=tidy]{ekdosis} \AddxmlBibResource{sample.xml} \usepackage[style=oxnotes]{biblatex} \addbibresource{sample.bib} \begin{document} \begin{ekdosis} On textual criticism, see \cite[207--241]{ReynoldsWilson1991}. \end{ekdosis} \end{document} \end{minted} % \iffalse % % \fi % % PDF output:--- % \medskip % % \needspace{7\baselineskip} % \resetlinenumber % \begin{alignment}[flush,tcols=1,texts=specimen,apparatus=specimen] % \begin{specimen} % On textual criticism, see \cite[207--241]{ReynoldsWilson1991}. % \end{specimen} % \end{alignment} % % \medskip % \texttt{TEI xml} ouput narrowed down to the contents of the || % element:--- % % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{xml}

On textual criticism, see 207--241.

Scribes and Scholars L. D. Reynolds N. G. Wilson 3 Oxford Clarendon Press 1991
\end{minted} % \iffalse % % \fi % % At the time of writing, the following citation commands are % converted into \texttt{TEI xml} by \pkg{ekdosis}:--- % \begin{enumerate} % \item % \cs{icite}\oarg{prenote}\oarg{postnote}\marg{key}\footnote{From the % \pkg{icite} package. \cs{icite} can be used in place of almost any % standard citation command. See \cite{icite}.} % \item \cs{cite}\oarg{prenote}\oarg{postnote}\marg{key} % \item \cs{Cite}\oarg{prenote}\oarg{postnote}\marg{key} % \item \cs{cite*}\oarg{prenote}\oarg{postnote}\marg{key} % \item \cs{parencite}\oarg{prenote}\oarg{postnote}\marg{key} % \item \cs{Parencite}\oarg{prenote}\oarg{postnote}\marg{key} % \item \cs{parencite*}\oarg{prenote}\oarg{postnote}\marg{key} % \item \cs{footcite}\oarg{prenote}\oarg{postnote}\marg{key} % \item \cs{footcitetext}\oarg{prenote}\oarg{postnote}\marg{key} % \item \cs{textcite}\oarg{prenote}\oarg{postnote}\marg{key} % \item \cs{Textcite}\oarg{prenote}\oarg{postnote}\marg{key} % \item \cs{smartcite}\oarg{prenote}\oarg{postnote}\marg{key} % \item \cs{Smartcite}\oarg{prenote}\oarg{postnote}\marg{key} % \item \cs{autocite}\oarg{prenote}\oarg{postnote}\marg{key} % \item \cs{Autocite}\oarg{prenote}\oarg{postnote}\marg{key} % \item \cs{autocite*}\oarg{prenote}\oarg{postnote}\marg{key} % \item \cs{Autocite*}\oarg{prenote}\oarg{postnote}\marg{key} % \end{enumerate} % % The next release of \pkg{ekdosis} will include all citation commands % with the exception of so-called \enquote{qualified citation lists}. % % \section{Future Work} % \label{sec:future-work} % A short, uncommented list of what is planned in the versions of % \pkg{ekdosis} to come follows:--- % \begin{enumerate} % \item Very short-term (weeks):--- % \begin{enumerate} % \item Text structure: milestone elements. % \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 Correspondence and alignment, segmentation: The functions % are being tested at the time of writing and will be included % shortly in \pkg{ekdosis}. % \end{enumerate} % \item Medium-term: Indexing, commands and environments for specific % modules of the \texttt{TEI}. % \end{enumerate} % % \begin{comment} % \section{Correspondence and Alignment} % \end{comment} % \label{sec:correspondence-alignment} % % \label{ref:segmentation} % % \section{GNU Free Documentation License} % \label{sec:fdl} % \textbf{Version 1.3, 3 November 2008} % % \begin{center} % Version 1.3, 3 November 2008 % % Copyright \copyright{} 2000, 2001, 2002, 2007, 2008 Free % Software Foundation, Inc. % % \bigskip % % \url{https://fsf.org/} % % \bigskip % % Everyone is permitted to copy and distribute verbatim copies % of this license document, but changing it is not allowed. % \end{center} % % \needspace{3\baselineskip} % \begin{center} % {\bf\large Preamble} % \end{center} % % The purpose of this License is to make a manual, textbook, or other % functional and useful document \enquote{free} in the sense of % freedom: to assure everyone the effective freedom to copy and % redistribute it, with or without modifying it, either commercially % or noncommercially. Secondarily, this License preserves for the % author and publisher a way to get credit for their work, while not % being considered responsible for modifications made by others. % % This License is a kind of \enquote{copyleft}, which means that % derivative works of the document must themselves be free in the same % sense. It complements the GNU General Public License, which is a % copyleft license designed for free software. % % We have designed this License in order to use it for manuals for % free software, because free software needs free documentation: a % free program should come with manuals providing the same freedoms % that the software does. But this License is not limited to software % manuals; it can be used for any textual work, regardless of subject % matter or whether it is published as a printed book. We recommend % this License principally for works whose purpose is instruction or % reference. % % \needspace{3\baselineskip} % \begin{center} % {\large\bf 1. APPLICABILITY AND DEFINITIONS\par} % \end{center} % % This License applies to any manual or other work, in any medium, % that contains a notice placed by the copyright holder saying it can % be distributed under the terms of this License. Such a notice % grants a world-wide, royalty-free license, unlimited in duration, to % use that work under the conditions stated herein. The % \enquote{\textbf{Document}}, below, refers to any such manual or % work. Any member of the public is a licensee, and is addressed as % \enquote{\textbf{you}}. You accept the license if you copy, modify % or distribute the work in a way requiring permission under copyright % law. % % A \enquote{\textbf{Modified Version}} of the Document means any work % containing the Document or a portion of it, either copied verbatim, % or with modifications and/or translated into another language. % % A \enquote{\textbf{Secondary Section}} is a named appendix or a % front-matter section of the Document that deals exclusively with the % relationship of the publishers or authors of the Document to the % Document's overall subject (or to related matters) and contains % nothing that could fall directly within that overall subject. % (Thus, if the Document is in part a textbook of mathematics, a % Secondary Section may not explain any mathematics.) The % relationship could be a matter of historical connection with the % subject or with related matters, or of legal, commercial, % philosophical, ethical or political position regarding them. % % The \enquote{\textbf{Invariant Sections}} are certain Secondary % Sections whose titles are designated, as being those of Invariant % Sections, in the notice that says that the Document is released % under this License. If a section does not fit the above definition % of Secondary then it is not allowed to be designated as Invariant. % The Document may contain zero Invariant Sections. If the Document % does not identify any Invariant Sections then there are none. % % The \enquote{\textbf{Cover Texts}} are certain short passages of % text that are listed, as Front-Cover Texts or Back-Cover Texts, in % the notice that says that the Document is released under this % License. A Front-Cover Text may be at most 5 words, and a % Back-Cover Text may be at most 25 words. % % A \enquote{\textbf{Transparent}} copy of the Document means a % machine-readable copy, represented in a format whose specification % is available to the general public, that is suitable for revising % the document straightforwardly with generic text editors or (for % images composed of pixels) generic paint programs or (for drawings) % some widely available drawing editor, and that is suitable for input % to text formatters or for automatic translation to a variety of % formats suitable for input to text formatters. A copy made in an % otherwise Transparent file format whose markup, or absence of % markup, has been arranged to thwart or discourage subsequent % modification by readers is not Transparent. An image format is not % Transparent if used for any substantial amount of text. A copy that % is not \enquote{Transparent} is called \enquote{\textbf{Opaque}}. % % Examples of suitable formats for Transparent copies include plain % ASCII without markup, Texinfo input format, LaTeX input format, SGML % or XML using a publicly available DTD, and standard-conforming % simple HTML, PostScript or PDF designed for human modification. % Examples of transparent image formats include PNG, XCF and JPG. % Opaque formats include proprietary formats that can be read and % edited only by proprietary word processors, SGML or XML for which % the DTD and/or processing tools are not generally available, and the % machine-generated HTML, PostScript or PDF produced by some word % processors for output purposes only. % % The \enquote{\textbf{Title Page}} means, for a printed book, the % title page itself, plus such following pages as are needed to hold, % legibly, the material this License requires to appear in the title % page. For works in formats which do not have any title page as % such, \enquote{Title Page} means the text near the most prominent % appearance of the work's title, preceding the beginning of the body % of the text. % % The \enquote{\textbf{publisher}} means any person or entity that % distributes copies of the Document to the public. % % A section \enquote{\textbf{Entitled XYZ}} means a named subunit of % the Document whose title either is precisely XYZ or contains XYZ in % parentheses following text that translates XYZ in another language. % (Here XYZ stands for a specific section name mentioned below, such % as \enquote{\textbf{Acknowledgements}}, % \enquote{\textbf{Dedications}}, \enquote{\textbf{Endorsements}}, or % \enquote{\textbf{History}}.) To \enquote{\textbf{Preserve the % Title}} of such a section when you modify the Document means that it % remains a section \enquote{Entitled XYZ} according to this % definition. % % The Document may include Warranty Disclaimers next to the notice % which states that this License applies to the Document. These % Warranty Disclaimers are considered to be included by reference in % this License, but only as regards disclaiming warranties: any other % implication that these Warranty Disclaimers may have is void and has % no effect on the meaning of this License. % % \needspace{3\baselineskip} % \begin{center} % {\large\bf 2. VERBATIM COPYING\par} % \end{center} % % You may copy and distribute the Document in any medium, either % commercially or noncommercially, provided that this License, the % copyright notices, and the license notice saying this License % applies to the Document are reproduced in all copies, and that you % add no other conditions whatsoever to those of this License. You % may not use technical measures to obstruct or control the reading or % further copying of the copies you make or distribute. However, you % may accept compensation in exchange for copies. If you distribute a % large enough number of copies you must also follow the conditions in % section~3. % % You may also lend copies, under the same conditions stated above, % and you may publicly display copies. % % \needspace{3\baselineskip} % \begin{center} % {\large\bf 3. COPYING IN QUANTITY\par} % \end{center} % % If you publish printed copies (or copies in media that commonly have % printed covers) of the Document, numbering more than 100, and the % Document's license notice requires Cover Texts, you must enclose the % copies in covers that carry, clearly and legibly, all these Cover % Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on % the back cover. Both covers must also clearly and legibly identify % you as the publisher of these copies. The front cover must present % the full title with all words of the title equally prominent and % visible. You may add other material on the covers in addition. % Copying with changes limited to the covers, as long as they preserve % the title of the Document and satisfy these conditions, can be % treated as verbatim copying in other respects. % % If the required texts for either cover are too voluminous to fit % legibly, you should put the first ones listed (as many as fit % reasonably) on the actual cover, and continue the rest onto adjacent % pages. % % If you publish or distribute Opaque copies of the Document numbering % more than 100, you must either include a machine-readable % Transparent copy along with each Opaque copy, or state in or with % each Opaque copy a computer-network location from which the general % network-using public has access to download using public-standard % network protocols a complete Transparent copy of the Document, free % of added material. If you use the latter option, you must take % reasonably prudent steps, when you begin distribution of Opaque % copies in quantity, to ensure that this Transparent copy will remain % thus accessible at the stated location until at least one year after % the last time you distribute an Opaque copy (directly or through % your agents or retailers) of that edition to the public. % % It is requested, but not required, that you contact the authors of % the Document well before redistributing any large number of copies, % to give them a chance to provide you with an updated version of the % Document. % % \needspace{3\baselineskip} % \begin{center} % {\large\bf 4. MODIFICATIONS\par} % \end{center} % % You may copy and distribute a Modified Version of the Document under % the conditions of sections 2 and 3 above, provided that you release % the Modified Version under precisely this License, with the Modified % Version filling the role of the Document, thus licensing % distribution and modification of the Modified Version to whoever % possesses a copy of it. In addition, you must do these things in % the Modified Version: % % \begin{itemize} % \item[A.] Use in the Title Page (and on the covers, if any) a title % distinct from that of the Document, and from those of previous % versions (which should, if there were any, be listed in the % History section of the Document). You may use the same title as a % previous version if the original publisher of that version gives % permission. % % \item[B.] List on the Title Page, as authors, one or more persons % or entities responsible for authorship of the modifications in % the Modified Version, together with at least five of the % principal authors of the Document (all of its principal authors, % if it has fewer than five), unless they release you from this % requirement. % % \item[C.] State on the Title page the name of the publisher of the % Modified Version, as the publisher. % % \item[D.] Preserve all the copyright notices of the Document. % % \item[E.] Add an appropriate copyright notice for your % modifications adjacent to the other copyright notices. % % \item[F.] Include, immediately after the copyright notices, a % license notice giving the public permission to use the Modified % Version under the terms of this License, in the form shown in the % Addendum below. % % \item[G.] Preserve in that license notice the full lists of % Invariant Sections and required Cover Texts given in the % Document's license notice. % % \item[H.] Include an unaltered copy of this License. % % \item[I.] Preserve the section Entitled \enquote{History}, % Preserve its Title, and add to it an item stating at least the % title, year, new authors, and publisher of the Modified Version % as given on the Title Page. If there is no section Entitled % \enquote{History} in the Document, create one stating the title, % year, authors, and publisher of the Document as given on its % Title Page, then add an item describing the Modified Version as % stated in the previous sentence. % % \item[J.] Preserve the network location, if any, given in the % Document for public access to a Transparent copy of the Document, % and likewise the network locations given in the Document for % previous versions it was based on. These may be placed in the % \enquote{History} section. You may omit a network location for a % work that was published at least four years before the Document % itself, or if the original publisher of the version it refers to % gives permission. % % \item[K.] For any section Entitled \enquote{Acknowledgements} or % \enquote{Dedications}, Preserve the Title of the section, and % preserve in the section all the substance and tone of each of the % contributor acknowledgements and/or dedications given therein. % % \item[L.] Preserve all the Invariant Sections of the Document, % unaltered in their text and in their titles. Section numbers or % the equivalent are not considered part of the section titles. % % \item[M.] Delete any section Entitled \enquote{Endorsements}. % Such a section may not be included in the Modified Version. % % \item[N.] Do not retitle any existing section to be Entitled % \enquote{Endorsements} or to conflict in title with any Invariant % Section. % % \item[O.] Preserve any Warranty Disclaimers. % \end{itemize} % % If the Modified Version includes new front-matter sections or % appendices that qualify as Secondary Sections and contain no % material copied from the Document, you may at your option designate % some or all of these sections as invariant. To do this, add their % titles to the list of Invariant Sections in the Modified Version's % license notice. These titles must be distinct from any other % section titles. % % You may add a section Entitled \enquote{Endorsements}, provided it % contains nothing but endorsements of your Modified Version by % various parties---for example, statements of peer review or that the % text has been approved by an organization as the authoritative % definition of a standard. % % You may add a passage of up to five words as a Front-Cover Text, and % a passage of up to 25 words as a Back-Cover Text, to the end of the % list of Cover Texts in the Modified Version. Only one passage of % Front-Cover Text and one of Back-Cover Text may be added by (or % through arrangements made by) any one entity. If the Document % already includes a cover text for the same cover, previously added % by you or by arrangement made by the same entity you are acting on % behalf of, you may not add another; but you may replace the old one, % on explicit permission from the previous publisher that added the % old one. % % The author(s) and publisher(s) of the Document do not by this % License give permission to use their names for publicity for or to % assert or imply endorsement of any Modified Version. % % \needspace{3\baselineskip} % \begin{center} % {\large\bf 5. COMBINING DOCUMENTS\par} % \end{center} % % You may combine the Document with other documents released under % this License, under the terms defined in section~4 above for % modified versions, provided that you include in the combination all % of the Invariant Sections of all of the original documents, % unmodified, and list them all as Invariant Sections of your combined % work in its license notice, and that you preserve all their Warranty % Disclaimers. % % The combined work need only contain one copy of this License, and % multiple identical Invariant Sections may be replaced with a single % copy. If there are multiple Invariant Sections with the same name % but different contents, make the title of each such section unique % by adding at the end of it, in parentheses, the name of the original % author or publisher of that section if known, or else a unique % number. Make the same adjustment to the section titles in the list % of Invariant Sections in the license notice of the combined work. % % In the combination, you must combine any sections Entitled % \enquote{History} in the various original documents, forming one % section Entitled \enquote{History}; likewise combine any sections % Entitled \enquote{Acknowledgements}, and any sections Entitled % \enquote{Dedications}. You must delete all sections Entitled % \enquote{Endorsements}. % % \needspace{3\baselineskip} % \begin{center} % {\large\bf 6. COLLECTIONS OF DOCUMENTS\par} % \end{center} % % You may make a collection consisting of the Document and other % documents released under this License, and replace the individual % copies of this License in the various documents with a single copy % that is included in the collection, provided that you follow the % rules of this License for verbatim copying of each of the documents % in all other respects. % % You may extract a single document from such a collection, and % distribute it individually under this License, provided you insert a % copy of this License into the extracted document, and follow this % License in all other respects regarding verbatim copying of that % document. % % \needspace{3\baselineskip} % \begin{center} % {\large\bf 7. AGGREGATION WITH INDEPENDENT WORKS\par} % \end{center} % % A compilation of the Document or its derivatives with other separate % and independent documents or works, in or on a volume of a storage % or distribution medium, is called an \enquote{aggregate} if the % copyright resulting from the compilation is not used to limit the % legal rights of the compilation's users beyond what the individual % works permit. When the Document is included in an aggregate, this % License does not apply to the other works in the aggregate which are % not themselves derivative works of the Document. % % If the Cover Text requirement of section~3 is applicable to these % copies of the Document, then if the Document is less than one half % of the entire aggregate, the Document's Cover Texts may be placed on % covers that bracket the Document within the aggregate, or the % electronic equivalent of covers if the Document is in electronic % form. Otherwise they must appear on printed covers that bracket the % whole aggregate. % % \needspace{3\baselineskip} % \begin{center} % {\large\bf 8. TRANSLATION\par} % \end{center} % % Translation is considered a kind of modification, so you may % distribute translations of the Document under the terms of % section~4. Replacing Invariant Sections with translations requires % special permission from their copyright holders, but you may include % translations of some or all Invariant Sections in addition to the % original versions of these Invariant Sections. You may include a % translation of this License, and all the license notices in the % Document, and any Warranty Disclaimers, provided that you also % include the original English version of this License and the % original versions of those notices and disclaimers. In case of a % disagreement between the translation and the original version of % this License or a notice or disclaimer, the original version will % prevail. % % If a section in the Document is Entitled \enquote{Acknowledgements}, % \enquote{Dedications}, or \enquote{History}, the requirement % (section~4) to Preserve its Title (section~1) will typically require % changing the actual title. % % \needspace{3\baselineskip} % \begin{center} % {\large\bf 9. TERMINATION\par} % \end{center} % % You may not copy, modify, sublicense, or distribute the Document % except as expressly provided under this License. Any attempt % otherwise to copy, modify, sublicense, or distribute it is void, and % will automatically terminate your rights under this License. % % However, if you cease all violation of this License, then your % license from a particular copyright holder is reinstated (a) % provisionally, unless and until the copyright holder explicitly and % finally terminates your license, and (b) permanently, if the % copyright holder fails to notify you of the violation by some % reasonable means prior to 60 days after the cessation. % % Moreover, your license from a particular copyright holder is % reinstated permanently if the copyright holder notifies you of the % violation by some reasonable means, this is the first time you have % received notice of violation of this License (for any work) from % that copyright holder, and you cure the violation prior to 30 days % after your receipt of the notice. % % Termination of your rights under this section does not terminate the % licenses of parties who have received copies or rights from you % under this License. If your rights have been terminated and not % permanently reinstated, receipt of a copy of some or all of the same % material does not give you any rights to use it. % % \needspace{3\baselineskip} % \begin{center} % {\large\bf 10. FUTURE REVISIONS OF THIS LICENSE\par} % \end{center} % % The Free Software Foundation may publish new, revised versions of % the GNU Free Documentation License from time to time. Such new % versions will be similar in spirit to the present version, but may % differ in detail to address new problems or concerns. See % \url{https://www.gnu.org/licenses/}. % % Each version of the License is given a distinguishing version % number. If the Document specifies that a particular numbered % version of this License \enquote{or any later version} applies to % it, you have the option of following the terms and conditions either % of that specified version or of any later version that has been % published (not as a draft) by the Free Software Foundation. If the % Document does not specify a version number of this License, you may % choose any version ever published (not as a draft) by the Free % Software Foundation. If the Document specifies that a proxy can % decide which future versions of this License can be used, that % proxy's public statement of acceptance of a version permanently % authorizes you to choose that version for the Document. % % \needspace{3\baselineskip} % \begin{center} % {\large\bf 11. RELICENSING\par} % \end{center} % % \enquote{Massive Multiauthor Collaboration Site} (or \enquote{MMC % Site}) means any World Wide Web server that publishes copyrightable % works and also provides prominent facilities for anybody to edit % those works. A public wiki that anybody can edit is an example of % such a server. A \enquote{Massive Multiauthor Collaboration} (or % \enquote{MMC}) contained in the site means any set of copyrightable % works thus published on the MMC site. % % \enquote{CC-BY-SA} means the Creative Commons Attribution-Share % Alike 3.0 license published by Creative Commons Corporation, a % not-for-profit corporation with a principal place of business in San % Francisco, California, as well as future copyleft versions of that % license published by that same organization. % % \enquote{Incorporate} means to publish or republish a Document, in % whole or in part, as part of another Document. % % An MMC is \enquote{eligible for relicensing} if it is licensed under % this License, and if all works that were first published under this % License somewhere other than this MMC, and subsequently incorporated % in whole or in part into the MMC, (1) had no cover texts or % invariant sections, and (2) were thus incorporated prior to November % 1, 2008. % % The operator of an MMC Site may republish an MMC contained in the % site under CC-BY-SA on the same site at any time before August 1, % 2009, provided the MMC is eligible for relicensing. % % \needspace{3\baselineskip} % \begin{center} % {\large\bf ADDENDUM: How to use this License for your documents\par} % \end{center} % % To use this License in a document you have written, include a copy % of the License in the document and put the following copyright and % license notices just after the title page: % % \bigskip % \begin{quote} % Copyright \copyright{} YEAR YOUR NAME. 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 the Free Software Foundation; with no % Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. % A copy of the license is included in the section entitled % \enquote{GNU Free Documentation License}. % \end{quote} % \bigskip % % If you have Invariant Sections, Front-Cover Texts and Back-Cover % Texts, replace the \enquote{with \dots\ Texts.}\ line with this: % % \bigskip % \begin{quote} % with the Invariant Sections being LIST THEIR TITLES, with the % Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. % \end{quote} % \bigskip % % If you have Invariant Sections without Cover Texts, or some other % combination of the three, merge those two alternatives to suit the % situation. % % If your document contains nontrivial examples of program code, we % recommend releasing these examples in parallel under your choice of % free software license, such as the GNU General Public License, % to permit their use in free software. % % \section{References} % \label{sec:references} % \printbibliography[heading=none] % % \section{Sample: C. J. Caesar, \emph{Gallic War}, % VI, XIII.1} % \label{sec:caesar-gw-6-1-13} % \subsection{\texttt{.tex} Source File} % \label{sec:caesar-gw-tex} % \inputminted[linenos=true]{latex}{samples/Caesar_BG-6-13-1.tex} % \subsection{\texttt{TEI xml} Output} % \label{sec:caesar-gw-tei} % \inputminted[linenos=true]{xml}{samples/Caesar_BG-6-13-1-tei.xml} % % \section{Arabic Sample File} % \label{sec:arabic-sample} % |arabic-sample.tex|:--- % \iffalse %<*example> % \fi \begin{minted}[linenos=false]{latex} % Instructions: % 1. Compile this file three times. % - Open arabic-sample.pdf and arabic-sample-tei.xml and see the % result. % 2. Compile arabic-sample_out.tex three times. % - Open arabic-sample_out.pdf and arabic-sample-out-tei.xml and % see the result. % \documentclass{article} % The following three lines are only needed by the % 'arabic-sample_out.tex' that arabluatex is instructed to produce: \usepackage{babel} \babelprovide[onchar=fonts]{arabic} \babelfont[*arabic]{rm}{Amiri} % instruct ekdosis to output TEI xml (arabic-sample-tei.xml): \usepackage[teiexport=tidy]{ekdosis} % instruct arabluatex to ouput sample-arabic_out.tex with Unicode % Arabic strings in place of arabtex ASCII scheme: \usepackage[fullvoc,export]{arabluatex} \begin{document} \begin{arabexport} % export arabtex strings to Unicode Arabic \begin{ekdosis} \begin{arab} 'inna 'abI kAna mina \app{ \lem{'l-muqAtilaTi} \rdg{'l-muqAtilIna} } wa-kAnat 'ummI min `u.zamA'i buyUti 'l-zamAzimaTi. \end{arab} \end{ekdosis} \end{arabexport} \end{document} \end{minted} % \iffalse % % \fi % % \StopEventually{} % % \section{Implementation} % \label{sec:implementation} % % \iffalse %<*package> % \fi % % \pkg{ekdosis} relies on Lua functions and tables. Read the % |.lua| files that accompany \pkg{ekdosis} for more % information. % \begin{macrocode} \RequirePackage{iftex} % \end{macrocode} % Of course, \pkg{ekdosis} requires {\LuaLaTeX}. Issue an error % if the document is processed with another engine. % \begin{macrocode} \RequireLuaTeX % \end{macrocode} % Set global options:--- % \begin{macrocode} \RequirePackage{expkv-opt} \RequirePackage{expkv-def} \newif\if@pkg@float \newif\if@pkg@footins \newif\if@pkg@ekddivs \newif\if@parnotesroman \newif\if@pkg@parnotes \newif\iftei@export \ekvdefinekeys{ekdosis}{ choice layout = {float = {\@pkg@floattrue}, footins = {\@pkg@floatfalse\@pkg@footinstrue}}, initial layout = float, unknown-choice layout = \PackageError{ekdosis}{unknown layout=#1}{`layout' must be either `float' or `footins'.}, choice divs = {ekdosis = {\@pkg@ekddivstrue}, latex = {\@pkg@ekddivsfalse \AtBeginDocument{\luadirect{ekdosis.setekddivsfalse()}}}}, initial divs = ekdosis, unknown-choice divs = \PackageError{ekdosis}{unknown divs=#1}{`divs' must be either `ekdosis' or `latex'.}, choice parnotes = {false = {}, true = {\@pkg@parnotestrue}, roman = {\@pkg@parnotestrue\@parnotesromantrue}}, default parnotes = true, unknown-choice parnotes = \PackageError{ekdosis}{unknown parnotes=#1}{`parnotes' must be either `true', or `false' or `roman'.}, choice teiexport = {false = {}, true = {\tei@exporttrue \AtBeginDocument{\luadirect{ekdosis.openteistream()}}% \AtEndDocument{\luadirect{ekdosis.closeteistream()}}}, tidy = {\tei@exporttrue \AtBeginDocument{\luadirect{ekdosis.openteistream()}}% \AtEndDocument{\luadirect{ekdosis.closeteistream("tidy")}}}}, default teiexport = true, unknown-choice teiexport = \PackageError{ekdosis}{unknown teiexport=#1}{`teiexport' must be either `true', `false' or `tidy'.} } \ekvoProcessLocalOptions{ekdosis} % \end{macrocode} % \paragraph{Required Packages} \label{ref:ekdrequirements} In % addition to \pkg{iftex}, \pkg{expkv-opt} and \pkg{expkv-def}, a list % of the packages that are required by \pkg{ekdosis} follows:--- % \begin{macrocode} % \RequirePackage{iftex} % already loaded above % \RequirePackage{expkv-opt} % already loaded above % \RequirePackage{expkv-def} % already loaded above \RequirePackage{luacode} \RequirePackage{paracol} \RequirePackage{xparse} \RequirePackage{etoolbox} \RequirePackage{lineno} \RequirePackage{keyfloat} \RequirePackage{refcount} \RequirePackage{zref-user} \RequirePackage{zref-abspage} \RequirePackage{ltxcmds} \RequirePackage{atbegshi} \RequirePackage{ifoddpage} \if@pkg@parnotes \RequirePackage{parnotes} \fi % \end{macrocode} % \paragraph{Lua} Here begins the real work: load |ekdosis.lua|:--- % \begin{macrocode} \luadirect{dofile(kpse.find_file("ekdosis.lua"))} % \end{macrocode} % \begin{macrocode} \AtEndDocument{ \luadirect{ekdosis.closestream()} } % \end{macrocode} % \begin{macro}{\SetHooks} \cs{SetHooks} is used to set % 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. % \begin{macrocode} \ekvdefinekeys{ekd@hooks}{ store appfontsize = \ekd@appfontsize, store refnumstyle = \ekd@refnumstyle, store postrefnum = \ekd@postrefnum, initial appfontsize = \footnotesize, initial refnumstyle = \bfseries, initial postrefnum = ~ } \NewDocumentCommand{\SetHooks}{m}{\ekvset{ekd@hooks}{#1}} % \end{macrocode} % \end{macro} % Build and process the list of witnesses and hands:--- % \begin{macrocode} \ekvdefinekeys{ekd@witness}{ store settlement = \settlement@value, store institution = \institution@value, store repository = \repository@value, store collection = \collection@value, store idno = \idno@value, store msName = \msName@value, store origDate = \origDate@value } % \end{macrocode} % \begin{macro}{\DeclareWitness} \cs{DeclareWitness} is a % preamble-only command. It takes three mandatory arguments and one % optional argument. It is meant to collect data related to % witnesses to be used in the edition text. Data are stored in |Lua| % tables and are used to encode the || part of the |TEI| % header as well as the Conspectus Siglorum in the edition in print. % \begin{macrocode} \NewDocumentCommand{\DeclareWitness}{m m m O{}}{% \bgroup \ekvset{ekd@witness}{#4} \luadirect{ekdosis.newwitness( \luastringN{#1}, \luastringN{#2}, \luastringN{#3}, \luastringO{\settlement@value}, \luastringO{\institution@value}, \luastringO{\repository@value}, \luastringO{\collection@value}, \luastringO{\idno@value}, \luastringO{\msName@value}, \luastringO{\origDate@value})} \egroup } \@onlypreamble\DeclareWitness % \end{macrocode} % \end{macro} % \begin{macro}{\DeclareHand} As \cs{DeclareWitness}, \cs{DeclareHand} % is a preamble-only command meant to collect data and store them in % |Lua| tables. It takes three mandatory arguments and one optional % argument. The second argument is used to connect the hand to a % declared witness it is related to. Then the table in which this % witness is recorded can be fed with new data. % \begin{macrocode} \NewDocumentCommand{\DeclareHand}{m m m +O{}}{ \luadirect{ekdosis.newhand(\luastringN{#1}, \luastringN{#2}, \luastringN{#3}, \luastringN{#4})} } \@onlypreamble\DeclareHand % \end{macrocode} % \end{macro} % Build and process the list of scholars:--- % \begin{macrocode} \ekvdefinekeys{ekd@scholar}{ store rawname = \rawname@value, store forename = \forename@value, store surname = \surname@value, store addname = \addname@value, store note = \note@value } % \end{macrocode} % \begin{macro}{\DeclareScholar} % \changes{v1.1}{2020/09/01}{nows builds a list of persons} % \cs{DeclareScholar} is used to build a list of persons within the % || element. It takes two mandatory arguments to specify % consecutively a unique identifier and the rendition to be used in % the apparatus criticus in print, and one optional argument used to % collect the name parts components and further items of information % from |key-value| \enquote*{named} arguments. % \begin{macrocode} \NewDocumentCommand{\DeclareScholar}{m m O{}}{% \bgroup \ekvset{ekd@scholar}{#3} \luadirect{ekdosis.newscholar( \luastringN{#1}, \luastringN{#2}, \luastringO{\rawname@value}, \luastringO{\forename@value}, \luastringO{\surname@value}, \luastringO{\addname@value}, \luastringO{\note@value})} \egroup } \@onlypreamble\DeclareScholar % \end{macrocode} % \end{macro} % \begin{macro}{\DeclareSource} % \changes{v1.1}{2020/09/01}{new command added}There is also a table in % which are collected data related to sources to be used in the % apparatus criticus. \cs{DeclareSource} is a preamble-only % command and takes two mandatory arguments: a unique id and a % shorthand (preferably a Bib\hologo{(La)TeX} label) to be used in % the apparatus criticus which can be extracted from a bibliographic % database. % \begin{macrocode} \NewDocumentCommand{\DeclareSource}{m m}{ \luadirect{ekdosis.newsource(\luastringN{#1}, \luastringN{#2})} } \@onlypreamble\DeclareSource % \end{macrocode} % \end{macro} % \begin{macro}{\DeclareShorthand} \cs{DeclareShorthand} is a % preamble-only command that can be used to record manuscript % families or any kind of shorthand to be used to refer to % previously declared ids, for example the shorthand |codd| can be % used to point to all declared witnesses. This command takes three % mandatory arguments: a unique id, its rendition in print and a % csv-list of previously declared ids. % \begin{macrocode} \NewDocumentCommand{\DeclareShorthand}{m m m}{ \luadirect{ekdosis.newshorthand(\luastringN{#1}, \luastringN{#2}, \luastringN{#3})} } \@onlypreamble\DeclareShorthand % \end{macrocode} % \end{macro} % \begin{macro}{\getsiglum} % \cs{getsiglum}\marg{csv list} takes a comma-separated list of % declared ids by means of \cs{DeclareWitness}, \cs{DeclareHand}, % \cs{DeclareShorthand} or \cs{DeclareSource} and returns their % respective renditions. % \begin{macrocode} \NewDocumentCommand{\getsiglum}{m}{% \luadirect{tex.sprint(ekdosis.getsiglum(\luastringN{#1}))}% } % \end{macrocode} % \end{macro} % \begin{macro}{\SigLine} % \cs{Sigline}\marg{unique id} takes the unique id of any declared % witness by means of \cs{DeclareWitness} as argument and returns a % line ready to be inserted in a table set to print a Conspectus % Siglorum. \cs{SigLine} returns three fields separated by the symbol % |&| that is used in tables as follows: the siglum referring to the % witness, the contents of the |description| field and the contents of % the optional |origDate| field. % \begin{macrocode} \NewDocumentCommand{\SigLine}{m}{% \luadirect{tex.sprint(ekdosis.basic_cs(\luastringN{#1}))} } % \end{macrocode} % \end{macro} % \paragraph{\TeX\ to \texttt{TEI xml}} % Here follow the |key-value| options to be used by \cs{SetTEIxmlExport} % below:--- % \begin{macrocode} \ekvdefinekeys{tei@settings}{ choice autopar = {true = \luadirect{ekdosis.setteiautopar("yes")}, false = {\luadirect{ekdosis.setteiautopar("no")}}}, initial autopar = true, unknown-choice autopar = \PackageError{ekdosis}{unknown autopar=#1}{`autopar' must be either `true' or `false'.} } % \end{macrocode} % \begin{macro}{\SetTEIxmlExport} % \cs{SetTEIxmlExport} collects the settings to be applied % to \texttt{TEI xml} export. For now, there is only one option. This % command can be used at any point of the document, except inside % environments meant to receive an apparatus criticus. % \begin{macrocode} \NewDocumentCommand{\SetTEIxmlExport}{m}{ \unless\ifekd@state\ekvset{tei@settings}{#1}\fi } % \end{macrocode} % \end{macro} % The following three commands can be used to instruct \pkg{ekdosis} % how to convert unknown or unusual \hologo{(La)TeX} commands into % \texttt{TEI xml} equivalents. % \begin{macro}{\TeXtoTEI} % \cs{TeXtoTEI}\marg{csname}\marg{TEI element}\oarg{TEI attribute(s)} % takes two mandatory arguments and one optional argument, namely: the % control sequence name to be converted, the \texttt{TEI} element it % is to be converted into and any additional \texttt{xml} attributes % to be appended to the opening \texttt{TEI} element:--- % \begin{macrocode} \NewDocumentCommand{\TeXtoTEI}{m m O{}}{% \luadirect{ekdosis.newcmdtotag(\luastringN{#1}, \luastringN{#2}, \luastringN{#3})} } % \end{macrocode} % \end{macro} % \begin{macro}{\EnvtoTEI} % \begin{macro}{\EnvtoTEI*} % \cs{EnvtoTEI}\meta{*}\marg{env name}\marg{TEI element}\oarg{TEI % attribute(s)} instructs how to convert \LaTeX{} environments into % \texttt{TEI xml} equivalents. It takes two mandatory arguments and % one optional argument, namely the name of the \LaTeX{} environment % to be converted, the \texttt{TEI} element it is to be converted into % and any additional attributes to be appended to the \texttt{TEI} % opening element. \cs{EnvtoTEI*} is restricted to \texttt{TEI} % elements that must never appear within |

| elements, such as % |

|, || and the like. % \begin{macrocode} \NewDocumentCommand{\EnvtoTEI}{s m m O{}}{% \IfBooleanTF{#1}{% \luadirect{ekdosis.newenvtotag(\luastringN{#2}, \luastringN{#3}, \luastringN{#4}, "yes")} }{% \luadirect{ekdosis.newenvtotag(\luastringN{#2}, \luastringN{#3}, \luastringN{#4})} } } % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\TeXtoTEIPatt} % Finally, the more flexible\---and more delicate to % handle\---\cs{TeXtoTEIPatt}\marg{\TeX\ % pattern}\allowbreak\marg{\texttt{TEI} pattern} uses pattern matching % to instruct \pkg{ekdosis} how to convert \hologo{(La)TeX} commands % into \texttt{TEI} equivalents. % \begin{macrocode} \NewDocumentCommand{\TeXtoTEIPatt}{m m}{% \luadirect{ekdosis.newpatttotag(\luastringN{#1}, \luastringN{#2})} } % \end{macrocode} % \end{macro} % \begin{macro}{\SetTEIFilename} \cs{SetTEIFilename}\marg{basename} is % a preamble-only command. It is used to set the base name of the % |TEI xml| output file, to which the suffix |.xml| is appended. By % default, the base name is |\jobname-tei|:--- % \begin{macrocode} \NewDocumentCommand{\SetTEIFileName}{m}{ \luadirect{ekdosis.setteifilename(\luastringN{#1})} } \@onlypreamble\SetTEIFileName % \end{macrocode} % \end{macro} % \begin{macro}{\AddxmlBibResource} This is a preamble-only command. % If a base name (either suffixed with |.xml| or not) for a % \texttt{TEI xml} compliant bibliographical database file be % provided with \cs{AddxmlBibResource}\marg{basename or name.xml}, % \pkg{ekdosis} will use it and insert formatted data in the back % matter section of its own \texttt{TEI xml} output file, as % || elements within a || section. % \begin{macrocode} \NewDocumentCommand{\AddxmlBibResource}{m}{ \luadirect{ekdosis.addxmlbibresource(\luastringN{#1})} } \@onlypreamble\AddxmlBibResource % \end{macrocode} % \end{macro} % %\paragraph{Multiple-layer apparatuses} % \pkg{ekdosis} must know if an entry is to be processed in a single- % or multiple-layer context:--- % \begin{macrocode} \newif\ifekd@mapps % \end{macrocode} % Now the key-value options can be defined:--- % \begin{macrocode} \ekvdefinekeys{ekd@newapp}{ choice direction = {LR = \def\direction@val{LR}, RL = \def\direction@val{RL}}, unknown-choice direction = \PackageError{ekdosis}{unknown direction=#1}{`direction' must be either `LR' or `RL'.}, store rule = \rule@val, nmeta norule = {rule=none}, code delim = \def\delim@val{\unexpanded{#1}}, store sep = \sep@val, store bhook = \bhook@val, store ehook = \ehook@val, store maxentries = \limit@val, initial direction = LR, initial delim = {}, initial ehook = {\csname ekd@end@apparatus\endcsname} } % \end{macrocode} % \begin{macro}{\DeclareApparatus} % \cs{DeclareApparatus}\marg{apparatus name}\oarg{options} is a % preamble-only command. As a mandatory argument, it takes the name of % the new layer of notes to be inserted in the apparatus block. Then, % the following seven key-value options can be used to lay out the % layer: \verb+direction=LR|RL+, |rule|, |delim| (the delimiter between % entries), |sep| (the separator between lemma part and readings or % notes), |bhook| (\LaTeX{} code inserted as the layer begins), % |ehook| (\LaTeX{} code inserted as the layer ends), |maxentries| % (if set and |maxentries >= 10|, the number of entries at which a % \cs{pagebreak} is issued):--- % \begin{macrocode} \NewDocumentCommand{\DeclareApparatus}{m O{}}{ \newbool{subsq@unit@#1} \booltrue{subsq@unit@#1} \unless\ifekd@mapps\global\ekd@mappstrue\fi \bgroup \ekvset{ekd@newapp}{#2} \luadirect{ekdosis.newapparatus( \luastringN{#1}, \luastring{\direction@val}, \luastringO{\rule@val}, \luastringO{\delim@val}, \luastringO{\sep@val}, \luastringO{\bhook@val}, \luastringO{\ehook@val}, \luastringO{\limit@val} )} \egroup } \@onlypreamble\DeclareApparatus % \end{macrocode} % \begin{macro}{\addentries} % \changes{v1.1}{2020/09/02}{modifies the number of accepted entries % on the current page.} % If |maxentries| be set for a given layer of critical notes, % \cs{addentries}\oarg{layer}\marg{n}, where \meta{n} is an integer, % can be used to add \meta{n}\---or remove it if it be negative\---to % the number of accepted entries on the current page. \cs{addentries} % operates on the default layer of notes, but any other declared layer % can be specified in the optional argument of the command. % \begin{macrocode} \NewDocumentCommand{\addentries}{O{\ekdan@type} m}{% \luadirect{ekdosis.addto_bagunits(\luastringO{#1}, \luastringN{#2})}% \ignorespaces } % \end{macrocode} % \end{macro} % \end{macro} % Apparatus-related settings and functions. Some booleans to check if % an apparatus should be inserted and what is the current environment. % \begin{macrocode} \newbool{do@app} \newif\ifekd@state \newif\ifekd@isinapp \newif\ifekd@isinlem % \end{macrocode} % The next boolean is shared with \pkg{arabluatex}. \cs{LRnum} is used % internally to ensure that numerals referring to line spans are % displayed in the right order. % \begin{macrocode} \providebool{al@rlmode} \@ifpackageloaded{arabluatex}{}{% \def\setRL{\booltrue{al@rlmode}\pardir TRT\textdir TRT} \def\setLR{\boolfalse{al@rlmode}\pardir TLT \textdir TLT} } \protected\def\LRnum#1{\bgroup\textdir TLT#1\egroup} % \end{macrocode} % Set counter referring to line numbers and make it global. % \begin{macrocode} \newcounter{ekd@lab} \globalcounter{ekd@lab} % \end{macrocode} % This command inserts words in the apparatus criticus without % checking if both |ekd@isinapp| and |ekd@state| are set to |true|. % \begin{macrocode} \NewDocumentCommand{\unconditional@appin}{o m}{% \IfNoValueTF{#1} {\luadirect{ekdosis.appin(\luastringO{#2})}} {\luadirect{ekdosis.appin(\luastringO{#2}, \luastringO{#1})}}% } % \end{macrocode} % \begin{macro}{\blfootnote} \cs{blfootnote}\marg{footnote} is used % internally to insert the apparatus in the footnote block should the % 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} \long\def\@blfootnotetext#1{\insert\footins{% \reset@font\footnotesize \interlinepenalty\interfootnotelinepenalty \splittopskip\footnotesep \splitmaxdepth \dp\strutbox \floatingpenalty \@MM \hsize\columnwidth \@parboxrestore \protected@edef\@currentlabel{% \csname p@footnote\endcsname\@thefnmark }% \color@begingroup \@makeblfntext{% \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% \color@endgroup}}% \newcommand\@makeblfntext[1]{% \parindent 1em% \noindent \hb@xt@0em{\hss\@makefnmark}#1} % \end{macrocode} % \end{macro} % \paragraph{Single-layer apparatus} The following commands are for % general settings. All of them can be used in the preamble or at any % point of the document. The keys to be used follow:--- % \begin{macrocode} \newif\ifrtl@app \edef\ekdsep{] } \ekvdefinekeys{default@app}{ choice direction = {LR = \rtl@appfalse, RL = \rtl@apptrue}, unknown-choice direction = \PackageError{ekdosis}{unknown direction=#1}{`direction' must be either `LR' or `RL'.}, code sep = \edef\ekdsep{#1}, store bhook = \ekd@begin@apparatus, initial bhook = {}, store ehook = \ekd@end@apparatus, initial ehook = {}, store delim = \ekd@unit@delim, initial delim = {}, store rule = \ekd@default@rule, initial rule = \rule{0.4\columnwidth}{0.4pt}, noval norule = \def\ekd@default@rule{\mbox{}} } % \end{macrocode} % \begin{macro}{\SetApparatus} % All settings can also be defined as |key-value| options within the % argument of \cs{SetApparatus}:--- % \begin{macrocode} \NewDocumentCommand{\SetApparatus}{m}{ \ekvset{default@app}{#1} } % \end{macrocode} % \end{macro} % \begin{macro}{\SetLTRapp} % \begin{macro}{\SetRTLapp} % \cs{SetLTRapp} and \cs{SetRTLapp} are two argument-less commands to % set the direction of single-layer apparatus criticus, either LTR or % RTL:--- % \begin{macrocode} \NewDocumentCommand{\SetRTLapp}{}{\rtl@apptrue} \NewDocumentCommand{\SetLTRapp}{}{\rtl@appfalse} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\SetSeparator} % \cs{SetSeparator}\marg{separator} allows to change the separator % between lemma texts and variant readings, which is by default % a closing square bracket followed by a space (\verb*+] +):--- % \begin{macrocode} \NewDocumentCommand{\SetSeparator}{m}{\edef\ekdsep{#1}} % \end{macrocode} % \end{macro} % \begin{macro}{\SetBeginApparatus} % \cs{SetBeginApparatus}\marg{characters} can be used to append % characters at the beginning of the apparatus block. By default, % nothing is appended:--- % \begin{macrocode} \NewDocumentCommand{\SetBeginApparatus}{m}{\edef\ekd@begin@apparatus{#1}} % \end{macrocode} % \end{macro} % \begin{macro}{\SetEndApparatus} % \cs{SetEndApparatus}\marg{characters} can be used to append % characters at the end of the apparatus block\---such as a period, % as it is customary in some editions. By default, nothing is % appended:--- % \begin{macrocode} \NewDocumentCommand{\SetEndApparatus}{m}{\edef\ekd@end@apparatus{#1}} % \end{macrocode} % \end{macro} % \begin{macro}{\SetUnitDelimiter} % \cs{SetUnitDelimiter}\marg{delimiter} can be used to set the % delimiter between entries in the apparatus criticus. By default, % there is no delimiter except a simple space. \cs{SetUnitDelimiter} % can be used to insert a broad space (with |\hskip| for instance, as % in the OCT series) or the divider-sign (‖, as in the Budé series):--- % \begin{macrocode} \NewDocumentCommand{\SetUnitDelimiter}{m}{\def\ekd@unit@delim{#1}} % \end{macrocode} % \end{macro} % \begin{macro}{\footnoteruletrue} % \begin{macro}{\footnoterulefalse} % As \pkg{ekdosis} takes care of drawing a rule separating the main % text from the apparatus block as well as layers of notes from each % other inside this block, it may not be desirable to have % the standard \LaTeX{} \enquote{footnoterule} printed on every page % of the edition text. \cs{footnoterulefalse} removes it while % \cs{footnoteruletrue} leaves it untouched. The latter is set by % default. % \begin{macrocode} \newif\iffootnoterule \footnoteruletrue \let\dflt@footnoterule\footnoterule \let\dflt@pcol@footnoterule\pcol@footnoterule \renewcommand\footnoterule{% \iffootnoterule \dflt@footnoterule% \fi } \renewcommand\pcol@footnoterule{% \iffootnoterule \dflt@pcol@footnoterule% \fi } % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\SetDefaultRule} % By default, \pkg{ekdosis} draws separating rules the definition of % which is |\rule{0.4\columnwid|\allowbreak|th}{0.4pt}|. This can be % changed in the preamble or at any point of the document with % \cs{SetDefaultRule}\marg{\allowbreak{}rule definition}. Leaving % this argument empty as in \cs{SetDefaultRule}|{}| removes the % rule. % \begin{macrocode} \NewDocumentCommand{\SetDefaultRule}{m}{% \def\@tempa{#1} \ifx\@tempa\empty\def\ekd@default@rule{\mbox{}}% \else% \def\ekd@default@rule{#1}% \fi} % \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. % \begin{macrocode} \newcommand*{\NLS}{% \par% \nobreak% \vspace{-\parskip}% \noindent% \ignorespaces} % \end{macrocode} % \end{macro} % This boolean is used to test if a given entry is to be preceded by a % numeral referring to the line of the edition text. % \begin{macrocode} \newif\ifsubsq@unit \subsq@unittrue % \end{macrocode} % \cs{add@@apparatus} inserts the apparatus block on a given page % either in the footnote floating block or in a float of its own, % depending on the value set in the |layout| global option. As some % commands need to know whether they are called from inside the % apparatus criticus, a conditional is first defined. % \begin{macrocode} \newif\ifekd@inside@app \def\add@@apparatus{% \if@pkg@parnotes\parnotes\else\fi% \if@pkg@footins% \bgroup% \ifrtl@app\setRL\else\setLR\fi% \blfootnote{% \if@pkg@parnotes% \if@parnotesroman% \renewcommand*{\theparnotemark}{\roman{parnotemark}}\else\fi% \parnoteclear\else\fi% \ekd@inside@apptrue \footnotesize\apparatus\unless\ifekd@mapps\ekd@end@apparatus\fi% \ekd@inside@appfalse \if@pkg@parnotes\parnotes\parnotereset\else\fi }% \egroup% \fi% \if@pkg@float% \keyparbox[!b]{}{\ifrtl@app\setRL\else\setLR\fi% \if@pkg@parnotes% \if@parnotesroman% \renewcommand*{\theparnotemark}{\roman{parnotemark}}\else\fi% \parnoteclear\else\fi% \ekd@inside@apptrue \ekd@appfontsize\apparatus\unless\ifekd@mapps\ekd@end@apparatus\fi% \ekd@inside@appfalse \if@pkg@parnotes\parnotes\parnotereset\else\fi% }% \fi% } % \end{macrocode} % Before inserting any new entry, \cs{add@apparatus} calls % \cs{test@apparatus} to decide whether a new apparatus block must be % created on a given page. % \begin{macrocode} \def\add@apparatus{% \test@apparatus% \ifbool{do@app}{\subsq@unitfalse\add@@apparatus}{}% } % \end{macrocode} % \cs{append@app} inserts a bare (sub)entry in the apparatus... % \begin{macrocode} \NewDocumentCommand{\append@app}{o +m}{% \ifekd@isinapp% \ifekd@state% \IfNoValueTF{#1}% {\luadirect{ekdosis.appin(\luastringO{#2})}}% {\luadirect{ekdosis.appin(\luastringO{#2}, \luastringO{#1})}}% \fi% \fi} % \end{macrocode} % while \cs{append@ln@app} inserts a (sub)entry possibly preceded by a % line number. % \begin{macrocode} \NewDocumentCommand{\append@ln@app}{o +m}{% \IfNoValueTF{#1} {\luadirect{tex.sprint(ekdosis.mdvappend(\luastringO{#2}))}} {\luadirect{tex.sprint(ekdosis.mdvappend(\luastringO{#2}, \luastringO{#1}))}}} % \end{macrocode} % \paragraph{Lineation settings} % \begin{macro}{\outerlinenumbers} % \begin{macro}{\innerlinenumbers} % \pkg{ekdosis} does not use the \enquote{pagewise} numbering mode % that is provided by \pkg{lineno}. Therefore, % \cs{outerlinenumbers} and \cs{innerlinenumbers} are defined in % addition to \cs{rightlinenum{\allowbreak}bers} and % \cs{leftlinenumbers}. % \begin{macrocode} \def\outerlinenumbers{ \def\makeLineNumberRunning{ \checkoddpage \ifoddpage \linenumberfont\hskip\linenumbersep\hskip\textwidth \hbox to\linenumberwidth{\hss\LineNumber}\hss \else \hss\linenumberfont\LineNumber\hskip\linenumbersep \fi } } \def\innerlinenumbers{ \def\makeLineNumberRunning{ \checkoddpage \ifoddpage \hss\linenumberfont\LineNumber\hskip\linenumbersep \else \linenumberfont\hskip\linenumbersep\hskip\textwidth \hbox to\linenumberwidth{\hss\LineNumber}\hss \fi } } % \end{macrocode} % \end{macro} % \end{macro} % The keys to be used for lineation settings follow. A conditional is % defined beforehand so that \pkg{ekdosis} may know whether the % numbering should start afresh at the top of each page. % \begin{macrocode} \newif\ifekd@pagelineation \NewDocumentCommand{\ekdatbegshihook}{}{% \ifekd@pagelineation\resetlinenumber\fi } \AtBeginShipout{\ekdatbegshihook} \newif\ifekd@elidednumbers \ekvdefinekeys{ekd@lineation}{ choice lineation = {page = \ekd@pagelineationtrue, document = \ekd@pagelineationfalse}, unknown-choice lineation = \PackageError{ekdosis}{unknown lineation=#1}{`lineation' must be either `page' or `document'.}, code modulonum = \chardef\c@linenumbermodulo#1\relax, noval modulo = \modulolinenumbers, choice numbers = {elided = \ekd@elidednumberstrue, full = \ekd@elidednumbersfalse}, unknown-choice numbers = \PackageError{ekdosis}{unknown numbers=#1}{`numbers' must be either `elided' or `full'.}, initial numbers = elided, choice margin = {right = \rightlinenumbers, left = \leftlinenumbers, inner = \innerlinenumbers, outer = \outerlinenumbers}, unknown-choice margin = \PackageError{ekdosis}{unknown margin=#1}{`margin' must be either `left', `right', \MessageBreak `inner' or `outer'} } % \end{macrocode} % \begin{macro}{\SetLineation} % Then \cs{SetLineation}\marg{options} can be used in the preamble or % at any point of the document to set lineation preferences. Its % argument processes the |key-value| options that are defined just % above. % \begin{macrocode} \NewDocumentCommand{\SetLineation}{m}{ \ekvset{ekd@lineation}{#1} } % \end{macrocode} % \end{macro} % Use |\normalfont| for line numbers:--- % \begin{macrocode} \renewcommand\linenumberfont{\normalfont\footnotesize} % \end{macrocode} % \begin{macro}{\SetDefaultApparatus} % By default, \pkg{ekdosis} defines one layer of critical notes which % is called |default|. This name can be changed at any point of the % document with \cs{SetDefaultApparatus}\marg{name}. % \begin{macrocode} \ekvdefinekeys{appnote}{ store type = \ekdan@type, initial type = default } \NewDocumentCommand{\SetDefaultApparatus}{m}{% \ekvset{appnote}{type=#1}} % \end{macrocode} % \end{macro} % \begin{macro}{\app} % \cs{app}|[type=|\meta{type}|]|\marg{apparatus entries} takes one % mandatory argument and accepts one optional argument. |type=| refers % to the layer the note must go into and \meta{apparatus entries} % contains command used to insert the entries, either \cs{lem}, % \cs{rdg} or \cs{note}\meta{*}:--- % \begin{macrocode} \NewDocumentCommand{\app}{O{} > { \TrimSpaces } +m}{% \leavevmode \begingroup \ekvset{appnote}{#1}% \ekd@isinapptrue% \stepcounter{ekd@lab}% \zlabel{ekd:\theekd@lab}% \luadirect{ekdosis.storeabspg( \luastring{\zref@extract{ekd:\theekd@lab}{abspage}})}% \ifekd@state\add@apparatus\fi% \luadirect{tex.sprint(ekdosis.removesp(\luastringN{#2}))}% \ekd@isinappfalse% \endgroup} % \end{macrocode} % \end{macro} % \cs{current@ref@arg} is used outside \cs{app} by \cs{note}. It takes % two mandatory arguments: the beginning line label and the ending % line label\---which are manually inserted---and returns the formatted % reference to be inserted in the apparatus criticus. % \begin{macrocode} \def\current@ref@arg#1#2{{%\textdir TLT% \unexpanded\expandafter{\ekd@refnumstyle}% \ifnum% \getpagerefnumber{#1} = \getpagerefnumber{#2} \ifnum% \getrefnumber{#1} = \getrefnumber{#2} % \ifekd@mapps% \ifbool{subsq@unit@\ekdan@type}{% \ifnum% \getrefnumber{#1} = \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevnotelab())}} \else \LRnum{\getrefnumber{#1}}% issue the no \fi% }% {\LRnum{\getrefnumber{#1}}}% issue the no \else \ifsubsq@unit% % \ifnum% \getrefnumber{#1} = \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevnotelab())}} \else \LRnum{\getrefnumber{#1}}% issue the no \fi % \else \LRnum{\getrefnumber{#1}}% issue the no \fi \fi % \else \ifekd@elidednumbers \luadirect{tex.sprint(ekdosis.numrange(\luastring{\getrefnumber{#1}}, \luastring{\getrefnumber{#2}}))}% \else \LRnum{\getrefnumber{#1}}--% \LRnum{\getrefnumber{#2}}% issue the nos \fi \fi% \else \LRnum{\getrefnumber{#1}}--% \LRnum{\getpagerefnumber{#2}}.% \LRnum{\getrefnumber{#2}}% issue pg and ln nos \fi% }\unexpanded\expandafter{\ekd@postrefnum}% } % \end{macrocode} % \cs{current@ref} is pretty much the same as \cs{current@reg@arg}, % but takes no argument. It is used by commands such as \cs{lem} when % references to page and line numbers can be returned by \textsf{Lua}. % \begin{macrocode} \def\current@ref{{%\textdir TLT% \unexpanded\expandafter{\ekd@refnumstyle}% \ifnum% \getpagerefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b} = \getpagerefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e} \ifnum% \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b} = \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e} % \ifekd@mapps% \ifbool{subsq@unit@\ekdan@type}{% \ifnum% \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b} = \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b} \else \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% issue the no \fi% }{\LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}}% issue the no \else \ifsubsq@unit% % \ifnum% \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b} = \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b} \else \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% issue the no \fi % \else \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% issue the no \fi \fi % \else \ifekd@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 \else \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}--% \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}% 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 \fi% }\unexpanded\expandafter{\ekd@postrefnum}% } % \end{macrocode} % Define keys to be used by the optional arguments of \cs{lem} and % \cs{rdg}:--- % \begin{macrocode} \ekvdefinekeys{lem}{ code wit = \def\ekdlr@wit{#1}, code source = \def\ekdlr@source{#1}, code resp = \def\ekdlr@resp{#1}, code alt = \def\ekdlr@alt{#1}, code pre = \def\ekdlr@pre{#1}, code post = \def\ekdlr@post{#1}, code prewit = \def\ekdlr@prewit{#1}, code postwit = \def\ekdlr@postwit{#1}, store type = \ekdlr@type, store sep = \ekdl@sep, bool nolem = \ifekdl@nolem, bool nosep = \ifekdl@nosep, initial sep = \ekdsep } \ekvdefinekeys{rdg}{ code wit = \def\ekdlr@wit{#1}, code source = \def\ekdlr@source{#1}, code resp = \def\ekdlr@resp{#1}, code alt = \def\ekdlr@alt{#1}, code pre = \def\ekdlr@pre{#1}, code post = \def\ekdlr@post{#1}, code prewit = \def\ekdlr@prewit{#1}, code postwit = \def\ekdlr@postwit{#1}, store type = \ekdlr@type, bool nordg = \ifekdr@nordg } % \end{macrocode} % \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, % preceded by the reference to the line number or a space if it is the % same number as the one of the previous entry. This command accepts % the optional key-value arguments just defined above. % \begin{macrocode} \NewDocumentCommand{\lem}{O{} m}{% \ekd@isinlemtrue% \luadirect{ekdosis.dolnlab(\luastringN{#2})}% \null \bgroup% \ekvset{lem}{#1}% \ifekd@mapps% \ifnum% \luadirect{tex.sprint(ekdosis.get_bagunits(\luastringO{\ekdan@type}))} = 1 \boolfalse{subsq@unit@\ekdan@type}% \fi% \luadirect{ekdosis.increment_bagunits(\luastringO{\ekdan@type})}% \def\ekd@munit@delim{% \luadirect{tex.sprint(ekdosis.getappdelim(\luastringO{\ekdan@type}))}}% \luadirect{tex.sprint(ekdosis.limit_bagunits(\luastringO{\ekdan@type}))}% \fi% \ifekdl@nolem\edef\lem@app{% % \hskip .75em \ifekd@mapps \ifbool{subsq@unit@\ekdan@type}% {\ekd@munit@delim}{}% \else% \ifsubsq@unit\unexpanded\expandafter{\ekd@unit@delim}\fi% \fi% \current@ref}%\hskip .25em}% \else% \ifbool{al@rlmode}{% \edef\lem@app{% % \hskip .75em \ifekd@mapps \ifbool{subsq@unit@\ekdan@type}% {\ekd@munit@delim}{}% \else% \ifsubsq@unit\unexpanded\expandafter{\ekd@unit@delim}\fi% \fi% \current@ref%\hskip .25em \ifdefined\ekdlr@alt% \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi {\textdir TRT\unexpanded\expandafter{\ekdlr@alt}}% \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \else \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi {\textdir TRT\unexpanded{#2}}% \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \fi \ifdefined\ekdlr@postwit% \space\unexpanded\expandafter{\ekdlr@postwit}\else\fi \ifdefined\ekdlr@resp\space\getsiglum{\ekdlr@resp}\else\fi \ifdefined\ekdlr@source\space\getsiglum{\ekdlr@source}\else\fi \ifdefined\ekdlr@wit\space\getsiglum{\ekdlr@wit}\else\fi \ifdefined\ekdlr@prewit% \space\unexpanded\expandafter{\ekdlr@prewit}\space\else\fi \ifekdl@nosep\else\unexpanded\expandafter{\ekdl@sep}\fi }% }% {% \edef\lem@app{% % \hskip .75em \ifekd@mapps \ifbool{subsq@unit@\ekdan@type}% {\ekd@munit@delim}{}% \else% \ifsubsq@unit\unexpanded\expandafter{\ekd@unit@delim}\fi% \fi% \current@ref%\hskip .25em \ifdefined\ekdlr@alt% \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \ltx@ifpackageloaded{babel}% {\noexpand\selectlanguage{\languagename}% \unexpanded\expandafter{\ekdlr@alt}}% {\unexpanded\expandafter{\ekdlr@alt}}% \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi \else \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \ltx@ifpackageloaded{babel}% {{\noexpand\selectlanguage{\languagename}\unexpanded{#2}}}{% {\unexpanded{#2}}}% \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi \fi \ifdefined\ekdlr@prewit% \space\unexpanded\expandafter{\ekdlr@prewit}\space\else\fi \ifdefined\ekdlr@wit\space\getsiglum{\ekdlr@wit}\else\fi \ifdefined\ekdlr@source\space\getsiglum{\ekdlr@source}\else\fi \ifdefined\ekdlr@resp\space\getsiglum{\ekdlr@resp}\else\fi \ifdefined\ekdlr@postwit% \space\unexpanded\expandafter{\ekdlr@postwit}\else\fi \ifekdl@nosep\else\unexpanded\expandafter{\ekdl@sep}\fi }% }% \fi% \ifekd@mapps% \append@ln@app[\ekdan@type]{\lem@app}% \else% \append@ln@app{\lem@app}% \fi% \egroup% \ekd@isinlemfalse% \subsq@unittrue% } % \end{macrocode} % \end{macro} % \begin{macro}{\rdg} % \cs{rdg}\oarg{options}\marg{variant reading} inserts \meta{variant % reading} in the second part of the entry, after the lemma text and % the separator, in the apparatus criticus. This command accepts the % optional key-value arguments defined above. % \begin{macrocode} \NewDocumentCommand{\rdg}{O{} m}{% \bgroup% \ekvset{rdg}{#1}% % \ifekdr@nordg\append@app{}\else% do we need \append@app{} here? If % % so, keep in mind \ifekd@mapps, % like so: \ifekdr@nordg% \ifekd@mapps% \append@app[\ekdan@type]{}% \else% \append@app{}% \fi% \else% \ifbool{al@rlmode}{% \edef\rdg@app{% \ifdefined\ekdlr@alt% \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi {\textdir TRT\unexpanded\expandafter{\ekdlr@alt}}% \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \else \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi {\textdir TRT\unexpanded{#2}}% \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \fi \ifdefined\ekdlr@postwit% \space\unexpanded\expandafter{\ekdlr@postwit}\else\fi \ifdefined\ekdlr@resp\space\getsiglum{\ekdlr@resp}\else\fi \ifdefined\ekdlr@source\space\getsiglum{\ekdlr@source}\else\fi \ifdefined\ekdlr@wit\space\getsiglum{\ekdlr@wit}\else\fi \ifdefined\ekdlr@prewit% \space\unexpanded\expandafter{\ekdlr@prewit}\space\else\fi }% }% {% \edef\rdg@app{% \ifdefined\ekdlr@alt% \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \ltx@ifpackageloaded{babel}% {\noexpand\selectlanguage{\languagename}% \unexpanded\expandafter{\ekdlr@alt}}% {\unexpanded\expandafter{\ekdlr@alt}}% \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi \else \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \ltx@ifpackageloaded{babel}% {{\noexpand\selectlanguage{\languagename}\unexpanded{#2}}}{% {\unexpanded{#2}}}% \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi \fi \ifdefined\ekdlr@prewit% \space\unexpanded\expandafter{\ekdlr@prewit}\space\else\fi \ifdefined\ekdlr@wit\space\getsiglum{\ekdlr@wit}\else\fi \ifdefined\ekdlr@source\space\getsiglum{\ekdlr@source}\else\fi \ifdefined\ekdlr@resp\space\getsiglum{\ekdlr@resp}\else\fi \ifdefined\ekdlr@postwit% \space\unexpanded\expandafter{\ekdlr@postwit}\else\fi }% }% \ifekd@mapps% \append@app[\ekdan@type]{\rdg@app}% \else% \append@app{\rdg@app}% \fi% \fi% \egroup% } % \end{macrocode} % \end{macro} % Define keys to be used by the optional argument of \cs{note} when % this command is found outside \cs{app}:--- % \begin{macrocode} \ekvdefinekeys{note}{ store type = \ekdan@type, store lem = \ekdn@lem, code labelb = \def\ekdn@labelb{#1}, code labele = \def\ekdn@labele{#1}, store sep = \ekdn@sep, bool nosep = \ifekdn@nosep, initial type = default, initial sep = \ekdsep } % \end{macrocode} % \cs{note@noapp} is used internally when a \cs{note} command is found % outside \cs{app}. This command is mostly used to insert short % comments or references to texts quoted or cited in the edition text % to go into additional layers of the apparatus criticus, e.g.\ the % \emph{apparatus testium}. It accepts the optional key-value % arguments just defined above. It must be noted that |labelb| must be % specified; otherwise \pkg{ekdosis} will issue an error message. % \begin{macrocode} \NewDocumentCommand{\note@noapp}{O{} +m}{% \null \bgroup% \ekvset{note}{#1}% \stepcounter{ekd@lab}% \zlabel{ekd:\theekd@lab}% \luadirect{ekdosis.storeabspg( \luastring{\zref@extract{ekd:\theekd@lab}{abspage}})}% \ifekd@state\add@apparatus\fi% \ifekd@mapps% \ifnum% \luadirect{tex.sprint(ekdosis.get_bagunits(\luastringO{\ekdan@type}))} = 1 \boolfalse{subsq@unit@\ekdan@type}% \fi% \luadirect{ekdosis.increment_bagunits(\luastringO{\ekdan@type})}% \def\ekd@munit@delim{% \luadirect{tex.sprint(ekdosis.getappdelim(\luastringO{\ekdan@type}))}}% \luadirect{tex.sprint(ekdosis.limit_bagunits(\luastringO{\ekdan@type}))}% \fi% \ifdefined\ekdn@labelb% \luadirect{tex.sprint(ekdosis.setnotelab(\luastringO{\ekdn@labelb}))}% \ifdefined\ekdn@labele\else\def\ekdn@labele{\ekdn@labelb}\fi% \else\PackageError{ekdosis}{missing labelb}{`labelb' must be set.}\fi% \ifbool{al@rlmode}% {\edef\note@contents{% % \hskip .75em \ifekd@mapps \ifbool{subsq@unit@\ekdan@type}% {\ekd@munit@delim}{}% \else% \ifsubsq@unit\unexpanded\expandafter{\ekd@unit@delim}\fi% \fi% \current@ref@arg{\ekdn@labelb}{\ekdn@labele}%\hskip .25em \ifdefined\ekdn@lem% {\textdir TRT\unexpanded\expandafter{\ekdn@lem}}% \unless\ifekdn@nosep \unexpanded\expandafter{\ekdn@sep}\fi \else\fi% {\textdir TRT\unexpanded{#2}}}}% {\edef\note@contents{% % \hskip .75em \ifekd@mapps \ifbool{subsq@unit@\ekdan@type}% {\ekd@munit@delim}{}% \else% \ifsubsq@unit\unexpanded\expandafter{\ekd@unit@delim}\fi% \fi% \current@ref@arg{\ekdn@labelb}{\ekdn@labele}%\hskip .25em \ifdefined\ekdn@lem \ltx@ifpackageloaded{babel}% {\noexpand\selectlanguage{\languagename}% \unexpanded\expandafter{\ekdn@lem}}% {\unexpanded\expandafter{\ekdn@lem}}% \unless\ifekdn@nosep \unexpanded\expandafter{\ekdn@sep}\fi \else\fi% \ltx@ifpackageloaded{babel}% {{\noexpand\selectlanguage{\languagename}\unexpanded{#2}}}{% {\unexpanded{#2}}}}}% \ifekd@mapps% \unconditional@appin[\ekdan@type]{\note@contents}% \else% \unconditional@appin{\note@contents}% \fi% \luadirect{ekdosis.setprevnotelab(\luastringO{\ekdn@labelb})}% \egroup \subsq@unittrue \ignorespaces } % \end{macrocode} % Define keys to be used by the optional argument of \cs{note} when % this command is found inside \cs{app}:--- % \begin{macrocode} \ekvdefinekeys{ekd@note}{ store pre = \pre@value, store post = \post@value } % \end{macrocode} % The following three commands, \cs{note@app}, \cs{ekd@note} and % \cs{ekd@note@star} are used internally when a \cs{note} command is % found inside \cs{app}. These commands are used to insert short % comments after the lemma text or after any variant reading in the % apparatus criticus. \cs{note@app} and subsequently \cs{ekd@note} and % \cs{ekd@note@star} accept the optional key-value arguments just % defined above. % \begin{macrocode} \NewDocumentCommand{\ekd@note}{O{} m}{% \bgroup% \ekvset{ekd@note}{#1}% \edef\note@contents{% \ekvifdefinedNoVal{ekd@note}{pre}{}{% \unexpanded\expandafter{\pre@value}}% {\unexpanded{#2}}% \ekvifdefinedNoVal{ekd@note}{post}{}{% \unexpanded\expandafter{\post@value}}% }% \append@app{\note@contents}% \egroup% } \NewDocumentCommand{\ekd@note@star}{O{} m}{% \if@pkg@parnotes \bgroup% \ekvset{ekd@note}{#1}% \edef\note@contents{% \ekvifdefinedNoVal{ekd@note}{pre}{}{% \unexpanded\expandafter{\pre@value}}% \unskip\noexpand\parnote{\unexpanded{#2}}% \ekvifdefinedNoVal{ekd@note}{post}{}{% \unexpanded\expandafter{\post@value}}% }% \append@app{\note@contents}% \egroup% \else \append@app{\unskip\footnote{#2}}% \fi% } \NewDocumentCommand{\note@app}{s O{} +m}{% \ifbool{al@rlmode}{% \IfBooleanTF{#1}{\ekd@note@star[#2]{% {\textdir TRT#3}}} {\ekd@note[#2]{{\textdir TRT#3}}}% }{% \IfBooleanTF{#1}{\ekd@note@star[#2]{#3}} {\ekd@note[#2]{#3}}% }% } % \end{macrocode} % \begin{macro}{\note} % Finally, \cs{note} is a simple command designed to check whether % \cs{note} itself is called inside or outside \cs{app}. Then, unless % it is found inside \cs{lem}, it calls \cs{note@app} in the former % case and \cs{note@noapp} in the latter case:--- % \begin{macrocode} \NewDocumentCommand{\note}{s O{} +m}{% \ifekd@state% \ifekd@isinapp% \ifekd@isinlem% \note@noapp[#2]{#3}% \else% \IfBooleanTF{#1}{\note@app*[#2]{#3}}{\note@app[#2]{#3}}% \fi% \else% \note@noapp[#2]{#3}% \fi% \fi% } % \end{macrocode} % \end{macro} % \paragraph{Emendations and Conjectures} % Here follows the |key-value| options to be used by % \cs{SetCritSymbols} below:--- % \begin{macrocode} \ekvdefinekeys{ekd@corr}{ store suppbegin = \suppb@value, store suppend = \suppe@value, store delbegin = \delb@value, store delend = \dele@value, store sicbegin = \sicb@value, store sicend = \sice@value, store gapmark = \gapm@value, initial suppbegin = \ifbool{al@rlmode}{>}{<}, initial suppend = \ifbool{al@rlmode}{<}{>}, initial delbegin = \ifbool{al@rlmode}{\}}{\{}, initial delend = \ifbool{al@rlmode}{\{}{\}}, initial sicbegin = \dag, initial sicend = \dag, initial gapmark = *** } % \end{macrocode} % \begin{macro}{\supplied} % \changes{v1.1}{2020/09/01}{new macro for editorial additions} % \cs{supplied}\marg{text} takes as mandatory argument the text added % or supplied by conjecture. % \begin{macrocode} \NewDocumentCommand{\supplied}{m}{% \ifekd@inside@app #1% \else \suppb@value #1\suppe@value \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\surplus} % \changes{v1.1}{2020/09/01}{new macro for editorial deletions} % \cs{surplus}\marg{text} takes as mandatory argument the text % considered by the editor to be inauthentic, but nevertheless % retained between braces in the edition text as it is transmitted by % all witnesses. % \begin{macrocode} \NewDocumentCommand{\surplus}{m}{% \ifekd@inside@app #1% \else \delb@value #1\dele@value \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\sic} % \changes{v1.1}{2020/09/01}{new macro for text deemed to be not % understandable} % \cs{sic}\marg{text} takes as mandatory argument the text deemed by % the editor to be readable but not understandable. \cs{sic} insert % \meta{text} between cruces while \cs{sic*} prints only one crux % before \meta{text}. % \begin{macrocode} \NewDocumentCommand{\sic}{s m}{% \ifekd@inside@app #2% \else \IfBooleanTF{#1} {\sicb@value #2} {\sicb@value #2\sice@value}% \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\gap} % \changes{v1.1}{2020/09/01}{new macro for lacunae} % \cs{gap}\marg{options} indicates that some amount of text has fallen % away from the entire tradition. It takes as mandatory argument a % comma-separated list of options that can be used to further specify % the reason for omission, the unit of measurement, the quantity and % extent. % \begin{macrocode} \NewDocumentCommand{\gap}{m}{% \gapm@value } % \end{macrocode} % \end{macro} % \begin{macro}{\SetCritSymbols} % \changes{v1.1}{2020/09/01}{new macro to set the symbols to be % used to mark the corrections} \cs{SetCritSymbols}\marg{csv list of % options} is used to change the symbols that \pkg{ekdosis} uses by % default for representing emendations, lacunae, omissions, gaps and % editorial deletions. % \begin{macrocode} \NewDocumentCommand{\SetCritSymbols}{m}{ \ekvset{ekd@corr}{#1} } % \end{macrocode} % \end{macro} % \cs{apparatus} is used internally by \pkg{ekdosis} to print the % apparatus at the bottom of pages. Therefore, it is not documented, % but this may change in the future for it will be possible to have % apparatuses printed at other places. % \begin{macrocode} \NewDocumentCommand{\apparatus}{}{% \luadirect{tex.sprint(ekdosis.appout())}} % \end{macrocode} % The following two commands call \textsf{Lua} functions to check % whether an apparatus should be printed on a given page and to store % the current column id. % \begin{macrocode} \NewDocumentCommand{\test@apparatus}{}{% \luadirect{tex.sprint(ekdosis.testapparatus())}} \NewDocumentCommand{\ekd@storecol}{}{% \luadirect{ekdosis.storecurcol(\luastring{\thecolumn})}% } % \end{macrocode} % Start and stop |ekdosis|: % \begin{macrocode} \NewDocumentCommand{\EkdosisOn}{}{% \ekd@statetrue} \NewDocumentCommand{\EkdosisOff}{}{% \ekd@statefalse% } % \end{macrocode} % Neutralize unwanted commands provided by \pkg{lineno} within the % \env{ekdosis} environment:--- % \begin{macrocode} \def\ekd@setlineno{% \let\setpagewiselinenumbers\relax% \let\pagewiselinenumbers\relax% \let\endpagewiselinenumbers\relax% \let\runningpagewiselinenumbers\relax% \let\realpagewiselinenumbers\relax% } % \end{macrocode} % \begin{environment}{ekdosis} % Finally comes the \env{ekdosis} environment meant to receive the % edition text equipped with an apparatus criticus. This environment % collects its contents and delivers it to \textsf{Lua} functions if a % \texttt{TEI xml} output file be desired. % \begin{macrocode} \NewDocumentEnvironment{ekdosis}{+b}{% \ekd@setlineno% \runninglinenumbers \EkdosisOn#1}{% \EkdosisOff \endrunninglinenumbers% \iftei@export \luadirect{ekdosis.exporttei(\luastringN{\par #1\par })}\fi} % \end{macrocode} % \end{environment} % \paragraph{Alignment} What follows is to arrange texts in parallel % columns either on single pages or on facing pages. % % Define keys to be used by the \env{alignment} environment:--- % \begin{macrocode} \ekvdefinekeys{ekd@align}{ store tcols = \tcols@num, store lcols = \lcols@num, store texts = \texts@value, store apparatus = \apparatus@value, bool paired = \ifekd@paired, choice lineation = {page = \ekd@pagelineationtrue, document = \ekd@pagelineationfalse}, unknown-choice lineation = \PackageError{ekdosis}{unknown lineation=#1}{`lineation' must be either `page' or `document'.}, choice segmentation = {auto = \def\segmentation@val{auto}, noauto = \def\segmentation@val{noauto}}, unknown-choice segmentation = \PackageError{ekdosis}{unknown segmentation=#1}{`segmentation' must be either `auto' or `noauto'.}, bool flush = \ifekd@flushapp, initial tcols = 2, initial lcols = 1, initial texts = edition;translation, initial apparatus = edition, default segmentation = auto } % \end{macrocode} % \begin{macro}{\SetAlignment} % \cs{SetAlignment}\marg{settings} can be used either in the % preamble or at any point of the document to set or modify the % keys-value settings just defined above. % \begin{macrocode} \NewDocumentCommand{\SetAlignment}{m}{ \ekvset{ekd@align}{#1} } % \end{macrocode} % \end{macro} % Patch \pkg{paracol} to insert a hook in \cs{pcol@nextpage}. This % hook is used to reset line numbers on new pages. % \begin{macrocode} \patchcmd{\pcol@nextpage}{% \endgroup}{% \ifekd@pagelineation\resetlinenumber\fi \endgroup}{}{} % \end{macrocode} % \cs{EkdosisColStart} and \cs{EkdosisColStop} initialize columns % meant to receive edition texts. These commands are used internally % by \pkg{ekdosis}. % \begin{macrocode} \NewDocumentCommand{\EkdosisColStart}{}{% \ekd@setlineno% \runninglinenumbers \ekd@storecol% \stepcounter{ekd@lab}% \zlabel{ekd:\theekd@lab}% \luadirect{% ekdosis.storeabspg(\luastring{\zref@extract{ekd:\theekd@lab}{abspage}}, "pg_i")}% \ifekd@pagelineation \luadirect{tex.sprint(ekdosis.checkresetlineno())} \fi } \NewDocumentCommand{\EkdosisColStop}{}{% \stepcounter{ekd@lab}% \zlabel{ekd:\theekd@lab}% \luadirect{% ekdosis.storeabspg(\luastring{\zref@extract{ekd:\theekd@lab}{abspage}}, "pg_ii")}% \endrunninglinenumbers% } % \end{macrocode} % \begin{environment}{alignment} % \cs{begin}|{alignment}|\oarg{options}\dots\cs{end}|{alignment}| can % be used as it is provided to typeset a standard critical edition % text on the left-hand pages accompanied with a translation on the % right-hand pages. To that effect, it provides by default two new % environments, \env{edition} and \env{translation}, to be used to % typeset both texts. (Either whole texts or texts entered by % paragraphs alternately.) The optional argument of \env{alignment} % accepts the exact same key-value options as \cs{SetAlignment} % described above. One may contrast these options with those accepted % by \cs{SetAlignment} as \enquote{local settings}. % \begin{macrocode} \NewDocumentEnvironment{alignment}{O{}} {% \ekvset{ekd@align}{#1}% \luadirect{ekdosis.mkenvdata( \luastring{\texts@value}, "texts" )} \ifekd@flushapp \luadirect{ekdosis.newalignment("set")} \fi \luadirect{ekdosis.mkenvdata( \luastring{\apparatus@value}, "apparatus" )} \setrunninglinenumbers \luadirect{tex.sprint(ekdosis.mkenv())} \ifekd@paired \begin{paracol}[\lcols@num]{\tcols@num} \else \begin{paracol}[\lcols@num]*{\tcols@num} \fi } {\end{paracol} \iftei@export\luadirect{ekdosis.export_coldata_totei()}\fi \ifekd@flushapp \luadirect{ekdosis.newalignment("reset")} \fi \luadirect{ekdosis.flushenvdata()} \luadirect{ekdosis.flushcolnums()} } % \end{macrocode} % \end{environment} % \paragraph{Divisions of the Body} % \pkg{ekdosis} can convert \cs{book}, \cs{part}, \cs{chapter}, % \cs{section}, \cs{subsec{\allowbreak}tion} and \cs{subsubsection} % into corresponding \texttt{TEI} \enquote*{numbered} % || elements, where $1\leq n\leq 6$. % \begin{macro}{\MkBodyDivs} % \cs{MkBodyDivs} is used to let \pkg{ekdosis} know which sectional % commands are actually being used in an edition text. This command % takes six mandatory arguments. For example, if \cs{section} and % \cs{subsection} are the only sectional commands being used, % |\MkBodyDivs{section}{subsection}{}{}{}{}| will have \cs{section} % and \cs{subsection} converted into || and || % respectively. % \begin{macrocode} \NewDocumentCommand{\MkBodyDivs}{mmmmmm}{ \luadirect{ekdosis.mkdivdepths( \luastringN{#1}, \luastringN{#2}, \luastringN{#3}, \luastringN{#4}, \luastringN{#5}, \luastringN{#6} ) } } % \end{macrocode} % \end{macro} % Divisions specific to \pkg{ekdosis}. Define keys to be used by % \cs{ekddiv}:--- % \begin{macrocode} \ekvdefinekeys{ekd@div}{ code type = \def\type@value{#1}, code n = \def\n@value{#1}, code head = \def\head@value{#1}, code barehead = \def\barehead@value{#1}, store depth = \depth@value, choice toc = {book = \def\toc@value{book}, part = \def\toc@value{part}, chapter = \def\toc@value{chapter}, section = \def\toc@value{section}, subsection = \def\toc@value{subsection}, subsubsection = \def\toc@value{subsubsection}, paragraph = \def\toc@value{paragraph}, subparagraph = \def\toc@value{subparagraph}}, unknown-choice toc = \PackageError{ekdosis}{unknown toc=#1}{`toc' must be either `book', `part', `chapter', `section', `subsection', \MessageBreak `subsubsection', `paragraph' or `subparagraph'.}, initial depth = 1 } % \end{macrocode} % \begin{macro}{\FormatDiv} % \cs{FormatDiv}\marg{n}\marg{code before}\marg{code % after} is used to lay out the heading of the title. It takes three % mandatory arguments: \emph{n}, namely the number referring to the % particular depth of the division, and then some \LaTeX{} formatting % commands to go before and after the heading itself:--- % \begin{macrocode} \NewDocumentCommand{\FormatDiv}{m m m}{ \luadirect{ekdosis.fmtdiv(\luastring{#1}, \luastringN{#2}, \luastringN{#3})} } % \end{macrocode} % \end{macro} % \cs{ekd@getfmtdiv} gets the formatting commands that have been % stored by \cs{FormatDiv}. % \begin{macrocode} \NewDocumentCommand{\ekd@getfmtdiv}{m m}{% \luadirect{tex.sprint(ekdosis.getfmtdiv(\luastringO{#1}, \luastringN{#2}))}% } % \end{macrocode} % \begin{macro}{\ekddiv} % \cs{ekddiv}\marg{key-value arguments} is the standard command % provided by \pkg{ekdosis} to meet the requirements of classical and % literary texts the divisions of which depend on many different % received traditions. It takes one mandatory argument in which the % key-value arguments defined above are accepted, and converts the % divisions into \texttt{TEI} \enquote*{un-numbered} |
| % elements. % \begin{macrocode} \NewDocumentCommand{\ekddiv}{m}{ \begingroup \ekvset{ekd@div}{#1}% \ifdefined\head@value \bgroup \ekd@getfmtdiv{\depth@value}{b}% \head@value \ekd@getfmtdiv{\depth@value}{e}% \egroup \ifdefined\toc@value \ltx@ifpackageloaded{hyperref}{\phantomsection}{}% \ifdefined\barehead@value \addcontentsline{toc}{\toc@value}{\barehead@value}% \else \addcontentsline{toc}{\toc@value}{\head@value}% \fi \fi \fi \endgroup } % \end{macrocode} % \end{macro} % A very basic and provisional implementation of poetry lines % follows:--- % \begin{macrocode} \newlength{\ekdverseindentlength} \setlength{\ekdverseindentlength}{\parindent} \newenvironment*{ekdverse}[1][\ekdverseindentlength]{ \begin{list}{}{% \setlength{\leftmargin}{#1} \setlength{\itemsep}{0pt} \setlength{\topsep}{0pt} \setlength{\partopsep}{0pt} } \item[] }{\end{list}} % \end{macrocode} % \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 % |

| elements\---must be used so that \pkg{ekdosis} can be % informed of paragraph boundaries. % \begin{macrocode} \NewDocumentEnvironment{ekdpar}{}{\par}{\par} % \end{macrocode} % \end{environment} % % \iffalse % % \fi % % \Finale % \iffalse %<*lua> % \fi % \begin{comment} % \begin{ekdlua} -- `' -- This table will hold the functions: ekdosis = {} -- lpeg equivalent for string.gsub() local function gsub(s, patt, repl) patt = lpeg.P(patt) patt = lpeg.Cs((patt / repl + 1)^0) return lpeg.match(patt, s) end -- some basic patterns: local letters = lpeg.R("az", "AZ") local ascii = lpeg.R("az", "AZ", "@@") local dblbkslash = lpeg.Cs("\\") local bsqbrackets = lpeg.Cs{ "[" * ((1 - lpeg.S"[]") + lpeg.V(1))^0 * "]" } local bcbraces = lpeg.Cs{ "{" * ((1 - lpeg.S"{}") + lpeg.V(1))^0 * "}" } local spce = lpeg.Cs(" ") local spcenc = lpeg.P(" ") local cmdstar = lpeg.Cs(spce * lpeg.P("*")) local bsqbracketsii = lpeg.Cs(bsqbrackets^-2) local bcbracesii = lpeg.Cs(bcbraces^-2) local cmd = lpeg.Cs(dblbkslash * ascii^1 * cmdstar^-1) local rawcmd = lpeg.Cs(dblbkslash * ascii^1) local aftercmd = lpeg.Cs(lpeg.S("*[{,.?;:'`\"") + dblbkslash) local cmdargs = lpeg.Cs(spce^-1 * bsqbracketsii * bcbracesii * bsqbrackets^-1) local app = lpeg.Cs("app") 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 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@rb") * spce^0) local para = lpeg.P(lpeg.Cs("\\p@ra") * spce^0) local labelrefcmds = lpeg.Cs(lpeg.P("label") + lpeg.P("linelabel") + lpeg.P("lineref") + lpeg.P("ref") + lpeg.P("pageref") + lpeg.P("vref") + lpeg.P("vpageref")) local citecmds = lpeg.Cs(lpeg.P("icite") + lpeg.P("cite") + lpeg.P("Cite") + lpeg.P("cite *") + lpeg.P("parencite") + lpeg.P("Parencite") + lpeg.P("parencite *") + lpeg.P("footcite") + lpeg.P("footcitetext") + lpeg.P("textcite") + lpeg.P("Textcite") + lpeg.P("smartcite") + lpeg.P("Smartcite") + lpeg.P("autocite") + lpeg.P("Autocite") + lpeg.P("autocite *") + lpeg.P("Autocite *") ) -- -- Bind to local variables local next = next -- General local xmlids = {} table.insert(xmlids, {xmlid = "scholars"} ) local function xmlidfound(element) for i = 1,#xmlids do if xmlids[i].xmlid == element then return true end end return false end local function checkxmlid(str) if string.find(str, "^[0-9]") or string.find(str, "[:; ]") then return false else return true end end -- Witnesses local listWit = {} -- Persons/Scholars local listPerson = {} local idsRend = {} local shorthands = {} local function isfound(table, value) for i = 1,#table do if table[i] == value then return true end end return false end local function isintable(table, value) for i = 1,#table do if table[i].a == value then return true end end return false end local function get_a_index(id, table) local idfound = nil for i = 1,#table do if table[i].a == id then idfound = i break end end return idfound end local function getindex(id, table) local idfound = nil for i = 1,#table do if table[i].xmlid == id then idfound = i break end end return idfound end function ekdosis.newwitness(id, siglum, description, Settlement, Institution, Repository, Collection, Idno, MsName, OrigDate) if xmlidfound(id) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..id.. "\" already exists as an xml:id. " .. "Please pick another id.}}") elseif not checkxmlid(id) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..id.. "\" is not a valid xml:id. \\MessageBreak " .. "Please pick another id.}}") else table.insert(xmlids, {xmlid = id}) table.sort(xmlids, function(a ,b) return(#a.xmlid > #b.xmlid) end) table.insert(idsRend, {xmlid = id, abbr = siglum}) table.sort(idsRend, function(a ,b) return(#a.xmlid > #b.xmlid) end) table.insert(listWit, {xmlid = id, abbr = siglum, detailsDesc = description, msIdentifier = { settlement = Settlement, institution = Institution, repository = Repository, collection = Collection, idno = Idno, msName = MsName} }) local indexwit = getindex(id, listWit) if OrigDate ~= "" then listWit[indexwit].history = {} listWit[indexwit].history.origin = {origDate = OrigDate} end end return true end function ekdosis.newhand(id, witid, siglum, description) if xmlidfound(id) or not xmlidfound(witid) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..id.. "\" already exists as an xml:id. " .. "Please pick another id.}}") elseif not checkxmlid(id) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..id.. "\" is not a valid xml:id. \\MessageBreak " .. "Please pick another id.}}") else table.insert(xmlids, {xmlid = id}) table.sort(xmlids, function(a ,b) return(#a.xmlid > #b.xmlid) end) table.insert(idsRend, {xmlid = id, abbr = siglum}) table.sort(idsRend, function(a ,b) return(#a.xmlid > #b.xmlid) end) local indexwit = getindex(witid, listWit) -- listWit[indexwit].handDesc = {xmlid = id, abbr = siglum, handNote = description} if listWit[indexwit].handDesc == nil then listWit[indexwit].handDesc = {} else end table.insert(listWit[indexwit].handDesc, {xmlid = id, abbr = siglum, detailsDesc = description}) end return true end function ekdosis.newshorthand(id, rend, xmlids) if isintable(shorthands, id) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..id.. "\" already exists as a shorthand. " .. "Please pick another shorthand.}}") else table.insert(shorthands, { a = id, b = rend, c = xmlids }) table.sort(shorthands, function(a ,b) return(#a.a > #b.a) end) table.insert(idsRend, {xmlid = id, abbr = rend}) table.sort(idsRend, function(a ,b) return(#a.xmlid > #b.xmlid) end) end return true end function ekdosis.newscholar(id, siglum, rawname, Forename, Surname, AddName, Note) if xmlidfound(id) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..id.. "\" already exists as an xml:id. " .. "Please pick another id.}}") elseif not checkxmlid(id) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..id.. "\" is not a valid xml:id. \\MessageBreak " .. "Please pick another id.}}") else table.insert(xmlids, {xmlid = id}) table.sort(xmlids, function(a ,b) return(#a.xmlid > #b.xmlid) end) table.insert(idsRend, {xmlid = id, abbr = siglum}) table.sort(idsRend, function(a ,b) return(#a.xmlid > #b.xmlid) end) if rawname ~= "" then table.insert(listPerson, {xmlid = id, abbr = siglum, note = Note, persName = { name = rawname} }) else table.insert(listPerson, {xmlid = id, abbr = siglum, note = Note, persName = { forename = Forename, surname = Surname, addName = AddName} }) end end return true end local xmlbibresource = nil function ekdosis.addxmlbibresource(str) if string.find(str, "%.xml$") then xmlbibresource = str else xmlbibresource = str..".xml" end return true end function ekdosis.newsource(id, siglum) if xmlidfound(id) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..id.. "\" already exists as an xml:id. " .. "Please pick another id.}}") elseif not checkxmlid(id) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..id.. "\" is not a valid xml:id. \\MessageBreak " .. "Please pick another id.}}") else table.insert(xmlids, {xmlid = id}) table.sort(xmlids, function(a ,b) return(#a.xmlid > #b.xmlid) end) table.insert(idsRend, {xmlid = id, abbr = siglum}) table.sort(idsRend, function(a ,b) return(#a.xmlid > #b.xmlid) end) end return true end function ekdosis.getsiglum(str, opt) str = str.."," str = string.gsub(str, "%s-(%,)", "%1") ctrl = str if opt == "tei" then for i = 1,#shorthands do str = string.gsub(str, shorthands[i].a, shorthands[i].c) end for i = 1,#idsRend do str = string.gsub(str, "(%f[%w])"..idsRend[i].xmlid.."(%,)", "%1#"..idsRend[i].xmlid.."%2") ctrl = string.gsub(ctrl, idsRend[i].xmlid.."%,", "") end str = string.gsub(str, "%,(%s-)([%#])", " %2") str = string.gsub(str, "%,$", "") else for i = 1,#idsRend do str = string.gsub(str, idsRend[i].xmlid.."%,", idsRend[i].abbr) ctrl = string.gsub(ctrl, idsRend[i].xmlid.."%,", "") end end -- if string.find(ctrl, "[A-Za-z0-9]") if string.find(ctrl, "%S") then return "" else return str end end -- begin totei functions local cmdtotags = { {a="textsuperscript", b="hi", c=" rend=\"sup\""}, {a="textsubscript", b="hi", c=" rend=\"sub\""}, {a="LRfootnote", b="note", c=" place=\"bottom\""}, {a="RLfootnote", b="note", c=" place=\"bottom\""}, {a="enquote *", b="quote", c=""}, {a="footnote", b="note", c=" place=\"bottom\""}, {a="enquote", b="quote", c=""}, {a="txtrans", b="s", c=" xml:lang=\"ar-Latn\" type=\"transliterated\""}, {a="textbf", b="hi", c=" rend=\"bold\""}, {a="textit", b="hi", c=" rend=\"italic\""}, {a="textsc", b="hi", c=" rend=\"smallcaps\""}, {a="textsf", b="hi", c=" rend=\"sf\""}, {a="arbup", b="hi", c=" rend=\"sup\""}, {a="txarb", b="s", c=" xml:lang=\"arb\""}, {a="arb", b="foreign", c=" xml:lang=\"ar-Latn\" type=\"transliterated\" subtype=\"arabtex\""} } local texpatttotags = { {a="\\pagebreak%s+%[[1-4]%]", b=""}, {a="\\pagebreak%s+", b=""}, {a="\\altrfont%s+", b=""}, {a="\\mbox%s+{(.-)}", b="%1"}, {a="\\LR%s+{(.-)}", b="%1"}, {a="\\RL%s+{(.-)}", b="%1"} } local envtotags = { {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\""} } local close_p = { "p", "lg" } local forbid_xmlid = true function ekdosis.newcmdtotag(cmd, tag, attr) if forbid_xmlid then attr = string.gsub(attr, "xml:id", "n") -- xml:id is not allowed here else end if isintable(cmdtotags, cmd) then local index = get_a_index(cmd, cmdtotags) table.remove(cmdtotags, index) table.insert(cmdtotags, {a = cmd, b = tag, c = " "..attr}) table.sort(cmdtotags, function(a ,b) return(#a.a > #b.a) end) else table.insert(cmdtotags, {a = cmd, b = tag, c = " "..attr}) table.sort(cmdtotags, function(a ,b) return(#a.a > #b.a) end) end return true end function ekdosis.newpatttotag(pat, repl) 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) return true end function ekdosis.newenvtotag(env, tag, attr, closep) if forbid_xmlid then attr = string.gsub(attr, "xml:id", "n") -- xml:id is not allowed here else end if isintable(envtotags, env) then local index = get_a_index(env, envtotags) table.remove(envtotags, index) table.insert(envtotags, {a = env, b = tag, c = " "..attr, d = closep}) table.sort(envtotags, function(a ,b) return(#a.a > #b.a) end) else table.insert(envtotags, {a = env, b = tag, c = " "..attr, d = closep}) table.sort(envtotags, function(a ,b) return(#a.a > #b.a) end) end return true end -- Get values of attributes local function get_attr_value(str, attr) str = str.."," str = string.gsub(str, "%b{}", function(body) body = string.gsub(body, attr, attr.."@ekd") return string.format("%s", body) end) local attrval = string.match(str, "%f[%w]"..attr.."%s?%=%s?%b{}") or string.match(str, "%f[%w]"..attr.."%s?%=%s?.-%,") or "" attrval = string.gsub(attrval, attr.."%s?%=%s?(%b{})", function(bbraces) bbraces = string.sub(bbraces, 2, -2) return string.format("%s", bbraces) end) attrval = string.gsub(attrval, attr.."%s?%=%s?(.-)%s?%,", "%1") str = string.gsub(str, attr.."@ekd", attr) return attrval end local function xml_entities(str) str = string.gsub(str, "%<", "<") str = string.gsub(str, "%>", ">") return str end local function note_totei(str) str = gsub(str, dblbkslash * note * spcenc^-1 * bsqbrackets * bcbraces * spcenc^-1, function(bkslash, cmd, opt, arg) opt = string.sub(opt, 2, -2) arg = string.sub(arg, 2, -2) teitype = get_attr_value(opt, "type") if teitype ~= "" then teitype = " type=\""..teitype.."\"" else end right = get_attr_value(opt, "labelb") left = get_attr_value(opt, "labele") if right == "" then return string.format("<%s>%s", cmd, arg, cmd) else if left ~= "" then return string.format( "<%s%s target=\"#range(right(%s),left(%s))\">%s", cmd, teitype, right, left, arg, cmd, right) elseif left == "" then return string.format( "<%s%s target=\"#right(%s)\">%s", cmd, teitype, right, arg, cmd, right) end end end) return str end local function app_totei(str) str = gsub(str, dblbkslash * app * spcenc^-1 * bsqbrackets * bcbraces * spcenc^-1, function(bkslash, cmd, opt, arg) opt = string.sub(opt, 2, -2) arg = string.sub(arg, 2, -2) opt = get_attr_value(opt, "type") if opt ~= "" then opt = " type=\""..opt.."\"" else end return app_totei(string.format("<%s%s>%s", cmd, opt, arg, cmd)) end) return str end local function lem_rdg_totei(str) str = gsub(str, spcenc^-1 * dblbkslash * lemrdg * spcenc^-1 * bsqbrackets * bcbraces * spcenc^-1, function(bkslash, cmd, opt, arg) opt = string.sub(opt, 2, -2) arg = string.sub(arg, 2, -2) -- opt = get_attr_value(opt, "wit") -- teiwit = get_attr_value(opt, "wit") if teiwit ~= "" then teiwit = " wit=\""..ekdosis.getsiglum(teiwit, "tei").."\"" else end teisource = get_attr_value(opt, "source") if teisource ~= "" then teisource = " source=\""..ekdosis.getsiglum(teisource, "tei").."\"" else end teiresp = get_attr_value(opt, "resp") if teiresp ~= "" then teiresp = " resp=\""..ekdosis.getsiglum(teiresp, "tei").."\"" else end teitype = get_attr_value(opt, "type") if teitype ~= "" then teitype = " type=\""..teitype.."\"" else end -- if opt == "" then return lem_rdg_totei(string.format("<%s>%s", cmd, arg, cmd)) else -- opt = ekdosis.getsiglum(opt, "tei") return lem_rdg_totei(string.format("<%s%s%s%s%s>%s", cmd, teiwit, teisource, teiresp, teitype, arg, cmd)) end end) str = gsub(str, spcenc^-0 * dblbkslash * lemrdg * spcenc^-1 * bcbraces * spcenc^-1, function(bkslash, cmd, arg) arg = string.sub(arg, 2, -2) return lem_rdg_totei(string.format("<%s>%s", cmd, arg, cmd)) end) return str end local function relocate_notes(str) str = string.gsub(str, "(%.-)(%.-%<%/note%>)(.-%<%/lem%>)", "%1%3%2") return str end local function linestotei(str) -- str = "\n"..str str = string.gsub(str, "^%s?(.-)%s?$", "\n%1\n") -- str = gsub(str, endpoem, "\n") str = gsub(str, poemline * spcenc^-1 * lpeg.P(">"), "\n") str = gsub(str, poemline * spcenc^-1, "\n") -- str = str.."\n" 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) 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) 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) 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) end) return str end local function envtotei(str) for i = 1,#envtotags do if envtotags[i].b ~= "" then if isfound(close_p, envtotags[i].b) or envtotags[i].d == "yes" then str = gsub(str, lpeg.P("\\begin") * spcenc^-1 * lpeg.P("{") * lpeg.Cs(envtotags[i].a) * lpeg.P("}") * bsqbracketsii * bcbracesii * spcenc^-1, "\\p@rb <"..envtotags[i].b..envtotags[i].c..">") str = gsub(str, spcenc^-1 * lpeg.P("\\end") * spcenc^-1 * lpeg.P("{") * lpeg.Cs(envtotags[i].a) * lpeg.P("}"), "\\p@ra ") else str = gsub(str, lpeg.P("\\begin") * spcenc^-1 * lpeg.P("{") * lpeg.Cs(envtotags[i].a) * lpeg.P("}") * bsqbracketsii * bcbracesii * spcenc^-1, "<"..envtotags[i].b..envtotags[i].c..">") str = gsub(str, spcenc^-1 * lpeg.P("\\end") * spcenc^-1 * lpeg.P("{") * lpeg.Cs(envtotags[i].a) * lpeg.P("}"), "") end else str = gsub(str, lpeg.P("\\begin") * spcenc^-1 * lpeg.P("{") * lpeg.Cs(envtotags[i].a) * lpeg.P("}") * bsqbracketsii * bcbracesii * spcenc^-1, "") str = gsub(str, spcenc^-1 * lpeg.P("\\end") * spcenc^-1 * lpeg.P("{") * lpeg.Cs(envtotags[i].a) * lpeg.P("}"), "") end end str = gsub(str, lpeg.P("\\begin") * spcenc^-1 * lpeg.P("{") * lpeg.Cs(ascii^1) * lpeg.P("}") * bsqbracketsii * bcbracesii * spcenc^-1, "<%1>") str = gsub(str, spcenc^-1 * lpeg.P("\\end") * spcenc^-1 * lpeg.P("{") * lpeg.Cs(ascii^1) * lpeg.P("}") * bsqbracketsii * bcbracesii, "") return str end local function texpatttotei(str) for i = 1,#texpatttotags do str = string.gsub(str, texpatttotags[i].a, texpatttotags[i].b) end return str end local function icitetotei(str) str = gsub(str, lpeg.P("\\") * citecmds * spcenc^-1 * bsqbrackets * bsqbrackets * bcbraces * bsqbrackets^-1, function(cmd, pre, post, body, opt) pre = string.sub(pre, 2, -2) post = string.sub(post, 2, -2) body = string.sub(body, 2, -2) if not checkxmlid(body) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..body.. "\" is not a valid xml:id. \\MessageBreak " .. "Please pick another id.}}") else end return string.format("%s %s", pre, body, post) end) str = gsub(str, lpeg.P("\\") * citecmds * spcenc^-1 * bsqbrackets * bcbraces * bsqbrackets^-1, function(cmd, post, body, opt) post = string.sub(post, 2, -2) body = string.sub(body, 2, -2) if not checkxmlid(body) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..body.. "\" is not a valid xml:id. \\MessageBreak " .. "Please pick another id.}}") else end return string.format("%s", body, post) end) str = gsub(str, lpeg.P("\\") * citecmds * spcenc^-1 * bcbraces * bsqbrackets^-1, function(cmd, body, opt) body = string.sub(body, 2, -2) if not checkxmlid(body) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..body.. "\" is not a valid xml:id. \\MessageBreak " .. "Please pick another id.}}") else end return string.format("", body) end) return str end local function cmdtotei(str) for i = 1,#cmdtotags do str = gsub(str, lpeg.P("\\") * lpeg.Cs(cmdtotags[i].a) * spcenc^-1 * bsqbrackets * -bcbraces, "\\%1%2{}") str = gsub(str, lpeg.P("\\") * lpeg.Cs(cmdtotags[i].a) * spcenc^-1 * -(bsqbrackets + bcbraces), "\\%1[]{}") str = string.gsub(str, "(\\"..cmdtotags[i].a..")%s?%*?(%b{})", "%1[]%2") str = string.gsub(str, "(\\"..cmdtotags[i].a..")%s?%*?(%b[])(%b{})", function(cmd, arg, body) body = string.sub(body, 2, -2) arg = string.sub(arg, 2, -2) arg = string.gsub(arg, "(%b{})", function(braces) braces = string.sub(braces, 2, -2) return string.format("\"%s\"", braces) end) body = cmdtotei(body) -- return string.format("<"..cmdtotags[i].b..cmdtotags[i].c.." %s>%s", arg, body) if cmdtotags[i].b ~= "" then return string.format("<"..cmdtotags[i].b..cmdtotags[i].c..">%s", body) else return "" end end) end -- temporarily: str = string.gsub(str, "\\(getsiglum)%s?(%b{})", function(cmd, body) body = string.sub(body, 2, -2) teisiglum = ekdosis.getsiglum(body, "tei") printsiglum = ekdosis.getsiglum(body) -- body = cmdtotei(body) return string.format("%s", teisiglum, printsiglum) end) str = string.gsub(str, "\\(gap)%s?(%b{})", function(cmd, body) body = string.sub(body, 2, -2) teireason = get_attr_value(body, "reason") if teireason ~= "" then teireason = " reason=\""..teireason.."\"" else end teiunit = get_attr_value(body, "unit") if teiunit ~= "" then teiunit = " unit=\""..teiunit.."\"" else end teiquantity = get_attr_value(body, "quantity") if teiquantity ~= "" then teiquantity = " quantity=\""..teiquantity.."\"" else end teiextent = get_attr_value(body, "extent") if teiextent ~= "" then teiextent = " extent=\""..teiextent.."\"" else end return string.format("", teireason, teiunit, teiquantity, teiextent) end) str = gsub(str, lpeg.P("\\") * labelrefcmds * spcenc^-1 * bcbraces, function(cmd, body) body = string.sub(body, 2, -2) if not checkxmlid(body) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..body.. "\" is not a valid xml:id. \\MessageBreak " .. "Please pick another id.}}") else end if string.find(cmd, "label") then return string.format("", body) else return string.format("", body) end end) str = string.gsub(str, "\\(%a+)%s?%*?(%b[])(%b{})", function(cmd, opt, body) body = string.sub(body, 2, -2) body = cmdtotei(body) return string.format("<%s>%s", cmd, body, cmd) end) str = string.gsub(str, "\\(%a+)%s?%*?(%b{})", function(cmd, body) body = string.sub(body, 2, -2) body = cmdtotei(body) return string.format("<%s>%s", cmd, body, cmd) end) str = string.gsub(str, "(%s)(%>)", "%2") return str end local teiautopar = true function ekdosis.setteiautopar(choice) if choice == "yes" then teiautopar = true else teiautopar = false end return true end local function partotei(str) if teiautopar then str = gsub(str, lpeg.P(lpeg.P("\\par") * spcenc^1)^1, "\\par ") str = gsub(str, ((para + parb) * par^-1)^2, "\\p@r ") str = string.gsub(str, "\\p@ra%s+", "

") str = string.gsub(str, "\\p@rb%s+", "

") str = string.gsub(str, "\\p@r%s+", "") str = string.gsub(str, "%s?\\par%s?", "

", 1) str = string.gsub(str, "(%)(%s-)(%<%/?div%d?)", "%3") str = string.gsub(str, "%s?\\par%s?", "

") str = string.gsub(str, "

%s?

", "") str = string.gsub(str, "(%)%s?(%)$", "%2") str = string.gsub(str, "(%)%s?$", "") str = string.gsub(str, "(

)%s?()", "%2%1") else str = gsub(str, par + para + parb, "") end return str end local function self_close_tags(str) str = gsub(str, lpeg.P("<" * -lpeg.S("/")) * lpeg.Cs(letters^1) * lpeg.Cs((1 - lpeg.S"<>")^0) * lpeg.P(">") * lpeg.P(""), function(ftag, arg, ltag) if ftag == ltag then return string.format("<%s%s/>", ftag, arg) else end end) return str end local divdepth = { book = 1, part = 2, chapter = 3, section = 4, subsection = 5, subsubsection = 6 } function ekdosis.mkdivdepths(...) divdepth = {} local num = 1 for _, y in ipairs{...} do if y == "book" or "part" or "chapter" or "section" or "subsection" or "subsubsection" then divdepth[y] = num num = num + 1 else end end return true end -- LaTeX side: format the divisions local fmtdiv = {} function ekdosis.fmtdiv(n, fmtb, fmte) if isintable(fmtdiv, n) then local index = get_a_index(n, fmtdiv) table.remove(fmtdiv, index) else end table.insert(fmtdiv, { a = n, formatb = fmtb, formate = fmte} ) return true end function ekdosis.getfmtdiv(n, pos) local index = get_a_index(n, fmtdiv) if index ~= nil then if pos == "b" then return fmtdiv[index].formatb elseif pos == "e" then return fmtdiv[index].formate end else return "" end end local ekddivs = true function ekdosis.setekddivsfalse() ekddivs = false end local function ekddivs_totei(str) str = gsub(str, dblbkslash * lpeg.Cs("ekddiv") * spce^-1 * bcbraces, function(bkslash, cmd, space, arg) if ekddivs then arg = string.sub(arg, 2, -2) teitype = get_attr_value(arg, "type") tein = get_attr_value(arg, "n") teihead = get_attr_value(arg, "head") teidepth = get_attr_value(arg, "depth") if teitype ~= "" then teitype = " type=\""..teitype.."\"" else end if tein ~= "" then tein = " n=\""..tein.."\"" else end if teidepth ~= "" then teidepth = " depth=\""..teidepth.."\"" else teidepth = " depth=\"1\"" end return string.format("\\p@rb %s\\p@ra ", teitype, tein, teidepth, teihead) else return "" end end) return str end local function section_totei(str) str = gsub(str, dblbkslash * sections * spce^-1 * bcbraces, "%1%2%3[]%4") str = gsub(str, dblbkslash * sections * spce^-1 * bsqbrackets * bcbraces, function(bkslash, secname, space, opt, arg) if ekddivs then return "" else ctr = divdepth[secname] arg = string.sub(arg, 2, -2) return string.format("\\p@rb %s\\p@ra ", ctr, secname, arg) end end) return str end local used_ndivs = {} local function close_ekddivs_at_end(str) local isdiv = false if string.find(str, "

$") then isdiv = true str = string.gsub(str, "(.*)(
)$", "%1") else end -- collect used depth numbers for i in string.gmatch(str, "
") do i = string.match(i, "depth=\"%d\"") i = string.match(i, "%d") if isintable(used_ndivs, i) then else table.insert(used_ndivs, {a = i} ) end end if next(used_ndivs) ~= nil then table.sort(used_ndivs, function(a ,b) return(#a.a > #b.a) end) else end local firstdiv = string.match(str, "
") or "" firstdiv = string.match(firstdiv, "depth%=\"%d\"") or "" firstdiv = string.match(firstdiv, "%d") or "" local lastdiv = string.match(string.reverse(str), ">.-\"%d\"%=htped.- vid<") or "" lastdiv = string.match(lastdiv, "\"%d\"%=htped") or "" lastdiv = string.match(lastdiv, "%d") or "" local firstdivindex = get_a_index(firstdiv, used_ndivs) local lastdivindex = get_a_index(lastdiv, used_ndivs) firstdivindex = tonumber(firstdivindex) lastdivindex = tonumber(lastdivindex) local closedivs = "" if isintable(used_ndivs, firstdiv) then while lastdivindex >= firstdivindex do closedivs = closedivs.."
" lastdivindex = lastdivindex - 1 end end if isdiv then return str..closedivs.."
" else return str..closedivs end end local function close_ndivs_at_end(str) local isdiv = false if string.find(str, "
$") then isdiv = true str = string.gsub(str, "(.*)(
)$", "%1") else end -- collect used div numbers for i in string.gmatch(str, " #b.a) end) else end local firstdiv = string.match(str, "= firstdivindex do closedivs = closedivs.."" lastdivindex = lastdivindex - 1 end end if isdiv then return str..closedivs.."
" else return str..closedivs end end local function close_ekddivs_in_between(str) local maxdepth = 1 for i in string.gmatch(str, "", "%1") do if tonumber(i) > tonumber(maxdepth) then maxdepth = i else end end for ndivi = 1, maxdepth do str = string.gsub(str, "(
)(.-)(
)", function(bdivi, ndivi, edivi, between, bdivii, ndivii, edivii) local firstdiv = ndivi local lastdiv = ndivii local firstdivindex = get_a_index(firstdiv, used_ndivs) local lastdivindex = get_a_index(lastdiv, used_ndivs) firstdivindex = tonumber(firstdivindex) lastdivindex = tonumber(lastdivindex) local closedivs = "" if firstdivindex >= lastdivindex then while firstdivindex >= lastdivindex do closedivs = closedivs.."
" firstdivindex = firstdivindex - 1 end end return string.format("%s%s%s%s%s%s%s%s", bdivi, ndivi, edivi, between, closedivs, bdivii, ndivii, edivii) end) end str = string.gsub(str, "()", "%1%3") used_ndivs = {} return str end local function close_ndivs_in_between(str) for ndivi = 1, 6 do str = string.gsub(str, "()(.-)()", function(bdivi, ndivi, edivi, between, bdivii, ndivii, edivii) local firstdiv = ndivi local lastdiv = ndivii local firstdivindex = get_a_index(firstdiv, used_ndivs) local lastdivindex = get_a_index(lastdiv, used_ndivs) firstdivindex = tonumber(firstdivindex) lastdivindex = tonumber(lastdivindex) local closedivs = "" if firstdivindex >= lastdivindex then while firstdivindex >= lastdivindex do closedivs = closedivs.."" firstdivindex = firstdivindex - 1 end end return string.format("%s%s%s%s%s%s%s%s", bdivi, ndivi, edivi, between, closedivs, bdivii, ndivii, edivii) end) end used_ndivs = {} return str end local function textotei(str) str = xml_entities(str) str = texpatttotei(str) str = note_totei(str) str = app_totei(str) str = lem_rdg_totei(str) str = relocate_notes(str) str = versetotei(str) str = envtotei(str) str = ekddivs_totei(str) str = section_totei(str) str = icitetotei(str) str = cmdtotei(str) str = self_close_tags(str) str = partotei(str) if ekddivs then str = close_ekddivs_at_end(str) str = close_ekddivs_in_between(str) else str = close_ndivs_at_end(str) str = close_ndivs_in_between(str) end return str end local teifilename = tex.jobname.."-tei" function ekdosis.setteifilename(str) teifilename = str return true end function ekdosis.openteistream() local f = io.open(teifilename.."_tmp.xml", "a+") f:write('', "\n") f:write("", "\n") f:write("", "\n") f:write("", "\n") f:write("", "\n") f:write("<!-- Title -->", "\n") f:write("", "\n") f:write("", "\n") f:write("", "\n") f:write("", "\n") f:write("", "\n") f:write("", "\n") f:write("", "\n") f:write("", "\n") f:write("", "\n") f:write("", "\n") for i = 1,#listWit do f:write('", "\n") f:write('', textotei(listWit[i].abbr), "", "\n") f:write(textotei(listWit[i].detailsDesc), "\n") f:write("", "\n") if listWit[i].msIdentifier.settlement == "" and listWit[i].msIdentifier.institution == "" and listWit[i].msIdentifier.repository == "" and listWit[i].msIdentifier.collection == "" and listWit[i].msIdentifier.idno == "" and listWit[i].msIdentifier.msName == "" then f:write("", "\n") else f:write("", "\n") if listWit[i].msIdentifier.settlement ~= "" then f:write("", textotei(listWit[i].msIdentifier.settlement), "", "\n") else end if listWit[i].msIdentifier.institution ~= "" then f:write("", textotei(listWit[i].msIdentifier.institution), "", "\n") else end if listWit[i].msIdentifier.repository ~= "" then f:write("", textotei(listWit[i].msIdentifier.repository), "", "\n") else end if listWit[i].msIdentifier.collection ~= "" then f:write("", textotei(listWit[i].msIdentifier.collection), "", "\n") else end if listWit[i].msIdentifier.idno ~= "" then f:write("", textotei(listWit[i].msIdentifier.idno), "", "\n") else end if listWit[i].msIdentifier.msName ~= "" then f:write("", textotei(listWit[i].msIdentifier.msName), "", "\n") else end f:write("", "\n") end if listWit[i].handDesc ~= nil then f:write("", "\n") f:write("", "\n") local j = 1 while listWit[i].handDesc[j] do f:write("", "\n") f:write('', textotei(listWit[i].handDesc[j].abbr), "", "\n") f:write("

", textotei(listWit[i].handDesc[j].detailsDesc), "

", "\n") f:write("
", "\n") j = j + 1 end f:write("
", "\n") f:write("
", "\n") else end if listWit[i].history ~= nil then f:write("", "\n") f:write("", "\n") f:write("", textotei(listWit[i].history.origin.origDate), "", "\n") f:write("", "\n") f:write("", "\n") end f:write("
", "\n") f:write("
", "\n") end f:write("
", "\n") f:write("", "\n") for i = 1,#listPerson do f:write('", "\n") f:write('', "\n") f:write('', textotei(listPerson[i].abbr), "", "\n") if listPerson[i].persName.name ~= nil then f:write(textotei(listPerson[i].persName.name)) else if listPerson[i].persName.forename ~= "" then f:write("", textotei(listPerson[i].persName.forename), "", "\n") else f:write("", "\n") end if textotei(listPerson[i].persName.surname) ~= "" then f:write("", textotei(listPerson[i].persName.surname), "", "\n") else f:write("", "\n") end if textotei(listPerson[i].persName.addName) ~= "" then f:write("", textotei(listPerson[i].persName.addName), "", "\n") end end if listPerson[i].note ~= "" then f:write("", textotei(listPerson[i].note), "", "\n") end f:write('', "\n") f:write('', "\n") end f:write("", "\n") f:write("
", "\n") f:write("
", "\n") f:write("", "\n") f:write('', "\n") f:write("", "\n") f:write("
", "\n") f:write("", "\n") f:write("", "\n") f:close() return true end local tidy = nil local function cleanup_tei() local f = assert(io.open(teifilename.."_tmp.xml", "r")) t = f:read("*a") t = string.gsub(t, "%%s?%", "") t = string.gsub(t, "^\n", "") f:close() local fw = assert(io.open(teifilename.."_tmp.xml", "w")) fw:write(t) fw:close() return true end function ekdosis.closeteistream(opt) local f = io.open(teifilename.."_tmp.xml", "a+") f:write("\n", "", "\n") if xmlbibresource ~= nil then bibf = assert(io.open(xmlbibresource, "r")) t = bibf:read("*a") t = string.gsub(t, "%s+corresp%=%b\"\"", "") t = string.gsub(t, "\n\n", "\n") f:write("", "\n") f:write("", "\n") for i in string.gmatch(t, ".-") do f:write(i, "\n") end f:write("", "\n") f:write("", "\n") bibf:close() else end f:write("", "\n") f:write("
", "\n") f:close() cleanup_tei() os.remove(teifilename..".xml") os.rename(teifilename.."_tmp.xml", teifilename..".xml") if opt == "tidy" then os.execute("tidy -qmi -xml --output-xml yes "..teifilename..".xml") else end return true end function ekdosis.exporttei(str) local f = io.open(teifilename.."_tmp.xml", "a+") -- f:write("\n

") str = textotei(str) f:write(str) f:close() return true end -- end totei functions -- begin basic TeX Conspectus siglorum function ekdosis.basic_cs(msid) local indexwit = getindex(msid, listWit) siglum = listWit[indexwit].abbr -- if listWit[indexwit].detailsDesc == "" -- then -- name = listWit[indexwit].msIdentifier.msName -- else -- name = listWit[indexwit].msIdentifier.msName -- .."\\thinspace\\newline\\bgroup\\footnotesize{}".. -- listWit[indexwit].detailsDesc -- .."\\egroup{}" -- end name = listWit[indexwit].detailsDesc if listWit[indexwit].history ~= nil and listWit[indexwit].history.origin ~= nil then date = listWit[indexwit].history.origin.origDate else date = "" end return siglum.."&"..name.."&"..date end -- end basic TeX Conspectus siglorum function ekdosis.removesp(str) str = gsub(str, cmd * cmdargs * spcenc^-1, "%1%2") return str end function ekdosis.closestream() os.remove(tex.jobname..".ekd") os.rename(tex.jobname.."_tmp.ekd", tex.jobname..".ekd") return true end local cur_abs_pg = 0 local pg_i = nil local pg_ii = nil local prevcol = nil local curcol = "x" local check_resetlineno = {} function ekdosis.update_abspg(n) -- not used cur_abs_pg = n return true end function ekdosis.storeabspg(n, pg) if pg == "pg_i" then pg_i = n elseif pg == "pg_ii" then pg_ii = n table.insert(check_resetlineno, curcol.."-"..pg_ii) end cur_abs_pg = n return true end function ekdosis.checkresetlineno() if isfound(check_resetlineno, curcol.."-"..pg_i) then return "" else return "\\resetlinenumber" end end -- -- Build environments to be aligned -- local cur_alignment = "-" local cur_alignment_patt = "%-" local cur_alignment_cnt = 1 local newalignment = false function ekdosis.newalignment(str) if str == "set" then newalignment = true cur_alignment = "-"..cur_alignment_cnt.."-" cur_alignment_patt = "%-"..cur_alignment_cnt.."%-" cur_alignment_cnt = cur_alignment_cnt + 1 elseif str == "reset" then newalignment = false cur_alignment = "-" cur_alignment_patt = "%-" end return true end local aligned_texts = {} local texts_w_apparatus = {} local coldata_totei = {} local function sanitize_envdata(str) -- look for a better way to achieve this str = string.gsub(str, "(%a+)%s+(%b[])", "%1%2") str = string.gsub(str, "(%a+)(%b[])%s+", "%1%2") str = string.gsub(str, "%s+(%a+)(%b[])", "%1%2") str = gsub(str, lpeg.Cs(letters^1) * spcenc^-1 * -bsqbrackets * lpeg.Cs(";"), "%1[]%2") str = string.gsub(str, "%s+(%a+)(%b[])", "%1%2") return str end function ekdosis.mkenvdata(str, opt) if not string.find(str, "%;", -1) then str = str .. ";" else end -- str = str ..";" -- str = string.gsub(str, "%s+", "") local fieldstart = 1 local col = 0 if opt == "texts" then str = sanitize_envdata(str) repeat local _s, nexti = string.find(str, "%b[]%s-%;", fieldstart) local namediv = string.gsub(string.sub(str, fieldstart, nexti-1), "(%a+)%s-(%b[])", "%1") local attr = string.gsub(string.sub(str, fieldstart, nexti-1), "(%a+)%s-(%b[])", "%2") attr = string.sub(attr, 2, -2) if forbid_xmlid then attr = string.gsub(attr, "xml:id", "n") -- xml:id is not allowed here else end table.insert(aligned_texts, { text = namediv, attribute = attr, column = col }) table.insert(coldata_totei, { environment = namediv, data = {} }) col = col + 1 fieldstart = nexti + 1 until fieldstart > string.len(str) return aligned_texts elseif opt == "apparatus" then repeat local nexti = string.find(str, "%;", fieldstart) table.insert(texts_w_apparatus, string.sub(str, fieldstart, nexti-1)) fieldstart = nexti +1 until fieldstart > string.len(str) return texts_w_apparatus end end -- Reminder: the following two variables are already set above -- local prevcol = nil -- local curcol = "x" function ekdosis.storecurcol(n) curcol = n return true end function ekdosis.flushcolnums() prevcol = nil curcol = "x" return true end function ekdosis.flushenvdata() aligned_texts = {} texts_w_apparatus = {} coldata_totei = {} return true end function ekdosis.storecoldata(nthcol, chunk) local tindex = tonumber(nthcol) + 1 table.insert(coldata_totei[tindex].data, chunk) return true end local environment_div = {} local function build_envdiv(str) if not environment_div[str] then environment_div[str] = 1 else environment_div[str] = environment_div[str] + 1 end local div = "div-"..str.."_"..environment_div[str] if xmlidfound(div) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..div.. "\" already exists as an xml:id. " .. "ekdosis has generated some random id.}}") return "div-"..math.random(1000,9999) elseif not checkxmlid(div) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..div.. "\" is not a valid xml:id. \\MessageBreak " .. "Please pick another id.}}") else table.insert(xmlids, {xmlid = div}) table.sort(xmlids, function(a ,b) return(#a.xmlid > #b.xmlid) end) return div end end function ekdosis.mkenv() local environments = {} for i = 1,#aligned_texts do if isfound(texts_w_apparatus, aligned_texts[i].text) then table.insert(environments, "\\NewDocumentEnvironment{".. aligned_texts[i].text.."}{+b}" .."{\\begin{nthcolumn}{".. aligned_texts[i].column.."}" .."\\par" .."\\EkdosisColStart" .."\\EkdosisOn#1" .."}{\\EkdosisOff" .."\\EkdosisColStop" .."\\end{nthcolumn}" .."\\csname iftei@export\\endcsname\\luadirect{ekdosis.storecoldata(" .. aligned_texts[i].column ..", \\luastringN{\\par#1\\par})}\\fi" .."}") table.insert(environments, "\\NewDocumentEnvironment{".. aligned_texts[i].text.."*}{+b}" .."{\\begin{nthcolumn*}{".. aligned_texts[i].column.."}[]" .."\\par" .."\\EkdosisColStart" .."\\EkdosisOn#1" .."}{\\EkdosisOff" .."\\EkdosisColStop" .."\\end{nthcolumn*}" .."\\csname iftei@export\\endcsname\\luadirect{ekdosis.storecoldata(" .. aligned_texts[i].column ..", \\luastringN{\\par#1\\par})}\\fi" .."}") else table.insert(environments, "\\NewDocumentEnvironment{".. aligned_texts[i].text.."}{+b}" .."{\\begin{nthcolumn}{".. aligned_texts[i].column.."}" .."\\par" .."#1" .."}{\\end{nthcolumn}" .."\\csname iftei@export\\endcsname\\luadirect{ekdosis.storecoldata(" .. aligned_texts[i].column ..", \\luastringN{\\par#1\\par})}\\fi" .."}") table.insert(environments, "\\NewDocumentEnvironment{".. aligned_texts[i].text.."*}{+b}" .."{\\begin{nthcolumn*}{"..aligned_texts[i].column.."}[]" .."\\par" .."#1" .."}{" .."\\end{nthcolumn*}" .."\\csname iftei@export\\endcsname\\luadirect{ekdosis.storecoldata(" .. aligned_texts[i].column ..", \\luastringN{\\par#1\\par})}\\fi" .."}") end forbid_xmlid = false if aligned_texts[i].attribute ~= "" then ekdosis.newenvtotag(aligned_texts[i].text, "div", "xml:id=\"" ..build_envdiv(aligned_texts[i].text) .."\" " ..aligned_texts[i].attribute) else ekdosis.newenvtotag(aligned_texts[i].text, "div", "xml:id=\"" ..build_envdiv(aligned_texts[i].text) .."\"") end forbid_xmlid = true end str = table.concat(environments) return str end function ekdosis.export_coldata_totei() for i = 1,#coldata_totei do ekdosis.exporttei("\\begin{".. coldata_totei[i].environment .."}" .. table.concat(coldata_totei[i].data) .. "\\end{".. coldata_totei[i].environment .."}") end end -- handle multiple layers in apparatuses -- local apparatuses = {} local bagunits = {} function ekdosis.newapparatus(teitype, appdir, apprule, appdelim, appsep, appbhook, appehook, applimit) if isintable(apparatuses, teitype) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" ..teitype.. "\" already exists.}}") else table.insert(apparatuses, {a = teitype, direction = appdir, rule = apprule, delim = appdelim, sep = appsep, bhook = appbhook, ehook = appehook, limit = applimit}) end bagunits[teitype] = 1 return true end function ekdosis.getappdelim(str) for i = 1,#apparatuses do if apparatuses[i].a == str then delimfound = apparatuses[i].delim break end end return delimfound end function ekdosis.get_bagunits(teitype) return bagunits[teitype] end local function getapplimit(str) for i = 1,#apparatuses do if apparatuses[i].a == str then limitfound = apparatuses[i].limit break end end if tonumber(limitfound) ~= nil then if tonumber(limitfound) < 10 then return 0 else return limitfound end else return 0 end end function ekdosis.limit_bagunits(teitype) local limit = tonumber(getapplimit(teitype)) if limit >= 10 and bagunits[teitype] > limit then bagunits[teitype] = 2 return "\\pagebreak" else return "" end end function ekdosis.addto_bagunits(teitype, n) n = tonumber(n) bagunits[teitype] = bagunits[teitype] - n end function ekdosis.increment_bagunits(teitype) bagunits[teitype] = (bagunits[teitype] or 0) + 1 end local function reset_bagunits() for i = 1,#apparatuses do bagunits[apparatuses[i].a] = 1 end end function ekdosis.appin(str, teitype) local f = io.open(tex.jobname.."_tmp.ekd", "a+") if next(apparatuses) == nil then f:write("<", cur_abs_pg, cur_alignment, curcol, "-0>", str, "\n") else for i = 1,#apparatuses do if apparatuses[i].a == teitype then appno = i break end end f:write("<", cur_abs_pg, cur_alignment, curcol, "-", appno, ">", str, "\n") end f:close() return true end function ekdosis.appout() local file = io.open(tex.jobname..".ekd", "r") if file ~= nil then io.close(file) f = assert(io.open(tex.jobname..".ekd", "r")) t = f:read("*a") local output = {} if next(apparatuses) == nil then -- table.insert(output, "BEGIN") table.insert(output, "\\noindent\\csname ekd@default@rule\\endcsname\\NLS") table.insert(output, "\\csname ekd@begin@apparatus\\endcsname\\ignorespaces") -- table.insert(output, "\\noindent ") for i in string.gmatch(t, "<"..cur_abs_pg ..cur_alignment_patt ..curcol.."%-0>.-") do table.insert(output, i) end -- table.insert(output, "END") else local n = 1 while apparatuses[n] do if string.match(t, "<"..cur_abs_pg ..cur_alignment_patt ..curcol.."%-"..n..">.-") then -- table.insert(output, "BEGIN") table.insert(output, "\\bgroup{}") if apparatuses[n].direction == "LR" then table.insert(output, "\\pardir TLT\\textdir TLT{}") elseif apparatuses[n].direction == "RL" then table.insert(output, "\\pardir TRT\\textdir TRT{}") end if apparatuses[n].rule == "none" then if n > 1 then table.insert(output, "\\NLS{}") else table.insert(output, "\\noindent ") end elseif apparatuses[n].rule ~= "" then if n > 1 then table.insert(output, "\\NLS{}" .. apparatuses[n].rule .. "\\NLS{}") else -- table.insert(output, "\\noindent ") table.insert(output, apparatuses[n].rule .. "\\NLS{}") end else if n > 1 then table.insert(output, "\\NLS\\csname ekd@default@rule\\endcsname\\NLS{}") else -- table.insert(output, "\\noindent ") table.insert(output, "\\csname ekd@default@rule\\endcsname\\NLS{}") end end if apparatuses[n].sep ~= "" then table.insert(output, "\\edef\\ekdsep{" .. apparatuses[n].sep .. "}") else end if apparatuses[n].bhook ~= "" then table.insert(output, apparatuses[n].bhook) else table.insert(output, "\\relax") end for i in string.gmatch(t, "<"..cur_abs_pg ..cur_alignment_patt ..curcol.."%-"..n..">.-") do table.insert(output, i) end if apparatuses[n].ehook ~= "" then table.insert(output, apparatuses[n].ehook) else end table.insert(output, "\\egroup{}") -- table.insert(output, "END") end n = n + 1 end end f:close() str = table.concat(output) str = string.gsub(str, "", "") str = string.gsub(str, "<"..cur_abs_pg..cur_alignment_patt..curcol.."%-[0-9]>", " ") return str else end end function ekdosis.appin_out(str, nl) local f = io.open(tex.jobname.."_tmp.ekd", "a+") if nl == "yes" then f:write(str, "\n") else f:write(str) end f:close() return true end local curcol_curabspg = {} function ekdosis.testapparatus() if isfound(curcol_curabspg, curcol.."-"..cur_abs_pg) then if newalignment then if next(apparatuses) ~= nil then reset_bagunits() end newalignment = false return "\\booltrue{do@app}" else return "\\boolfalse{do@app}" end else table.insert(curcol_curabspg, curcol.."-"..cur_abs_pg) if next(apparatuses) ~= nil then reset_bagunits() end newalignment = false return "\\booltrue{do@app}" end end local function get_ln_prefix(x, y) for index = 1, string.len(x) do if string.sub(x, index, index) ~= string.sub(y, index, index) then return string.sub(x, 1, index - 1) end end end function ekdosis.numrange(x, y) xstr = tostring(x) ystr = tostring(y) if x == y -- which will never apply then return "\\LRnum{" .. xstr .. "}" elseif string.len(xstr) ~= string.len(ystr) then return "\\LRnum{" .. xstr .. "}--\\LRnum{" .. ystr .. "}" else common = get_ln_prefix(xstr, ystr) if string.len(common) == 0 then return "\\LRnum{" .. xstr .. "}--\\LRnum{" .. ystr .. "}" elseif string.sub(xstr, -2, -2) == "1" then return "\\LRnum{" .. string.sub(common, 1, -2) .. string.sub(xstr, string.len(common), -1) .. "}--\\LRnum{" .. string.sub(ystr, string.len(common), -1) .. "}" else return "\\LRnum{" .. string.sub(common, 1, -1) .. string.sub(xstr, string.len(common) + 1, -1) .. "}--\\LRnum{" .. string.sub(ystr, string.len(common) + 1, -1) .. "}" end end end local lnlabs = {} local lnlab_salt = 0 local current_lnlab = nil local prev_lnlab = nil local current_notelab = nil local prev_notelab = nil local current_lemma = nil local salt = 0 local function mdvisintable(table, value) for _, v in pairs(table) do if v == value then return true end end return false end function ekdosis.dolnlab(str) prev_lnlab = current_lnlab current_lemma = str i = md5.sumhexa(str) if not mdvisintable(lnlabs, i) then table.insert(lnlabs, i) else i = i..salt table.insert(lnlabs, i) salt = salt + 1 end current_lnlab = i return true end function ekdosis.getlnlab() return current_lnlab end function ekdosis.getprevlnlab() return prev_lnlab end function ekdosis.setnotelab(str) current_notelab = str return "\\linelabel{" .. current_notelab .. "}" end function ekdosis.getnotelab() return current_notelab end function ekdosis.setprevnotelab(str) prev_notelab = str return true end function ekdosis.getprevnotelab() return prev_notelab end local function remove_note(str) str = gsub(str, dblbkslash * lpeg.P("note") * cmdargs, "") return str end function ekdosis.mdvappend(str, teitype) if teitype == nil then return "\\linelabel{" .. current_lnlab .. "-b}\\wordboundary{}" .. current_lemma .. "\\linelabel{" .. current_lnlab .. "-e}" .. "\\csname append@app\\endcsname{" .. remove_note(str) .. "}" else return "\\linelabel{" .. current_lnlab .. "-b}\\wordboundary{}" .. current_lemma .. "\\linelabel{" .. current_lnlab .. "-e}" .. "\\csname append@app\\endcsname" .. "[" .. teitype .. "]{" .. remove_note(str) .. "}" end end % \end{ekdlua} % \end{comment} % \iffalse % % \fi % \endinput