summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/minim-pdf/minim-pdf.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/generic/minim-pdf/minim-pdf.tex')
-rw-r--r--macros/luatex/generic/minim-pdf/minim-pdf.tex351
1 files changed, 351 insertions, 0 deletions
diff --git a/macros/luatex/generic/minim-pdf/minim-pdf.tex b/macros/luatex/generic/minim-pdf/minim-pdf.tex
new file mode 100644
index 0000000000..f8075ae6e4
--- /dev/null
+++ b/macros/luatex/generic/minim-pdf/minim-pdf.tex
@@ -0,0 +1,351 @@
+
+\ifdefined\minimpdfloaded
+ \message{(skipped)}
+ \expandafter\endinput\fi
+\chardef\minimpdfloaded = \catcode`\:
+\catcode`\: = 11
+
+% Abbreviations used throughout this document:
+% se structure element
+% mci marked content item
+
+\newcount \writedocumentstructure
+\newcount \writehyphensandspaces
+\newcount \strictstructuretagging
+
+\writedocumentstructure = 0
+\writehyphensandspaces = 1
+\strictstructuretagging = 0
+
+% 1 the attributes
+
+\input minim-alloc
+\input minim-hooks
+
+% By three attributes do we determine the document structure.
+%
+% One for marking the current structure element:
+% - is the index of the lua-side se table
+% - assignments are always local
+\newattribute \tagging:current:se \tagging:current:se = 1
+%
+% One for ordering children of structure elements:
+% - assignments are always global
+% - should generally increase monotously
+% - should change (increase) at every se boundary
+\newattribute \tagging:element:order \tagging:element:order = 1
+%
+% One for marking the status:
+% - assignments are generally local
+% - if set, disables tagging and content marking
+\newattribute \tagging:current:status \tagging:current:status = \unset
+%
+% A fourth attribute keeps track of the current language
+% - assignments are local
+% - sets language of structure elements
+\newattribute \tagging:current:language \tagging:current:language = \language
+
+\directlua { require('minim-pdf') }
+
+% 1 artifacts and content items
+
+% \stoptagging ... \starttagging
+% disables marking structure elements
+\newif\iftagging:enabled \tagging:enabledtrue
+\protected\def\starttagging{\tagging:enabledtrue
+ \ifnum1=\tagging:current:status
+ \tagging:current:status\unset\fi}
+\protected\def\stoptagging{\tagging:enabledfalse
+ \ifnum\unset=\tagging:current:status
+ \tagging:current:status1\relax\fi}
+
+% \markartifact {Layout} {...}
+% \startartifact {Pagination /Subtype/Header} ... \stopartifact
+\long\def\markartifact#1#2{\startartifact{#1}#2\stopartifact}
+\protected\def\startartifact{\begingroup\stoptagging
+ \tagging:mci:incr\tagging:art:markstart}
+\protected\def\stopartifact{\tagging:art:markstop\tagging:mci:incr\endgroup}
+
+% \startcontentitem ... \stopcontentitem
+\protected\def\startcontentitem{\iftagging:enabled\tagging:mci:incr\tagging:mci:markstart\fi}
+\protected\def\stopcontentitem{\iftagging:enabled\tagging:mci:markstop\tagging:mci:incr\fi}
+
+% \startsinglecontentitem ... \stopsinglecontentitem
+\protected\def\startsinglecontentitem{\begingroup \startcontentitem\stoptagging}
+\protected\def\stopsinglecontentitem{\endgroup\stopcontentitem}
+
+% \ensurecontentitem
+\protected\def\ensurecontentitem{\iftagging:enabled\tagging:mci:content\fi}
+\protected\def\tagging:mci:incr{\global\advance\tagging:element:order1\relax}
+
+% 1 structure elements
+
+% \savecurrentelement ... \continueelement
+% \savecurrentelementto\name ... \continueelementfrom\name
+\protected\def\savecurrentelementto#1{\global\chardef#1\tagging:current:se}
+\protected\def\continueelementfrom#1{\tagging:current:se#1\tagging:mci:incr}
+\def\savecurrentelement{\savecurrentelementto\tagging:saved:se}
+\def\continueelement{\continueelementfrom\tagging:saved:se}
+
+% \markelement {Tag} {...}
+% \startelement {Tag} ... \stopelement {Tag}
+% \ensurestopelement {Tag}
+\long\protected\def\markelement#1#2{\iftagging:enabled
+ \startelement{#1}#2\stopelement{#1}\else#2\fi}
+\protected\def\startelement{\iftagging:enabled \tagging:mci:incr
+ \expandafter\tagging:startelement\else
+ \expandafter\tagging:ignore\fi}
+\protected\def\stopelement{\iftagging:enabled \tagging:mci:incr
+ \expandafter\tagging:stopelement\else
+ \expandafter\tagging:ignore\fi}
+\protected\def\ensurestopelement{\iftagging:enabled \tagging:mci:incr
+ % n.b. this can cause problems if you skip levels
+ \expandafter\tagging:ensurestopelement\else
+ \expandafter\tagging:ignore\fi}
+\def\tagging:ignore#1#{\ignore}
+
+% \addstructuretype [options] Existing Alias
+\protected\def\addstructuretype{\withoptions[]\addstructure:type}
+\def\addstructure:type[#1]{\struct:addalias{return {#1}}}
+
+% \setalttext {...} and \setactualtext {...}
+\protected\def\setalttext{\iftagging:enabled
+ \expandafter\tagging:alt\fi}
+\protected\def\setactualtext{\iftagging:enabled
+ \expandafter\tagging:actual\fi}
+
+
+% 1 auto-marking paragraphs
+
+% \nextpartag {H}
+% \nextpartag {} % no tag inserted for next paragraph
+% \markparagraphs(true|false)
+\newif\ifmarkparagraphs \markparagraphstrue
+\newtoks\nextpartag \nextpartag{P}
+\toksapp\minim:ateverypar{\iftagging:enabled \ifmarkparagraphs
+ \expandafter\ifx\expandafter\relax\the\nextpartag\relax\else
+ \startelement{\the\nextpartag}\fi
+ \nextpartag{P}\fi \fi}
+
+% 1 tagging helper macros
+
+% \marktocentry {destination}{label}{title}{filler}{page}
+\def\marktocentry#1#2#3#4#5{%
+ \ifx\marktocentry#1\marktocentry
+ \def\marktocentry:link##1{##1}\else
+ \def\marktocentry:link##1{\hyperlink dest{#1}##1\endlink}\fi
+ \markelement{TOCI}{\nextpartag{}\quitvmode
+ \ifx\marktocentry#2\marktocentry\else
+ \markelement{Lbl}{\marktocentry:link{#2}}\fi
+ \markelement{Reference}{\marktocentry:link{#3%
+ \ifx\marktocentry#4\marktocentry\else
+ \markartifact{Layout}{#4}\fi#5}}}}
+
+% \marktable \halign {\marktablerow#&\marktablecell#\cr
+% \marktableheader
+% Header & cells \cr
+% \marktablebody
+% ... & ... \cr ...
+% \marktablefooter
+% ... & ... \cr ... }
+%
+\def\marktable{\startelement{Table}%
+ \def\tagging:cell{TD}}
+\def\marktableheader{%
+ \noalign{\gdef\tagging:cell{TH}%
+ \startelement{THead}%
+ \savecurrentelementto\tagging:tpart}}
+\def\marktablebody{%
+ \noalign{\gdef\tagging:cell{TD}%
+ \startelement{TBody}%
+ \savecurrentelementto\tagging:tpart}}
+\def\marktablefooter{%
+ \noalign{\startelement{TFoot}%
+ \savecurrentelementto\tagging:tpart}}
+\def\marktablerow{
+ \unless\ifdefined\tagging:tpart
+ \startelement{TBody}%
+ \savecurrentelementto\tagging:tpart\fi
+ \continueelementfrom\tagging:tpart
+ \startelement{TR}%
+ \savecurrentelementto\tagging:row
+ \startelement{\tagging:cell}}
+\def\marktablecell{%
+ \continueelementfrom\tagging:row
+ \startelement{\tagging:cell}}
+
+% \automarktable \halign ... { ... }
+\def\automarktable#1#{\marktable
+ \def\tagging:table{\tagging:mktrow{#1}}%
+ \afterassignment\tagging:table
+ \let\tagging:tmp= }
+\def\tagging:mktrow#1#2&#3\cr{\iftrue
+ \tagging:mktcell{#1\bgroup\marktablerow#2}\fi
+ #3&\tagging:mktrow&\cr}
+\def\tagging:mktcell#1#2\fi#3&{\fi
+ \ifx\tagging:mktrow#3\tagging:mkthdr{#1}\fi
+ \ifx\tagging:mktrow#3\tagging:mktrow
+ \tagging:mktcell{#1&}\else
+ \tagging:mktcell{#1&\marktablecell#3}\fi}
+\def\tagging:mkthdr#1#2\cr#3\cr{\fi#1\cr
+ \marktableheader#3\cr\marktablebody}
+\def\tagging:fi{\fi}
+
+% \marktableaslist \halign ... { ... }
+\def\marktableaslist#1#{\startelement{L}%
+ \def\tagging:table{\tagging:mktlist{#1}}%
+ \afterassignment\tagging:table
+ \let\tagging:tmp= }
+\def\tagging:mktlist#1#2&{#1\bgroup
+ \startelement{LI}\savecurrentelement
+ \startelement{Lbl}#2&\continueelement
+ \startelement{LBody}}
+
+% \autotagformulas
+% \stopformulatagging ... \startformulatagging
+% \formulafilename
+\newif \iftagging:indisplay
+\newif \iftagging:toplevelmath \tagging:toplevelmathtrue
+\newif \iftagging:formulaenabled
+\let\startformulatagging = \tagging:formulaenabledtrue
+\let\stopformulatagging = \tagging:formulaenabledfalse
+\newcount \tagging:formulanr
+\def\formulafilename{unnumbered-equation-\the\tagging:formulanr}
+\def\autotagformulas{\startformulatagging
+ \everymath\expandafter{\the\everymath
+ \tagging:formula\tagging:startformula}%
+ \everydisplay\expandafter{\the\everydisplay \tagging:indisplaytrue
+ \tagging:formula\tagging:startdisplay}}
+\def\tagging:formula#1{%
+ \iftagging:enabled \iftagging:formulaenabled \iftagging:toplevelmath
+ \tagging:toplevelmathfalse #1\fi\fi\fi}
+\def\tagging:startformula\fi\fi\fi#1${\tagging:makeformula{#1}{$}}
+\def\tagging:startdisplay\fi\fi\fi#1$${\tagging:makeformula{#1}{$$}}
+\def\tagging:makeformula#1#2{\fi\fi\fi
+ \global\advance\tagging:formulanr1\relax
+ \startelement\iftagging:indisplay block\else inline\fi{Formula}%
+ \setalttext{\tagging:formulasource{#1}}%
+ \setactualtext{\tagging:formulasource{#1}}%
+ \ifnum3=\pdfaconformancelevel
+ \embedfile mimetype text/x-tex
+ relation Source desc {Equation source}
+ name {\formulafilename.tex}
+ string {\tagging:formulasource{#1}}\fi
+ \scantextokens{#1}#2}
+\def\tagging:formulasource#1{%
+ $\iftagging:indisplay$\fi
+ \unexpanded{#1}%
+ $\iftagging:indisplay$\fi}
+
+% 1 hyperlinks
+
+% provided by the lua module:
+% \newdestinationname
+% \lastdestinationname
+
+% \nameddestination {name}
+\def\nameddestination{\ifhmode\expandafter\linkdest:h\else\expandafter\linkdest:v\fi}
+\def\linkdest:h#1{\vadjust pre{\linkdest:v{#1}}}
+\def\linkdest:v#1{\pdfextension dest name {#1} xyz\nobreak}
+
+% \hyperlink dest {name} ... \endlink
+% \hyperlink url {url} ... \endlink
+\protected\def\endlink{\pdfextension endlink\stopelement{Link}\relax}
+\protected\def\startlink{\startelement{Link}\pdfextension startlink}
+\def\hyperlink#1#{\quitvmode\hyperlink:rmspace#1 \hyperlink:rmspace}
+\def\hyperlink:rmspace#1 #2\hyperlink:rmspace{%
+ \startlink attr {\minim:linkattr}%
+ \csname hyperlink:#1\endcsname}
+\def\hyperlink:dest#1{user {/Subtype/Link /F 4 /A <</S/GoTo /D (#1)>>}}
+\def\hyperlink:url#1{user {/Subtype/Link /F 4 /A <</S/URI /URI (#1)>>}}
+\def\minim:linkattr{/Border [0 0 0]}
+
+% 1 languages
+
+% provided by the lua module:
+% \setdocumentlanguage {name or code}
+% \setlanguagecode {name} {code}
+% \minim:apply:language:code{name} → index
+
+% patch in language codes to \uselanguage
+\ifcsname uselanguage@hook\endcsname
+ \expandafter\let
+ \expandafter\minim:uselanguagehook
+ \lastnamedcs \fi
+\expandafter\edef\csname uselanguage@hook\endcsname#1{%
+ % tagging support
+ \noexpand\tagging:current:language
+ \noexpand\minim:apply:language:code{#1}%
+ % previous definitions
+ \ifdefined\minim:uselanguagehook
+ \noexpand\minim:uselanguagehook{#1}\fi}
+
+% \newnamedlanguage {name} {lhm} {rhm}
+\def\newnamedlanguage#1#2#3{%
+ \expandafter\newlanguage\csname lang@#1\endcsname
+ \expandafter\chardef\csname lhm@#1\endcsname=#2\relax
+ \expandafter\chardef\csname rhm@#1\endcsname=#3\relax
+ \csname lu@texhyphen@loaded@\the\csname lang@#1\endcsname\endcsname}
+
+% \newnameddialect {language} {dialect}
+\def\newnameddialect#1#2{%
+ \expandafter\chardef\csname lang@#2\endcsname\csname lang@#1\endcsname
+ \expandafter\chardef\csname lhm@#2\endcsname\csname lhm@#1\endcsname
+ \expandafter\chardef\csname rhm@#2\endcsname\csname rhm@#1\endcsname}
+
+% and provide several dummy languages
+\ifcsname lang@nohyph\endcsname \else
+ \newnamedlanguage {nohyph} 1 1 \fi
+\ifcsname lang@nolang\endcsname \else
+ \newnameddialect {nohyph} {nolang} \fi
+\ifcsname lang@uncoded\endcsname \else
+ \newnameddialect {nohyph} {uncoded} \fi
+\ifcsname lang@undetermined\endcsname \else
+ \newnameddialect {nohyph} {undetermined} \fi
+
+% 1 embedded files
+
+% provided by the lua module
+% \embedfile <options>
+
+% \setembeddedfilesmodate { yyyy-mm-dd }
+\newtoks\setembeddedfilesmoddate
+ \setembeddedfilesmoddate{}
+\newtoks\embeddedfiles:moddate
+\def\minim:makedefaultmoddate{%
+ \expandafter\edef\expandafter
+ \minim:tmp\expandafter{\the\setembeddedfilesmoddate}%
+ \embeddedfiles:moddate\expandafter{\minim:tmp}}
+
+% 1 declarations of pdf/a conformance
+
+\newcount \pdfaconformancelevel
+\pdfaconformancelevel = 0
+
+% \pdfalevel 2b
+\def\pdfalevel#1#2{%
+ \global\pdfaconformancelevel=#1\relax
+ \ifcsname minim:pdfa:#1#2\endcsname \lastnamedcs\else
+ \errmessage{Unknown pdf/a standard pdf/a-#1}\fi}
+
+\def\minim:pdfasettings#1#2#3{%
+ \pdfvariable minorversion #1\relax
+ \minim:default:rgb:profile
+ \if#2A\writedocumentstructure1\fi
+ \input minim-xmp
+ \setmetadata pdfaid:conformance{#2}%
+ \setmetadata pdfaid:part{#3}}
+
+\expandafter\def\csname minim:pdfa:1a\endcsname{\minim:pdfasettings 4A1}
+\expandafter\def\csname minim:pdfa:1b\endcsname{\minim:pdfasettings 4B1}
+\expandafter\def\csname minim:pdfa:2a\endcsname{\minim:pdfasettings 7A2}
+\expandafter\def\csname minim:pdfa:2b\endcsname{\minim:pdfasettings 7B2}
+\expandafter\def\csname minim:pdfa:2u\endcsname{\minim:pdfasettings 7U2}
+\expandafter\def\csname minim:pdfa:3a\endcsname{\minim:pdfasettings 7A3}
+\expandafter\def\csname minim:pdfa:3b\endcsname{\minim:pdfasettings 7B3}
+\expandafter\def\csname minim:pdfa:3u\endcsname{\minim:pdfasettings 7U3}
+
+% 
+
+\catcode`\: = \minimpdfloaded
+