diff options
Diffstat (limited to 'macros/luatex/generic/minim-pdf/minim-pdf.tex')
-rw-r--r-- | macros/luatex/generic/minim-pdf/minim-pdf.tex | 351 |
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\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 + |