diff options
author | Norbert Preining <preining@logic.at> | 2021-04-04 01:53:22 +0000 |
---|---|---|
committer | Norbert Preining <preining@logic.at> | 2021-04-04 01:53:22 +0000 |
commit | c4c34aedd2080aa9180cbd259e124e491aecfd96 (patch) | |
tree | 4d9515b0f761dd745b9b153d2f8fdfb576847f17 /Master/texmf-dist/tex/lualatex/ekdosis | |
parent | b33e03e753e3f34613edf68fbcece8772a5e859a (diff) |
ekdosis (4apr21)
git-svn-id: svn://tug.org/texlive/trunk@58721 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/lualatex/ekdosis')
-rw-r--r-- | Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.lua | 185 | ||||
-rw-r--r-- | Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.sty | 371 |
2 files changed, 415 insertions, 141 deletions
diff --git a/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.lua b/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.lua index 55d42fbc7bc..4916d9c586b 100644 --- a/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.lua +++ b/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.lua @@ -2,7 +2,7 @@ This file is part of the `ekdosis' package ekdosis -- Typesetting TEI xml-compliant critical editions -Copyright (C) 2020 Robert Alessi +Copyright (C) 2020--2021 Robert Alessi Please send error reports and suggestions for improvements to Robert Alessi <alessi@robertalessi.net> @@ -52,14 +52,17 @@ local app = lpeg.Cs("app") local lemrdg = lpeg.Cs(lpeg.Cs("lem") + lpeg.Cs("rdg")) local note = lpeg.Cs("note") local lnbrk = lpeg.Cs("\\\\") -local poemline = lpeg.Cs(lnbrk * bsqbrackets^-1) -local endpoem = lpeg.Cs(lnbrk * lpeg.S("*!") * bsqbrackets^-1) +local poemline = lpeg.Cs(lnbrk * spcenc^-1 * lpeg.S("*!")^-1 * bsqbrackets^-1 * spcenc^-1) +local poemlinebreak = lpeg.Cs(lnbrk * spcenc^-1 * lpeg.P(">") * bsqbrackets^-1 * spcenc^-1) +local linegroup = lpeg.Cs{ "<lg" * ((1 - lpeg.S"<>") + lpeg.V(1))^0 * ">" } +local bclinegroup = lpeg.Cs(linegroup + lpeg.P("</lg>")) +local endpoem = lpeg.Cs(lnbrk * lpeg.S("*!") * bsqbrackets^-1) -- not used local sections = lpeg.Cs(lpeg.P("book") + lpeg.P("part") + lpeg.P("chapter") + lpeg.P("section") + lpeg.P("subsection") + lpeg.P("subsubsection")) local par = lpeg.P(lpeg.P("\\par") * spce^0) -local parb = lpeg.P(lpeg.Cs("\\p@rb") * spce^0) -local para = lpeg.P(lpeg.Cs("\\p@ra") * spce^0) +local parb = lpeg.P(lpeg.P("\\p@rb") * spce^0) +local para = lpeg.P(lpeg.P("\\p@ra") * spce^0) local labelrefcmds = lpeg.Cs(lpeg.P("label") + lpeg.P("linelabel") + lpeg.P("lineref") @@ -401,28 +404,37 @@ local texpatttotags = { {a="\\addentries%s+%[(.-)%]{(.-)}", b=""}, {a="\\addentries%s+{(.-)}", b=""}, {a="\\setverselinenums%s+{(.-)}{(.-)}", b=""}, + {a="\\resetvlinenumber%s+%[(.-)%]", b=""}, + {a="\\resetvlinenumber%s+", b=""}, {a="\\resetlinenumber%s+%[(.-)%]", b=""}, {a="\\resetlinenumber%s+", b=""}, + {a="\\indentpattern%s+{(.-)}", b=""}, + {a="\\settowidth%s+{(.-)}{(.-)}", b=""}, {a="\\poemlines%s+{(.-)}", b=""}, {a="\\pagebreak%s+%[[1-4]%]", b=""}, {a="\\pagebreak%s+", b=""}, {a="\\altrfont%s+", b=""}, {a="\\mbox%s+{(.-)}", b="%1"}, {a="\\LR%s+{(.-)}", b="%1"}, - {a="\\RL%s+{(.-)}", b="%1"} + {a="\\RL%s+{(.-)}", b="%1"}, + {a="\\%=%=%=%s?", b="—"}, + {a="\\%-%-%-%s?", b="—"}, + {a="\\%=%=%s?", b="–"}, + {a="\\%-%-%s?", b="–"}, + {a="\\%=%/%s?", b="‐"}, + {a="\\%-%/%s?", b="‐"}, + {a="\\vin%s+", b=""} } local envtotags = { {a="flushright", b="p", c=" rend=\"align(right)\""}, {a="flushleft", b="p", c=" rend=\"align(left)\""}, {a="quotation", b="quote", c=""}, - {a="ekdverse", b="lg", c=""}, {a="txarabtr", b="p", c=" xml:lang=\"ar-Latn\" type=\"transliterated\""}, {a="quoting", b="quote", c=""}, {a="ekdpar", b="p", c=""}, {a="txarab", b="p", c=" xml:lang=\"arb\""}, {a="center", b="p", c=" rend=\"align(center)\""}, - {a="verse", b="lg", c=""}, {a="arab", b="p", c=" xml:lang=\"ar-Latn\" type=\"transliterated\" subtype=\"arabtex\""} } @@ -457,8 +469,16 @@ function ekdosis.newpatttotag(pat, repl) pat = string.gsub(pat, "([%[%]])", "%%%1") pat = string.gsub(pat, "%#[1-9]", "(.-)") repl = string.gsub(repl, "%#([1-9])", "%%%1") - table.insert(texpatttotags, { a = pat, b = repl }) - table.sort(texpatttotags, function(a ,b) return(#a.a > #b.a) end) + if isintable(texpatttotags, pat) + then + local index = get_a_index(pat, texpatttotags) + table.remove(texpatttotags, index) + table.insert(texpatttotags, { a = pat, b = repl }) + table.sort(texpatttotags, function(a ,b) return(#a.a > #b.a) end) + else + table.insert(texpatttotags, { a = pat, b = repl }) + table.sort(texpatttotags, function(a ,b) return(#a.a > #b.a) end) + end return true end @@ -632,32 +652,69 @@ local function relocate_notes(str) end local function linestotei(str) --- str = "\n<l>"..str - str = string.gsub(str, "^%s?(.-)\\\\[%!%*]?%s?$", "\n<l>%1</l>\n") --- str = gsub(str, endpoem, "</l>\n") - str = gsub(str, poemline * spcenc^-1 * lpeg.P(">"), "\n<lb/>") - str = gsub(str, poemline * spcenc^-1, "</l>\n<l>") --- str = str.."</l>\n" + if not string.find(str, "^%s?<lg") + then + str = "\n<l>"..str + end + str = gsub(str, poemline * spcenc^0 * bclinegroup, "</l>\n%2") + str = gsub(str, linegroup * -(spcenc^0 * bclinegroup), "%1\n<l>") + str = gsub(str, lpeg.Cs("</lg>") * -(spcenc^0 * (bclinegroup + -1)), "%1\n<l>") + -- str = gsub(str, poemline * spcenc^-1 * -1, "</l>\n") + str = gsub(str, poemlinebreak, "<lb/> ") + -- str = gsub(str, poemline * spcenc^-1 * lpeg.Cs("<lg"), "</l>%2") + -- str = gsub(str, lpeg.Cs("</lg>") * spcenc^1 * -lpeg.P("<l"), "%1\n<l>") + str = gsub(str, poemline, "</l>\n<l>") + return str +end + +local function stanzatotei(str) + str = string.gsub(str, "\\begin%s?%{ekdstanza%}(%b[])(.-)\\end%s?%{ekdstanza%}", function(opt, arg) + arg = string.gsub(arg, "\\par%s?", "") + opt = string.sub(opt, 2, -2) + teitype = get_attr_value(opt, "type") + if teitype ~= "" then teitype = " type=\""..teitype.."\"" else end + if opt == "" + then + return string.format("<lg>%s</lg>", arg) + else + return string.format("<lg%s>%s</lg>", teitype, arg) + end + end) + str = string.gsub(str, "\\begin%s?%{ekdstanza%}(.-)\\end%s?%{ekdstanza%}", function(arg) + arg = string.gsub(arg, "\\par%s?", "") + return string.format("<lg>%s</lg>", arg) + end) return str end -- better use lpeg: look into this later local function versetotei(str) - str = string.gsub(str, "(\\begin%s?%{ekdverse%})(%b[])(.-)(\\end%s?%{ekdverse%})", function(benv, opt, arg, eenv) - arg = linestotei(arg) - return string.format("%s%s%s%s", benv, opt, arg, eenv) + str = string.gsub(str, "\\begin%s?%{ekdverse%}(%b[])(.-)\\end%s?%{ekdverse%}", function(opt, arg) + arg = string.gsub(arg, "\\par%s?", "") + arg = string.gsub(arg, "\\begin%s?%{patverse%*?%}", "") + arg = string.gsub(arg, "\\end%s?%{patverse%*?%}", "") + arg = string.gsub(arg, "\\indentpattern%s?%b{}", "") + opt = string.sub(opt, 2, -2) + teitype = get_attr_value(opt, "type") + if teitype ~= "" then teitype = " type=\""..teitype.."\"" else end + if opt == "" + then + return "\\p@rb "..linestotei(string.format("<lg>%s</lg>", arg)).."\\p@ra " + else + return "\\p@rb "..linestotei(string.format("<lg%s>%s</lg>", teitype, arg)).."\\p@ra " + end end) - str = string.gsub(str, "(\\begin%s?%{ekdverse%})(.-)(\\end%s?%{ekdverse%})", function(benv, arg, eenv) - arg = linestotei(arg) - return string.format("%s%s%s", benv, arg, eenv) + str = string.gsub(str, "\\begin%s?%{ekdverse%}(.-)\\end%s?%{ekdverse%}", function(arg) + arg = string.gsub(arg, "\\par%s?", "") + return "\\p@rb "..linestotei(string.format("<lg>%s</lg>", arg)).."\\p@ra " end) - str = string.gsub(str, "(\\begin%s?%{verse%})(%b[])(.-)(\\end%s?%{verse%})", function(benv, opt, arg, eenv) - arg = linestotei(arg) - return string.format("%s%s%s%s", benv, opt, arg, eenv) + str = string.gsub(str, "\\begin%s?%{verse%}%b[](.-)\\end%s?%{verse%}", function(arg) + arg = string.gsub(arg, "\\par%s?", "") + return "\\p@rb "..linestotei(string.format("<lg>%s</lg>", arg)).."\\p@ra " end) - str = string.gsub(str, "(\\begin%s?%{verse%})(.-)(\\end%s?%{verse%})", function(benv, arg, eenv) - arg = linestotei(arg) - return string.format("%s%s%s", benv, arg, eenv) + str = string.gsub(str, "\\begin%s?%{verse%}(.-)\\end%s?%{verse%}", function(arg) + arg = string.gsub(arg, "\\par%s?", "") + return "\\p@rb "..linestotei(string.format("<lg>%s</lg>", arg)).."\\p@ra " end) return str end @@ -1128,7 +1185,7 @@ local function close_ekddivs_in_between(str) end for ndivi = 1, maxdepth do - str = string.gsub(str, "(<div .-depth%=\")("..ndivi..")(\".->)(.-)(<div .-depth%=\")(%d)(\".->)", + str = string.gsub(str, "(<div [^%>]-[Dd]epth%=\")("..ndivi..")(\".->)(.-)(<div [^%>]-depth%=\")(%d)(\".->)", function(bdivi, ndivi, edivi, between, bdivii, ndivii, edivii) local firstdiv = ndivi local lastdiv = ndivii @@ -1145,11 +1202,17 @@ local function close_ekddivs_in_between(str) firstdivindex = firstdivindex - 1 end end + bdivii = string.gsub(bdivii, "depth", "Depth") return string.format("%s%s%s%s%s%s%s%s", - bdivi, ndivi, edivi, between, closedivs, bdivii, ndivii, edivii) + bdivi, ndivi, edivi, between, + closedivs, bdivii, ndivii, edivii) end) end - str = string.gsub(str, "(<div.-)(%sdepth%=\"%d\")(.->)", "%1%3") + return str +end + +local function clean_ekddivs(str) + str = string.gsub(str, "(<div.-)(%s[Dd]epth%=\"%d\")(.->)", "%1%3") used_ndivs = {} return str end @@ -1157,7 +1220,7 @@ end local function close_ndivs_in_between(str) for ndivi = 1, 6 do - str = string.gsub(str, "(<div)("..ndivi..")(.->)(.-)(<div)([1-6])(.->)", + str = string.gsub(str, "(<[Dd]iv)("..ndivi..")(.->)(.-)(<div)([1-6])(.->)", function(bdivi, ndivi, edivi, between, bdivii, ndivii, edivii) local firstdiv = ndivi local lastdiv = ndivii @@ -1174,11 +1237,17 @@ local function close_ndivs_in_between(str) firstdivindex = firstdivindex - 1 end end + bdivii = string.gsub(bdivii, "div", "Div") return string.format("%s%s%s%s%s%s%s%s", - bdivi, ndivi, edivi, between, closedivs, bdivii, ndivii, edivii) - + bdivi, ndivi, edivi, between, + closedivs, bdivii, ndivii, edivii) end) end + return str +end + +local function clean_latexdivs(str) + str = string.gsub(str, "(<Div)([1-6])(.->)", "<div%2%3") used_ndivs = {} return str end @@ -1191,6 +1260,7 @@ local function textotei(str) str = rdgGrp_totei(str) str = lem_rdg_totei(str) str = relocate_notes(str) + str = stanzatotei(str) str = versetotei(str) str = envtotei(str) str = ekddivs_totei(str) @@ -1203,9 +1273,13 @@ local function textotei(str) then str = close_ekddivs_at_end(str) str = close_ekddivs_in_between(str) + str = close_ekddivs_in_between(str) + str = clean_ekddivs(str) else str = close_ndivs_at_end(str) str = close_ndivs_in_between(str) + str = close_ndivs_in_between(str) + str = clean_latexdivs(str) end return str end @@ -1709,7 +1783,8 @@ function ekdosis.newapparatus(teitype, appsep, appbhook, appehook, - applimit) + applimit, + applang) if isintable(apparatuses, teitype) then tex.print("\\unexpanded{\\PackageWarning{ekdosis}{\"" @@ -1723,12 +1798,23 @@ function ekdosis.newapparatus(teitype, sep = appsep, bhook = appbhook, ehook = appehook, - limit = applimit}) + limit = applimit, + lang = applang}) end bagunits[teitype] = 1 return true end +function ekdosis.getapplang(teitype) + i = get_a_index(teitype, apparatuses) + if apparatuses[i].lang ~= "" + then + return apparatuses[i].lang + else + return "\\languagename" + end +end + function ekdosis.getappdelim(str) for i = 1,#apparatuses do @@ -1824,7 +1910,7 @@ function ekdosis.appout() local output = {} if next(apparatuses) == nil then -- table.insert(output, "BEGIN") - table.insert(output, "\\noindent\\csname ekd@default@rule\\endcsname\\NLS") + table.insert(output, "\\csname ekd@default@rule\\endcsname\\NLS") table.insert(output, "\\csname ekd@begin@apparatus\\endcsname\\ignorespaces") -- table.insert(output, "\\noindent ") for i in string.gmatch(t, @@ -1839,6 +1925,7 @@ function ekdosis.appout() end -- table.insert(output, "END") else + local appinserted = false local n = 1 while apparatuses[n] do @@ -1853,16 +1940,19 @@ function ekdosis.appout() table.insert(output, "\\bgroup{}") if apparatuses[n].direction == "LR" then - table.insert(output, "\\pardir TLT\\textdir TLT{}") + table.insert(output, "\\pardir TLT\\leavevmode\\textdir TLT{}") elseif apparatuses[n].direction == "RL" then - table.insert(output, "\\pardir TRT\\textdir TRT{}") + table.insert(output, "\\pardir TRT\\leavevmode\\textdir TRT{}") end if apparatuses[n].rule == "none" then if n > 1 then - table.insert(output, "\\NLS{}") + if appinserted + then + table.insert(output, "\\NLS{}") + end else table.insert(output, "\\noindent ") end @@ -1870,7 +1960,12 @@ function ekdosis.appout() then if n > 1 then - table.insert(output, "\\NLS{}" .. apparatuses[n].rule .. "\\NLS{}") + if appinserted + then + table.insert(output, "\\NLS{}" .. apparatuses[n].rule .. "\\NLS{}") + else + table.insert(output, apparatuses[n].rule .. "\\NLS{}") + end else -- table.insert(output, "\\noindent ") table.insert(output, apparatuses[n].rule .. "\\NLS{}") @@ -1878,7 +1973,12 @@ function ekdosis.appout() else if n > 1 then - table.insert(output, "\\NLS\\csname ekd@default@rule\\endcsname\\NLS{}") + if appinserted + then + table.insert(output, "\\NLS\\csname ekd@default@rule\\endcsname\\NLS{}") + else + table.insert(output, "\\csname ekd@default@rule\\endcsname\\NLS{}") + end else -- table.insert(output, "\\noindent ") table.insert(output, "\\csname ekd@default@rule\\endcsname\\NLS{}") @@ -1904,6 +2004,7 @@ function ekdosis.appout() ..curcol.."%-"..n..">") do table.insert(output, i) + appinserted = true end if apparatuses[n].ehook ~= "" then diff --git a/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.sty b/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.sty index 3e8094f9c14..c313fe5d29c 100644 --- a/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.sty +++ b/Master/texmf-dist/tex/lualatex/ekdosis/ekdosis.sty @@ -15,7 +15,7 @@ %% This file is part of the `ekdosis' package %% %% ekdosis -- Typesetting TEI xml compliant critical editions -%% Copyright (C) 2020 Robert Alessi +%% Copyright (C) 2020--2021 Robert Alessi %% %% Please send error reports and suggestions for improvements to Robert %% Alessi <alessi@robertalessi.net> @@ -41,7 +41,7 @@ %% Running "make inst" installs the files in the user's TeX tree. \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{ekdosis} - [2020/11/04 v1.1 Typesetting TEI xml-compliant critical editions] + [2021/04/02 v1.2 Typesetting TEI xml-compliant critical editions] \RequirePackage{iftex} \RequireLuaTeX \RequirePackage{expkv-opt} @@ -52,6 +52,7 @@ \newif\if@parnotesroman \newif\if@pkg@parnotes \newif\iftei@export +\newif\if@pkg@poetry@verse \ekvdefinekeys{ekdosis}{ choice layout = {float = {\@pkg@floattrue}, footins = {\@pkg@floatfalse\@pkg@footinstrue}}, @@ -64,7 +65,9 @@ initial divs = ekdosis, unknown-choice divs = \PackageError{ekdosis}{unknown divs=#1}{`divs' must be either `ekdosis' or `latex'.}, - bool verse = \if@pkg@verse, + choice poetry = {verse = {\@pkg@poetry@versetrue}}, + unknown-choice poetry = \PackageError{ekdosis}{unknown + poetry=#1}{`poetry' must be `verse' for now.}, choice parnotes = {false = {}, true = {\@pkg@parnotestrue}, roman = {\@pkg@parnotestrue\@parnotesromantrue}}, @@ -85,6 +88,9 @@ `tidy'.} } \ekvoProcessLocalOptions{ekdosis} +\newif\ifekd@memoir@loaded +\@ifclassloaded{memoir}{% + \ekd@memoir@loadedtrue\@pkg@poetry@versetrue}{} \RequirePackage{luacode} \RequirePackage{paracol} \RequirePackage{etoolbox} @@ -96,7 +102,7 @@ \RequirePackage{ltxcmds} \RequirePackage{pdftexcmds} \RequirePackage{ifoddpage} -\if@pkg@verse +\if@pkg@poetry@verse \RequirePackage{verse} \fi \if@pkg@parnotes @@ -110,9 +116,16 @@ store appfontsize = \ekd@appfontsize, store refnumstyle = \ekd@refnumstyle, store postrefnum = \ekd@postrefnum, + store lemmastyle = \ekd@lemmastyle, + store readingstyle = \ekd@readingstyle, + code initialrule = \def\ekd@initial@rule{#1\NLS}, + default initialrule = \rule{0.4\columnwidth}{0.4pt}, + noval noinitialrule = \undef\ekd@initial@rule, initial appfontsize = \footnotesize, initial refnumstyle = \bfseries, - initial postrefnum = ~ + initial postrefnum = ~, + initial lemmastyle = {}, + initial readingstyle = {} } \NewDocumentCommand{\SetHooks}{m}{\ekvset{ekd@hooks}{#1}} \ekvdefinekeys{ekd@witness}{ @@ -237,6 +250,7 @@ store bhook = \bhook@val, store ehook = \ehook@val, store maxentries = \limit@val, + store lang = \lang@val, initial direction = LR, initial delim = {}, initial ehook = {\csname ekd@end@apparatus\endcsname} @@ -255,7 +269,8 @@ \luastringO{\sep@val}, \luastringO{\bhook@val}, \luastringO{\ehook@val}, - \luastringO{\limit@val} + \luastringO{\limit@val}, + \luastringO{\lang@val} )} \egroup } @@ -264,6 +279,29 @@ \luadirect{ekdosis.addto_bagunits(\luastringO{#1}, \luastringN{#2})}% \ignorespaces } +\NewDocumentCommand{\ekdpb}{o m}{% + \def\@tmpoarg{#1}% + \def\@tmpmarg{#2}% + \luadirect{ekdosis.dolnlab(\luastringN{#2})}% + \linelabel{\luadirect{tex.sprint(ekdosis.getlnlab())}}% + \def\tmp@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 + }\ignorespaces +} \newbool{do@app} \newif\ifekd@state \newif\ifekd@isinapp @@ -281,8 +319,8 @@ {\luadirect{ekdosis.appin(\luastringO{#2})}} {\luadirect{ekdosis.appin(\luastringO{#2}, \luastringO{#1})}}% } - % \def\blfootnote{\gdef\@thefnmark{\relax}\@footnotetext} -\def\blfootnote{\gdef\@thefnmark{}\@blfootnotetext} +\def\blfootnote{\gdef\@thefnmark{\relax}\@footnotetext} + % \def\blfootnote{\gdef\@thefnmark{}\@blfootnotetext} \long\def\@blfootnotetext#1{\insert\footins{% \reset@font\footnotesize \interlinepenalty\interfootnotelinepenalty @@ -316,7 +354,9 @@ initial delim = {}, store rule = \ekd@default@rule, initial rule = \rule{0.4\columnwidth}{0.4pt}, - noval norule = \def\ekd@default@rule{\mbox{}} + noval norule = \def\ekd@default@rule{\mbox{}}, + store lang = \ekd@singleapp@lang, + initial lang = \ltx@ifpackageloaded{babel}{\languagename}{} } \NewDocumentCommand{\SetApparatus}{m}{ \ekvset{default@app}{#1} @@ -327,6 +367,8 @@ \NewDocumentCommand{\SetBeginApparatus}{m}{\edef\ekd@begin@apparatus{#1}} \NewDocumentCommand{\SetEndApparatus}{m}{\edef\ekd@end@apparatus{#1}} \NewDocumentCommand{\SetUnitDelimiter}{m}{\def\ekd@unit@delim{#1}} +\NewDocumentCommand{\SetApparatusLanguage}{m}{% + \def\ekd@singleapp@lang{#1}} \newif\iffootnoterule \footnoteruletrue \let\dflt@footnoterule\footnoterule @@ -348,43 +390,65 @@ \def\ekd@default@rule{#1}% \fi} \newcommand*{\NLS}{% - \par% - \nobreak% - \vspace{-\parskip}% - \noindent% - \ignorespaces} + \nobreak\@normalcr\relax + % \par + % \nobreak + % \vspace{-\parskip}% + % \leavevmode + % \noindent + % \ignorespaces +} \newif\ifsubsq@unit \subsq@unittrue \newif\ifekd@inside@app \def\add@@apparatus{% - \if@pkg@parnotes\parnotes\else\fi% - \if@pkg@footins% - \bgroup% - \ifrtl@app\setRL\else\setLR\fi% + \if@pkg@parnotes\parnotes\else\fi + \if@pkg@footins + \bgroup + \unless\ifekd@mapps + \ifrtl@app\pardir TRT\leavevmode\textdir TRT\else + \pardir TLT\leavevmode\textdir TLT\fi + \fi \blfootnote{% - \if@pkg@parnotes% - \if@parnotesroman% - \renewcommand*{\theparnotemark}{\roman{parnotemark}}\else\fi% - \parnoteclear\else\fi% + \if@pkg@parnotes + \if@parnotesroman + \renewcommand*{\theparnotemark}{\roman{parnotemark}}\else\fi + \parnoteclear\else\fi \ekd@inside@apptrue - \footnotesize\apparatus\unless\ifekd@mapps\ekd@end@apparatus\fi% + \ekd@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 }% - \egroup% - \fi% - \if@pkg@float% - \keyparbox[!b]{}{\ifrtl@app\setRL\else\setLR\fi% - \if@pkg@parnotes% - \if@parnotesroman% - \renewcommand*{\theparnotemark}{\roman{parnotemark}}\else\fi% - \parnoteclear\else\fi% + \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\apparatus\unless\ifekd@mapps\ekd@end@apparatus\fi% + \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% + \if@pkg@parnotes\parnotes\parnotereset\else\fi }% - \fi% + \fi } \def\add@apparatus{% \test@apparatus% @@ -403,8 +467,8 @@ {\luadirect{tex.sprint(ekdosis.mdvappend(\luastringO{#2}))}} {\luadirect{tex.sprint(ekdosis.mdvappend(\luastringO{#2}, \luastringO{#1}))}}} -\def\outerlinenumbers{ - \def\makeLineNumberRunning{ +\def\outerlinenumbers{% + \def\makeLineNumberRunning{% \checkoddpage \ifoddpage \linenumberfont\hskip\linenumbersep\hskip\textwidth @@ -412,10 +476,10 @@ \else \hss\linenumberfont\LineNumber\hskip\linenumbersep \fi - } + }% } -\def\innerlinenumbers{ - \def\makeLineNumberRunning{ +\def\innerlinenumbers{% + \def\makeLineNumberRunning{% \checkoddpage \ifoddpage \hss\linenumberfont\LineNumber\hskip\linenumbersep @@ -423,9 +487,10 @@ \linenumberfont\hskip\linenumbersep\hskip\textwidth \hbox to\linenumberwidth{\hss\LineNumber}\hss \fi - } + }% } \newif\ifekd@pagelineation +\newif\ifekd@pagevlineation \NewDocumentCommand{\ekdatbegshihook}{}{% \ifekd@pagelineation\resetlinenumber\fi } @@ -436,11 +501,17 @@ document = \ekd@pagelineationfalse}, unknown-choice lineation = \PackageError{ekdosis}{unknown lineation=#1}{`lineation' must be either `page' or `document'.}, + choice vlineation = {page = \ekd@pagevlineationtrue, + document = \ekd@pagevlineationfalse}, + unknown-choice vlineation = \PackageError{ekdosis}{unknown + vlineation=#1}{`vlineation' must be either `page' or `document'.}, code modulonum = \chardef\c@linenumbermodulo#1\relax, noval modulo = \modulolinenumbers, - code vmodulonum = \if@pkg@verse\poemlines{#1}\fi, - initial vmodulonum = 1, - noval vmodulo = \if@pkg@verse\poemlines{5}\fi, + code vmodulo = \ifekd@memoir@loaded\linenumberfrequency{#1} + \else\if@pkg@poetry@verse\poemlines{#1}\fi\fi, + initial vmodulo = 1, + default vmodulo = 5, + bool continuousvnum = \if@continuous@vnum, choice numbers = {elided = \ekd@elidednumberstrue, full = \ekd@elidednumbersfalse}, unknown-choice numbers = \PackageError{ekdosis}{unknown @@ -452,7 +523,12 @@ outer = \outerlinenumbers}, unknown-choice margin = \PackageError{ekdosis}{unknown margin=#1}{`margin' must be either `left', `right', \MessageBreak - `inner' or `outer'} + `inner' or `outer'}, + choice vmargin = { + right = \if@pkg@poetry@verse\verselinenumbersright\fi, + left = \if@pkg@poetry@verse\verselinenumbersleft\fi}, + unknown-choice vmargin = \PackageError{ekdosis}{unknown + vmargin=#1}{`margin' must be either `left' ot `right'} } \NewDocumentCommand{\SetLineation}{m}{ \ekvset{ekd@lineation}{#1} @@ -484,34 +560,36 @@ = 0 \ifnum% - \getrefnumber{#1} + \pdf@strcmp{\getrefnumber{#1}}{\getrefnumber{#2}} = - \getrefnumber{#2} + 0 % \ifekd@mapps% \ifbool{subsq@unit@\ekdan@type}{% \ifnum% - \getrefnumber{#1} + \pdf@strcmp{\getrefnumber{#1}}{% + \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevnotelab())}}} = - \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevnotelab())}} + 0 \else - \LRnum{\getrefnumber{#1}}% issue the no + \LRnum{\getrefnumber{#1}}\unexpanded\expandafter{\ekd@postrefnum}% issue the no \fi% }% - {\LRnum{\getrefnumber{#1}}}% issue the no + {\LRnum{\getrefnumber{#1}}\unexpanded\expandafter{\ekd@postrefnum}}% issue the no \else \ifsubsq@unit% % \ifnum% - \getrefnumber{#1} + \pdf@strcmp{\getrefnumber{#1}}{% + \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevnotelab())}}} = - \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevnotelab())}} + 0 \else - \LRnum{\getrefnumber{#1}}% issue the no + \LRnum{\getrefnumber{#1}}\unexpanded\expandafter{\ekd@postrefnum}% issue the no \fi % \else - \LRnum{\getrefnumber{#1}}% issue the no + \LRnum{\getrefnumber{#1}}\unexpanded\expandafter{\ekd@postrefnum}% issue the no \fi \fi % @@ -519,17 +597,18 @@ \ifekd@elidednumbers \luadirect{tex.sprint(ekdosis.numrange(\luastring{\getrefnumber{#1}}, \luastring{\getrefnumber{#2}}))}% + \unexpanded\expandafter{\ekd@postrefnum}% issue the nos \else \LRnum{\getrefnumber{#1}}--% - \LRnum{\getrefnumber{#2}}% issue the nos + \LRnum{\getrefnumber{#2}}\unexpanded\expandafter{\ekd@postrefnum}% issue the nos \fi \fi% \else \LRnum{\getrefnumber{#1}}--% \LRnum{\getpagerefnumber{#2}}.% - \LRnum{\getrefnumber{#2}}% issue pg and ln nos + \LRnum{\getrefnumber{#2}}\unexpanded\expandafter{\ekd@postrefnum}% issue pg and ln nos \fi% - }\unexpanded\expandafter{\ekd@postrefnum}% + }% } \def\current@ref{{%\textdir TLT% \unexpanded\expandafter{\ekd@refnumstyle}% @@ -540,33 +619,41 @@ = 0 \ifnum% - \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b} + \pdf@strcmp{% + \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% + {\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}} = - \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e} + 0 % \ifekd@mapps% \ifbool{subsq@unit@\ekdan@type}{% \ifnum% - \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b} + \pdf@strcmp{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% + {\getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b}} = - \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b} + 0 \else - \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% issue the no + \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% + \unexpanded\expandafter{\ekd@postrefnum}% issue the no \fi% - }{\LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}}% issue the no + }{\LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% + \unexpanded\expandafter{\ekd@postrefnum}}% issue the no \else \ifsubsq@unit% % \ifnum% - \getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b} + \pdf@strcmp{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% + {\getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b}} = - \getrefnumber{\luadirect{tex.sprint(ekdosis.getprevlnlab())}-b} + 0 \else - \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% issue the no + \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% + \unexpanded\expandafter{\ekd@postrefnum}% issue the no \fi % \else - \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% issue the no + \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}% + \unexpanded\expandafter{\ekd@postrefnum}% issue the no \fi \fi % @@ -574,18 +661,21 @@ \ifekd@elidednumbers \luadirect{tex.sprint(ekdosis.numrange( \luastring{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}, - \luastring{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}))}% issue the nos + \luastring{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}))}% + \unexpanded\expandafter{\ekd@postrefnum}% issue the nos \else \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}--% - \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}% issue the nos + \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}% + \unexpanded\expandafter{\ekd@postrefnum}% issue the nos \fi \fi% \else \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-b}}--% \LRnum{\getpagerefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}.% - \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}% issue pg and ln nos + \LRnum{\getrefnumber{\luadirect{tex.sprint(ekdosis.getlnlab())}-e}}% + \unexpanded\expandafter{\ekd@postrefnum}% issue pg and ln nos \fi% - }\unexpanded\expandafter{\ekd@postrefnum}% + }% } \ekvdefinekeys{lem}{ code wit = \def\ekdlr@wit{#1}, @@ -617,6 +707,13 @@ \NewDocumentCommand{\rdgGrp}{O{} > {\TrimSpaces } m}{% \luadirect{tex.sprint(ekdosis.removesp(\luastringN{#2}))}% } +\def\app@lang{% + \ifekd@mapps + \luadirect{tex.sprint(ekdosis.getapplang(\luastring{\ekdan@type}))}% + \else + \ekd@singleapp@lang + \fi +} \NewDocumentCommand{\lem}{O{} m}{% \ekd@isinlemtrue% \luadirect{ekdosis.dolnlab(\luastringN{#2})}% @@ -657,13 +754,15 @@ \ifdefined\ekdlr@alt% \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi - {\textdir TRT\unexpanded\expandafter{\ekdlr@alt}}% + {\textdir TRT\unexpanded\expandafter{\ekd@lemmastyle}% + \unexpanded\expandafter{\ekdlr@alt}}% \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \else \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi - {\textdir TRT\unexpanded{#2}}% + {\textdir TRT\unexpanded\expandafter{\ekd@lemmastyle}% + \unexpanded{#2}}% \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \fi @@ -691,17 +790,21 @@ \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \ltx@ifpackageloaded{babel}% - {\noexpand\selectlanguage{\languagename}% - \unexpanded\expandafter{\ekdlr@alt}}% - {\unexpanded\expandafter{\ekdlr@alt}}% + {{\unexpanded\expandafter{\ekd@lemmastyle}% + \noexpand\selectlanguage{\app@lang}% + \unexpanded\expandafter{\ekdlr@alt}}}% + {\unexpanded\expandafter{\ekd@lemmastyle}% + \unexpanded\expandafter{\ekdlr@alt}}% \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi \else \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \ltx@ifpackageloaded{babel}% - {{\noexpand\selectlanguage{\languagename}\unexpanded{#2}}}{% - {\unexpanded{#2}}}% + {{\unexpanded\expandafter{\ekd@lemmastyle}% + \noexpand\selectlanguage{\app@lang}% + \unexpanded{#2}}}{% + {\unexpanded\expandafter{\ekd@lemmastyle}\unexpanded{#2}}}% \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi \fi @@ -743,13 +846,15 @@ \ifdefined\ekdlr@alt% \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi - {\textdir TRT\unexpanded\expandafter{\ekdlr@alt}}% + {\textdir TRT\unexpanded\expandafter{\ekd@readingstyle}% + \unexpanded\expandafter{\ekdlr@alt}}% \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \else \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi - {\textdir TRT\unexpanded{#2}}% + {\textdir TRT\unexpanded\expandafter{\ekd@readingstyle}% + \unexpanded{#2}}% \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \fi @@ -768,17 +873,20 @@ \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \ltx@ifpackageloaded{babel}% - {\noexpand\selectlanguage{\languagename}% - \unexpanded\expandafter{\ekdlr@alt}}% - {\unexpanded\expandafter{\ekdlr@alt}}% + {{\unexpanded\expandafter{\ekd@readingstyle}% + \noexpand\selectlanguage{\app@lang}% + \unexpanded\expandafter{\ekdlr@alt}}}% + {\unexpanded\expandafter{\ekd@readingstyle}% + \unexpanded\expandafter{\ekdlr@alt}}% \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi \else \ifdefined\ekdlr@pre% \space\unexpanded\expandafter{\ekdlr@pre}\space\else\fi \ltx@ifpackageloaded{babel}% - {{\noexpand\selectlanguage{\languagename}\unexpanded{#2}}}{% - {\unexpanded{#2}}}% + {{\unexpanded\expandafter{\ekd@readingstyle}% + \noexpand\selectlanguage{\app@lang}\unexpanded{#2}}}{% + {\unexpanded\expandafter{\ekd@readingstyle}\unexpanded{#2}}}% \ifdefined\ekdlr@post% \space\unexpanded\expandafter{\ekdlr@post}\space\else\fi \fi @@ -845,7 +953,8 @@ \fi% \current@ref@arg{\ekdn@labelb}{\ekdn@labele}%\hskip .25em \ifdefined\ekdn@lem% - {\textdir TRT\unexpanded\expandafter{\ekdn@lem}}% + {\textdir TRT\unexpanded\expandafter{\ekd@lemmastyle}% + \unexpanded\expandafter{\ekdn@lem}}% \unless\ifekdn@nosep \unexpanded\expandafter{\ekdn@sep}\fi \else\fi% @@ -861,14 +970,16 @@ \current@ref@arg{\ekdn@labelb}{\ekdn@labele}%\hskip .25em \ifdefined\ekdn@lem \ltx@ifpackageloaded{babel}% - {\noexpand\selectlanguage{\languagename}% + {{\unexpanded\expandafter{\ekd@lemmastyle}% + \noexpand\selectlanguage{\app@lang}% + \unexpanded\expandafter{\ekdn@lem}}}% + {\unexpanded\expandafter{\ekd@lemmastyle}% \unexpanded\expandafter{\ekdn@lem}}% - {\unexpanded\expandafter{\ekdn@lem}}% \unless\ifekdn@nosep \unexpanded\expandafter{\ekdn@sep}\fi \else\fi% \ltx@ifpackageloaded{babel}% - {{\noexpand\selectlanguage{\languagename}\unexpanded{#2}}}{% + {{\noexpand\selectlanguage{\app@lang}\unexpanded{#2}}}{% {\unexpanded{#2}}}}}% \ifekd@mapps% \unconditional@appin[\ekdan@type]{\note@contents}% @@ -894,7 +1005,11 @@ \ekvifdefinedNoVal{ekd@note}{post}{}{% \unexpanded\expandafter{\post@value}}% }% + \ifekd@mapps% + \append@app[\ekdan@type]{\note@contents}% + \else% \append@app{\note@contents}% + \fi% \egroup% } \NewDocumentCommand{\ekd@note@star}{O{} m}{% @@ -911,7 +1026,11 @@ \append@app{\note@contents}% \egroup% \else - \append@app{\unskip\footnote{#2}}% + \ifekd@mapps% + \append@app[\ekdan@type]{\note@contents}% + \else% + \append@app{\note@contents}% + \fi% \fi% } \NewDocumentCommand{\note@app}{s O{} +m}{% @@ -1147,13 +1266,52 @@ \fi \endgroup } -\if@pkg@verse -\verselinenumfont{\normalfont\footnotesize} +\newif\ifekd@test@vpnum +\newcounter{ekd@vpnum} +\globalcounter{ekd@vpnum} +\NewDocumentCommand{\test@vpnum}{}{% + \ifekd@test@vpnum + \edef\@tempa{\theekd@vpnum}% + \stepcounter{ekd@vpnum}% + \label{vpnum:\theekd@vpnum}% + \ifnum + \pdf@strcmp{\getpagerefnumber{vpnum:\@tempa}}% + {\getpagerefnumber{vpnum:\theekd@vpnum}} + = 0 + \else + \resetvlinenumber + \fi + \else + \label{vpnum:\theekd@vpnum}% + \global\ekd@test@vpnumtrue + \fi +} +\if@pkg@poetry@verse +\patchcmd{\start@vsline}{% + \ifaltindent}{% + \ifekd@pagevlineation\test@vpnum\fi + \ifaltindent}{}{} +\ekvdefinekeys{ekd@verse}{ + dimen width = \vwidth@val, + initial width = \linewidth, + code type = \def\type@value{#1}, +} +\ifekd@memoir@loaded + \linenumberfont{\normalfont\footnotesize} +\else + \verselinenumfont{\normalfont\footnotesize} +\fi \setcounter{poemline}{1} -\NewDocumentEnvironment{ekdverse}{O{\linewidth}}{% +\NewDocumentEnvironment{ekdverse}{!O{}}{% + \ekvset{ekd@verse}{#1}% + \if@continuous@vnum\setverselinenums{\thelinenumber}{0}\fi \nolinenumbers \let\linelabel\label - \stepcounter{verse@envctr}% + \ifekd@memoir@loaded + \refstepcounter{verse}% + \else + \stepcounter{verse@envctr}% + \fi \addtocounter{poemline}{-1}\refstepcounter{poemline}% \setcounter{vslineno}{1}% \let\\=\@vscentercr @@ -1164,22 +1322,23 @@ \setlength{\itemsep}{0pt}% \setlength{\topsep}{0pt}% \setlength{\partopsep}{0pt}% - \ifdim #1 < \linewidth + \ifdim\vwidth@val < \linewidth \rightmargin \z@ \setlength{\leftmargin}{\linewidth}% - \addtolength{\leftmargin}{-#1}% + \addtolength{\leftmargin}{-\vwidth@val}% \addtolength{\leftmargin}{-0.5\leftmargin}% \else \rightmargin \leftmargin \fi \addtolength{\leftmargin}{\vindent}}% - \item[]% + \item[]\ifekd@pagevlineation\test@vpnum\fi% } -{\endlist} +{\endlist + \if@continuous@vnum\resetlinenumber[\thepoemline]\fi} \else \newlength{\ekdverseindentlength} \setlength{\ekdverseindentlength}{\parindent} -\NewDocumentEnvironment{ekdverse}{O{\ekdverseindentlength}}{ +\NewDocumentEnvironment{ekdverse}{!O{\ekdverseindentlength}}{ \begin{list}{}{% \setlength{\leftmargin}{#1} \setlength{\itemsep}{0pt} @@ -1189,7 +1348,21 @@ \item[] }{\end{list}} \fi +\NewDocumentCommand{\resetvlinenumber}{O{1}}{% + \if@pkg@poetry@verse + \setverselinenums{#1}{0}% + \fi +} +\ekvdefinekeys{ekd@stanza}{ + code type = \def\type@value{#1} +} +\NewDocumentEnvironment{ekdstanza}{!O{}}{% + \leavevmode\unskip + \ekvset{ekd@stanza}{#1}% + \ignorespaces +}{} \NewDocumentEnvironment{ekdpar}{}{\par}{\par} +\IfFileExists{\jobname-ekd.cfg}{\input{\jobname-ekd.cfg}}{} \endinput %% %% End of file `ekdosis.sty'. |