summaryrefslogtreecommitdiff
path: root/macros
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-08-19 03:01:47 +0000
committerNorbert Preining <norbert@preining.info>2021-08-19 03:01:47 +0000
commit0c52816f121429fd9e4277d4dc8895f92c2bdb52 (patch)
tree7238f37f09631486a5d27dbcf730950f6a146991 /macros
parentae34f484404571c09a61f3bde45d083a51cb0ac5 (diff)
CTAN sync 202108190301
Diffstat (limited to 'macros')
-rw-r--r--macros/latex/contrib/bytefield/README2
-rw-r--r--macros/latex/contrib/bytefield/bytefield.dtx57
-rw-r--r--macros/latex/contrib/bytefield/bytefield.ins4
-rw-r--r--macros/latex/contrib/bytefield/bytefield.pdfbin583061 -> 630473 bytes
-rw-r--r--macros/latex/contrib/keyparse/README.md6
-rw-r--r--macros/latex/contrib/keyparse/keyparse.dtx486
-rw-r--r--macros/latex/contrib/keyparse/keyparse.ins64
-rw-r--r--macros/latex/contrib/keyparse/keyparse.pdfbin0 -> 575187 bytes
-rw-r--r--macros/latex/contrib/lambdax/README.md6
-rw-r--r--macros/latex/contrib/lambdax/lambdax.dtx416
-rw-r--r--macros/latex/contrib/lambdax/lambdax.ins64
-rw-r--r--macros/latex/contrib/verifiche/verifiche-example.pdfbin175413 -> 182373 bytes
-rw-r--r--macros/latex/contrib/verifiche/verifiche.dtx50
-rw-r--r--macros/latex/contrib/verifiche/verifiche.pdfbin518387 -> 519980 bytes
-rw-r--r--macros/luatex/latex/ekdosis/Makefile16
-rw-r--r--macros/luatex/latex/ekdosis/README.md2
-rw-r--r--macros/luatex/latex/ekdosis/ekdosis.dtx1468
-rw-r--r--macros/luatex/latex/ekdosis/ekdosis.el261
-rw-r--r--macros/luatex/latex/ekdosis/ekdosis.pdfbin830931 -> 930575 bytes
-rw-r--r--macros/luatex/latex/ekdosis/samples/Caesar_BG-6-13-1.pdfbin17995 -> 18006 bytes
-rw-r--r--macros/luatex/latex/ekdosis/samples/Caesar_BG-6-13-1.tex4
21 files changed, 2629 insertions, 277 deletions
diff --git a/macros/latex/contrib/bytefield/README b/macros/latex/contrib/bytefield/README
index b76f221d76..5f8e64c3d2 100644
--- a/macros/latex/contrib/bytefield/README
+++ b/macros/latex/contrib/bytefield/README
@@ -33,7 +33,7 @@ supports hyperref hyperlinks.
Copyright and license
---------------------
-Copyright (C) 2000-2020 Scott Pakin, scott+bf@pakin.org
+Copyright (C) 2000-2021 Scott Pakin, scott+bf@pakin.org
This package may be distributed and/or modified under the conditions
of the LaTeX Project Public License, either version 1.3a of this
diff --git a/macros/latex/contrib/bytefield/bytefield.dtx b/macros/latex/contrib/bytefield/bytefield.dtx
index 8af3e52bbf..24ee535fda 100644
--- a/macros/latex/contrib/bytefield/bytefield.dtx
+++ b/macros/latex/contrib/bytefield/bytefield.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2000-2020 by Scott Pakin <scott+bf@pakin.org>
+% Copyright (C) 2000-2021 by Scott Pakin <scott+bf@pakin.org>
% -----------------------------------------------------------
%
% This file may be distributed and/or modified under the
@@ -22,7 +22,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{bytefield}
%<*package>
- [2020/10/31 v2.6 Network protocol diagrams]
+ [2021/08/17 v2.7 Network protocol diagrams]
%</package>
%
%<*driver>
@@ -46,7 +46,7 @@
pdfauthor={Scott Pakin},
pdfsubject={Protocol diagrams for LaTeX},
pdfkeywords={bits, bytes, bit fields, communication, network protocol diagrams, LaTeX2e, memory maps},
- pdfcopyright={Copyright (C) 2000-2020, Scott Pakin},
+ pdfcopyright={Copyright (C) 2000-2021, Scott Pakin},
pdflicenseurl={http://www.latex-project.org/lppl/},
pdfcaptionwriter={Scott Pakin},
pdfcontactemail={scott+bf@pakin.org},
@@ -68,7 +68,7 @@
%</driver>
% \fi
%
-% \CheckSum{1194}
+% \CheckSum{1182}
%
% \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
@@ -423,10 +423,7 @@
%
% The first, optional, argument, \meta{sides}, is a list of letters
% specifying which sides of the field box to draw---[|l|]eft, [|r|]ight,
-% [|t|]op, and/or [|b|]ottom.\footnote{Uppercase |L|, |R|, |T|, and |B|
-% undo a prior |l|, |r|, |t|, or |b| and may be useful for writing
-% wrapper commands around \texttt{\string\bitbox} and
-% \texttt{\string\wordbox}.} The default is ``|lrtb|'' (i.e.,~all
+% [|t|]op, and/or [|b|]ottom. The default is ``|lrtb|'' (i.e.,~all
% sides are drawn). The second, required, argument is the width in bits
% of a bit box or the height in words of a word box. The third argument
% is an optional, comma-separated list of \meta{key}=\meta{value} pairs,
@@ -2342,9 +2339,7 @@
% Put some text~(|#4|) in a box that's a given number of bits~(|#2|)
% wide and one byte tall. An optional argument~(|#1|) specifies which
% lines to draw---|[l]|eft, |[r]|ight, |[t]|op, and/or |[b]|ottom
-% (default: |lrtb|). Uppercase letters provide the opposite effect:
-% They suppress drawing the |[L]|eft, |[R]|ight, |[T]|op, and/or
-% |[B]|ottom sides. Additional drawing parameters can be provided via
+% (default: |lrtb|). Additional drawing parameters can be provided via
% another optional argument~(|#3|).
% \begin{macrocode}
\DeclareRobustCommand{\bitbox}{\bf@call@box@cmd{\bf@bitbox}}
@@ -2389,9 +2384,7 @@
% Put some text~(|#4|) in a box that's a given number of bytes~(|#2|)
% tall and one word (|\bits@wide| bits) wide. An optional
% argument~(|#1|) specifies which lines to draw---|[l]|eft, |[r]|ight,
-% |[t]|op, and/or |[b]|ottom (default: |lrtb|). Uppercase letters
-% provide the opposite effect: They suppress drawing the |[L]|eft,
-% |[R]|ight, |[T]|op, and/or |[B]|ottom sides. Additional drawing
+% |[t]|op, and/or |[b]|ottom (default: |lrtb|). Additional drawing
% parameters can be provided via another optional argument~(|#3|).
% \begin{macrocode}
\DeclareRobustCommand{\wordbox}{\bf@call@box@cmd{\bf@wordbox}}
@@ -2565,9 +2558,8 @@
% Put each token in |#3| into a box that's a given number of bits (|#2|)
% wide and one byte tall. An optional argument (|#1|) specifies which
% lines to draw---|[l]|eft, |[r]|ight, |[t]|op, and/or |[b]|ottom
-% (default: |lrtb|). Uppercase letters suppress drawing the |[L]|eft,
-% |[R]|ight, |[T]|op, and/or |[B]|ottom sides. The |*|-form of the
-% command omits interior left and right lines.
+% (default: |lrtb|). The |*|-form of the command omits interior left
+% and right lines.
% \begin{macrocode}
\DeclareRobustCommand{\bitboxes}{%
\@ifstar
@@ -2700,11 +2692,14 @@
% \subsubsection{Parsing arguments}
%
% The macros in this section are used to parse the optional argument to
-% |\bitbox| or |\wordbox|, which is some subset of $\{ |l|, |r|, |t|,
-% |b|, |L|, |R|, |T|, |B| \}$. Lowercase letters display the left,
-% right, top, or bottom side of a box; uppercase letters inhibit the
-% display. The default is not to display any sides, but an uppercase
-% letter can negate the effect of a prior lowercase letter.
+% \cs{bitbox}, \cs{wordbox}, and \cs{bitboxes}, which is some subset of
+% $\{ |l|, |r|, |t|, |b|, |L|, |R|, |T|, |B| \}$ and defaults to
+% ``|lrtb|'' for all three user macros. If the argument is empty, no
+% lines are drawn. Lowercase letters in the argument display,
+% respectively, the left, right, top, or bottom side of a box.
+% Uppercase letters undo the effect of the corresponding, prior,
+% lowercase letter and are used internally by \cs{bitboxes} to suppress
+% internal left and right lines.
%
% \begin{macro}{\ifbitbox@top}
% \begin{macro}{\ifbitbox@bottom}
@@ -3064,6 +3059,8 @@
% \end{macro}
%
% \begin{macro}{\store@rcurly}
+% \changes{v2.7}{2021/08/17}{Properly align right curly braces under
+% Lua\string\LaTeX\ (bug reported by Georgi Nikiforov)}
% \begin{macro}{\curly@height}
% \begin{macro}{\half@curly@height}
% \begin{macro}{\curly@shift}
@@ -3083,16 +3080,15 @@
\bf@newdimen\curly@shift
\setlength{\curly@shift}{\bf@rightcurlyshrinkage}%
\setlength{\curly@shift}{\half@curly@height + 0.5\curly@shift}%
+ \addtolength{\curly@shift}{-\fontdimen22\textfont2}%
\global\sbox{#1}{\raisebox{\curly@shift}{%
- $\xdef\old@axis{\the\fontdimen22\textfont2}$%
\bf@rightcurlystyle{%
- $\fontdimen22\textfont2=0pt%
- \left.
+ $\left.
\vrule height\half@curly@height
width 0pt
depth\half@curly@height\right\bf@rightcurly$%
}%
- $\fontdimen22\textfont2=\old@axis$}}%
+ }}%
\endgroup
}
% \end{macrocode}
@@ -3103,6 +3099,8 @@
% \end{macro}
%
% \begin{macro}{\store@lcurly}
+% \changes{v2.7}{2021/08/17}{Properly align left curly braces under
+% Lua\string\LaTeX\ (bug reported by Georgi Nikiforov)}
% \begin{macro}{\curly@height}
% \begin{macro}{\half@curly@height}
% \begin{macro}{\curly@shift}
@@ -3118,16 +3116,15 @@
\bf@newdimen\curly@shift
\setlength{\curly@shift}{\bf@leftcurlyshrinkage}%
\setlength{\curly@shift}{\half@curly@height + 0.5\curly@shift}%
+ \addtolength{\curly@shift}{-\fontdimen22\textfont2}%
\global\sbox{#1}{\raisebox{\curly@shift}{%
- $\xdef\old@axis{\the\fontdimen22\textfont2}$%
\bf@leftcurlystyle{%
- $\fontdimen22\textfont2=0pt%
- \left\bf@leftcurly
+ $\left\bf@leftcurly
\vrule height\half@curly@height
width 0pt
depth\half@curly@height\right.$%
}%
- $\fontdimen22\textfont2=\old@axis$}}%
+ }}%
\endgroup
}
% \end{macrocode}
diff --git a/macros/latex/contrib/bytefield/bytefield.ins b/macros/latex/contrib/bytefield/bytefield.ins
index d00c642405..fcbcf0584c 100644
--- a/macros/latex/contrib/bytefield/bytefield.ins
+++ b/macros/latex/contrib/bytefield/bytefield.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (C) 2000-2020 by Scott Pakin <scott+bf@pakin.org>
+%% Copyright (C) 2000-2021 by Scott Pakin <scott+bf@pakin.org>
%%
%% This file may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License, either version 1.3a of this license
@@ -21,7 +21,7 @@
This is a generated file.
-Copyright (C) 2000-2020 by Scott Pakin <scott+bf@pakin.org>
+Copyright (C) 2000-2021 by Scott Pakin <scott+bf@pakin.org>
This file may be distributed and/or modified under the conditions of
the LaTeX Project Public License, either version 1.3a of this license
diff --git a/macros/latex/contrib/bytefield/bytefield.pdf b/macros/latex/contrib/bytefield/bytefield.pdf
index 46b2b36d09..655403099f 100644
--- a/macros/latex/contrib/bytefield/bytefield.pdf
+++ b/macros/latex/contrib/bytefield/bytefield.pdf
Binary files differ
diff --git a/macros/latex/contrib/keyparse/README.md b/macros/latex/contrib/keyparse/README.md
new file mode 100644
index 0000000000..a8179a4c80
--- /dev/null
+++ b/macros/latex/contrib/keyparse/README.md
@@ -0,0 +1,6 @@
+-----------------------------------------------------------------
+##### keyparse --- key-based parser
+- Source repository: https://github.com/rogard/keyparse
+- Released under the LaTeX Project Public License v1.3c or later
+- See http://www.latex-project.org/lppl.txt
+-----------------------------------------------------------------
diff --git a/macros/latex/contrib/keyparse/keyparse.dtx b/macros/latex/contrib/keyparse/keyparse.dtx
new file mode 100644
index 0000000000..8017d273a5
--- /dev/null
+++ b/macros/latex/contrib/keyparse/keyparse.dtx
@@ -0,0 +1,486 @@
+% \iffalse meta-comment
+% !TEX program = pdfLaTeX
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+-----------------------------------------------------------------
+##### keyparse --- key-based parser
+- Source repository: https://github.com/rogard/keyparse
+- Released under the LaTeX Project Public License v1.3c or later
+- See http://www.latex-project.org/lppl.txt
+-----------------------------------------------------------------
+%</readme>
+%<*internal>
+\fi
+\def\nameofplainTeX{plain}
+\ifx\fmtname\nameofplainTeX\else
+\expandafter\begingroup
+\fi
+%</internal>
+%<*install>
+\input l3docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\preamble
+-----------------------------------------------------------------------------
+keyparse --- key-based parser
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------------------
+
+\endpreamble
+\postamble
+
+Copyright (C) 2021 by Erwann Rogard
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License (LPPL), either
+version 1.3c of this license or (at your option) any later
+version. The latest version of this license is in the file:
+
+http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+Erwann Rogard.
+
+This work consists of the file keyparse.dtx and the derived files:
+keyparse.sty, and keyparse.pdf.
+
+\endpostamble
+\generate{
+ \file{\jobname.sty}{\from{\jobname.dtx}{package}}
+}
+%</install>
+%<install> \endbatchfile
+%<*internal>
+\generate{
+ \file{\jobname.ins}{\from{\jobname.dtx}{install}}
+}
+\nopreamble\nopostamble
+\generate{
+ \file{README.md}{\from{\jobname.dtx}{readme}}
+}
+\ifx\fmtname\nameofplainTeX
+\expandafter\endbatchfile
+\else
+\expandafter\endgroup
+\fi
+%</internal>
+%<package> \NeedsTeXFormat{LaTeX2e}[2021-06-01]
+%<package> \RequirePackage{expl3, xparse, l3keys2e}[2021-06-01]
+%<package> \ProvidesExplPackage
+%<package> {keyparse} % Package name
+%<package> {2021-08-18} % Release date
+%<package> {1.1} % Release version
+%<package> {keyparse --- key-based parser } % Description
+%<*driver>
+\documentclass[show-notes]{l3doc}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+%^^A\documentclass[full, show-notes]{l3doc}
+%^^A \listfiles
+\usepackage{amsmath, bookmark, enumitem, mathtools, microtype, tcolorbox, xparse}
+\usepackage[french, german, english]{babel}
+\usepackage[T1]{fontenc}
+\usepackage[bibencoding=auto, backend=biber, sorting=ynt]{biblatex}
+\begin{filecontents*}{\jobname.bib}
+@manual{interface3,
+ title = {The \LaTeX3 interfaces},
+ author = {The \LaTeX3 Project Team},
+ year = {2019},
+ note = {\url{https://ctan.math.washington.edu/tex-archive/macros/latex/contrib/l3kernel/expl3.pdf}},
+ annote = {} }
+@manual{xparse,
+ title = {The \pkg{xparse} package},
+ author = {The \LaTeX3 Project Team},
+ year = {2019},
+ note = {\url{https://ctan.math.illinois.edu/macros/latex/contrib/l3packages/xparse.pdf}},
+ annote = {} }
+@misc{a-188053,
+ author = {@{}sean-allred},
+ title = {``How to create lambda expressions?''},
+ year = {2014},
+ note = {\url{https://tex.stackexchange.com/a/188053/112708}}}
+\end{filecontents*}
+\addbibresource{\jobname.bib}
+\ExplSyntaxOn
+%^^A *** Sectioning
+\tl_gset:Nn \partname {Part}%^^A allows to test w/o babel
+\makeatletter
+\newcommand*{\docsetnameref}
+{\def\@currentlabelname}%https://tex.stackexchange.com/questions/537751
+\makeatother
+\newcounter{cscounter}
+\ProvideDocumentCommand
+\DocPhantomSection{sO{subsection}D<>{}mo}
+{\leavevmode
+ \refstepcounter{cscounter}
+ \IfBooleanF{#1}{\addcontentsline{toc}{#2}{#4}}
+ \IfValueT{#5}
+ {\docsetnameref{#3#4}\label{#5}}}
+% ^^A *** Msg
+\msg_new:nnn{__keyparse_doc}{unknown}{~#1:#2~unknown}
+% ^^A *** Expressions
+\ProvideDocumentCommand{\pkgpattpair}{mm}{\texttt{>\{#1\}\{#2\}}}
+\ProvideDocumentCommand{\pkgrule}{}{\texttt{$\rightarrow$}}
+% ^^A *** L3 package
+\ProvideDocumentCommand{\docplaceh}{mO{1}}{\texttt{\prg_replicate:nn{#2}{\#}#1}}
+% ^^A *** Lists
+\newlist{arab-inl}{enumerate*}{1}
+\setlist[arab-inl]{label=\arabic*)}
+\newlist{colon-inl}{itemize*}{1}
+\setlist[colon-inl]
+{ %^^Abefore=\noindent,
+ label={},
+ itemjoin={{; }},
+ after={{.}}}
+\newlist{descr}{description}{1}
+\setlist[descr]{nosep, align=right, itemindent=0pt, font=\sffamily\tiny}
+\ExplSyntaxOff
+%^^A *** listing
+\tcbuselibrary{listings, breakable}
+\newtcblisting[auto counter]
+{listing}[2][]{
+ noparskip,
+ breakable,
+ colback=white,
+ colframe=black,
+ opacitybacktitle=.8,%
+ fonttitle=\bfseries,
+ title={Listing~\thetcbcounter. #1},
+ arc=0pt,
+ outer arc=0pt,
+ boxrule=1pt,
+ listing and text,
+ #2}
+\newtcblisting
+{internal}
+{text only,
+ breakable,
+ colback=white,
+ fontupper=\sffamily,
+ arc=1pt,
+ outer arc=1pt,
+ boxrule=0pt,
+ halign=left,
+ fontupper=\small\sffamily,
+ left=0pt,
+ top=0pt,
+ bottom=0pt}
+\usepackage{keyparse}
+\usepackage{hyperref} %^^A comes last
+\begin{document}
+\DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{\jobname.sty}
+% \title{The \pkg{keyparse} package\thanks{^^A
+% This file describes version \fileversion, last revised \filedate.^^A
+% }^^A
+% }
+% \author{Erwann Rogard\thanks{first.lastname at gmail.com}}
+%
+% \date{Released \filedate}
+% \begin{documentation}
+%
+% \maketitle
+%
+% \begin{abstract}
+% This \LaTeX package provides an interface to define and evaluate key-based replacement rules\cite{interface3}.
+% It can be used to parse the argument specification of a document command\cite{xparse}.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \part{Usage}\label{part:usage}
+%
+% \section{Document command}
+% \begin{function}{KeyparseKeys}
+% \begin{syntax}
+% \cs{KeyparseKeys}\Arg{rule}
+% \end{syntax}
+% \begin{descr}
+% \item[Expands~to] The keys associated with \meta{rule}
+% \end{descr}
+% \end{function}
+%
+% \begin{function}{KeyparseEval}
+% \begin{syntax}
+% \cs{KeyparseEval}
+% \end{syntax}
+% \begin{descr}
+% \item[Adapts] \nameref{cs:keyparse:eval}
+% \end{descr}
+% \end{function}
+%
+% \section{Programming}
+% \DocPhantomSection*{\cs{keyparse_set:nnnnn}}[cs:keyparse:rule]
+% \begin{function}{\keyparse_set:nnnnn}
+% \begin{syntax}
+% \cs{keyparse_set:nnnnn}\Arg{rule}\Arg{key}\Arg{signature}\Arg{replacement}\Arg{recurse}
+% \end{syntax}
+% \begin{descr}
+% \item[Requires]
+% \begin{colon-inl}
+% \item \meta{rule} is a token~list
+% \item \meta{key}\meta{signature} is a valid \enquote{weird} argument specifier\cite[Naming functions and variables]{interface3}
+% \item \meta{replacement} and \meta{recurse} are in terms of \meta{signature}
+% \end{colon-inl}
+% \item[Semantics] As shown under {\sffamily\tiny{}Expands~to} for \nameref{cs:keyparse:eval}
+% \item[Tip] Using |{|\meta{token}|}| as \meta{replacement}, one can iterate over the result of \nameref{cs:keyparse:eval} using \cs[no-index]{tl_map_function:nN}.
+% Using \meta{token}, instead, merges the \meta{tokens}'s.
+% \end{descr}
+% \end{function}
+%
+% \DocPhantomSection*{\cs{keyparse_eval:nn}}[cs:keyparse:eval]
+% \begin{function}[EXP]{\keyparse_eval:nn}
+% \begin{syntax}
+% \cs{keyparse_eval:nn}\Arg{rule}|{|\meta{key}\meta{args}|}|
+% \end{syntax}
+% \end{function}
+% \begin{descr}
+% \item[Requires] \meta{args} is compatible with \meta{signature} for that \meta{rule} and \meta{key}
+% \item[Expands~to] \meta{replacement}\nameref{cs:keyparse:eval}\Arg{rule}\Arg{recurse}
+% \end{descr}
+%
+% \subsection*{Other}
+% \begin{function}[EXP]{\keyparse_argspec_e:n}
+% \cs{keyparse_argspec_e:n}\Arg{token list}
+% \end{function}
+%
+% \section{Rule}
+% Hereafter are rules defined with \nameref{cs:keyparse:rule}.
+%
+% \DocPhantomSection{\textsf{argspec}}[keyparse:argspec]
+% \DescribeEnv{argspec}
+% \begin{descr}
+% \item[Keys] \KeyparseKeys{argspec}
+% \item[Requires] \meta{key_i}\meta{arg_i} is a valid document-command argument specifier\cite{xparse}
+% \item[Rule i] \meta{key_i}\meta{arg_i}\pkgrule|{|\meta{key_i}\meta{arg_i}|}|
+% \end{descr}
+%
+% \DocPhantomSection{\textsf{pair/first}}[keyparse:pair:first]
+% \DescribeEnv{pair/first}
+% \begin{descr}
+% \item[Keys] \KeyparseKeys{pair/first}
+% \item[Rule 1] \pkgpattpair{\meta{first}}{\meta{second}}\pkgrule\meta{first}
+% \end{descr}
+%
+% \DocPhantomSection{\textsf{pair/merge}}[keyparse:pair:merge]
+% \DescribeEnv{pair/merge}
+% \begin{descr}
+% \item[Keys] \KeyparseKeys{pair/merge}
+% \item[Rule 1] \pkgpattpair{\meta{first}}{\meta{second}}\pkgrule\meta{first}\meta{second}
+% \end{descr}
+%
+% \clearpage
+% \part{Listing}\label{part:listing}
+% \addcontentsline{toc}{subsection}
+% {\ref{listing:keyparse:plain}.
+% Making rules for \texttt{\&}, \texttt{>\{.\}}, and \texttt{+.+}}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}
+ [Making rules for \texttt{\&}, \texttt{>\{.\}}, and \texttt{+.+}]
+ {label=listing:keyparse:plain}
+ \ExplSyntaxOn
+ \group_begin:
+ \keyparse_set:nnnnn{foo}{&}{#1}{{&}}{#1}
+ \keyparse_set:nnnnn{foo}{>}{#1#2}{{#1}}{#2}
+ \keyparse_set:nnnnn{foo}{+}{#1+#2}{{#1}}{#2}
+ \exp_args:Nx
+ \tl_map_inline:nn
+ {\keyparse_eval:nn{foo}{&>{123}+xyz+}}
+ {\texttt{(\tl_to_str:n{#1})}}
+ \group_end:
+ \ExplSyntaxOff
+ \end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \addcontentsline{toc}{subsection}
+% {\ref{listing:keyparse:leslie}. Embedding `\LaTeX' in \enquote{Leslie Lamport built \dots}}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}
+ [Embedding `\LaTeX' in \enquote{Leslie Lamport built \dots}]
+ {label=listing:keyparse:leslie}
+ \begingroup
+ \KeyparseEval{pair/first}
+ {>{}{Leslie~}
+ >{La}{mport~built~LaTeX~on~top~of~Donald~Knuth's~}
+ >{TeX}{.}}
+ \endgroup
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \addcontentsline{toc}{subsection}
+% {\ref{listing:keyparse:argspec}. \nameref{keyparse:argspec}.}
+% \iffalse
+%<*guardlisting>
+% \fi
+ \begin{listing}
+ [\nameref{keyparse:argspec}]
+ {label=listing:keyparse:argspec}
+ \ExplSyntaxOn
+ \group_begin:
+ \tl_set:Nx\l_tmpa_tl
+ {\keyparse_eval:nn{argspec}{msotae{_^}r<]d[>}}
+ \exp_args:Nx
+ \tl_map_inline:Nn
+ \l_tmpa_tl
+ {\texttt{(\tl_to_str:n{#1})}}
+ \group_end:
+ \ExplSyntaxOff
+ \end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \section{Support}\label{other:support}
+%
+% This package is available from \url{https://github.com/rogard/keyparse}.
+%
+% \changes{Version 1.0}
+% {2020/08/03}
+% {Initial version}
+% \changes{Version 1.1}
+% {2020/08/18}
+% {Name change from lex to keyparse at request of ctan}
+%
+% \StopEventually{
+% \clearpage
+% \PrintChanges
+% ^^A \PrintIndex % https://tex.stackexchange.com/q/610349/112708
+% }
+%\end{documentation}
+% \begin{implementation}
+% \part{Implementation}\label{part:impl}
+% \begin{macrocode}
+%<*package>
+%<@@=keyparse>
+\ExplSyntaxOn
+% \end{macrocode}
+% \section{\textsf{keyparse}}
+% \subsection{Interface}
+% \begin{macro}[int]
+% {not-set}
+% \begin{macrocode}
+\msg_new:nnn
+{@@}
+{not-set}
+{recursion~for~rule~#1~is~not~set}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}
+% {\@@_keyparse_rule_w:n,
+% \@@_keyparse_rule:n,
+% \@@_keyparse_eval_aux:nn,
+% \@@_keyparse_eval_aux:ne}
+% \begin{arguments}
+% \item rule
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn
+\@@_keyparse_rule_w:n
+{\clist_clear_new:c{@@_keys_#1_clist}
+ \cs_new:cpn
+ {@@_keyparse_eval_#1:w} ##1 ##2 \q_recursion_stop
+ {\quark_if_recursion_tail_stop:n{##1}
+ \use:c{@@_keyparse_eval_#1_##1:w}##2\q_recursion_stop }}
+\cs_new_protected:Nn
+\@@_keyparse_rule:n{\@@_keyparse_rule_w:n{#1}}
+\cs_new:Nn
+\@@_keyparse_eval_aux:nn
+{\cs_if_exist:cTF
+ {@@_keyparse_eval_#1:w}
+ { \use:c{@@_keyparse_eval_#1:w}#2
+ \q_recursion_tail
+ \q_recursion_stop}
+ {\msg_error:nnn{@@}
+ {not-set}
+ {#1}}}
+\cs_generate_variant:Nn\@@_keyparse_eval_aux:nn{ne}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}
+% {\keyparse_eval:nn,
+% \keyparse_set:nnnnn}
+% \begin{macrocode}
+\cs_new:Nn
+\keyparse_eval:nn
+{\@@_keyparse_eval_aux:ne{#1}
+ {\tl_trim_spaces:n{#2}}}
+\cs_new_protected:Nn
+\keyparse_set:nnnnn
+{\cs_if_exist:cTF
+ {@@_keyparse_eval_#1:w}
+ {\clist_put_right:cn
+ {@@_keys_#1_clist}{\texttt{\tl_to_str:n{#2}}}
+ \cs_new:cpn
+ {@@_keyparse_eval_#1_#2:w}#3 \q_recursion_stop
+ {#4\use:c{@@_keyparse_eval_#1:w}#5 \q_recursion_stop}}
+ {\@@_keyparse_rule:n{#1}
+ \keyparse_set:nnnnn
+ {#1}{#2}{#3}{#4}{#5}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\KeyparseKeys, \KeyparseEval}
+% \begin{macrocode}
+\ProvideDocumentCommand
+{\KeyparseKeys}
+{m}
+{\clist_use:cnnn
+ {@@_keys_#1_clist}
+ {~and~}{,~}{~and~}}
+\NewDocumentCommand{\KeyparseEval}
+{mm}
+{\keyparse_eval:nn{#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+% \subsection{\textsf{argspec}}\label{impl:argspec}
+% \begin{macro}
+% {\keyparse_argspec_e:n}
+% \begin{macrocode}
+\cs_new:Nn\keyparse_argspec_e:n{{e{#1}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}[int]
+% {argspec}
+% Expandability forbids inline, hence \cs{keyparse_argspec_e:n} for key `e'
+% \begin{macrocode}
+\keyparse_set:nnnnn{argspec}{e}{#1#2}
+{ \tl_map_function:nN{#1}\keyparse_argspec_e:n}{#2}
+\keyparse_set:nnnnn{argspec}{d}{#1#2#3}{{d#1#2}}{#3}
+\keyparse_set:nnnnn{argspec}{m}{#1}{{m}}{#1}
+\keyparse_set:nnnnn{argspec}{o}{#1}{{o}}{#1}
+\keyparse_set:nnnnn{argspec}{r}{#1#2#3}{{r#1#2}}{#3}
+\keyparse_set:nnnnn{argspec}{s}{#1}{{s}}{#1}
+\keyparse_set:nnnnn{argspec}{t}{#1#2}{{t#1}}{#2}
+% \end{macrocode}
+% \end{macro}
+% \subsection{\textsf{pair}}\label{impl:pair}
+% \begin{macro}[int]
+% {pair/first,
+% pair/merge}
+% \begin{macrocode}
+\keyparse_set:nnnnn{pair/first}{>}{#1#2#3}{#1}{#3}
+\keyparse_set:nnnnn{pair/merge}{>}{#1#2#3}{#1#2}{#3}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\ExplSyntaxOff
+%</package>
+% \end{macrocode}
+% \end{implementation}
+% \Finale
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/keyparse/keyparse.ins b/macros/latex/contrib/keyparse/keyparse.ins
new file mode 100644
index 0000000000..ec855609b5
--- /dev/null
+++ b/macros/latex/contrib/keyparse/keyparse.ins
@@ -0,0 +1,64 @@
+%%
+%% This is file `keyparse.ins',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% keyparse.dtx (with options: `install')
+%% -----------------------------------------------------------------------------
+%% keyparse --- key-based parser
+%% Released under the LaTeX Project Public License v1.3c or later
+%% See http://www.latex-project.org/lppl.txt
+%% ----------------------------------------------------------------------------
+%%
+\input l3docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\preamble
+-----------------------------------------------------------------------------
+keyparse --- key-based parser
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------------------
+
+\endpreamble
+\postamble
+
+Copyright (C) 2021 by Erwann Rogard
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License (LPPL), either
+version 1.3c of this license or (at your option) any later
+version. The latest version of this license is in the file:
+
+http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+Erwann Rogard.
+
+This work consists of the file keyparse.dtx and the derived files:
+keyparse.sty, and keyparse.pdf.
+
+\endpostamble
+\generate{
+ \file{\jobname.sty}{\from{\jobname.dtx}{package}}
+}
+ \endbatchfile
+%%
+%% Copyright (C) 2021 by Erwann Rogard
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License (LPPL), either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in the file:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This work is "maintained" (as per LPPL maintenance status) by
+%% Erwann Rogard.
+%%
+%% This work consists of the file keyparse.dtx and the derived files:
+%% keyparse.sty, and keyparse.pdf.
+%%
+%%
+%% End of file `keyparse.ins'.
diff --git a/macros/latex/contrib/keyparse/keyparse.pdf b/macros/latex/contrib/keyparse/keyparse.pdf
new file mode 100644
index 0000000000..387d47bd8c
--- /dev/null
+++ b/macros/latex/contrib/keyparse/keyparse.pdf
Binary files differ
diff --git a/macros/latex/contrib/lambdax/README.md b/macros/latex/contrib/lambdax/README.md
new file mode 100644
index 0000000000..d47d78106d
--- /dev/null
+++ b/macros/latex/contrib/lambdax/README.md
@@ -0,0 +1,6 @@
+-----------------------------------------------------------------
+##### lambdax --- lambda expression
+- Source repository: https://github.com/rogard/lambdax
+- Released under the LaTeX Project Public License v1.3c or later
+- See http://www.latex-project.org/lppl.txt
+-----------------------------------------------------------------
diff --git a/macros/latex/contrib/lambdax/lambdax.dtx b/macros/latex/contrib/lambdax/lambdax.dtx
new file mode 100644
index 0000000000..77e6a91115
--- /dev/null
+++ b/macros/latex/contrib/lambdax/lambdax.dtx
@@ -0,0 +1,416 @@
+% \iffalse meta-comment
+% !TEX program = pdfLaTeX
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+-----------------------------------------------------------------
+##### lambdax --- lambda expression
+- Source repository: https://github.com/rogard/lambdax
+- Released under the LaTeX Project Public License v1.3c or later
+- See http://www.latex-project.org/lppl.txt
+-----------------------------------------------------------------
+%</readme>
+%<*internal>
+\fi
+\def\nameofplainTeX{plain}
+\ifx\fmtname\nameofplainTeX\else
+\expandafter\begingroup
+\fi
+%</internal>
+%<*install>
+\input l3docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\preamble
+----------------------------------------------------------------
+lambdax --- lambda expression
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------
+
+\endpreamble
+\postamble
+
+Copyright (C) 2021 by Erwann Rogard
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License (LPPL), either
+version 1.3c of this license or (at your option) any later
+version. The latest version of this license is in the file:
+
+http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+Erwann Rogard.
+
+This work consists of the file lambdax.dtx and the derived files:
+lambdax.sty, and lambdax.pdf.
+
+\endpostamble
+\generate{
+ \file{\jobname.sty}{\from{\jobname.dtx}{package}}
+}
+%</install>
+%<install> \endbatchfile
+%<*internal>
+\generate{
+ \file{\jobname.ins}{\from{\jobname.dtx}{install}}
+}
+\nopreamble\nopostamble
+\generate{
+ \file{README.md}{\from{\jobname.dtx}{readme}}
+}
+\ifx\fmtname\nameofplainTeX
+\expandafter\endbatchfile
+\else
+\expandafter\endgroup
+\fi
+%</internal>
+%<package> \NeedsTeXFormat{LaTeX2e}[2021-06-01]
+%<package> \RequirePackage{expl3, xparse, xtemplate, l3keys2e}[2021-06-01]
+%<package> \RequirePackage{lex}[2021-08-03]
+%<package> \ProvidesExplPackage
+%<package> {lambdax} % Package name
+%<package> {2021-08-03} % Release date
+%<package> {1.0} % Release version
+%<package> {lambdax --- Lambda expression } % Description
+%<*driver>
+\documentclass[show-notes]{l3doc}%^^A full
+% ^^A \listfiles
+\usepackage[french, german, english]{babel}
+\usepackage{bookmark, enumitem, tcolorbox, xparse}
+\usepackage[bibencoding=auto, backend=biber, sorting=ynt]{biblatex}
+\usepackage[T1]{fontenc}
+\ExplSyntaxOn
+% ^^A *** Sectioning
+\tl_gset:Nn \partname {Part}%^^A allows to test w/o babel
+% ^^A
+\ExplSyntaxOff
+% ^^A *** Typesetting
+\ProvideDocumentCommand{\docdescrf}{}{\sffamily\bfseries\tiny{}}
+% ^^A *** bibliography
+\begin{filecontents*}{\jobname.bib}
+@misc{erw-ccool,
+ author = {Rogard, Erwann},
+ title = {The \pkg{ccool} package for \LaTeX},
+ note = {\url{https://github.com/rogard/ccool/blob/master/ccool.pdf}},
+ year = {2020}}
+@misc{erw-lex,
+ author = {Rogard, Erwann},
+ title = {The \pkg{lex} package for \LaTeX},
+ note = {\url{https://github.com/rogard/lex/blob/master/lex.pdf}},
+ year = {2021}}
+@manual{xparse,
+ title = {The \pkg{xparse} package},
+ author = {The \LaTeX3 Project Team},
+ year = {2019},
+ note = {\url{https://ctan.math.illinois.edu/macros/latex/contrib/l3packages/xparse.pdf}},
+ annote = {} }
+@misc{a-188053,
+ author = {@{}sean-allred},
+ title = {``How to create lambda expressions?''},
+ year = {2014},
+ note = {\url{https://tex.stackexchange.com/a/188053/112708}}}
+@misc{q-610349,
+ author = {@{}Erwann},
+ title = {``Troubleshooting \PrintIndex \PrintChanges''},
+ year = {2021},
+ note = {\url{https://tex.stackexchange.com/questions/610349/troubleshooting-printindex-printchanges}}}
+\end{filecontents*}
+\addbibresource{\jobname.bib}
+% ^^A *** Lists
+\newlist{arab-inl}{enumerate*}{1}
+\setlist[arab-inl]{label=\arabic*)}
+\newlist{colon-inl}{itemize*}{1}
+\setlist[colon-inl]
+{ %^^Abefore=\noindent,
+ label={},
+ itemjoin={{; }},
+ after={{.}}}
+\newlist{descr}{description}{1}
+\setlist[descr]{nosep, align=left, itemindent=0pt,
+ font=\sffamily\tiny}
+% ^^A *** This package's loading
+\usepackage{lambdax}
+\usepackage{hyperref} %^^A comes last
+\begin{document}
+\DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{\jobname.sty}
+% \title{The \pkg{lambdax} package\thanks{^^A
+% This file describes version \fileversion, last revised \filedate.^^A
+% }^^A
+% }
+% \author{Erwann Rogard\thanks{first.lastname at gmail.com}}
+%
+% \date{Released \filedate}
+% \begin{documentation}
+% \maketitle
+% \begin{abstract}
+% This is a \LaTeX package that provides `lambda expressions', in other words
+% an interface by which one consecutively, first,
+% specifies the parameters and replacement code of a document-command\cite{xparse},
+% and, second, evaluates it with compatible arguments.
+% Optionally, one can recurse.
+% For example,
+% |\LambdaX[mm]<t^>{$#1$#2}{x}|
+% |{,~}^{y}{~and~}^{z}{.}|,
+% where |<.>| specifies the recurse paramater,
+% expands to ``\LambdaX[mm]<t^>{$#1$#2}{x}{,~}^{y}{~and~}^{z}{.}''
+% \end{abstract}
+% \part{Usage}\label{part:usage}
+%
+% \tableofcontents
+%
+% \section{Settings}
+%
+% The options hereafter are load-time-only.
+%
+% \DescribeOption{xparse-command}
+% \begin{descr}
+% \item[Side effect] Sets the xparse-document-command used by \cs{lambdax:nn}
+% \item[Initial] \cs[no-index]{DeclareDocumentCommand}
+% \end{descr}
+%
+% \section{Programming}
+% \begin{function}
+% {\lambdax:nn}
+% \begin{syntax}
+% \cs{lambdax:nn}\Arg{argspec}\Arg{code}\meta{args}
+% \end{syntax}
+% \end{function}
+% \begin{descr}
+% \item[Expands to] \meta{code}, \meta{args} replacing the parameters implied by \meta{argspec}
+% \end{descr}
+%
+% \begin{function}
+% {\lambdax:nnn}
+% \begin{syntax}
+% \cs{lambdax:nn}\Arg{argspec}\Arg{code}\Arg{bool-arg-type}\meta{args}\meta{bool-arg}
+% \end{syntax}
+% \end{function}
+% \begin{descr}
+% \item[Limitation] That of \pkg{lex}\cite{erw-lex}'s \texttt{argspec} collection.
+% \item[Argspec] Examples of \meta{bool-arg-type}\cite{xparse} and \meta{bool-arg} are |s| and |*|, respectively.
+% \item[Semantics] That of \cs{lambdax:nn} and recurse if applicable.
+% \end{descr}
+%
+% \begin{function}[EXP]
+% {\lambdax_xcmd_if:NTF}
+% \begin{syntax}
+% \cs{lambdax_xcmd_if:NTF:Nn}\meta{xparse-command}\Arg{code~if~true}\Arg{code~if~false}
+% \end{syntax}
+% \end{function}
+%
+% \section{Document}
+% \begin{function}
+% {\LambdaX}
+% \begin{syntax}
+% \cs[no-index]{LambdaX}\oarg{argspec}|<|\meta{bool-arg-type}|>|\Arg{code}
+% \end{syntax}
+% \begin{descr}
+% \item[Adapts] \cs{lambda:nn} and \cs{lambda:nnn}
+% \end{descr}
+% \end{function}
+%
+% \part{Other}
+% \section{Acknowledgment}
+% The basis for \cs{lambdax:nn} originates with \cite{a-188053}. Except for chaining, it was already provided by \cite{erw-ccool}.
+%
+% \section{Bibliograhy}
+% \printbibliography[heading=none]
+%
+% \changes{Version 1.0}
+% {2020/08/03}
+% {Initial version}
+% \clearpage
+% \StopEventually{
+% \PrintChanges
+%^^A \PrintIndex % waiting for a response to \cite{q-610349}
+% }
+%
+% \end{documentation}
+% \begin{implementation}
+%
+% \part{Implementation}\label{part:impl}
+%
+% \begin{macrocode}
+%<*package>
+%<@@=lambdax>
+\ExplSyntaxOn
+% \end{macrocode}
+% \section{Auxiliary}
+% \begin{macrocode}
+\cs_generate_variant:Nn\tl_count:n{e}
+\cs_generate_variant:Nn\int_eval:n{e}
+\cs_generate_variant:Nn\bool_if:nT{o, e}
+% \end{macrocode}
+% \begin{macro}{\@@_str_case_empty:n}
+% \begin{macrocode}
+\cs_new:Nn
+\@@_str_case_empty:n
+{{#1}
+ {\c_empty_tl}}
+% \end{macrocode}
+% \end{macro}
+% \section{\textsf{xcmdif}}
+% \begin{macro}[int]{not-xparse}
+% \begin{macrocode}
+\msg_new:nnn{@@}
+{not-xparse}
+{Expecting~an~xparse~command,~got~#2}
+% \end{macrocode}
+% \end{macro}
+% \begin{variable}
+% {\c@@_xcmdname_tl}
+% \begin{macrocode}
+\tl_const:Nn
+\c@@_xcmdname_tl
+{ {NewDocumentCommand}
+ {RenewDocumentCommand}
+ {ProvideDocumentCommand}
+ {DeclareDocumentCommand}
+ {NewExpandableDocumentCommand}
+ {RenewExpandableDocumentCommand}
+ {ProvideExpandableDocumentCommand}
+ {DeclareExpandableDocumentCommand} }
+% \end{macrocode}
+% \end{variable}
+% \begin{macro}
+% {\@@_xcmd_if:nTF,
+% \@@_xcmd_if:eTF,
+% \lambdax_xcmd_if:NTF,
+% \@@_xcmd_else_error:Nn}
+% \begin{macrocode}
+\prg_new_conditional:Nnn
+\@@_xcmd_if:n{TF}
+{\exp_args:Nnx
+ \str_case:nnTF{#1}
+ { \tl_map_function:NN
+ \c@@_xcmdname_tl
+ \@@_str_case_empty:n}
+ {\prg_return_true:}
+ {\prg_return_false:}}
+\cs_generate_variant:Nn\@@_xcmd_if:nTF{e}
+\cs_new:Nn
+\lambdax_xcmd_if:NTF
+{\@@_xcmd_if:eTF
+ {\cs_to_str:N#1}{#2}{#3}}
+\cs_new:Nn
+\@@_xcmd_else_error:Nn
+{ \lambdax_xcmd_if:NTF#1
+ { #2 }
+ { \msg_error:nne{@@}
+ {not-xparse}
+ {\token_to_str:N#1} } }
+% \end{macrocode}
+% \end{macro}
+% \begin{variable}
+% {\c@@_xenv_tl}
+% \begin{macrocode}
+\tl_const:Nn
+\c@@_xenv_tl
+{ {NewDocumentEnvironment}
+ {RenewDocumentEnvironment}
+ {ProvideDocumentEnvironment}
+ {DeclareDocumentEnvironment} }
+% \end{macrocode}
+% \end{variable}
+% \begin{macro}[int]
+% {\@@_msg_name:n}
+% \begin{macrocode}
+\cs_new:Nn
+\@@_msg_name:n{msg_\g@@_opt_msg_tl{}:#1}
+% \end{macrocode}
+% \end{macro}
+% \section{\textsf{lambda}}\label{impl:lambda}
+% \begin{macro}
+% {\@@_placeholder:n,
+% \@@_placeholder:e,
+% \@@_argspec:n,
+% \@@_argspec_count:n,
+% \@@_chain_position:n,
+% \@@_chain_placeholder:n}
+% \begin{macrocode}
+\cs_new:Nn\@@_placeholder:n{#### #1}
+\cs_generate_variant:Nn\@@_placeholder:n{o,e}
+\cs_new:Nn\@@_argspec:n{\lex_eval:nn{argspec}{#1}}
+\cs_new:Nn\@@_argspec_count:n{\tl_count:e{\@@_argspec:n{#1}}}
+\cs_new:Nn\@@_chain_position:n{\int_eval:e{\@@_argspec_count:n{#1}+1}}
+\cs_new:Nn\@@_chain_placeholder:n
+{\@@_placeholder:e
+ {\@@_chain_position:n{#1}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}
+% {\@@_lambda:Nnn,
+% \@@_lambda_dev:N,
+% \@@_lambda_doc:NN }
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_lambda:Nnn
+{\exp_args:NNx
+ #1 \@@_lambda
+ {#2}
+ {#3}
+ \@@_lambda}
+\cs_generate_variant:Nn\@@_lambda:N{c}
+\cs_new_protected:Nn
+\@@_lambda_chain:Nnnn
+{ \tl_set:Nn
+ \l@@_head_tl
+ {\exp_args:NNx#1 \@@_lambda_chain
+ {#2#3} }
+ \exp_args:Nx
+ \l@@_head_tl
+ {\exp_not:n{#4} \exp_not:N
+ \bool_if:oT
+ {\@@_chain_placeholder:n{#2}}
+ {\exp_not:N\@@_lambda_chain}}
+ \@@_lambda_chain}
+\cs_set_protected:Nn
+\@@_lambda_dev:N
+{ \cs_new_protected:Nn
+ \lambdax:nn
+ { \@@_lambda:Nnn #1
+ {##1}{##2} }
+ \cs_new_protected:Nn
+ \lambdax:nnn
+ { \@@_lambda_chain:Nnnn #1
+ {##1}{##2}{##3} } }
+\cs_set_protected:Nn
+\@@_lambda_doc:N
+{ \NewDocumentCommand
+ #1 { O{m} d<> m }
+ {\IfValueTF{##2}
+ { \lambdax:nnn { ##1 } { ##2 } { ##3 } }
+ { \lambdax:nn { ##1 } { ##3 } } } }
+\cs_generate_variant:Nn\@@_lambda_doc:N{c}
+% \end{macrocode}
+% \end{macro}
+% \section{Settings}
+% \begin{macrocode}
+\keys_define:nn{ @@ }
+{ dev.code:n = {
+ \@@_xcmd_else_error:Nn#1
+ {\@@_lambda_dev:N#1 }
+ },
+ internal / document-command-name.code:n = { \@@_lambda_doc:c{#1} },
+ internal / document-command-name.initial:n = { LambdaX },
+ xparse-command.code:n =
+ { \@@_xcmd_else_error:Nn #1
+ { \keys_set:nn{ @@ }{ dev = #1 } } },
+ xparse-command .initial:n = { \DeclareDocumentCommand }
+}
+% \end{macrocode}
+% \begin{macrocode}
+\ProcessKeysOptions{@@}
+\ExplSyntaxOff
+%</package>
+% \end{macrocode}
+% \end{implementation}
+% \Finale
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/lambdax/lambdax.ins b/macros/latex/contrib/lambdax/lambdax.ins
new file mode 100644
index 0000000000..91db360b4c
--- /dev/null
+++ b/macros/latex/contrib/lambdax/lambdax.ins
@@ -0,0 +1,64 @@
+%%
+%% This is file `lambdax.ins',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% lambdax.dtx (with options: `install')
+%% ----------------------------------------------------------------
+%% lambdax --- lambda expression
+%% Released under the LaTeX Project Public License v1.3c or later
+%% See http://www.latex-project.org/lppl.txt
+%% ----------------------------------------------------------------
+%%
+\input l3docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\preamble
+----------------------------------------------------------------
+lambdax --- lambda expression
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------
+
+\endpreamble
+\postamble
+
+Copyright (C) 2021 by Erwann Rogard
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License (LPPL), either
+version 1.3c of this license or (at your option) any later
+version. The latest version of this license is in the file:
+
+http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+Erwann Rogard.
+
+This work consists of the file lambdax.dtx and the derived files:
+lambdax.sty, and lambdax.pdf.
+
+\endpostamble
+\generate{
+ \file{\jobname.sty}{\from{\jobname.dtx}{package}}
+}
+ \endbatchfile
+%%
+%% Copyright (C) 2021 by Erwann Rogard
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License (LPPL), either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in the file:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This work is "maintained" (as per LPPL maintenance status) by
+%% Erwann Rogard.
+%%
+%% This work consists of the file lambdax.dtx and the derived files:
+%% lambdax.sty, and lambdax.pdf.
+%%
+%%
+%% End of file `lambdax.ins'.
diff --git a/macros/latex/contrib/verifiche/verifiche-example.pdf b/macros/latex/contrib/verifiche/verifiche-example.pdf
index 0ac131160b..82611e6104 100644
--- a/macros/latex/contrib/verifiche/verifiche-example.pdf
+++ b/macros/latex/contrib/verifiche/verifiche-example.pdf
Binary files differ
diff --git a/macros/latex/contrib/verifiche/verifiche.dtx b/macros/latex/contrib/verifiche/verifiche.dtx
index 364354f072..dc5a4a9e7e 100644
--- a/macros/latex/contrib/verifiche/verifiche.dtx
+++ b/macros/latex/contrib/verifiche/verifiche.dtx
@@ -16,12 +16,12 @@
%
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}
-%<package>\ProvidesPackage{verifiche} [2021/02/16 v4.1 .dtx verifiche file]
+%<package>\ProvidesPackage{verifiche} [2021/08/18 v4.2 .dtx verifiche file]
%<*driver>
\documentclass{ltxdoc}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
-\usepackage[italian]{babel}
+\usepackage[english, italian]{babel}
\usepackage{listings}
\lstset{
language=[LaTeX]TeX,
@@ -66,7 +66,7 @@
%</driver>
% \fi
%
-% \CheckSum{741}
+% \CheckSum{752}
% \changes{v1.0}{2020/06/14}{Initial version.}
% \changes{v2.0}{2020/06/26}{Better performance in exercise environment.}
% \changes{v2.1}{2020/06/30}{Introduced closedquestionitem to control |item| symbol.}
@@ -74,6 +74,7 @@
% \changes{v3.0}{2021/02/14}{Remove fancyhdr and introduce a new page style. Improve the printheading command.}
% \changes{v4.0}{2021/02/15}{Introduce comando to change the aspect of the exercise score.}
% \changes{v4.1}{2021/02/16}{Introduce ptrulerlength to change the aspect of the exercise score.}
+% \changes{v4.2}{2021/08/18}{Solved truefalse issue in solutionsmode. Add noexercisept global option to hide the score of each exercise.}
% \GetFileInfo{verifiche.sty}
% \DoNotIndex{\newcommand,\newenvironment,\def,\begin,\end,\par}
% \DoNotIndex{\DeclareOption,\ExecuteOptions,\ProcessOptions,\RequirePackage}
@@ -107,7 +108,7 @@
% \DoNotIndex{\or, \overset, \PackageError, \PackageWarning, \parindent, \pgfmathparse, \pgfmathresult}
% \DoNotIndex{\ProcessOptionsX, \protected@write, \ref, \refstepcounter, \reversemarginpar, \rule}
% \DoNotIndex{\scshape, setkeys, \sffamily, \sisetup, \spacedim, \string, \tikz, \underline, \usetikzlibrary}
-% \DoNotIndex{\val, \xout, \y, \usebox}
+% \DoNotIndex{\val, \xout, \y, \usebox, \romannumeral, \@ifundefined, \ltx@zero, \rc@default, \rc@extract@, \chardef}
%
%
% \title{Il pacchetto \textsf{verifiche}
@@ -116,6 +117,12 @@
% \author{Francesco Raccanello\\ \texttt{raccanello.francesco@gmail.com}}
%
% \maketitle
+%\begin{otherlanguage}{english}
+%\begin{abstract}
+% The aim of this package is to manage the elements of a middle or hight school test. It can composes the headings of the page, the exercises and their solutions. The exercises can show numeration, difficulty and score.
+% The package manages some standard test typology: plain exercise, complete-the-text, true or false, open questions, closed questions, find-the-error.
+%\end{abstract}
+%\end{otherlanguage}
%\begin{abstract}
%Il presente pacchetto si propone di gestire gli elementi che generalmente compongono
%una prova scritta per le scuole secondarie di primo e secondo grado:
@@ -124,7 +131,7 @@
%Alcuni comandi permettono di generare alcune tipologie di test: esercizi semplici, esercizi di completamento, vero o falso, domande aperte e chiuse e trova l'errore.
%Ciascun esercizio può presentare la soluzione corretta che viene riportata nel documento in base ad un'apposita opzione del pacchetto.
%\end{abstract}
-%
+%\clearpage
%\tableofcontents
%\clearpage
%
@@ -164,16 +171,17 @@
%\textbf{\meta{options}}& \textbf{Descrizione} \\[.5em]
%\hline\\
%|noinstitute| & non stampa il nome dell'istituto (si veda pag. \pageref{par:institute}).\\
-%|nocandidatename| & non stampa la sezione per il nome del candidato\\
-%|noinstruction| & non stampa le istruzioni della prova\\
+%|nocandidatename|& non stampa la sezione per il nome del candidato\\
+%|noinstruction| & non stampa le istruzioni della prova\\
%|noduration| & non stampa la durata della prova\\
-%|noasyear| & non stampa l'anno scolastico\\
+%|noasyear| & non stampa l'anno scolastico\\
%|notesttype| & non stampa il tipo di prova \\
-%|nonumbered| & quesiti non numerati\\
-%|solutions| & stampa le soluzioni degli esercizi (si veda pag.\pageref{sec:solutions})\\
-%|red| & il colore del font delle soluzioni è rosso\\
+%|nonumbered| & quesiti non numerati\\
+%|noexercisept| & non stampa il punteggio degli esercizi, anche se dichiarati\\
+%|solutions| & stampa le soluzioni degli esercizi (si veda pag.\pageref{sec:solutions})\\
+%|red| & il colore del font delle soluzioni è rosso\\
%|blue| & il colore del font delle soluzioni è blu\\
-%|color|=\meta{color} & il colore del font delle soluzioni è \meta{color}\\[.5em]
+%|color|=\meta{color}& il colore del font delle soluzioni è \meta{color}\\[.5em]
%\hline
%\end{tabular}
%\end{center}
@@ -998,6 +1006,7 @@ dell'esercizio somministrato
\newif\ifprintedheading\printedheadingfalse
\newif\ifexercisesnumbered\exercisesnumberedtrue
\newif\ifshowmarginexercise\showmarginexercisefalse
+\newif\ifshowexercisept\showexercisepttrue
\newif\ifopenquestionlines\openquestionlinesfalse
\newif\ifopenquestionsquared\openquestionsquaredfalse
% \end{macrocode}
@@ -1015,6 +1024,7 @@ dell'esercizio somministrato
\DeclareOptionX{nocandidatename}[]{\candidatenamefalse}
\DeclareOptionX{notesttype}[]{\testtypefalse}
\DeclareOptionX{nonumbered}[]{\exercisesnumberedfalse}
+\DeclareOptionX{noexercisept}[]{\showexerciseptfalse}
\DeclareOptionX{color}[red]{\solutionscolortrue\def\solutionscolor{#1}}
\DeclareOptionX{red}[]{\ExecuteOptionsX{color=red}}
\DeclareOptionX{blue}[]{\ExecuteOptionsX{color=blue}}
@@ -1254,13 +1264,17 @@ dell'esercizio somministrato
\def\diffstar{\hfill\foreach \i in {1,..., #1}{\diffsymb}}%
\showmarginexercisetrue}%
\define@key{esercizio}{pt}[none]{
+ \ifshowexercisept%
\def\pointes{#1}%
\def\espoint{\hfill\@ptprefix\@lpt@delimiter\pointes\space\@useptlabel{\pointes}\@rpt@delimiter}
- \showmarginexercisetrue}%
+ \showmarginexercisetrue
+ \fi}%
\define@key{esercizio}{partialpt}[none]{%
+ \ifshowexercisept%
\def\@totalpartialpt{\convertreftonum{ptes@\theexercisenumber}}%
\def\sumpartialpt{\@ptprefix\@lpt@delimiter\@totalpartialpt\space\@useptlabel{\@totalpartialpt}\@rpt@delimiter}%
- \showmarginexercisetrue}%
+ \showmarginexercisetrue
+ \fi}%
% \end{macrocode}
%
%
@@ -1343,9 +1357,11 @@ dell'esercizio somministrato
%\begin{macro}{\partialpt}The |partialpt| macro define the content of the margin note where it's used.
% \begin{macrocode}
\NewDocumentCommand{\partialpt}{m}{%
+ \ifshowexercisept%
\leavevmode\reversemarginpar\marginpar{%
\hfill\@partialptprefix\@lpartialpt@delimiter#1\space\@usepartialptlabel{#1}\@rpartialpt@delimiter%
- \addtocounter{partialpoints}{#1}}}%
+ \addtocounter{partialpoints}{#1}}%
+ \fi}%
% \end{macrocode}
%\end{macro}
%\paragraph{Soluzione}
@@ -1403,11 +1419,11 @@ dell'esercizio somministrato
\tikz[baseline=-.8ex]{%
%true part
\node[draw, rectangle, minimum size=1.5em] {V};%
- \ifsol\IfSubStr{#1}{V}{\node[shift={(1pt,1pt)}]{%
+ \ifsol\IfSubStr{#1}{V}{\node[inner sep=0pt, shift={(1pt,1pt)}]{%
$\Large\ifsolutionscolor\color{\solutionscolor}\fi\checkmark$}}{};\fi%
%false part
\node[xshift=1cm, draw, rectangle, minimum size=1.5em]{F};%
- \ifsol\IfSubStr{#1}{F}{\node[xshift=1cm, shift={(1pt,1pt)}]{%
+ \ifsol\IfSubStr{#1}{F}{\node[inner sep=0pt, xshift=1cm, shift={(1pt,1pt)}]{%
$\Large\ifsolutionscolor\color{\solutionscolor}\fi\checkmark$}}{};\fi%
}%
}
diff --git a/macros/latex/contrib/verifiche/verifiche.pdf b/macros/latex/contrib/verifiche/verifiche.pdf
index f9b2801344..0f399271db 100644
--- a/macros/latex/contrib/verifiche/verifiche.pdf
+++ b/macros/latex/contrib/verifiche/verifiche.pdf
Binary files differ
diff --git a/macros/luatex/latex/ekdosis/Makefile b/macros/luatex/latex/ekdosis/Makefile
index 4479b82d09..032cf9baed 100644
--- a/macros/luatex/latex/ekdosis/Makefile
+++ b/macros/luatex/latex/ekdosis/Makefile
@@ -57,6 +57,8 @@ clean: testsamples
rm -rf *
cp -p -r .backup/* .
rm -rf .backup
+
+pandoc:
pandoc -s README.md -o about.html
auctex:
@@ -86,6 +88,18 @@ local: uninst auctex
mkdir -p $(UTREE)/{tex,source,doc}/lualatex/$(NAME)
cp $(NAME).sty $(UTREE)/tex/lualatex/$(NAME)
cp $(NAME).lua $(UTREE)/tex/lualatex/$(NAME)
+ if [ -e "$(NAME).pdf" ]; then cp $(NAME).pdf $(UTREE)/doc/lualatex/$(NAME) &&\
+ cp -r $(SAMPLES)/ $(UTREE)/doc/lualatex/$(NAME); fi
+
+install: all
+ sudo mkdir -p $(LOCAL)/{tex,source,doc}/latex/$(NAME)
+ sudo cp $(NAME).dtx $(LOCAL)/source/latex/$(NAME)
+ sudo cp $(NAME).sty $(LOCAL)/tex/latex/$(NAME)
+ sudo cp $(NAME).pdf $(LOCAL)/doc/latex/$(NAME)
+ cp -r $(SAMPLES)/ $(LOCAL)/doc/latex/$(NAME)
+
+uninstall:
+ rm -rf $(LOCAL)/{tex,source,doc}/latex/$(NAME)
zip: all
ln -sf . $(NAME)
@@ -109,4 +123,4 @@ package: distclean all
rm -rf $(NAME)/
.SILENT: testsamples
-.PHONY: all clean distclean inst local uninst install uninstall zip package samples testsamples
+.PHONY: all clean distclean pandoc inst local uninst install uninstall zip package samples testsamples
diff --git a/macros/luatex/latex/ekdosis/README.md b/macros/luatex/latex/ekdosis/README.md
index 51a1e595e6..0fef027f19 100644
--- a/macros/luatex/latex/ekdosis/README.md
+++ b/macros/luatex/latex/ekdosis/README.md
@@ -62,7 +62,7 @@ This release of ekdosis consists of the following source files:
License Applicable to the Documentation
---------------------------------------
-Copyright ⓒ 2020 Robert Alessi
+Copyright ⓒ 2020--2021 Robert Alessi
The documentation file `ekdosis.pdf` that is generated from the
`ekdosis.dtx` source file is licensed under the GNU Free Documentation
diff --git a/macros/luatex/latex/ekdosis/ekdosis.dtx b/macros/luatex/latex/ekdosis/ekdosis.dtx
index 229d7c1d14..30b19f07d6 100644
--- a/macros/luatex/latex/ekdosis/ekdosis.dtx
+++ b/macros/luatex/latex/ekdosis/ekdosis.dtx
@@ -61,7 +61,7 @@ along with this program. If not, see
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{ekdosis}
%<*package>
- [2021/04/02 v1.2 Typesetting TEI xml-compliant critical editions]
+ [2021/08/18 v1.3 Typesetting TEI xml-compliant critical editions]
%</package>
%<*driver>
\begin{filecontents}[noheader,overwrite]{bibdata.xml}
@@ -166,7 +166,7 @@ along with this program. If not, see
<monogr>
<title level="m">Works of W. Shakespeare</title>
<editor>
- <forename>H.N.</forename>
+ <forename>H. N.</forename>
<surname>Hudson</surname>
</editor>
<imprint>
@@ -180,7 +180,7 @@ along with this program. If not, see
<monogr>
<title level="m">Shakespeare's Complete Sonnets</title>
<editor>
- <forename>C.M.</forename>
+ <forename>C. M.</forename>
<surname>Walsh</surname>
</editor>
<imprint>
@@ -246,7 +246,7 @@ along with this program. If not, see
author = {{Homer}},
title = {The Odyssey},
date = 1919,
- editor = {Murray, A.T\adddot},
+ editor = {Murray, A. T.},
volumes = 2,
publisher = {Harvard University Press -- William Heinemann},
location = {Cambridge, MA. -- London}
@@ -266,7 +266,7 @@ along with this program. If not, see
}
@Book{ReynoldsWilson1991,
- author = {Reynolds, L. D. and Wilson, N. G},
+ author = {Reynolds, L. D. and Wilson, N. G.},
title = {Scribes and Scholars},
year = {1991},
subtitle = {A Guide to the Translation of Greek and Latin
@@ -311,6 +311,15 @@ along with this program. If not, see
url = {http://www.teibyexample.org}
}
+@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{extdash,
title = {The Extdash package},
titleaddon = {A range of dash commands for compound words},
@@ -329,6 +338,16 @@ along with this program. If not, see
version = {1.0}
}
+@Software{keyfloat,
+ title = {The Keyfloat package},
+ subtitle = {Provides a key/value interface for generating
+ floats},
+ author = {Dunn, Brian},
+ url = {https://ctan.org/pkg/keyfloat},
+ date = {2021-06-29},
+ version = {2.06},
+}
+
@Software{lineno,
title = {The Lineno package},
titleaddon = {Line numbers on paragraphs},
@@ -365,13 +384,23 @@ along with this program. If not, see
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{tcolorbox,
+ title = {The Tcolorbox package},
+ subtitle = {Coloured boxes, for LaTeX examples and theorems,
+ etc},
+ author = {Sturm, Thomas F.},
+ url = {https://ctan.org/pkg/tcolorbox},
+ date = {2021-06-14},
+ version = {4.51},
+}
+
+@Software{titleps,
+ title = {The Titleps package},
+ titleaddon = {Page style control},
+ author = {Bezos López, Javier},
+ url = {https://ctan.org/pkg/titleps},
+ date = {2019-10-16},
+ version = {2.13}
}
@Software{verse,
@@ -413,6 +442,7 @@ along with this program. If not, see
\end{filecontents}
\begin{filecontents}[overwrite]{\jobname-ekd.cfg}
\footnotelayout{m}
+\SetCritSymbols{suppbegin = 〈,suppend = 〉}
\EnvtoTEI{ancientgreek}{p}[xml:lang="grc"]
\DeclareApparatus{fontium}[
delim=\hskip0.75em,
@@ -423,7 +453,6 @@ along with this program. If not, see
delim=\hskip0.75em]
\DeclareApparatus{rtl}[
direction=RL,
- sep={[ },
delim=\hskip0.75em]
\DeclareWitness{M}{M}{\emph{Marcianus Gr.} 269}[
settlement=Venice,
@@ -475,6 +504,11 @@ along with this program. If not, see
\DeclareHand{hIpc}{hI}{I\textsuperscript{pc}}[Lectio post correctionem]
\DeclareWitness{hR}{R}{\emph{Vaticanus Gr.} 277}
\DeclareWitness{hH}{H}{\emph{Parisinus Gr.} 2142}
+\DeclareWitness{hGalE1.Q}{Gal.E1(Q)}{\emph{Parisinus Gr.}
+ 2174}[origDate=s. XIV]
+\DeclareWitness{hGalE1.M}{Gal.E1(M)}{\emph{Monacencis Gr.}
+ 231}[origDate=s. XVI]
+ \DeclareShorthand{hGalE1.M.Q}{Gal.E1(MQ)}{hGalE1.M,hGalE1.Q}
\DeclareSource{Lit}{Littré}
\DeclareSource{Erm}{Ermerins}
\DeclareSource{Sm}{Smith}
@@ -524,17 +558,18 @@ along with this program. If not, see
\defaultfontfeatures{Renderer=Harfbuzz}
\usepackage[latin.classic,greek.ancient,american]{babel}
\babelfont{rm}{Old Standard}
-\babelfont{sf}{NewComputerModern Sans}
-\babelfont{tt}{NewComputerModern Mono}
+\babelfont{sf}{NewComputerModernSans10}
+\babelfont{tt}{NewComputerModernMono10}
\babelfont[greek]{rm}[
Script=Greek,
RawFeature={+ss05;+ss06}
]{Old Standard}
-\babelfont[greek]{sf}[Script=Greek]{NewComputerModern Sans}
-\babelfont[greek]{tt}[Script=Greek]{NewComputerModern Mono}
+\babelfont[greek]{sf}[Script=Greek]{NewComputerModernSans10}
+\babelfont[greek]{tt}[Script=Greek]{NewComputerModernMono10}
\newfontfamily{\junicode}{Junicode}[
Ligatures=TeX,
RawFeature={+hist}]
+\newfontfamily\missaali{Missaali Regular}
\babeltags{ancientgreek = greek}
\def\sg#1{\textancientgreek{#1}}
\usepackage[Old Standard]{mathfont}
@@ -564,6 +599,8 @@ along with this program. If not, see
\usepackage{manfnt}
\usepackage{lettrine}
\newcommand\danger{\lettrine[loversize=-.5]{\textdbend}{\hskip6pt}}
+\newcommand\mansee{\lettrine[loversize=-.4,
+ lraise=.55]{\mantriangleright}{\hskip6pt}}
\usepackage{metalogox}
\usepackage{hologo}
\usepackage{xcolor}
@@ -575,9 +612,9 @@ along with this program. If not, see
\colorlet{cinnamon}{black}}{}
\definecolor{gainsboro}{RGB}{222,222,222}
\PassOptionsToPackage{bookmarks=true}{hyperref}
-\usepackage{xurl}
+\usepackage[obeyspaces]{url}
\usepackage[numbered]{hypdoc}
-\usepackage[loadlang=en]{metastr}
+\usepackage[titlematter,loadlang=en|de|fr|es]{metastr}
\hypersetup{
colorlinks,
allcolors=cinnamon,
@@ -593,7 +630,11 @@ along with this program. If not, see
\bibinput{ekdosis}
\usepackage[nospace,american]{varioref}
\newcommand\phts{\phantomsection}
+\usepackage{nameref}
+\newcommand\vnref[1]{\vref{#1}, \enquote{\nameref{#1}}}
\usepackage[style=oxnotes-inote,dashed]{biblatex}
+\DefineBibliographyStrings{english}{
+ seenote={cf\adddotspace n\adddotspace}}
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
@@ -602,6 +643,27 @@ along with this program. If not, see
}
}
}
+% include seenote in parentheses
+\renewbibmacro*{footcite:note}{%
+ \ifnameundef{labelname}
+ {\printfield{label}}
+ {\printnames{labelname}}%
+ \ifsingletitle
+ {}
+ {\setunit*{\printdelim{nametitledelim}}%
+ \printfield[title]{labeltitle}}%
+ \setunit*{\addspace}%
+ \printtext{%
+ \mkbibparens{%
+ \bibstring{seenote}\addnbspace
+ \ref{cbx@\csuse{cbx@f@\thefield{entrykey}}}%
+ \iftoggle{cbx:pageref}
+ {\ifsamepage{\the\value{instcount}}
+ {\csuse{cbx@f@\thefield{entrykey}}}
+ {}
+ {\addcomma\space\bibstring{page}\addnbspace
+ \pageref{cbx@\csuse{cbx@f@\thefield{entrykey}}}}}
+ {}}}}
\ifbool{nocolordoc}
{
\usepackage{academicons}
@@ -662,6 +724,14 @@ along with this program. If not, see
\metaset{contacturl}{http://www.roberalessi.net}
\metaset{partof}{The ekdosis Package}
\metaset[print]{partof}{The \textsf{ekdosis} Package}
+\metaset[altlang]{rightstext}{en,de,fr,es}
+\metaset[fr]{partofmessage}{%
+ Ce document fait partie de l'œuvre: \metapick[#1]{partof}.}
+\metaset[es]{partofmessage}{%
+ Este documento forma parte de la obra: \metapick[#1]{partof}.}
+\metaset[es]{licenseurlmessage}{%
+ Para ver una copia de esta licencia, siga el vínculo:
+ \metapick[#1]{licenseurl}.}
\metaset{copyrightowner}{\metapick[#1]{author}}
\metaset{copyrightdate}{2020--2021}
\metaset{licensemessage}{Permission is granted to copy, distribute
@@ -674,7 +744,6 @@ along with this program. If not, see
\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
@@ -780,7 +849,7 @@ along with this program. If not, see
%</driver>
% \fi
%
-% \CheckSum{2188}
+% \CheckSum{2519}
%
% \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
@@ -857,7 +926,7 @@ along with this program. If not, see
% Please send error reports and suggestions for improvements to Robert
% Alessi:
% \begin{itemize}
-% \item email: \mailto[ekdosis package]{alessi@roberalessi.net}
+% \item email: \mailto[ekdosis package]{Robert Alessi <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:
@@ -915,8 +984,9 @@ along with this program. If not, see
% \end{keyfigure}
% \end{comment}
%
-% The reader will find here, by way of introduction, a summarized
-% version of the first part of an article published in the
+% \lettrine{\color{cinnamon}\missaali +T+}{he reader} will find here,
+% by way of introduction, a summarized version of the first part of an
+% article published in the
% \mkbibemph{\citefield{Alessi2020}{journaltitle}} as a contribution
% to a Digital Humanities workshop held at Stanford University
% (\printdate{2019-04-15}).\footcite{Alessi2020}
@@ -1123,17 +1193,66 @@ along with this program. If not, see
% follows.
%
% \danger The reader is invited to refer to the relevant sections of
-% this documentation for more information on how to use them.
+% this documentation for more information on how to use these options.
%
% \DescribeOption{layout}\phts\label{ref:layout-opt}
-% |layout|$=$\verb+float|footins+\hfill\tcboxverb{Default: float}\\
-% By default, layers of critical notes are inserted as a floating
-% environment to be printed at the bottom of pages. |layout=footins|
-% 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.
+% |layout|$=$\verb+float|footins|keyfloat|fitapp+
+% \hfill\tcboxverb{Default: float}
+% \begin{enumerate}
+% \item |layout=float| By default, layers of critical notes are
+% inserted as floating environments to be printed at the bottom of
+% the pages.
+% \item |layout=footins| This 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 the pages. In this
+% case, the apparatus criticus will be inserted between regular
+% numbered footnotes, but will carry no footnote mark of its own.
+% \item \label{ref:keyfloat-opt}\newfeature[v1.3] |layout=keyfloat|
+% does approximately the
+% same as the default option |layout=float| but uses the
+% \pkg{keyfloat} package\footcite{keyfloat} to generate the floating
+% environments to be used as containers for critical footnotes. This
+% way, the keys and values provided by this
+% package\footcite[See][sect. 2.3, \ppno~13--16]{keyfloat} may be
+% used to achieve such effects as append additional, informative
+% text below the apparatus, draw a line around the apparatus block
+% or change its width.\footnote{See below, \vpageref{ref:keyparopts}
+% for more information.}
+% \item \label{ref:fitapp-opt}\newfeature[v1.3] |layout=fitapp| As
+% described below in \vnref{sec:oscillating-problem}, \pkg{ekdosis}
+% may oscillate indefinitely between different sets of page
+% decisions when one or more apparatus entries attached to the last
+% lines of the edition text on a given page do not fit in the
+% apparatus block. The reader will find in this section of the
+% documentation a detailed account of several ways to circumvent
+% this issue. Alternatively, or rather conjointly with those ways,
+% |layout=fitapp| can be used to instruct \pkg{ekdosis} to scale
+% down the characters of the apparatus block so that the contentious
+% entries can fit. This mechanism uses the \enquote{fitting} library
+% provided by the \pkg{tcolorbox} package.\footcite[sect.~22,
+% \ppno~\pnfmt{438--449}]{tcolorbox} When this option is set, the
+% apparatus criticus grows normally until a predefined height is
+% reached. This height is set to |0.5\textheight| by
+% default.\footnote{Of course, this height can be modified. See
+% below \vpageref{ref:appheight} for details.} From this point on,
+% the apparatus block ceases to grow; rather, the size of the
+% characters is reduced to allow for additional entries. As a
+% consequence of this rationale, the total number of entries on a
+% given page must not be too high. It is therefore advisable to use
+% |layout=fitapp| conjointly with |maxentries| as described below
+% \vpageref{ref:maxentries} and in \vref{sec:oscillating-problem}. %
+% \danger If used appropriately, this mechanism gives excellent
+% typographical results, notably with complex edition texts of which
+% the entries in the associated apparatus can be quite abundant in
+% number. It may even put an end to the
+% \enquote{\hyperref[sec:oscillating-problem]{oscillating problem}}
+% in most of the cases. However, as suitable it may be for high
+% quality typeset texts and final, camera-ready copies, its benefit
+% comes at the expense of slowing down the compilation process. Yet
+% looser algorithms can be selected when speed must prevail over
+% quality for intermediate or draft copies.\footnote{See below
+% \vpageref{ref:fitalgorithm} for more information.}
+% \end{enumerate}
%
% \DescribeOption{divs}\phts\label{ref:divs-opt}
% |divs|$=$\verb+ekdosis|latex+\hfill\tcboxverb{Default: ekdosis}\\
@@ -1203,6 +1322,53 @@ along with this program. If not, see
%</example>
% \fi
%
+% \subsection{Setup}
+% \label{sec:setup}
+% \DescribeMacro{\ekdsetup} \newfeature[v1.3] Starting from v1.3,
+% \cs{ekdsetup} can be used to specify options that affect the general
+% behavior of \pkg{ekdosis}. \cs{ekdsetup} is a preamble-only
+% command. It accepts the following |key=value| options the number of
+% which is expected to increase as \pkg{ekdosis} grows:\\
+% \DescribeOption{showpagebreaks}\phts\label{ref:showpagebreaks-opt}
+% \unskip|showpagebreaks|$=$\verb+true|false+
+% \hfill \tcboxverb{Initially: false; Default: true}\\
+% This named argument, which defaults to |true| if used without value,
+% has specific marks printed in the margins so as to spot with a rapid
+% cast of the eye the locations of conditional page breaks generated
+% by the \cs{ekdpb} command described below \vpageref{ref:ekdpb}. By
+% default, page breaks generated by \cs{ekdpb} are identified by the
+% string |spb|\===for \enquote{soft} page break\=== whereas those
+% generated by \cs{ekdpb*} are identified by |hpb|\===for
+% \enquote{hard} page break. Furthermore, when \cs{ekdpb} triggers no
+% page break, the marker is printed between square brackets, like so:
+% |[spb]|. In this
+% way, inoperative \cs{ekdpb} can be easily spotted and removed.\\
+% \DescribeOption{spbmk} |spbmk|$=$\meta{string}
+% \hfill\tcboxverb{Default: spb}\\
+% |spbmk| is used to change the string associated to \enquote{soft}
+% page breaks.\\
+% \DescribeOption{hpbmk} |hpbmk|$=$\meta{string}
+% \hfill\tcboxverb{Default: hpb}\\
+% |hpbmk| is used to change the string associated to \enquote{hard}
+% page breaks.
+%
+% As an example, what follows has \enquote{soft} page breaks printed
+% in blue and \enquote{hard} page breaks printed in red:---
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}[linenos=false]{latex}
+\ekdsetup{
+ showpagebreaks,
+ spbmk = \textcolor{blue}{spb},
+ hpbmk = \textcolor{red}{hpb}
+}
+\end{minted}
+% \iffalse
+%</example>
+% \fi
+%
% \subsection{Using a Configuration File}
% \label{sec:using-conf-file}
% Complex editions may use a large number of witnesses, sources and
@@ -1212,7 +1378,7 @@ along with this program. If not, see
% way to avoid overloading the document preamble: all the settings
% related to the critical edition can be gathered in a separate
% configuration file named |\jobname-ekd.cfg|. If such a file can be
-% found, its contents is automatically read and used by
+% found, its contents are automatically read and used by
% \pkg{ekdosis}.
%
% \subsection{Witnesses, Hands, Sources, Scholars \& Shorthands}
@@ -1247,7 +1413,8 @@ along with this program. If not, see
% \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.
+% output if any.\footnote{See \vpageref{ref:xmlid} for more
+% information.}
% \item The rendition to be used in the printed apparatus criticus,
% which also will be found within the |<sourceDesc>| element of the
% \texttt{TEI} header where the description of the witness occurs,
@@ -1258,8 +1425,8 @@ along with this program. If not, see
% \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 |<msIdentifer>| element in the \texttt{TEI}
+% the first six of which are used to collect items of information to
+% be found within the |<msIdentifer>| 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.}---\\
@@ -1276,13 +1443,17 @@ along with this program. If not, see
% \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.
+% used to identify the date of origin for the witness.\\
+% \DescribeOption{locus} |locus|$=$\meta{locus}\newfeature[v1.3]: The
+% sequence of folio references where the edition text is found in the
+% manuscript.
%
% \phts\label{ref:marcianus-b}
% To take here one example, a witness such as the \emph{Marcianus
% Graecus}~269, referred to as manuscript \enquote*{M} in the
% editions, which contains sixty treatises transmitted under the name
-% of Hippocrates, could be declared as follows:---
+% of Hippocrates, could be declared as follows:\footnote{The locus
+% specified refers to Hippocrates' \emph{Epidemics}, Book~6.}---
%
%\iffalse
%<*example>
@@ -1293,7 +1464,8 @@ along with this program. If not, see
institution=Marciana Library,
msName=Marcianus Gr.,
idno=269,
- origDate=s. X]
+ origDate=s. X,
+ locus=fol. 416\textsuperscript{v}–426\textsuperscript{v}]
\end{minted}
% \iffalse
%</example>
@@ -1308,7 +1480,7 @@ along with this program. If not, see
% \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.
+% if any.\footnote{See \vpageref{ref:xmlid} for more information.}
% \item The unique identifier 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,
@@ -1442,7 +1614,7 @@ along with this program. If not, see
% \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.
+% if any.\footnote{See \vpageref{ref:xmlid} for more information.}
% \item The rendition to be used in the apparatus criticus in print,
% which also will be found within the |<sourceDesc>| element of the
% \texttt{TEI} header where the description of the persons cited
@@ -1554,10 +1726,12 @@ along with this program. If not, see
% \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:---
+% witness, the contents of the |description| field, followed if
+% applicable by the sequence of folios that refers to the edition
+% text, 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
@@ -1731,6 +1905,8 @@ yesterday.
% |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.
+%
+% \needspace{2\baselineskip}
% \danger \DescribeMacro{\ekdsep} If |nosep| be used so as to insert
% an explanatory note after the lemma text with the \cs{note} command
% described below \vpageref{ref:editorial-notes}, then \cs{ekdsep} can
@@ -1749,6 +1925,19 @@ yesterday.
% 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{2\baselineskip}
+% \noindent
+% \DescribeOption{num} (no-value
+% argument)\phts\label{ref:lem-num}\newfeature[v1.3]\\
+% |num| takes no value. If used, this argument instructs to print any
+% line number that \pkg{ekdosis} may have decided not to print in the
+% apparatus criticus before the lemma text.\\
+% \DescribeOption{nonum} (no-value
+% argument)\phts\label{ref:lem-nonum}\newfeature[v1.3]\\
+% Compared to |num|, |nonum| does the opposite. If used, any number
+% that \pkg{ekdosis} may have decided to print before the lemma text
+% is suppressed.
%
% \needspace{11\baselineskip}
% Finally, four named arguments can be used to insert words at the
@@ -2040,6 +2229,19 @@ friend
%</example>
% \fi
%
+% \danger It must be noted that from a technical standpoint, albeit
+% the nested lemmas are printed \emph{before} their parents in the
+% apparatus criticus, they are seen by \pkg{ekdosis} \emph{after} the
+% latter as the source file is compiled. As a result, notably when the
+% whole nested group of lemmas falls on the same line without being
+% preceded by an apparatus entry on this line, it may be needed to
+% suppress redundant numbers that \pkg{ekdosis} may have decided to
+% print in the appartus criticus. Conversely, it may be needed to
+% print numbers that \pkg{ekdosis} may have decided not to print. To
+% both ends, the |num| and |nonum| optional arguments of the \cs{lem}
+% command can be used as described above
+% \vpagerefrange{ref:lem-num}{ref:lem-nonum}.
+%
% \subsubsection{Explicit Grouping}
% \label{sec:explicit-grouping}
% \DescribeMacro{\rdgGrp} \cs{rdgGrp}\oarg{options}\marg{lemma text
@@ -2447,11 +2649,11 @@ friend
% \iffalse
%</example>
% \fi
-%
+%
+% \needspace{11\baselineskip}
% PDF output:---
% \medskip
%
-% \needspace{7\baselineskip}
% \resetlinenumber
% \begin{alignment}[flush,tcols=1,texts=specimen,apparatus=specimen]
% \begin{specimen}
@@ -3119,18 +3321,56 @@ texts=latin[xml:lang="la"]+\textcolor{red}{;}+
% \DescribeOption{initialrule} |initialrule|$=$\meta{command}
% \phts\label{ref:initialrule}\hfill\bgroup\footnotesize
% \tcboxverb{Default: \rule{0.4\columnwidth}{0.4pt} (initially not set)}%
-% \egroup
-% \newfeature[v1.2] |initialrule| draws a separating rule between the
-% edition text and all subsequent layers of critical notes. Of course,
-% this option only makes sense when multiple-layer apparatus criticus
-% are set. Therefore, it has no effect on single-layer apparatus
+% \egroup \newfeature[v1.2] |initialrule| draws a separating rule
+% between the edition text and all subsequent layers of critical
+% notes. Of course, this option only makes sense when multiple-layer
+% apparatus criticus are set. Therefore, it has no effect on
+% single-layer apparatus
% criticus.\\
% \DescribeOption{noinitialrule}\hfill\tcboxverb{Default: not set}\\
% This is a no-value option. It removes any previously set
% |initialrule|.
-%
+%
% An example of the way these hooks may be used is provided below in
% \vref{lst:shak-sonnet1}.
+%
+% \noindent\textbf{Option Specific to the |layout=keyfloat| Global
+% Setting}\footnote{See above \vref{ref:keyfloat-opt}.}\\
+% \DescribeOption{keyparopts}%
+% \phts\label{ref:keyparopts}|keyparopts|$=$\meta{csv options}
+% \hfill\tcboxverb{Default: empty}\\
+% \newfeature[v1.3] The comma-separated options that can be used are
+% those described in the documentation of the \pkg{keyfloat}
+% package.\footcite[sect.~2.3, \ppno~\pnfmt{13--15}]{keyfloat} As an
+% example, |keyparopts={ft, tr={made with ekdosis},| %
+% \allowbreak|lw=1.2}| will draw a tight frame around the apparatus
+% block, have the words \enquote{made with \pkg{ekdosis}} printed
+% below this block on the
+% right and set its width to |1.2\linewidth|.\\
+% \textbf{Options Specific to the |layout=fitapp| Global
+% Setting}\footnote{See above \vref{ref:fitapp-opt}.}\\
+% \DescribeOption{appheight}%
+% \phts\label{ref:appheight}|appheight|$=$\meta{dimension}
+% \hfill\tcboxverb{Default: 0.5\textheight}\\
+% \newfeature[v1.3] This option is used to change the maximum height
+% up to which the apparatus block is allowed to grow before the size
+% of the characters is reduced to allow for more entries. The value
+% must be a dimension, namely a number followed by a length unit, such
+% as |0.65\textheight|, |18cm| or |6in|.\\
+% \DescribeOption{fitalgorithm}%
+% \phts\label{ref:fitalgorithm}
+% \unskip|fitalgorithm|$=$\verb+fontsize|hybrid|areasize|squeeze+
+% \hfill\tcboxverb{Default: fontsize}\\
+% \newfeature[v1.3] The four algorithms that can be used to have the
+% entries inserted in the apparatus criticus fit to the selected
+% height are presented here from the tightest to the loosest, that is,
+% the slowest to the fastest.\footnote{See \cite[446--449]{tcolorbox}
+% for details and illustrative examples.} While it is advisable to
+% limit the use of |fontsize| to high quality typesetting for
+% camera-ready copies, |areasize| offers a satisfactory settlement
+% when speed must be given an advantage for intermediate or draft
+% copies. |squeeze| should be avoided as it gives results that are
+% offensive to the sight and unacceptable to any reader.
%
% \subsection{Single-Layer Apparatus Criticus}
% \label{sec:single-layer-app}
@@ -3190,6 +3430,15 @@ texts=latin[xml:lang="la"]+\textcolor{red}{;}+
% needed to apply in the apparatus criticus a language different from
% the one that is selected in the edition text.
%
+% \DescribeMacro{\SetApparatusNoteLanguage}
+% \phts\label{ref:app-note-lang}\newfeature[v1.3]
+% \cs{SetApparatusNoteLanguage}\marg{languagename} can be used when it
+% is needed to apply in text entries introduced by the mandatory
+% argument of the \cs{note} command as described in
+% \vref{ref:type-note}\===namely
+% \cs{note}\oarg{options}\marg{text}\===a language different from the
+% one that is selected in the edition text.
+%
% \paragraph{General Command}
% \DescribeMacro{\SetApparatus} \cs{SetApparatus}\marg{csv list of
% apparatus settings}\phts\label{ref:apparatus-settings-b}\\
@@ -3215,23 +3464,31 @@ texts=latin[xml:lang="la"]+\textcolor{red}{;}+
% \hfill\tcboxverb{Default: empty}\\
% The characters to be appended at the end of the apparatus
% block.\footnote{See also n.~\vref{fn:rm-dots}.}\\
-% \DescribeOption{rule} |rule|$=$\meta{command}\verb+|+|none|
+% \DescribeOption{rule} |rule|$=$\meta{command}
% \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.\\
+% between the edition text and the apparatus criticus.\\
% \DescribeOption{norule}\hfill\tcboxverb{Default: not set}\\
-% |norule| does not accept any value and has the same effect as
-% |rule=none|.\phts\label{ref:apparatus-settings-e}\\
+% |norule| does not accept any value and is used to remove the
+% line.\phts\label{ref:apparatus-settings-e}\\
% \DescribeOption{lang} |lang|$=$\meta{languagename}
% \newfeature[v1.2]\phts\label{ref:app-lang-opt}
% \hfill\tcboxverb{Default: not set}\\
-% \needspace{3\baselineskip}\noindent
% |lang=<languagename>| is used as described
% \vpageref[above]{ref:app-lang} when it is needed to apply in the
% apparatus criticus a language different from the one that is
% selected in the edition text. |languagename| can be any value
% accepted by \pkg{babel} or \pkg{polyglossia}.
+% \DescribeOption{notelang} |notelang|$=$\meta{languagename}
+% \newfeature[v1.3]\phts\label{ref:app-note-lang-opt}
+% \hfill\tcboxverb{Default: not set}\\
+% |notelang=<languagename>| is used as described
+% \vpageref[above]{ref:app-note-lang} when is needed to apply in text
+% entries introduced by the mandatory argument of the \cs{note}
+% command as described in \vref{ref:type-note}\===namely
+% \cs{note}\oarg{options}\marg{text}\===a language different from the
+% one that is selected in the edition text. |languagename| can be any
+% value accepted by \pkg{babel} or \pkg{polyglossia}.
%
% As an example, an apparatus criticus with references to line numbers
% printed in normal font, a colon as a separator between lemma texts
@@ -3327,6 +3584,7 @@ texts=latin[xml:lang="la"]+\textcolor{red}{;}+
% \DescribeOption{rule}
% \DescribeOption{norule}
% \DescribeOption{lang}\phts\label{ref:apps-lang-opt}
+% \DescribeOption{notelang}
% With regard to layout, any declared layer inherits the default values
% described above in \vref{sec:single-layer-app}. That said, as the
% optional argument of \cs{DeclareApparatus} accepts the exact same
@@ -3498,6 +3756,7 @@ Some \app[type=rec2]{
% they are related to. As a result of this rule, all spaces subsequent
% to \cs{note} are ignored.
%
+% \needspace{2\baselineskip}
% \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
@@ -3517,6 +3776,14 @@ Some \app[type=rec2]{
% \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{num} (no-value argument)\newfeature[v1.3]\\
+% |num| takes no value. If used, this argument instructs to print any
+% line number that \pkg{ekdosis} may have decided not to print in the
+% apparatus criticus before the note.\\
+% \DescribeOption{nonum} (no-value argument)\\
+% Compared to |num|, |nonum| does the opposite. If used, any number
+% that \pkg{ekdosis} may have decided to print before the note
+% is suppressed.\\
% \DescribeOption{labelb} |labelb|$=$\meta{label}
% \hfill\tcboxverb{Mandatory}\\
% |labelb| is the unique label to serve as a reference for the point
@@ -3524,7 +3791,12 @@ Some \app[type=rec2]{
% \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.\\
+% will issue an error message. However, two strictly consecutive
+% \cs{note} commands are allowed to share the same |labelb| value for
+% it may happen that consecutive notes need to refer to spans of text
+% that begin at the exact same location. In this case, \pkg{ekdosis}
+% generates only one \cs{linelabel} and one corresponding
+% |<anchor>| element in the \texttt{TEI xml} file.\\
% \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|
@@ -3686,6 +3958,7 @@ argument of the
% element (ll.~5--7). Otherwise, the \texttt{TEI} output would not be
% valid.
%
+% \needspace{4\baselineskip}
% \section{Poetry}
% \label{sec:poetry}
% \subsection[The Standard \textsf{verse} Environment]{The Standard
@@ -3837,7 +4110,7 @@ argument of the
% \DescribeOption{width} |width|$=$\meta{length}
% \hfill\tcboxverb{Default: \linewidth}\\
% If |width| be supplied, it is taken as a length in relation to which
-% the entire contents of the environment is to be horizontally
+% the entire contents of the environment are to be horizontally
% centered. If given, this dimension may correspond to an average line
% or to the longest line of the line group. To this end, the standard
% \LaTeX\ command \cs{settowidth} can be used, like so:--- %
@@ -4171,7 +4444,7 @@ substantiall fewell,}
% |Hudson1856|, |Butler1899| and |Walsh1908| have been declared as
% sources.\footnote{See above \vpageref{ref:declare-source} and
% below \vref{sec:references-cited-works}.} |God| and |Stee|,
-% resp.\ Godwin and Steevens, have been decalred as
+% resp.\ Godwin and Steevens, have been declared as
% scholars.\footnote{See above \vpageref{ref:declare-scholar}.}
% \item \cs{ekdlettrine} (l.~23) is a specific command for the
% \pkg{lettrine} package does not work in list
@@ -4396,11 +4669,13 @@ substantiall fewell,}
% to set lineation preferences. Its argument processes the |key=value|
% options that follow:---\\
% \textbf{General Options}\\
-% \DescribeOption{lineation} |lineation|$=$\verb+page|document+
+% \DescribeOption{lineation} |lineation|$=$\verb+page|document|none+
% \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.\\
+% numbering should start afresh at the top of each page. |none| does
+% the same as |page| but prevents the numbers from being printed in
+% the margins while keeping them in use in the apparatus criticus.\\
% \DescribeOption{modulo} |modulo| \hfill\tcboxverb{Default: not set}\\
% |modulo| does not accept any value. When this option is set, every
% fifth line is numbered.\\
@@ -4536,8 +4811,9 @@ substantiall fewell,}
% \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}.
+% file, the reader is invited to refer to point \vref{it:lang-subopt},
+% and \vref{sec:teixml-output} including the example provided
+% \vpageref{ref:ancientgreek-ex}.
%
% \danger In some cases, it may be needed to apply in the apparatus
% criticus a language different from the one that is selected in the
@@ -4971,7 +5247,7 @@ subtype="arabtex">'inna 'abI kAna mina
%</example>
% \fi
%
-% \subsection{Using \texttt{TEI} Un-numbered Divisions}
+% \subsection{\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
@@ -5016,9 +5292,14 @@ subtype="arabtex">'inna 'abI kAna mina
% being |1| and the smallest being |9|.\\
% \DescribeOption{toc}
% |toc|$=$\verb+book|part|chapter|section|subsection|subsubsection|paragraph|+\\
-% |subparagraph|\hfill\tcboxverb{Default: not set}\\
+% \phantom{|toc|$=$}|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.
+% contents at the hierarchic level that is specified as value.\\
+% \DescribeOption{mark} \newfeature[v1.3] |mark|$=$\meta{signpost}
+% \hfill\tcboxverb{Default: none}\\
+% |mark| holds the signpost to be emitted as marker for headers and
+% footers. Its value is recalled by \cs{ekdmark} as described below in
+% \vref{sec:headers-footers}.
%
% \paragraph{Formatting the Titles}
% \DescribeMacro{\FormatDiv} By design, \pkg{ekdosis} does
@@ -5046,10 +5327,11 @@ subtype="arabtex">'inna 'abI kAna mina
% here follows how the first three hierarchical levels could be
% formatted as un-numbered divisions:---
%
+% \captof{Divisions of the body text}[\label{lst:ekddiv-ex}]
% \iffalse
%<*example>
% \fi
-\begin{minted}[linenos=false]{latex}
+\begin{minted}{latex}
% Preamble:
\FormatDiv{1}{\begin{center}\Large}{\end{center}}
\FormatDiv{2}{\begin{center}\large}{\end{center}}
@@ -5159,6 +5441,126 @@ subtype="arabtex">'inna 'abI kAna mina
%</example>
% \fi
%
+% \subsection{Headers and Footers}
+% \label{sec:headers-footers}
+% \newfeature[v1.3] \pkg{ekdosis} provides a mechanism of its own for
+% emitting header and footer marks. The first operation consists in
+% recording the information to be printed as signpost by means of the
+% |mark| optional argument of the \cs{ekddiv} command described above
+% in \vref{sec:ekddiv}.
+%
+% \DescribeMacro{\ekdmark} Once this is done, \cs{ekdmark} can be
+% inserted in commands used to make headers and footers where the mark
+% is to be printed.
+%
+% A common layout is that of headers in which one finds printed in
+% sequence on even pages the page number, then the author's name, and
+% on odd pages the title of the edited text, then the current
+% division, then the page number, like so:---
+%
+% \needspace{5\baselineskip}
+% \begin{xltabular}{1.0\linewidth}{|XcX|}
+% \multicolumn{3}{l}{Even pages:}\\
+% \hline
+% \cs{thepage} & Hippocratis & \\
+% \hline
+% \multicolumn{3}{l}{Odd pages:}\\
+% \hline
+% & Epidemiarum liber II, \cs{ekdmark} & \hfill\cs{thepage}\\
+% \hline
+% \end{xltabular}
+%
+% To return to the example provided by \vref{lst:ekddiv-ex}, the mark
+% of the current division would be inserted in the third-level
+% \cs{ekddiv} command printed at line~28 like so:---
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}[firstnumber=28,linenos]{latex}
+ \ekddiv{head=1, type=paragraph, depth=3, n=II.1.1, mark={1, 1}}
+\end{minted}
+% \iffalse
+%</example>
+% \fi
+%
+% The following example finally illustrates how the corresponding
+% headers and footers can be prepared in a straightforward way with
+% the help of the \pkg{titleps} package:\footcite{titleps}---
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}[linenos=false]{latex}
+% Preamble:
+\usepackage{titleps}
+\newpagestyle{edition}{
+ \sethead[\thepage][Hippocratis][]
+ {}{Epidemiarum liber II, \ekdmark}{\thepage}
+}
+% Apply the page style:
+\pagestyle{edition}
+\end{minted}
+% \iffalse
+%</example>
+% \fi
+%
+% \DescribeMacro{\endmark} It must be noted that \cs{ekdmark} is
+% designed to print the first mark that is emitted on a given page and
+% ignore the mark corresponding to any portion of text that may be
+% printed between the top of the page and the point where the first
+% mark is called. \cs{endmark} is an argument-less command that can be
+% used just at the end of that portion of text to instruct
+% \pkg{ekdosis} to print the last-emitted mark of the preceding page
+% instead of the first-emitted mark of the current page.
+%
+% \paragraph{Removing Headers and Footers}
+% Pages such as title pages must be printed with empty headers and
+% footers. \pkg{ekdosis} must be given control over every item of
+% information inserted in these areas beforehand.
+%
+% \DescribeMacro{\ekdprintmark}
+% \cs{ekdprintmark}\marg{selector}\marg{signpost} The signposts
+% printed in headers and footers must be passed as second argument of
+% \cs{ekdprintmark} so that \pkg{ekdosis} can remove them on pages
+% where printing them is not desirable. \meta{selector} refers to
+% three symbolic letters where the first can be either |H| or
+% |F|\===for \underLine{h}eader or \underLine{f}ooter\===, the second
+% |E| or |O|\===for \underLine{o}dd or \underLine{e}ven\===and the
+% third |L|, |C| or |R|\===for \underLine{l}eft, \underLine{c}enter or
+% \underLine{r}ight. The example provided above would then read as
+% follows:---
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}[linenos=false]{latex}
+% Preamble:
+\usepackage{titleps}
+\newpagestyle{edition}{
+ \sethead[\ekdprintmark{HEL}{\thepage}]
+ [\ekdprintmark{HEC}{Hippocratis}]
+ []
+ {}
+ {\ekdprintmark{HOC}{Epidemiarum liber II, \ekdmark}}
+ {\ekdprintmark{HOR}{\thepage}}
+}
+% Apply the page style:
+\pagestyle{edition}
+\end{minted}
+% \iffalse
+%</example>
+% \fi
+%
+% \DescribeMacro{\ekdnohfmarks} Once all signposts are marked with
+% \cs{ekdprintmark}, \cs{ekdnohfmarks} can be used at any point of the
+% document with the same effect as the \LaTeX\ standard command
+% \cs{thispagestyle}|{empty}|.
+%
+% \DescribeMacro{\ekdresethfmarks} Finally, \cs{ekdresethfmarks} is
+% provided in rare cases when it is needed to reset headers and
+% footers to their original, viz.\ printable state.
+%
% \section{The Tricks of the Trade}
% \label{sec:tricks-of-trade}
% As the |.tex| source file is compiled, \pkg{ekdosis} has to compute
@@ -5206,7 +5608,9 @@ subtype="arabtex">'inna 'abI kAna mina
% pages may result in pages that break just after they begin.
%
% \paragraph{Conditional page breaks}
-% \DescribeMacro{\ekdpb} \cs{ekdpb}\oarg{page no}\marg{line no}
+% \phts\label{ref:ekdpb} \DescribeMacro{\ekdpb}\DescribeMacro{\ekdpb*}
+% \cs{ekdpb}\oarg{page no}\marg{line no}
+% \cs{ekdpb*}|{}| \cs{ekdpb*}|\|
% \newfeature[v1.2]\\
% One way to avoid this inconvenience is to use \cs{ekdpb} instead of
% the standard \cs{pagebreak} command provided by \LaTeX\ to insert
@@ -5216,7 +5620,17 @@ subtype="arabtex">'inna 'abI kAna mina
% the page number where the page break should occur. The value that is
% expected is the page number as it is printed\===e.g.\ an Arabic,
% Roman or alphanumeric number. If the specified conditions be not
-% met, then the page break is not triggered.
+% met, then the page break is not triggered. Finally, the
+% \enquote{starred} version of this command forces the page break,
+% irrespective of the values specified as page or line numbers. Unlike
+% \cs{ekdpb}, which requires the lines to be numbered, \cs{ekdpb*} is
+% allowed at any point of the document: as \cs{ekdpb*} disregards the
+% number given as argument, it is equivalent to the standard \LaTeX\
+% \cs{pagebreak} command. Yet it can be used instead of the latter to
+% have marks further printed in the margins so as to spot with a
+% fleeting glance the locations where induced page breaks
+% occur.\footnote{This requires the |showpagebreaks| option to be set
+% to |true| as described above \vpageref{ref:showpagebreaks-opt}.}
%
% \paragraph{Using \texttt{maxentries}}
% Another way\---should the edition text fall into the vicious circle
@@ -5264,6 +5678,17 @@ subtype="arabtex">'inna 'abI kAna mina
% many of them and \pkg{ekdosis} still oscillates between different
% sets of page decisions.
%
+% \paragraph{The \texttt{fitapp} Global Option}
+% \newfeature[v1.3] The rationale of this option is discussed above
+% (see \vref{ref:fitapp-opt}). As this mechanism has the characters of
+% the apparatus block scaled down to allow for more entries once a
+% predefined height has been reached, \pkg{ekdosis} should settle down
+% in most of the contentious cases.\footnote{That is, cases that arise
+% \emph{after} the predefined height has been reached.} However, it is
+% advisable to use |fitapp| conjointly with |maxentries| to prevent
+% the number of allowed entries from being too high, which would
+% result in the characters being too small or even illegible.
+%
% \subsection{Variae Quaestiones}
% \label{sec:variae-quaestiones}
% This section is about issues that are not strictly speaking part of
@@ -5532,18 +5957,19 @@ subtype="arabtex">'inna 'abI kAna mina
% |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.
+% \phts\label{ref:xmlid} 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 than letters of the Latin
+% alphabet\--- from |a| to |z|, either upper or lower case\---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} output file,
@@ -5790,7 +6216,8 @@ many mathematical writings and to the sense of
% example illustrates how \cs{EnvtoTEI} can be used conjointly with
% \pkg{babel} to convey information about the languages used from
% \LaTeX\ to \texttt{TEI}:---
-%
+%
+% \phts\label{ref:ancientgreek-ex}
% \iffalse
%<*example>
% \fi
@@ -5841,6 +6268,14 @@ many mathematical writings and to the sense of
% strings captured are inserted where each of them is expected in
% the \texttt{TEI} element.
%
+% \danger If the entire string to be captured be enclosed in square or
+% curly brackets, it is advisable to use |@b|\texttt{\emph{n}} (for
+% curly brackets) or |@s|\texttt{\emph{n}} (for square brackets)
+% instead of |#|\texttt{\emph{n}}, where \texttt{\emph{n}} is the
+% number that is expected in the sequence. This will prevent any
+% brackets that may be found in the captured string from being
+% interpreted.
+%
% \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
@@ -5855,14 +6290,22 @@ many mathematical writings and to the sense of
% \iffalse
%<*example>
% \fi
-\begin{minted}[linenos=false]{latex}
-\TeXtoTEIPat{\textcolor␣{#1}{#2}}{<hi rend="#1">#2</hi>}
+\begin{minted}[linenos]{latex}
+\TeXtoTEIPat{\textcolor␣{#1}@b2}{<hi rend="#1">@b2</hi>}
Sample text with a \textcolor{red}{word} in red.
\end{minted}
% \iffalse
%</example>
% \fi
+%
+% \begin{remarks}
+% \item[\textsc{Rem.}] As can be seen from l.~1, it is safe to use
+% |#1| for the first string for color names are naturally formed of
+% letters without braces. However, |@b2| is preferable to capture
+% the whole second argument of \cs{textcolor} for it may contain
+% words within braces.
+% \end{remarks}
%
% \iffalse
%<*example>
@@ -5875,6 +6318,91 @@ Sample text with a \textcolor{red}{word} in red.
%</example>
% \fi
%
+% \subsection{Inserting Code in the \texttt{TEI xml} Ouput File}
+% \label{sec:inserting-code-tei}
+% It may be needed to insert code in the \texttt{TEI xml} output file
+% only, for example when clear enough information is written in the
+% apparatus criticus by means of such optional arguments as |pre|,
+% |post|, |prewit| or |postwit| that are not processed for \texttt{TEI
+% xml} ouput.\footnote{See above \vref{sec:single-text-editing}.}
+%
+% \needspace{2\baselineskip}
+% \DescribeMacro{\teidirect} \newfeature[v1.3] \cs{teidirect}\oarg{xml
+% attributes}\marg{xml element}\marg{code}\\
+% Two mandatory arguments are expected by \cs{teidirect}, namely the
+% \texttt{TEI xml} element followed by the contents to be found in the
+% ouput file between the opening and closing tags. Additionally,
+% attribute-value pairs to be found inside the start-tag of the
+% element can be specified in the optional argument of the command. An
+% example follows:
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}[linenos]{latex}
+% Preamble:
+\DeclareWitness{GalE1.M}{Gal.E1(M)}{\emph{Monacencis Gr.}
+ 231}[origDate=s. XVI]
+\DeclareWitness{GalE1.Q}{Gal.E1(Q)}{\emph{Parisinus Gr.}
+ 2174}[origDate=s. XIV]
+ \DeclareShorthand{GalE1.M.Q}{Gal.E1(MQ)}{GalE1.M,GalE1.Q}
+
+% Document:
+ἐν \app{
+ \lem[wit=codd]{καύμασιν}
+ \rdg[wit=GalE1.M.Q, postwit=\unskip(23.16)]{καύματι}
+ \teidirect{note}{p. 23, l. 16 Wenkebach}}
+\end{minted}
+% \iffalse
+%</example>
+% \fi
+%
+% \begin{remarks}
+% \item |GalE1.M.Q| (l.~11) has been defined as a shorthand to denote
+% the agreement of two otherwise defined manuscripts by means of
+% \cs{DeclareWitness}: |GalE1.M| and |GalE1.Q|. (See ll.~2--6.)
+% \item The |postwit| optional argument has been used to further
+% specify the location where this variant reading can be found in
+% the critical edition of Galen's Commentary on Hippocrates'
+% \emph{Epidemics}, Book~1 (l.~11). But as the effect of |postwit|
+% is limited to the PDF output, \cs{teidirect} has been used to
+% convey this item of information to the \texttt{TEI xml} ouput file
+% (l.~12).
+% \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=hcodd]{καύμασιν}
+% \rdg[wit=hGalE1.M.Q, postwit=\unskip(23.16)]{καύματι}
+% \teidirect{note}{p. 23, l. 16 Wenkebach}}
+% \end{ancientgreek}
+% \end{specimen}
+% \end{alignment}
+%
+% \texttt{TEI xml} output:---
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{minted}[linenos]{xml}
+<p xml:lang="grc">ἐν
+<app>
+ <lem wit="#V #I #R #H">καύμασιν</lem>
+ <rdg wit="#GalE1.#M #GalE1.Q">καύματι</rdg>
+ <note>p. 23, l. 16 Wenkebach</note>
+</app></p>
+\end{minted}
+% \iffalse
+%</example>
+% \fi
+%
% \subsection{Specific \texttt{TEI} Modules}
% \label{sec:specific-tei-modules}
% The following example illustrates how \pkg{ekdosis} can be adapted
@@ -6189,8 +6717,8 @@ Sample text with a \textcolor{red}{word} in red.
% \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 |<ptr>| or
-% |<ref>| elements with the appropriate identifier supplied by means
-% of the |target| attribute.
+% |<bibl>| elements with the appropriate identifier supplied by means
+% of the |target| or |corresp| attributes.
%
% Of course, for this mechanism to work, Bib\TeX\ or Bib\LaTeX\ must
% be used and connected to some |.bib| bibliographical database
@@ -6210,7 +6738,7 @@ Sample text with a \textcolor{red}{word} in red.
% \fi
\begin{minted}[linenos=false]{bibtex}
@Book{ReynoldsWilson1991,
- author = {Reynolds, L. D. and Wilson, N. G},
+ author = {Reynolds, L. D. and Wilson, N. G.},
title = {Scribes and Scholars},
year = {1991},
subtitle = {A Guide to the Translation of Greek and Latin
@@ -6306,7 +6834,9 @@ Sample text with a \textcolor{red}{word} in red.
<text>
<body>
<p>On textual criticism, see
- <ref target="#ReynoldsWilson1991">207--241</ref>.</p>
+ <bibl corresp="#ReynoldsWilson1991">
+ <biblScope>207--241</biblScope>
+ </bibl>.</p>
</body>
<back>
<listBibl>
@@ -6376,8 +6906,6 @@ Sample text with a \textcolor{red}{word} in red.
% \item Marginal edition texts: It may happen that the marginalia of
% manuscripts contain texts worth editing in addition to and along
% the main text to which they are linked by reference signs.
-% \item Headers and footers: \cs{ekddiv} will provide top and bottom
-% marks to be used in headers and footers.
% \end{enumerate}
% \item Short-term (months):---
% \begin{enumerate}
@@ -7034,6 +7562,8 @@ Sample text with a \textcolor{red}{word} in red.
\RequirePackage{expkv-def}
\newif\if@pkg@float
\newif\if@pkg@footins
+\newif\if@pkg@keyfloat
+\newif\if@pkg@fitfloat
\newif\if@pkg@ekddivs
\newif\if@parnotesroman
\newif\if@pkg@parnotes
@@ -7041,7 +7571,9 @@ Sample text with a \textcolor{red}{word} in red.
\newif\if@pkg@poetry@verse
\ekvdefinekeys{ekdosis}{
choice layout = {float = {\@pkg@floattrue},
- footins = {\@pkg@floatfalse\@pkg@footinstrue}},
+ footins = {\@pkg@floatfalse\@pkg@footinstrue},
+ keyfloat = {\@pkg@floatfalse\@pkg@keyfloattrue},
+ fitfloat = {\@pkg@floatfalse\@pkg@fitfloattrue}},
initial layout = float,
unknown-choice layout = \PackageError{ekdosis}{unknown
layout=#1}{`layout' must be either `float' or `footins'.},
@@ -7089,7 +7621,21 @@ Sample text with a \textcolor{red}{word} in red.
\RequirePackage{paracol}
\RequirePackage{etoolbox}
\RequirePackage{lineno}
-\RequirePackage{keyfloat}
+\if@pkg@float
+ \RequirePackage{trivfloat}
+ \trivfloat{ekdapparatus}
+\fi
+\if@pkg@keyfloat
+ \RequirePackage{keyfloat}
+ \def\ekd@keyparopts#1{%
+ \def\ekd@insert@keyparapp{%
+ \keyparbox[!b]{#1}{\ekd@insert@apparatus}}}
+ \ekd@keyparopts{}
+\fi
+\if@pkg@fitfloat
+ \RequirePackage{tcolorbox}
+ \tcbuselibrary{fitting,skins}
+\fi
\RequirePackage{refcount}
\RequirePackage{zref-user}
\RequirePackage{zref-abspage}
@@ -7112,6 +7658,23 @@ Sample text with a \textcolor{red}{word} in red.
\luadirect{ekdosis.closestream()}
}
% \end{macrocode}
+% \paragraph{Setup}
+% \begin{macro}{\ekdsetup}
+% \changes{v1.3}{2021/08/18}{new command for global options}
+% \cs{ekdsetup} is used to specify options that affect the general
+% behavior of \pkg{ekdosis}. It is a preamble-only command.
+% \begin{macrocode}
+\ekvdefinekeys{ekd@setup}{
+ bool showpagebreaks = \ifekd@showpb,
+ store spbmk = \ekd@spbmk,
+ initial spbmk = spb,
+ store hpbmk = \ekd@hpbmk,
+ initial hpbmk = hpb,
+}
+\NewDocumentCommand{\ekdsetup}{m}{\ekvset{ekd@setup}{#1}}
+\@onlypreamble\ekdsetup
+% \end{macrocode}
+% \end{macro}
% \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
@@ -7120,6 +7683,8 @@ Sample text with a \textcolor{red}{word} in red.
% \texttt{lemmastyle}}
% \changes{v1.2}{2021/04/02}{general hooks: new option
% \texttt{readingstyle}}
+% \changes{v1.3}{2021/08/18}{general hooks: new options
+% \texttt{keyparopts} and \texttt{appheight}}
% \begin{macrocode}
\ekvdefinekeys{ekd@hooks}{
store appfontsize = \ekd@appfontsize,
@@ -7127,6 +7692,17 @@ Sample text with a \textcolor{red}{word} in red.
store postrefnum = \ekd@postrefnum,
store lemmastyle = \ekd@lemmastyle,
store readingstyle = \ekd@readingstyle,
+ code keyparopts = \if@pkg@keyfloat\ekd@keyparopts{#1}\fi,
+ dimen appheight = \ekd@app@height,
+ initial appheight = .5\textheight,
+ choice fitalgorithm = {fontsize = \def\ekd@fit@algorithm{fontsize},
+ hybrid = \def\ekd@fit@algorithm{hybrid},
+ areasize = \def\ekd@fit@algorithm{areasize},
+ squeeze = \def\ekd@fit@algorithm{squeeze}},
+ initial fitalgorithm = fontsize,
+ unknown-choice fitalgorithm = \PackageError{ekdosis}{unknown
+ fitalgorithm=#1}{`fitalgorithm' must be either `fontsize',
+ `hybrid', `areasize' or `squeeze'.},
code initialrule = \def\ekd@initial@rule{#1\NLS},
default initialrule = \rule{0.4\columnwidth}{0.4pt},
noval noinitialrule = \undef\ekd@initial@rule,
@@ -7148,7 +7724,8 @@ Sample text with a \textcolor{red}{word} in red.
store collection = \collection@value,
store idno = \idno@value,
store msName = \msName@value,
- store origDate = \origDate@value
+ store origDate = \origDate@value,
+ store locus = \locus@value
}
% \end{macrocode}
% \begin{macro}{\DeclareWitness} \cs{DeclareWitness} is a
@@ -7171,7 +7748,8 @@ Sample text with a \textcolor{red}{word} in red.
\luastringO{\collection@value},
\luastringO{\idno@value},
\luastringO{\msName@value},
- \luastringO{\origDate@value})}
+ \luastringO{\origDate@value},
+ \luastringO{\locus@value})}
\egroup
}
\@onlypreamble\DeclareWitness
@@ -7325,6 +7903,16 @@ Sample text with a \textcolor{red}{word} in red.
}
% \end{macrocode}
% \end{macro}
+% \begin{macro}{\teidirect}
+% \changes{v1.3}{2021/08/18}{direct insertion of elements in the
+% \texttt{TEI xml} file}
+% \cs{teidirect}\oarg{xml attributes}\marg{xml element}\marg{code}
+% does nothing in \LaTeX. Its only use is to insert elements in the
+% \texttt{TEI xml} output file.
+% \begin{macrocode}
+\NewDocumentCommand{\teidirect}{O{}mm}{\ignorespaces}
+% \end{macrocode}
+% \end{macro}
% \begin{macro}{\EnvtoTEI}
% \begin{macro}{\EnvtoTEI*}
% \cs{EnvtoTEI}\meta{*}\marg{env name}\marg{TEI element}\oarg{TEI
@@ -7390,8 +7978,20 @@ Sample text with a \textcolor{red}{word} in red.
\@onlypreamble\AddxmlBibResource
% \end{macrocode}
% \end{macro}
-%
-%\paragraph{Multiple-layer apparatuses}
+% \begin{macro}{\ekd@test@lang}
+% \cs{ekd@test@lang} is used internally by \pkg{ekdosis}. This command
+% returns \cs{ekd@lang@pkgtrue} if either \pkg{babel} or
+% \pkg{polyglossia} be used so that \cs{languagename} can be inserted
+% when and where needed in the apparatus criticus.
+% \begin{macrocode}
+\newif\ifekd@lang@pkg
+\NewDocumentCommand{\ekd@test@lang}{}{%
+ \ltx@ifpackageloaded{babel}{\ekd@lang@pkgtrue}{}%
+ \ltx@ifpackageloaded{polyglossia}{\ekd@lang@pkgtrue}{}%
+}
+% \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}
@@ -7412,6 +8012,7 @@ Sample text with a \textcolor{red}{word} in red.
store ehook = \ehook@val,
store maxentries = \limit@val,
store lang = \lang@val,
+ store notelang = \notelang@val,
initial direction = LR,
initial delim = {},
initial ehook = {\csname ekd@end@apparatus\endcsname}
@@ -7444,7 +8045,8 @@ Sample text with a \textcolor{red}{word} in red.
\luastringO{\bhook@val},
\luastringO{\ehook@val},
\luastringO{\limit@val},
- \luastringO{\lang@val}
+ \luastringO{\lang@val},
+ \luastringO{\notelang@val}
)}
\egroup
}
@@ -7473,29 +8075,42 @@ Sample text with a \textcolor{red}{word} in red.
% \cs{ekdpk}\oarg{page no}\marg{line no} is used to insert conditional
% page breaks by specifying that the page break should occur only on a
% given line and optionally a given page. If the specified conditions
-% are met then this command triggers \cs{pagebreak}.
+% be met then this command triggers \cs{pagebreak}.
% \begin{macrocode}
-\NewDocumentCommand{\ekdpb}{o m}{%
- \def\@tmpoarg{#1}%
- \def\@tmpmarg{#2}%
- \luadirect{ekdosis.dolnlab(\luastringN{#2})}%
- \linelabel{\luadirect{tex.sprint(ekdosis.getlnlab())}}%
- \def\tmp@ln{%
- \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}}}%
- \def\tmp@pg{%
- \getpagerefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}}}%
- \IfNoValueTF{#1}
- {\ifnum
- \pdf@strcmp{\@tmpmarg}{\tmp@ln} = 0
- \pagebreak
- \fi}
- {\ifnum
- \pdf@strcmp{\@tmpoarg}{\tmp@pg} = 0
- \ifnum
- \pdf@strcmp{\@tmpmarg}{\tmp@ln} = 0
- \pagebreak
- \fi
- \fi
+\newcounter{ekd@pb}
+\globalcounter{ekd@pb}
+\NewDocumentCommand{\ekdpb}{s o m}{%
+ \IfBooleanTF{#1}
+ {\ifekd@showpb\marginpar{\ekd@hpbmk}\fi
+ \pagebreak}
+ {%
+ \def\@tmpoarg{#2}%
+ \def\@tmpmarg{#3}%
+ \stepcounter{ekd@pb}%
+ \linelabel{ekdpb:\theekd@pb}%
+ \def\tmp@ln{%
+ \getrefnumber{ekdpb:\theekd@pb}}%
+ \def\tmp@pg{%
+ \getpagerefnumber{ekdpb:\theekd@pb}}%
+ \IfNoValueTF{#2}
+ {\ifnum
+ \pdf@strcmp{\@tmpmarg}{\tmp@ln} = 0
+ \ifekd@showpb\marginpar{\ekd@spbmk}\fi
+ \pagebreak
+ \else
+ \ifekd@showpb\marginpar{[\ekd@spbmk]}\fi
+ \fi}
+ {\ifnum
+ \pdf@strcmp{\@tmpoarg}{\tmp@pg} = 0
+ \ifnum
+ \pdf@strcmp{\@tmpmarg}{\tmp@ln} = 0
+ \ifekd@showpb\marginpar{\ekd@spbmk}\fi
+ \pagebreak
+ \else
+ \ifekd@showpb\marginpar{[\ekd@spbmk]}\fi
+ \fi
+ \fi
+ }%
}\ignorespaces
}
% \end{macrocode}
@@ -7507,6 +8122,7 @@ Sample text with a \textcolor{red}{word} in red.
\newif\ifekd@state
\newif\ifekd@isinapp
\newif\ifekd@isinlem
+\newif\ifekd@appinapp
% \end{macrocode}
% The next boolean is shared with \pkg{arabluatex}. \cs{LRnum} is used
% internally to ensure that numerals referring to line spans are
@@ -7581,7 +8197,11 @@ Sample text with a \textcolor{red}{word} in red.
initial rule = \rule{0.4\columnwidth}{0.4pt},
noval norule = \def\ekd@default@rule{\mbox{}},
store lang = \ekd@singleapp@lang,
- initial lang = \ltx@ifpackageloaded{babel}{\languagename}{}
+ initial lang = \ltx@ifpackageloaded{babel}{\languagename}{%
+ \ltx@ifpackageloaded{polyglossia}{\languagename}{}},
+ store notelang = \ekd@singleapp@note@lang,
+ initial notelang = \ltx@ifpackageloaded{babel}{\languagename}{%
+ \ltx@ifpackageloaded{polyglossia}{\languagename}{}}
}
% \end{macrocode}
% \begin{macro}{\SetApparatus}
@@ -7650,6 +8270,18 @@ Sample text with a \textcolor{red}{word} in red.
\def\ekd@singleapp@lang{#1}}
% \end{macrocode}
% \end{macro}
+% \begin{macro}{\SetApparatusNoteLanguage}
+% \changes{v1.3}{2021/08/18}{defines an alternate language to be
+% applied in note apparatus entries}
+% \cs{SetApparatusNoteLang}\marg{languagename} can be used when
+% it is needed to apply in entries introduced by the \cs{note} command
+% a language different from the one that is selected in the edition
+% text.
+% \begin{macrocode}
+\NewDocumentCommand{\SetApparatusNoteLanguage}{m}{%
+ \def\ekd@singleapp@note@lang{#1}}
+% \end{macrocode}
+% \end{macro}
% \begin{macro}{\footnoteruletrue}
% \begin{macro}{\footnoterulefalse}
% As \pkg{ekdosis} takes care of drawing a rule separating the main
@@ -7723,6 +8355,42 @@ Sample text with a \textcolor{red}{word} in red.
% apparatus criticus, a conditional is first defined.
% \begin{macrocode}
\newif\ifekd@inside@app
+% \end{macrocode}
+% Then \cs{ekd@fitapp} is defined for |layout=fitapp|:---
+% \begin{macrocode}
+\if@pkg@fitfloat
+ \newtcboxfit{\ekd@fitapp}{%
+ blankest,
+ fit basedim = \f@size pt,
+ fit fontsize macros,
+ fit height from=0pt to \ekd@app@height,
+ fit algorithm = \ekd@fit@algorithm,
+ float=!b}
+\fi
+% \end{macrocode}
+% Finally two commands are used to actually insert the apparatus
+% depending on the value set in the |layout| global option.
+% \begin{macrocode}
+\long\def\ekd@insert@apparatus{%
+ \unless\ifekd@mapps
+ \ifrtl@app\pardir TRT\leavevmode\textdir TRT\else
+ \pardir TLT\leavevmode\textdir TLT\fi
+ \fi
+ \if@pkg@parnotes
+ \if@parnotesroman
+ \renewcommand*{\theparnotemark}{\roman{parnotemark}}\fi
+ \parnoteclear\fi
+ \ekd@inside@apptrue
+ \ekd@appfontsize
+ \ifekd@mapps
+ \ifdefined\ekd@initial@rule
+ \ekd@initial@rule
+ \fi
+ \fi
+ \apparatus\unless\ifekd@mapps\ekd@end@apparatus\fi
+ \ekd@inside@appfalse
+ \if@pkg@parnotes\parnotes\parnotereset\fi
+}%
\def\add@@apparatus{%
\if@pkg@parnotes\parnotes\else\fi
\if@pkg@footins
@@ -7750,26 +8418,15 @@ Sample text with a \textcolor{red}{word} in red.
\egroup
\fi
\if@pkg@float
- \keyparbox[!b]{}{%
- \unless\ifekd@mapps
- \ifrtl@app\pardir TRT\leavevmode\textdir TRT\else
- \pardir TLT\leavevmode\textdir TLT\fi
- \fi
- \if@pkg@parnotes
- \if@parnotesroman
- \renewcommand*{\theparnotemark}{\roman{parnotemark}}\else\fi
- \parnoteclear\else\fi
- \ekd@inside@apptrue
- \ekd@appfontsize
- \ifekd@mapps
- \ifdefined\ekd@initial@rule
- \ekd@initial@rule
- \fi
- \fi
- \apparatus\unless\ifekd@mapps\ekd@end@apparatus\fi
- \ekd@inside@appfalse
- \if@pkg@parnotes\parnotes\parnotereset\else\fi
- }%
+ \begin{ekdapparatus}[!b]%
+ \ekd@insert@apparatus
+ \end{ekdapparatus}%
+ \fi
+ \if@pkg@keyfloat
+ \ekd@insert@keyparapp
+ \fi
+ \if@pkg@fitfloat
+ \ekd@fitapp{\ekd@insert@apparatus}%
\fi
}
% \end{macrocode}
@@ -7802,7 +8459,7 @@ Sample text with a \textcolor{red}{word} in red.
{\luadirect{tex.sprint(ekdosis.mdvappend(\luastringO{#2},
\luastringO{#1}))}}}
% \end{macrocode}
-% \paragraph{Lineation settings}
+% \paragraph{Lineation Settings}
% \begin{macro}{\outerlinenumbers}
% \begin{macro}{\innerlinenumbers}
% \pkg{ekdosis} does not use the \enquote{pagewise} numbering mode
@@ -7849,7 +8506,9 @@ Sample text with a \textcolor{red}{word} in red.
\newif\ifekd@elidednumbers
\ekvdefinekeys{ekd@lineation}{
choice lineation = {page = \ekd@pagelineationtrue,
- document = \ekd@pagelineationfalse},
+ document = \ekd@pagelineationfalse,
+ none = \ekd@pagelineationtrue
+ \renewcommand\thelinenumber{}},
unknown-choice lineation = \PackageError{ekdosis}{unknown
lineation=#1}{`lineation' must be either `page' or `document'.},
choice vlineation = {page = \ekd@pagevlineationtrue,
@@ -7921,14 +8580,16 @@ Sample text with a \textcolor{red}{word} in red.
\leavevmode
\begingroup
\ekvset{appnote}{#1}%
- \ekd@isinapptrue%
+ \ifekd@isinapp\ekd@appinapptrue\fi
+ \ekd@isinapptrue
\stepcounter{ekd@lab}%
\zlabel{ekd:\theekd@lab}%
\luadirect{ekdosis.storeabspg(
\luastring{\zref@extract{ekd:\theekd@lab}{abspage}})}%
- \ifekd@state\add@apparatus\fi%
+ \ifekd@state\add@apparatus\fi
\luadirect{tex.sprint(ekdosis.removesp(\luastringN{#2}))}%
- \ekd@isinappfalse%
+ \ekd@isinappfalse
+ \ekd@appinappfalse
\endgroup}
% \end{macrocode}
% \end{macro}
@@ -7988,10 +8649,16 @@ Sample text with a \textcolor{red}{word} in red.
\fi
\fi%
\else
- \LRnum{\getrefnumber{#1}}--%
- \LRnum{\getpagerefnumber{#2}}.%
- \LRnum{\getrefnumber{#2}}\unexpanded\expandafter{\ekd@postrefnum}% issue pg and ln nos
+ \ifboolexpr{bool {ekd@pagelineation} or bool {ekd@pagevlineation}}
+ {\LRnum{\getrefnumber{#1}}--%
+ \LRnum{\getpagerefnumber{#2}}.%
+ \LRnum{\getrefnumber{#2}}\unexpanded\expandafter{\ekd@postrefnum}}% issue pg and ln nos
+ {\LRnum{\getrefnumber{#1}}--%
+ \LRnum{\getrefnumber{#2}}\unexpanded\expandafter{\ekd@postrefnum}}% issue the nos
\fi%
+ \ifekdn@forcenum
+ \LRnum{\getrefnumber{#1}}\unexpanded\expandafter{\ekd@postrefnum}% force the no
+ \fi
}%
}
% \end{macrocode}
@@ -8021,6 +8688,28 @@ Sample text with a \textcolor{red}{word} in red.
{\getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b}}
=
0
+ %%%begin
+ \ifnum%
+ \pdf@strcmp{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}%
+ {\getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-e}}
+ =
+ 0
+ \ifekd@appinapp
+ \ifnum%
+ \pdf@strcmp{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+ {\getrefnumber{\luadirect{tex.sprint(ekdosis.getprevprevlnlab())}-b}}
+ =
+ 0
+ \else
+ \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+ \unexpanded\expandafter{\ekd@postrefnum}% issue the no
+ \fi
+ \fi
+ \else
+ \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+ \unexpanded\expandafter{\ekd@postrefnum}% issue the no
+ \fi
+ %%% end
\else
\LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
\unexpanded\expandafter{\ekd@postrefnum}% issue the no
@@ -8035,6 +8724,28 @@ Sample text with a \textcolor{red}{word} in red.
{\getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b}}
=
0
+ %%%begin
+ \ifnum%
+ \pdf@strcmp{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}%
+ {\getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-e}}
+ =
+ 0
+ \ifekd@appinapp
+ \ifnum%
+ \pdf@strcmp{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+ {\getrefnumber{\luadirect{tex.sprint(ekdosis.getprevprevlnlab())}-b}}
+ =
+ 0
+ \else
+ \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+ \unexpanded\expandafter{\ekd@postrefnum}% issue the no
+ \fi
+ \fi
+ \else
+ \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+ \unexpanded\expandafter{\ekd@postrefnum}% issue the no
+ \fi
+ %%% end
\else
\LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
\unexpanded\expandafter{\ekd@postrefnum}% issue the no
@@ -8059,17 +8770,27 @@ Sample text with a \textcolor{red}{word} in red.
\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}}%
- \unexpanded\expandafter{\ekd@postrefnum}% issue pg and ln nos
+ \ifboolexpr{bool {ekd@pagelineation} or bool {ekd@pagevlineation}}
+ {\LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}--%
+ \LRnum{\getpagerefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}.%
+ \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}%
+ \unexpanded\expandafter{\ekd@postrefnum}}% issue pg and ln nos
+ {\LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}--%
+ \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}%
+ \unexpanded\expandafter{\ekd@postrefnum}}% issue the nos
\fi%
+ \ifekdl@forcenum
+ \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}%
+ \unexpanded\expandafter{\ekd@postrefnum}% force the no
+ \fi
}%
}
% \end{macrocode}
% Define keys to be used by the optional arguments of \cs{lem} and
% \cs{rdg}:---
% \begin{macrocode}
+\newif\ifekdl@forcenum
+\newif\ifekdl@nonum
\ekvdefinekeys{lem}{
code wit = \def\ekdlr@wit{#1},
code source = \def\ekdlr@source{#1},
@@ -8081,6 +8802,8 @@ Sample text with a \textcolor{red}{word} in red.
code postwit = \def\ekdlr@postwit{#1},
store type = \ekdlr@type,
store sep = \ekdl@sep,
+ noval nonum = \ekdl@nonumtrue,
+ noval num = \ekdl@forcenumtrue,
bool nolem = \ifekdl@nolem,
bool nosep = \ifekdl@nosep,
initial sep = \ekdsep
@@ -8113,8 +8836,9 @@ Sample text with a \textcolor{red}{word} in red.
% \end{macrocode}
% \end{macro}
% \begin{macro}{\app@lang}
-% This macro is used internally by \cs{lem}, \cs{rdg} and \cs{note} to
-% set the language for apparatus entries.
+% \begin{macro}{\app@note@lang}
+% \cs{app@lang} is used internally by \cs{lem} and \cs{rdg} to set the
+% language for apparatus entries. \cs{note} uses \cs{\app@note@lang}.
% \begin{macrocode}
\def\app@lang{%
\ifekd@mapps
@@ -8123,8 +8847,16 @@ Sample text with a \textcolor{red}{word} in red.
\ekd@singleapp@lang
\fi
}
+\def\app@note@lang{%
+ \ifekd@mapps
+ \luadirect{tex.sprint(ekdosis.getappnotelang(\luastring{\ekdan@type}))}%
+ \else
+ \ekd@singleapp@note@lang
+ \fi
+}
% \end{macrocode}
% \end{macro}
+% \end{macro}
% \begin{macro}{\lem}
% \cs{lem}\oarg{options}\marg{lemma text} inserts \meta{lemma text}
% both in the edition text and in the apparatus criticus by default,
@@ -8137,7 +8869,10 @@ Sample text with a \textcolor{red}{word} in red.
\luadirect{ekdosis.dolnlab(\luastringN{#2})}%
\null
\bgroup%
+ \ekdl@forcenumfalse
+ \ekdl@nonumfalse
\ekvset{lem}{#1}%
+ \ekd@test@lang
\ifekd@mapps%
\ifnum%
\luadirect{tex.sprint(ekdosis.get_bagunits(\luastringO{\ekdan@type}))}
@@ -8157,7 +8892,7 @@ Sample text with a \textcolor{red}{word} in red.
\else%
\ifsubsq@unit\unexpanded\expandafter{\ekd@unit@delim}\fi%
\fi%
- \current@ref}%\hskip .25em}%
+ \unless\ifekdl@nonum\current@ref\fi}%\hskip .25em}%
\else%
\ifbool{al@rlmode}{%
\edef\lem@app{%
@@ -8168,7 +8903,7 @@ Sample text with a \textcolor{red}{word} in red.
\else%
\ifsubsq@unit\unexpanded\expandafter{\ekd@unit@delim}\fi%
\fi%
- \current@ref%\hskip .25em
+ \unless\ifekdl@nonum\current@ref\fi%\hskip .25em
\ifdefined\ekdlr@alt%
\ifdefined\ekdlr@post%
\space\unexpanded\expandafter{\ekdlr@post}\space\else\fi
@@ -8203,11 +8938,11 @@ Sample text with a \textcolor{red}{word} in red.
\else%
\ifsubsq@unit\unexpanded\expandafter{\ekd@unit@delim}\fi%
\fi%
- \current@ref%\hskip .25em
+ \unless\ifekdl@nonum\current@ref\fi%\hskip .25em
\ifdefined\ekdlr@alt%
\ifdefined\ekdlr@pre%
\space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi
- \ltx@ifpackageloaded{babel}%
+ \ifbool{ekd@lang@pkg}%
{{\unexpanded\expandafter{\ekd@lemmastyle}%
\noexpand\selectlanguage{\app@lang}%
\unexpanded\expandafter{\ekdlr@alt}}}%
@@ -8218,7 +8953,7 @@ Sample text with a \textcolor{red}{word} in red.
\else
\ifdefined\ekdlr@pre%
\space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi
- \ltx@ifpackageloaded{babel}%
+ \ifbool{ekd@lang@pkg}%
{{\unexpanded\expandafter{\ekd@lemmastyle}%
\noexpand\selectlanguage{\app@lang}%
\unexpanded{#2}}}{%
@@ -8257,6 +8992,7 @@ Sample text with a \textcolor{red}{word} in red.
\NewDocumentCommand{\rdg}{O{} m}{%
\bgroup%
\ekvset{rdg}{#1}%
+ \ekd@test@lang
% \ifekdr@nordg\append@app{}\else% do we need \append@app{} here? If
% % so, keep in mind \ifekd@mapps,
% like so:
@@ -8298,7 +9034,7 @@ Sample text with a \textcolor{red}{word} in red.
\ifdefined\ekdlr@alt%
\ifdefined\ekdlr@pre%
\space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi
- \ltx@ifpackageloaded{babel}%
+ \ifbool{ekd@lang@pkg}%
{{\unexpanded\expandafter{\ekd@readingstyle}%
\noexpand\selectlanguage{\app@lang}%
\unexpanded\expandafter{\ekdlr@alt}}}%
@@ -8309,7 +9045,7 @@ Sample text with a \textcolor{red}{word} in red.
\else
\ifdefined\ekdlr@pre%
\space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi
- \ltx@ifpackageloaded{babel}%
+ \ifbool{ekd@lang@pkg}%
{{\unexpanded\expandafter{\ekd@readingstyle}%
\noexpand\selectlanguage{\app@lang}\unexpanded{#2}}}{%
{\unexpanded\expandafter{\ekd@readingstyle}\unexpanded{#2}}}%
@@ -8338,6 +9074,7 @@ Sample text with a \textcolor{red}{word} in red.
% Define keys to be used by the optional argument of \cs{note} when
% this command is found outside \cs{app}:---
% \begin{macrocode}
+\newif\ifekdn@forcenum
\ekvdefinekeys{note}{
store type = \ekdan@type,
store lem = \ekdn@lem,
@@ -8346,7 +9083,9 @@ Sample text with a \textcolor{red}{word} in red.
store sep = \ekdn@sep,
bool nosep = \ifekdn@nosep,
initial type = default,
- initial sep = \ekdsep
+ initial sep = \ekdsep,
+ bool nonum = \ifekdn@nonum,
+ noval num = \ekdn@forcenumtrue
}
% \end{macrocode}
% \cs{note@noapp} is used internally when a \cs{note} command is found
@@ -8361,6 +9100,7 @@ Sample text with a \textcolor{red}{word} in red.
\leavevmode
\bgroup%
\ekvset{note}{#1}%
+ \ekd@test@lang
\stepcounter{ekd@lab}%
\zlabel{ekd:\theekd@lab}%
\luadirect{ekdosis.storeabspg(
@@ -8391,7 +9131,7 @@ Sample text with a \textcolor{red}{word} in red.
\else%
\ifsubsq@unit\unexpanded\expandafter{\ekd@unit@delim}\fi%
\fi%
- \current@ref@arg{\ekdn@labelb}{\ekdn@labele}%\hskip .25em
+ \unless\ifekdn@nonum\current@ref@arg{\ekdn@labelb}{\ekdn@labele}\fi%\hskip .25em
\ifdefined\ekdn@lem%
{\textdir TRT\unexpanded\expandafter{\ekd@lemmastyle}%
\unexpanded\expandafter{\ekdn@lem}}%
@@ -8407,9 +9147,9 @@ Sample text with a \textcolor{red}{word} in red.
\else%
\ifsubsq@unit\unexpanded\expandafter{\ekd@unit@delim}\fi%
\fi%
- \current@ref@arg{\ekdn@labelb}{\ekdn@labele}%\hskip .25em
+ \unless\ifekdn@nonum\current@ref@arg{\ekdn@labelb}{\ekdn@labele}\fi%\hskip .25em
\ifdefined\ekdn@lem
- \ltx@ifpackageloaded{babel}%
+ \ifbool{ekd@lang@pkg}%
{{\unexpanded\expandafter{\ekd@lemmastyle}%
\noexpand\selectlanguage{\app@lang}%
\unexpanded\expandafter{\ekdn@lem}}}%
@@ -8418,8 +9158,8 @@ Sample text with a \textcolor{red}{word} in red.
\unless\ifekdn@nosep
\unexpanded\expandafter{\ekdn@sep}\fi
\else\fi%
- \ltx@ifpackageloaded{babel}%
- {{\noexpand\selectlanguage{\app@lang}\unexpanded{#2}}}{%
+ \ifbool{ekd@lang@pkg}%
+ {{\noexpand\selectlanguage{\app@note@lang}\unexpanded{#2}}}{%
{\unexpanded{#2}}}}}%
\ifekd@mapps%
\unconditional@appin[\ekdan@type]{\note@contents}%
@@ -8466,25 +9206,25 @@ Sample text with a \textcolor{red}{word} in red.
\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
- \ifekd@mapps%
+ \bgroup
+ \ekvset{ekd@note}{#1}%
+ \edef\note@contents{%
+ \ekvifdefinedNoVal{ekd@note}{pre}{}{%
+ \unexpanded\expandafter{\pre@value}}%
+ \if@pkg@parnotes
+ \unskip\noexpand\parnote{\unexpanded{#2}}%
+ \else
+ \unskip\noexpand\footnote{\unexpanded{#2}}%
+ \fi
+ \ekvifdefinedNoVal{ekd@note}{post}{}{%
+ \unexpanded\expandafter{\post@value}}%
+ }%
+ \ifekd@mapps
\append@app[\ekdan@type]{\note@contents}%
- \else%
+ \else
\append@app{\note@contents}%
- \fi%
- \fi%
+ \fi
+ \egroup
}
\NewDocumentCommand{\note@app}{s O{} +m}{%
\ifbool{al@rlmode}{%
@@ -8781,6 +9521,116 @@ Sample text with a \textcolor{red}{word} in red.
}
% \end{macrocode}
% \end{environment}
+% \paragraph{Headers and Footers}
+% \pkg{ekdosis} provides a mechanism of its own for headers and
+% footers as follows. Most of it is handled by \textsf{Lua}
+% functions.
+% \begin{macro}{\ekd@storemark}
+% \cs{ekd@storemark} is used internally by the |mark| optional
+% argument of \cs{ekddiv} described below to store marks to be
+% printed at specific places in headers or footers.
+% \begin{macrocode}
+\NewDocumentCommand{\ekd@storemark}{m}{%
+ \stepcounter{ekd@lab}%
+ \label{ekd:\theekd@lab}%
+ \luadirect{ekdosis.storehfmark(
+ \luastring{\getpagerefnumber{ekd:\theekd@lab}},
+ \luastringN{#1})}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\endmark}
+% \changes{v1.3}{2021/08/18}{prints the last-emitted mark of the
+% preceding page}
+% By default, \cs{ekdmark} described below prints the first mark
+% that is emitted on a given page and ignores the mark corresponding
+% to any portion of text that may be printed between the top of the
+% page and the point where the first mark is called. \cs{endmark} is
+% an argument-less command that can be used just at the end of that
+% portion of text to instruct \pkg{ekdosis} to print the last-emitted
+% mark of the preceding page instead of the first-emitted mark of the
+% current page.
+% \begin{macrocode}
+\NewDocumentCommand{\endmark}{}{%
+ \stepcounter{ekd@lab}%
+ \label{ekd:\theekd@lab}%
+ \luadirect{ekdosis.storehfmark(
+ \luastring{\getpagerefnumber{ekd:\theekd@lab}},
+ "", "endmk")}%
+ \ifdefined\xspace\xspace\fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\edkmark}
+% \changes{v1.3}{2021/08/18}{prints marks in headers or footers}
+% \cs{ekdmark} is an argument-less command called in commands used to
+% make headers and footers where the marks stored by means of the
+% |mark| optional argument of \cs{ekddiv} are to be printed.
+% \begin{macrocode}
+\NewDocumentCommand{\ekdmark}{}{%
+ \luadirect{tex.sprint(ekdosis.gethfmark(\luastring{\thepage}))}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ekdprintmark}
+% \changes{v1.3}{2021/08/18}{prints or removes the marks in headers
+% and footers} \cs{ekdprintmark}\marg{selector}\marg{signpost} The
+% signposts printed in headers and footers must be
+% passed as second argument of \cs{ekdprintmark} so that \pkg{ekdosis}
+% can remove them on pages where printing them is not
+% desirable. \meta{selector} refers to three symbolic letters where
+% the first can be either |H| or |F|\===for \underLine{h}eader or
+% \underLine{f}ooter\===, the second |E| or |O|\===for \underLine{o}dd
+% or \underLine{e}ven\===and the third |L|, |C| or |R|\===for
+% \underLine{l}eft, \underLine{c}enter or \underLine{r}ight:---
+% \begin{macrocode}
+\ekvdefinekeys{ekd@marks}{
+ choice mark = {HEL = \def\ekd@mk{HEL},
+ HEC = \def\ekd@mk{HEC},
+ HER = \def\ekd@mk{HER},
+ HOL = \def\ekd@mk{HOL},
+ HOC = \def\ekd@mk{HOC},
+ HOR = \def\ekd@mk{HOR},
+ FEL = \def\ekd@mk{FEL},
+ FEC = \def\ekd@mk{FEC},
+ FEL = \def\ekd@mk{FER},
+ FOL = \def\ekd@mk{FOL},
+ FOC = \def\ekd@mk{FOC},
+ FOL = \def\ekd@mk{FOR}},
+ unknown-choice mark = \PackageError{ekdosis}{unknown mark=#1}{`mark'
+ must be either `HEL', `HEC', `HER', `HOL', `HOC', `HOR', `FEL',
+ \MessageBreak `FEC', `FER', `FOL', `FOC' or `FOR'.}
+}
+\NewDocumentCommand{\ekdprintmark}{m m}{%
+ \bgroup
+ \ekvset{ekd@marks}{mark = #1}%
+ \luadirect{tex.sprint(ekdosis.printmark(\luastringN{#2},
+ \luastringO{\ekd@mk}))}%
+ \egroup
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ekdnofhmarks}
+% \changes{v1.3}{2021/08/18}{removes headers and footers on specific
+% pages} Once the signposts are marked with \cs{ekdprintmark},
+% \cs{ekdnohfmarks} has the same effect as the \LaTeX\ standard
+% command \cs{thispagestyle}|{empty}|.
+% \begin{macrocode}
+\NewDocumentCommand{\ekdnohfmark}{}{%
+ \luadirect{ekdosis.nohfmark()}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ekdresethfmarks}
+% \changes{v1.3}{2021/08/18}{marks headers and footers as printable}
+% \cs{ekdresethfmarks} can be used in rare cases when it is needed to
+% reset headers and footers to their original, viz.\ printable state.
+% \begin{macrocode}
+\NewDocumentCommand{\ekdresethfmarks}{}{%
+ \luadirect{ekdosis.resethfmark()}%
+}
+% \end{macrocode}
+% \end{macro}
% \paragraph{Divisions of the Body}
% \pkg{ekdosis} can convert \cs{book}, \cs{part}, \cs{chapter},
% \cs{section}, \cs{subsec{\allowbreak}tion} and \cs{subsubsection}
@@ -8817,6 +9667,7 @@ Sample text with a \textcolor{red}{word} in red.
code head = \def\head@value{#1},
code barehead = \def\barehead@value{#1},
store depth = \depth@value,
+ code mark = \ekd@storemark{#1},
choice toc = {book = \def\toc@value{book},
part = \def\toc@value{part},
chapter = \def\toc@value{chapter},
@@ -9071,6 +9922,9 @@ 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 inlem = lpeg.Cs{ "<lem" * ((1 - (lpeg.P"<lem" + lpeg.P"</lem>")) + lpeg.V(1))^0 * "</lem>" }
+local inanchor = lpeg.Cs{ "<anchor" * ((1 - (lpeg.P"<" + lpeg.P">")) + lpeg.V(1))^0 * ">" }
+local inopeningnote = lpeg.Cs{ "<note" * ((1 - (lpeg.P"<" + lpeg.P">")) + lpeg.V(1))^0 * ">" }
local lnbrk = lpeg.Cs("\\\\")
local poemline = lpeg.Cs(lnbrk * spcenc^-1 * lpeg.S("*!")^-1 * bsqbrackets^-1 * spcenc^-1)
local poemlinebreak = lpeg.Cs(lnbrk * spcenc^-1 * lpeg.P("&gt;") * bsqbrackets^-1 * spcenc^-1)
@@ -9127,7 +9981,7 @@ end
local function checkxmlid(str)
if string.find(str, "^[0-9]")
- or string.find(str, "[:; ]")
+ or string.find(str, "[%{%}%[%]%(%):; ]")
then
return false
else
@@ -9194,7 +10048,8 @@ function ekdosis.newwitness(id,
Collection,
Idno,
MsName,
- OrigDate)
+ OrigDate,
+ Locus)
if xmlidfound(id)
then
tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\""
@@ -9230,6 +10085,10 @@ function ekdosis.newwitness(id,
listWit[indexwit].history = {}
listWit[indexwit].history.origin = {origDate = OrigDate}
end
+ if Locus ~= "" then
+ listWit[indexwit].msContents = {}
+ listWit[indexwit].msContents.msItemStruct = {locus = Locus}
+ end
end
return true
end
@@ -9374,19 +10233,22 @@ function ekdosis.getsiglum(str, opt)
ctrl = str
if opt == "tei" then
for i = 1,#shorthands do
- str = string.gsub(str, shorthands[i].a, shorthands[i].c)
+ local tempa = string.gsub(shorthands[i].a, "([%-%.%_])", "%%%1")
+ str = string.gsub(str, tempa, shorthands[i].c)
end
for i = 1,#idsRend do
- str = string.gsub(str, "(%f[%w])"..idsRend[i].xmlid.."(%,)",
+ local tempb = string.gsub(idsRend[i].xmlid, "([%-%.%_])", "%%%1")
+ str = string.gsub(str, "(%f[%w%-%.%_])"..tempb.."(%,)",
"%1#"..idsRend[i].xmlid.."%2")
- ctrl = string.gsub(ctrl, idsRend[i].xmlid.."%,", "")
+ ctrl = string.gsub(ctrl, tempb.."%,", "")
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.."%,", "")
+ local tempc = string.gsub(idsRend[i].xmlid, "([%-%.%_])", "%%%1")
+ str = string.gsub(str, tempc.."%,", idsRend[i].abbr)
+ ctrl = string.gsub(ctrl, tempc.."%,", "")
end
end
-- if string.find(ctrl, "[A-Za-z0-9]")
@@ -9409,14 +10271,18 @@ local cmdtotags = {
{a="marginpar", b="note", c=" place=\"margin\""},
{a="footnote", b="note", c=" place=\"bottom\""},
{a="enquote", b="quote", c=""},
+ {a="prname *", b="span",
+ c=" xml:lang=\"ar-Latn\" type=\"transliterated\""},
+ {a="prname", b="span",
+ c=" xml:lang=\"ar-Latn\" type=\"transliterated\" subtype=\"arabtex\""},
{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",
+ {a="txarb", b="foreign", c=" xml:lang=\"arb\""},
+ {a="arb", b="span",
c=" xml:lang=\"ar-Latn\" type=\"transliterated\" subtype=\"arabtex\""}
}
@@ -9428,22 +10294,31 @@ local texpatttotags = {
{a="\\resetvlinenumber%s+", b=""},
{a="\\resetlinenumber%s+%[(.-)%]", b=""},
{a="\\resetlinenumber%s+", b=""},
+ {a="\\ekdresethfmarks%s+", b=""},
{a="\\indentpattern%s+{(.-)}", b=""},
+ {a="\\ekdnohfmark%s+", b=""},
{a="\\settowidth%s+{(.-)}{(.-)}", b=""},
{a="\\poemlines%s+{(.-)}", b=""},
{a="\\pagebreak%s+%[[1-4]%]", b=""},
{a="\\pagebreak%s+", b=""},
+ {a="\\teidirect%s+(%b[]){(.-)}(%b{})", b="<%2 ekd@os%1ekd@cs>ekd@ob%3ekd@cb</%2>"},
+ {a="\\teidirect%s+{(.-)}(%b{})", b="<%1>ekd@ob%2ekd@cb</%1>"},
{a="\\altrfont%s+", b=""},
- {a="\\mbox%s+{(.-)}", b="%1"},
- {a="\\LR%s+{(.-)}", b="%1"},
- {a="\\RL%s+{(.-)}", b="%1"},
+ {a="\\endmark%s+", b=""},
+ {a="\\ekdpb%s+%*?%[(.-)%]{(.-)}", b=""},
+ {a="\\ekdpb%s+%*?{(.-)}", b=""},
+ {a="\\ekdpb%s+%*\\?", b=""},
+ {a="\\mbox%s+(%b{})", b="ekd@ob%1ekd@cb"},
+ {a="\\LR%s+(%b{})", b="ekd@ob%1ekd@cb"},
+ {a="\\RL%s+(%b{})", b="ekd@ob%1ekd@cb"},
{a="\\%=%=%=%s?", b="—"},
{a="\\%-%-%-%s?", b="—"},
{a="\\%=%=%s?", b="–"},
{a="\\%-%-%s?", b="–"},
{a="\\%=%/%s?", b="‐"},
{a="\\%-%/%s?", b="‐"},
- {a="\\vin%s+", b=""}
+ {a="\\vin%s+", b=""},
+ {a="\\uc%s+(%b{})", b="ekd@ob%1ekd@cb"}
}
local envtotags = {
@@ -9487,8 +10362,12 @@ end
function ekdosis.newpatttotag(pat, repl)
pat = string.gsub(pat, "([%[%]])", "%%%1")
+ pat = string.gsub(pat, "%@b[1-9]", "(%%b{})")
+ pat = string.gsub(pat, "%@s[1-9]", "(%%b[])")
pat = string.gsub(pat, "%#[1-9]", "(.-)")
repl = string.gsub(repl, "%#([1-9])", "%%%1")
+ repl = string.gsub(repl, "%@b([1-9])", "ekd@ob%%%1ekd@cb")
+ repl = string.gsub(repl, "%@s([1-9])", "ekd@os%%%1ekd@cs")
if isintable(texpatttotags, pat)
then
local index = get_a_index(pat, texpatttotags)
@@ -9581,6 +10460,22 @@ local function note_totei(str)
return str
end
+local function remove_extra_anchors(str)
+ str = gsub(str, lpeg.Cs("</note>") * inanchor * inopeningnote, function(enote, anchor, bnote)
+ local id_one = string.gsub(anchor, "(%<anchor )(.-)(/%>)", "%2")
+ id_one = string.sub(get_attr_value(id_one, "xml:id"), 2, -2)
+ local id_two = string.match(bnote, "target%=.-right%((.-)%)")
+ id_two = string.gsub(id_two, ".-right%((.-)%)", "%1")
+ if id_one == id_two
+ then
+ return string.format("%s%s", enote, bnote)
+ else
+ return string.format("%s%s%s", enote, anchor, bnote)
+ end
+ end)
+ return str
+end
+
local function app_totei(str)
str = gsub(str,
dblbkslash *
@@ -9667,7 +10562,16 @@ local function lem_rdg_totei(str)
end
local function relocate_notes(str)
- str = string.gsub(str, "(%<lem.-%>.-)(%<note.->.-%<%/note%>)(.-%<%/lem%>)", "%1%3%2")
+ str = gsub(str, inlem, function(arg)
+ local notes = {}
+ for i in string.gmatch(arg, "%<note.-%>.-%<%/note%>")
+ do
+ table.insert(notes, i)
+ end
+ allnotes = table.concat(notes)
+ arg = string.gsub(arg, "%<note.->.-%<%/note%>", "")
+ return string.format("%s%s", arg, allnotes)
+ end)
return str
end
@@ -9786,6 +10690,10 @@ end
local function texpatttotei(str)
for i = 1,#texpatttotags do
str = string.gsub(str, texpatttotags[i].a, texpatttotags[i].b)
+ str = string.gsub(str, "ekd@ob%{", "")
+ str = string.gsub(str, "%}ekd@cb", "")
+ str = string.gsub(str, "ekd@os%[", "")
+ str = string.gsub(str, "%]ekd@cs", "")
end
return str
end
@@ -9811,7 +10719,8 @@ local function icitetotei(str)
"Please pick another id.}}")
else
end
- return string.format("%s <ref target=\"#%s\">%s</ref>", pre, body, post)
+ return string.format("%s <bibl corresp=\"#%s\"><biblScope>%s</biblScope></bibl>",
+ pre, body, post)
end)
str = gsub(str, lpeg.P("\\")
* citecmds
@@ -9831,7 +10740,7 @@ local function icitetotei(str)
"Please pick another id.}}")
else
end
- return string.format("<ref target=\"#%s\">%s</ref>", body, post)
+ return string.format("<bibl corresp=\"#%s\"><biblScope>%s</biblScope></bibl>", body, post)
end)
str = gsub(str, lpeg.P("\\")
* citecmds
@@ -9987,6 +10896,86 @@ local function self_close_tags(str)
return str
end
+--headers and footers
+local hfmarks = {}
+
+function ekdosis.storehfmark(page, mk, opt)
+ if opt == "endmk"
+ then
+ local emark = hfmarks[#hfmarks].mark
+ table.insert(hfmarks, {a = page, mark = emark})
+ else
+ table.insert(hfmarks, {a = page, mark = mk})
+ end
+ return true
+end
+
+local printhfmarks = {
+ HEL = true,
+ HEC = true,
+ HER = true,
+ HOL = true,
+ HOC = true,
+ HOR = true,
+ FOL = true,
+ FOC = true,
+ FOR = true,
+ FEL = true,
+ FEC = true,
+ FER = true,
+}
+
+function ekdosis.nohfmark()
+ printhfmarks.HEL = false
+ printhfmarks.HEC = false
+ printhfmarks.HER = false
+ printhfmarks.HOL = false
+ printhfmarks.HOC = false
+ printhfmarks.HOR = false
+ printhfmarks.FOL = false
+ printhfmarks.FOC = false
+ printhfmarks.FOR = false
+ printhfmarks.FEL = false
+ printhfmarks.FEC = false
+ printhfmarks.FER = false
+end
+
+function ekdosis.resethfmark()
+ printhfmarks.HEL = true
+ printhfmarks.HEC = true
+ printhfmarks.HER = true
+ printhfmarks.HOL = true
+ printhfmarks.HOC = true
+ printhfmarks.HOR = true
+ printhfmarks.FOL = true
+ printhfmarks.FOC = true
+ printhfmarks.FOR = true
+ printhfmarks.FEL = true
+ printhfmarks.FEC = true
+ printhfmarks.FER = true
+end
+
+function ekdosis.printmark(str, mk)
+ if printhfmarks[mk]
+ then
+ return str
+ else
+ printhfmarks[mk] = true
+ return ""
+ end
+end
+
+function ekdosis.gethfmark(page)
+ local indexpage = get_a_index(page, hfmarks)
+ if hfmarks[indexpage] ~= nil
+ then
+ return hfmarks[indexpage].mark
+ else
+ return hfmarks[#hfmarks-1].mark or ""
+ end
+end
+
+-- divisions of the body text
local divdepth = {
book = 1,
part = 2,
@@ -10195,7 +11184,7 @@ end
local function close_ekddivs_in_between(str)
local maxdepth = 1
- for i in string.gmatch(str, "<div.-depth=\"(%d)\".->", "%1")
+ for i in string.gmatch(str, "<div.-[Dd]epth=\"(%d)\".->", "%1")
do
if tonumber(i) > tonumber(maxdepth)
then
@@ -10220,9 +11209,9 @@ local function close_ekddivs_in_between(str)
do
closedivs = closedivs.."</div>"
firstdivindex = firstdivindex - 1
+ bdivii = string.gsub(bdivii, "depth", "Depth")
end
end
- bdivii = string.gsub(bdivii, "depth", "Depth")
return string.format("%s%s%s%s%s%s%s%s",
bdivi, ndivi, edivi, between,
closedivs, bdivii, ndivii, edivii)
@@ -10255,9 +11244,9 @@ local function close_ndivs_in_between(str)
do
closedivs = closedivs.."</div"..used_ndivs[firstdivindex].a..">"
firstdivindex = firstdivindex - 1
+ bdivii = string.gsub(bdivii, "div", "Div")
end
end
- bdivii = string.gsub(bdivii, "div", "Div")
return string.format("%s%s%s%s%s%s%s%s",
bdivi, ndivi, edivi, between,
closedivs, bdivii, ndivii, edivii)
@@ -10276,6 +11265,7 @@ local function textotei(str)
str = xml_entities(str)
str = texpatttotei(str)
str = note_totei(str)
+ str = remove_extra_anchors(str)
str = app_totei(str)
str = rdgGrp_totei(str)
str = lem_rdg_totei(str)
@@ -10384,7 +11374,14 @@ function ekdosis.openteistream()
end
f:write("</handDesc>", "\n")
f:write("</physDesc>", "\n")
- else end
+ else end
+ if listWit[i].msContents ~= nil then
+ f:write("<msContents>", "\n")
+ f:write("<msItemStruct>", "\n")
+ f:write("<locus>", textotei(listWit[i].msContents.msItemStruct.locus), "</locus>", "\n")
+ f:write("</msItemStruct>", "\n")
+ f:write("</msContents>", "\n")
+ end
if listWit[i].history ~= nil then
f:write("<history>", "\n")
f:write("<origin>", "\n")
@@ -10525,7 +11522,15 @@ function ekdosis.basic_cs(msid)
else
date = ""
end
- return siglum.."&"..name.."&"..date
+ if listWit[indexwit].msContents ~= nil
+ and
+ listWit[indexwit].msContents.msItemStruct ~= nil
+ then
+ locus = listWit[indexwit].msContents.msItemStruct.locus
+ else
+ locus = ""
+ end
+ return siglum.."&"..name.." "..locus.."&"..date
end
-- end basic TeX Conspectus siglorum
@@ -10804,7 +11809,8 @@ function ekdosis.newapparatus(teitype,
appbhook,
appehook,
applimit,
- applang)
+ applang,
+ appnotelang)
if isintable(apparatuses, teitype)
then
tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\""
@@ -10819,7 +11825,8 @@ function ekdosis.newapparatus(teitype,
bhook = appbhook,
ehook = appehook,
limit = applimit,
- lang = applang})
+ lang = applang,
+ notelang = appnotelang})
end
bagunits[teitype] = 1
return true
@@ -10835,6 +11842,16 @@ function ekdosis.getapplang(teitype)
end
end
+function ekdosis.getappnotelang(teitype)
+ i = get_a_index(teitype, apparatuses)
+ if apparatuses[i].notelang ~= ""
+ then
+ return apparatuses[i].notelang
+ else
+ return "\\languagename"
+ end
+end
+
function ekdosis.getappdelim(str)
for i = 1,#apparatuses
do
@@ -10873,7 +11890,7 @@ end
function ekdosis.limit_bagunits(teitype)
local limit = tonumber(getapplimit(teitype))
- if limit >= 10 and bagunits[teitype] > limit
+ if limit >= 10 and bagunits[teitype] >= limit
then
bagunits[teitype] = 2
return "\\pagebreak"
@@ -11129,6 +12146,8 @@ local lnlabs = {}
local lnlab_salt = 0
local current_lnlab = nil
local prev_lnlab = nil
+local prev_prev_lnlab = nil
+local notelabs = {}
local current_notelab = nil
local prev_notelab = nil
local current_lemma = nil
@@ -11142,6 +12161,7 @@ local function mdvisintable(table, value)
end
function ekdosis.dolnlab(str)
+ if prev_lnlab ~= nil then prev_prev_lnlab = prev_lnlab end
prev_lnlab = current_lnlab
current_lemma = str
i = md5.sumhexa(str)
@@ -11164,9 +12184,19 @@ function ekdosis.getprevlnlab()
return prev_lnlab
end
+function ekdosis.getprevprevlnlab()
+ return prev_prev_lnlab
+end
+
function ekdosis.setnotelab(str)
current_notelab = str
- return "\\linelabel{" .. current_notelab .. "}"
+ if isfound(notelabs, current_notelab)
+ then
+ return ""
+ else
+ table.insert(notelabs, current_notelab)
+ return "\\linelabel{" .. current_notelab .. "}"
+ end
end
function ekdosis.getnotelab()
@@ -11182,8 +12212,12 @@ function ekdosis.getprevnotelab()
return prev_notelab
end
-local function remove_note(str)
- str = gsub(str, dblbkslash * lpeg.P("note") * cmdargs, "")
+local cmdstorm = lpeg.P(lpeg.P("note")
+ + lpeg.P("linelabel")
+ + lpeg.P("index"))
+
+local function remove_from_app(str)
+ str = gsub(str, dblbkslash * cmdstorm * cmdargs, "")
return str
end
@@ -11197,7 +12231,7 @@ function ekdosis.mdvappend(str, teitype)
"\\linelabel{" .. current_lnlab .. "-e}"
..
"\\csname append@app\\endcsname{"
- .. remove_note(str) .. "}"
+ .. remove_from_app(str) .. "}"
else
return "\\linelabel{" .. current_lnlab .. "-b}\\wordboundary{}"
..
@@ -11206,7 +12240,7 @@ function ekdosis.mdvappend(str, teitype)
"\\linelabel{" .. current_lnlab .. "-e}"
..
"\\csname append@app\\endcsname" .. "[" .. teitype .. "]{"
- .. remove_note(str) .. "}"
+ .. remove_from_app(str) .. "}"
end
end
diff --git a/macros/luatex/latex/ekdosis/ekdosis.el b/macros/luatex/latex/ekdosis/ekdosis.el
index 74d6bf1745..845c004aef 100644
--- a/macros/luatex/latex/ekdosis/ekdosis.el
+++ b/macros/luatex/latex/ekdosis/ekdosis.el
@@ -24,7 +24,11 @@
(defvar LaTeX-ekdosis-preamble-options
'(("parnotes" ("true" "false" "roman"))
("teiexport" ("true" "false" "tidy"))
- ("layout" ("float" "footins")))
+ ("layout" ("float" "footins" "keyfloat" "fitapp"))
+ ("divs" ("ekdosis" "latex"))
+ ("poetry" ("verse"))
+ ("parnotes" ("true" "false" "roman"))
+ ("teiexport" ("true" "false" "tidy")))
"Package options for the ekdosis package.")
(defun LaTeX-ekdosis-package-options ()
@@ -42,37 +46,66 @@
(TeX-read-key-val optional arg)
optional)))
+(defvar LaTeX-ekdosis-ekdsetup-options
+ '(("showpagebreaks" ("true" "false"))
+ ("spbmk")
+ ("hpbmk"))
+ "List of local options for ekdsetup macro.")
+
(defvar LaTeX-ekdosis-declarewitness-options
'(("settlement")
+ ("institution")
("repository")
+ ("collection")
+ ("idno")
("msName")
("origDate")
- ("idno"))
+ ("locus"))
"List of local options for DeclareWitness macro.")
+(defvar LaTeX-ekdosis-declarehand-options
+ '(("note"))
+ "List of local options for DeclareHand macro.")
+
+(defvar LaTeX-ekdosis-declarescholar-options
+ '(("rawname")
+ ("forename")
+ ("surname")
+ ("addname")
+ ("note"))
+ "List of local options for DeclareScholar macro.")
+
(defvar LaTeX-ekdosis-app-options
'(("type"))
"Local option for app|note macro.")
(defvar LaTeX-ekdosis-lem-options
'(("wit")
+ ("source")
+ ("resp")
("alt")
("pre")
("post")
("prewit")
("postwit")
("sep")
+ ("type")
+ ("num")
+ ("nonum")
("nolem" ("true" "false"))
("nosep" ("true" "false")))
"Local options for lem macro")
(defvar LaTeX-ekdosis-rdg-options
'(("wit")
+ ("source")
+ ("resp")
("alt")
("pre")
("post")
("prewit")
("postwit")
+ ("type")
("nordg" ("true" "false")))
"Local options for rdg macro.")
@@ -82,6 +115,9 @@
("labelb")
("labele")
("sep")
+ ("nosep")
+ ("num")
+ ("nonum")
("pre")
("post"))
"Local options for note macro.")
@@ -91,6 +127,93 @@
("post"))
"Local options for note* macro.")
+(defvar LaTeX-ekdosis-rdggrp-options
+ '(("type"))
+ "Local options for rdgGrp macro.")
+
+(defvar LaTeX-ekdosis-setcritsymbols-options
+ '(("suppbegin")
+ ("suppend")
+ ("delbegin")
+ ("delend")
+ ("sicbegin")
+ ("sicend")
+ ("gapmark"))
+ "List of local options for setcritsymbols macro.")
+
+(defvar LaTeX-ekdosis-sethooks-options
+ '(("appfontsize")
+ ("refnumstyle")
+ ("postrefnum")
+ ("lemmastyle")
+ ("readingstyle")
+ ("initialrule")
+ ("noinitialrule")
+ ("keyparopts")
+ ("appheight")
+ ("fitalgorithm" ("fontsize" "hybrid" "areasize" "squeeze")))
+ "List of local options for sethooks macro.")
+
+(defvar LaTeX-ekdosis-gap-options
+ '(("reason")
+ ("unit")
+ ("quantity")
+ ("extent"))
+ "List of local options for gap macro.")
+
+(defvar LaTeX-ekdosis-setapparatus-options
+ '(("direction" ("LR" "RL"))
+ ("sep")
+ ("delim")
+ ("bhook")
+ ("ehook")
+ ("rule")
+ ("norule")
+ ("lang")
+ ("notelang"))
+ "List of local options for setapparatus macro.")
+
+(defvar LaTeX-ekdosis-declareapparatus-options
+ '(("direction" ("LR" "RL"))
+ ("sep")
+ ("delim")
+ ("bhook")
+ ("ehook")
+ ("rule")
+ ("norule")
+ ("lang")
+ ("notelang")
+ ("maxentries"))
+ "List of local options for declareapparatus macro.")
+
+(defvar LaTeX-ekdosis-setlineation-options
+ '(("lineation" ("page" "document" "none"))
+ ("sep")
+ ("modulo")
+ ("modulonum")
+ ("margin" ("right" "left" "inner" "outer"))
+ ("numbers" ("elided" "full"))
+ ("vlineation" ("page" "document"))
+ ("vmodulo")
+ ("vmargin" ("right" "left"))
+ ("continuousvnum"))
+ "List of local options for setlineation macro.")
+
+(defvar LaTeX-ekdosis-ekddiv-options
+ '(("type")
+ ("n")
+ ("head")
+ ("barehead")
+ ("depth" ("1" "2" "3" "4" "5" "6" "7" "8" "9"))
+ ("toc" ("book" "part" "chapter" "section" "subsection"
+ "subsubsection" "paragraph" "subparagraph"))
+ ("mark"))
+ "List of local options for ekddiv macro.")
+
+(defvar LaTeX-ekdosis-setteixmlexport-options
+ '(("autopar" ("true" "false")))
+ "List of local options for SetTEIxmlExport macro.")
+
(defvar LaTeX-ekdosis-alignment-key-val-options
'(("tcols")
("lcols")
@@ -98,9 +221,18 @@
("apparatus")
("flush" ("true" "false"))
("paired" ("true" "false"))
- ("pagelineation" ("true" "false")))
+ ("lineation" ("page" "document")))
"Local options for alignment env.")
+(defvar LaTeX-ekdosis-ekdverse-key-val-options
+ '(("width")
+ ("type"))
+ "Local options for ekdverse env.")
+
+(defvar LaTeX-ekdosis-ekdstanza-key-val-options
+ '(("type"))
+ "Local options for ekdstanza env.")
+
(TeX-add-style-hook
"ekdosis"
(lambda ()
@@ -120,12 +252,53 @@
(add-to-list (make-local-variable 'LaTeX-fold-macro-spec-list)
'("[l]" ("linelabel"))
t)
+ (add-to-list (make-local-variable 'LaTeX-fold-macro-spec-list)
+ '("{{1}}" ("surplus"))
+ t)
+ (add-to-list (make-local-variable 'LaTeX-fold-macro-spec-list)
+ '("<{1}>" ("supplied"))
+ t)
+ (add-to-list (make-local-variable 'LaTeX-fold-macro-spec-list)
+ '("{1}" ("sic"))
+ t)
+ (add-to-list (make-local-variable 'LaTeX-fold-macro-spec-list)
+ '("[g]" ("gap"))
+ t)
+ (add-to-list (make-local-variable 'LaTeX-fold-macro-spec-list)
+ '("{1}" ("mbox"))
+ t)
+ (add-to-list (make-local-variable 'LaTeX-fold-macro-spec-list)
+ '("{1}" ("rdgGrp"))
+ t)
+ (add-to-list (make-local-variable 'LaTeX-fold-macro-spec-list)
+ '("[pb]" ("ekdpb"))
+ t)
+ (add-to-list (make-local-variable 'LaTeX-fold-macro-spec-list)
+ '("[t]" ("teidirect"))
+ t)
;; This package relies on lualatex, so check for it:
(TeX-check-engine-add-engines 'luatex)
(TeX-add-symbols
+ '("ekdsetup" (TeX-arg-key-val LaTeX-ekdosis-ekdsetup-options))
'("DeclareWitness" "xml:id" "rendition" "description"
[ LaTeX-ekdosis-long-key-val LaTeX-ekdosis-declarewitness-options ]
0)
+ '("DeclareHand" "xml:id" "base ms." "rendition"
+ [ LaTeX-ekdosis-long-key-val LaTeX-ekdosis-declarehand-options ]
+ 0)
+ '("DeclareSource" "xml:id" "rendition"
+ 0)
+ '("DeclareScholar" "xml:id" "rendition"
+ [ LaTeX-ekdosis-long-key-val LaTeX-ekdosis-declarescholar-options ]
+ 0)
+ '("DeclareShorthand" "xml:id" "rendition" "csv-list of ids"
+ 0)
+ '("getsiglum" "csv-list"
+ 0)
+ '("SigLine" "unique id"
+ 0)
+ '("linelabel" "label"
+ 0)
'("app" [ TeX-arg-key-val LaTeX-ekdosis-app-options ]
t)
'("lem" [ LaTeX-ekdosis-long-key-val LaTeX-ekdosis-lem-options ]
@@ -136,14 +309,90 @@
t)
'("note*" [ LaTeX-ekdosis-long-key-val LaTeX-ekdosis-note-star-options ]
t)
- '("SetEkdosisAlignment"
+ '("rdgGrp" [ TeX-arg-key-val LaTeX-ekdosis-rdggrp-options ]
+ t)
+ '("SetCritSymbols" (TeX-arg-key-val LaTeX-ekdosis-setcritsymbols-options))
+ '("supplied" "supplied text" 0)
+ '("surplus" "surplus text" 0)
+ '("gap" (TeX-arg-key-val LaTeX-ekdosis-gap-options))
+ '("sic" "sic text" 0)
+ '("SetAlignment"
(TeX-arg-key-val LaTeX-ekdosis-alignment-key-val-options))
+ '("columnratio" "fraction(s)" [ "fraction(s)" ] )
+ '("setcolumnwidth" "width/gap" [ "width/gap" ] )
+ '("marginparthreshold" "number of columns" [ "number of columns" ] )
+ '("footnotelayout"
+ (TeX-arg-eval completing-read
+ (TeX-argument-prompt nil nil "Layout")
+ '("c" "m" "p")))
+ '("SetHooks" (TeX-arg-key-val LaTeX-ekdosis-sethooks-options))
+ '("SetLTRapp" 0)
+ '("SetRTLapp" 0)
+ '("SetSeparator" "separator" 0)
+ '("SetBeginApparatus" "chars|commands" 0)
+ '("SetEndApparatus" "chars" 0)
+ '("SetUnitDelimiter" "delimiter" 0)
+ '("SetDefaultRule" "command" 0)
+ '("SetApparatusLanguage" "lang name" 0)
+ '("SetApparatusNoteLanguage" "lang name" 0)
+ '("SetApparatus" (TeX-arg-key-val LaTeX-ekdosis-setapparatus-options))
+ '("footnoteruletrue" 0)
+ '("footnoterulefalse" 0)
+ '("SetDefaultApparatus" "apparatus name" 0)
+ '("DeclareApparatus" "apparatus name"
+ [ TeX-arg-key-val LaTeX-ekdosis-declareapparatus-options ] 0)
+ '("indentpattern" "pattern" 0)
+ '("vin" 0)
+ '("SetLineation" (TeX-arg-key-val LaTeX-ekdosis-setlineation-options))
+ '("innerlinenumbers" 0)
+ '("outerlinenumbers" 0)
+ '("modulolinenumbers" [ "number" ] )
+ '("resetlinenumber" [ "number" ] )
+ '("resetvlinenumber" [ "number" ] )
+ '("verselinenumfont" "commands" 0)
+ '("SetLR" 0)
+ '("SetRL" 0)
+ '("MkBodyDivs" "div1" "div2" "div3" "div4" "div5" "div6" 0)
+ '("ekddiv" (LaTeX-ekdosis-long-key-val LaTeX-ekdosis-ekddiv-options))
+ '("FormatDiv" "number" "code before" "code after" 0)
+ '("ekdmark" 0)
+ '("endmark" 0)
+ '("ekdprintmark"
+ (TeX-arg-eval completing-read
+ (TeX-argument-prompt nil nil "selector")
+ '("HEL" "HEC" "HER" "HOL" "HOC" "HOR"
+ "FEL" "FEC" "FER" "FOL" "FOC" "FOR"))
+ "signpost" 0 )
+ '("ekdnohfmark" 0)
+ '("ekdresethfmarks" 0)
+ '("ekdpb" [ "page number" ] "line number" 0)
+ '("ekdpb*")
+ '("addentries" [ "layer" ] "number" 0)
+ '("SetTEIFilename" "base name" 0)
+ '("SetTEIxmlExport" (TeX-arg-key-val
+ LaTeX-ekdosis-setteixmlexport-options))
+ '("TeXtoTEI" "csname" "TEI element" [ "TEI attributes" ] 0)
+ '("EnvtoTEI" "env name" "TEI element" [ "TEI attributes" ] 0)
+ '("EnvtoTEI*" "env name" "TEI element" [ "TEI attributes" ] 0)
+ '("TeXtoTEIPat" "TeX pattern" "TEI pattern" 0)
+ '("teidirect" [ "xml attributes" ] "xml element" "code" 0)
+ '("AddxmlBibResource" "basename or name.xml" 0)
)
(LaTeX-add-environments
"ekdosis"
+ "edition"
+ "translation"
+ "edition*"
+ "translation*"
+ "patverse"
+ "ekdpar"
'("alignment" LaTeX-env-args
- [ TeX-arg-key-val LaTeX-ekdosis-alignment-key-val-options ]
- ))
+ [ TeX-arg-key-val LaTeX-ekdosis-alignment-key-val-options ] )
+ '("ekdverse" LaTeX-env-args
+ [ TeX-arg-key-val LaTeX-ekdosis-ekdverse-key-val-options ] )
+ '("ekdstanza" LaTeX-env-args
+ [ TeX-arg-key-val LaTeX-ekdosis-ekdstanza-key-val-options ] )
+ )
)
LaTeX-dialect)
diff --git a/macros/luatex/latex/ekdosis/ekdosis.pdf b/macros/luatex/latex/ekdosis/ekdosis.pdf
index b3f6649357..de40fcdb68 100644
--- a/macros/luatex/latex/ekdosis/ekdosis.pdf
+++ b/macros/luatex/latex/ekdosis/ekdosis.pdf
Binary files differ
diff --git a/macros/luatex/latex/ekdosis/samples/Caesar_BG-6-13-1.pdf b/macros/luatex/latex/ekdosis/samples/Caesar_BG-6-13-1.pdf
index 17f6b02a96..1ca0224762 100644
--- a/macros/luatex/latex/ekdosis/samples/Caesar_BG-6-13-1.pdf
+++ b/macros/luatex/latex/ekdosis/samples/Caesar_BG-6-13-1.pdf
Binary files differ
diff --git a/macros/luatex/latex/ekdosis/samples/Caesar_BG-6-13-1.tex b/macros/luatex/latex/ekdosis/samples/Caesar_BG-6-13-1.tex
index 2b1b442a97..14673ac2ac 100644
--- a/macros/luatex/latex/ekdosis/samples/Caesar_BG-6-13-1.tex
+++ b/macros/luatex/latex/ekdosis/samples/Caesar_BG-6-13-1.tex
@@ -2,8 +2,8 @@
\usepackage{fontspec}
\usepackage[latin.classic,french,english]{babel}
\babelfont{rm}{Old Standard}
-\babelfont{sf}{NewComputerModern Sans}
-\babelfont{tt}{NewComputerModern Mono}
+\babelfont{sf}{NewComputerModernSans10}
+\babelfont{tt}{NewComputerModernMono10}
\usepackage{nextpage}
\usepackage{xltabular}