summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/minim-pdf/minim-pdf.doc
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/generic/minim-pdf/minim-pdf.doc')
-rw-r--r--macros/luatex/generic/minim-pdf/minim-pdf.doc425
1 files changed, 425 insertions, 0 deletions
diff --git a/macros/luatex/generic/minim-pdf/minim-pdf.doc b/macros/luatex/generic/minim-pdf/minim-pdf.doc
new file mode 100644
index 0000000000..2c06dd25b0
--- /dev/null
+++ b/macros/luatex/generic/minim-pdf/minim-pdf.doc
@@ -0,0 +1,425 @@
+
+\input minim-doc.sty
+
+\manual{minim-pdf}
+
+\ifchapter \chapter Hypertext
+
+This chapter and the next document the support of the modern pdf features
+provided by the minim-pdf package.
+Load it by saying ⟦\input minim-pdf⟧.
+The next chapter concerns the creation of tagged pdf;
+all other features of the package are described here.
+
+\else \startmetadata
+ author {Esger Renkema}
+ title {minim-pdf}
+ date {2021-06-01}
+ version {2021/1.0}
+ keywords {LuaTeX; Plain TeX; PDF/A; Tagged PDF; accessibility; a11y;
+ hypertext; bookmarks; document outline; associated files}
+ stopmetadata
+\maketitle
+
+This package adds low-level support to plain luatex for marking up the
+structure of a pdf document. The implementation is rather basic, but should
+allow you to make your pdfs fully pdf/a-compliant.
+Load the package by saying ⟦\input minim-pdf⟧.
+
+The creation of tagged pdf will be described in the second half of this manual;
+all other features will be covered first.
+
+\fi
+
+\section Hyperlinks % 1
+
+For most simple cases, you can use
+⟦*\hyperlink [name {...} | url {...}] ... \endlink⟧ for linking to a named
+destination in your own document or to an external hyperlink respectively.
+There is no support for nonsimple cases.
+
+A named destination can be created with ⟦*\nameddestination {...}⟧ (also in
+horizontal mode, unlike the backend primitive) and if you cannot think of
+a name, ⟦*\newdestinationname⟧ should generate a unique one.
+If you need the latter twice, ⟦*\lastdestinationname⟧ gives the last
+generated name.
+
+
+\section Bookmarks % 1
+
+Bookmarks can be added with ⟦*\outline [open] [dest {name}] {title}⟧.
+Add ⟦open⟧ to have the bookmark appear initially open and
+say ⟦dest {name}⟧ for having it refer to a specific named destination
+(otherwise, a new one will be created where the ⟦\outline⟧ command appears).
+
+A bookmark is automatically associated with the current structure element and
+the hierarchy of structure elements determines the nesting of bookmarks.
+Therefore, if you want nested bookmarks, you \emph{must} precede the ⟦\outline⟧
+command with a declaration of the current structure element, even if you have
+otherwise disabled tagging. See the next chapter on how to do this.
+
+
+\section Page labels % 1
+
+If the page numbers of your document are not a simple sequence starting with~1,
+you can use ⟦*\setpagelabels [pre {prefix}] style nr⟧ for communicating
+this to the pdf viewer.
+This command affects the page labels from the next page on: ⟦nr⟧ should be the
+numerical page number of that page.
+The ⟦prefix⟧ is prepended to each number and the
+⟦style⟧ must be one of ⟦decimal⟧, ⟦roman⟧, ⟦Roman⟧, ⟦alphabetic⟧, ⟦Alphabetic⟧
+or ⟦none⟧. In the last case, only the prefix is used.
+
+
+\section PDF/A % 1
+
+You can declare pdf/a conformance with ⟦*\pdfalevel xy⟧, with version $\tt
+x ∈ \{1,2,3\}$ and conformance level $\tt y ∈ \{a,b,u\}$. This will set the
+correct pdf version and ⟦pdfaid⟧ metadata. If the conformance level is ‘⟦a⟧’,
+tagging will be enabled (see the next chapter). Finally, a default RGB colour
+profile will be included.
+The conformance level can be queried from the ⟦*\pdfaconformancelevel⟧ register.
+
+Note that merely declaring conformance will not make your document pdf/a
+compliant, and that minim will not warn you if it is not.
+However, the features described in this chapter and the next should be enough
+to make pdf/a compliance possible.
+
+Also note that there currently is no documented way of choosing a different
+colour profile from the default (i.e. the default rgb profile provided by the
+colorprofiles package).
+Should you need do that, you will have to do so manually, after
+disabling the automatic inclusion by saying
+⟦\expandafter\let \csname minim:default:rgb:profile\endcsname = \relax⟧.
+
+Finally, note that pdf/a requires that spaces are represented by actual space
+characters and that discretionary hyphens are marked as soft hyphens
+(⟦U+00AD⟧).
+Since both features benefit accessibility and text extraction in general, they
+are enabled by default.
+You can disable them by setting ⟦*\writehyphensandspaces⟧ to a nonpositive value.
+
+
+\section Embedded files % 1
+
+You can attach (associate) files with ⟦*\embedfile <options>⟧.
+The file will be attached to the current structure element (see the next
+chapter) unless the ⟦global⟧ option is given: then it will be added to the
+document catalog.
+Arguments consisting of a single word can be given without braces and
+exactly one of the options ⟦file⟧ or ⟦string⟧ must be present.
+
+\smallskip\marktableaslist \halign{#\quad\hfil&#\hfil\cr
+⟦file ⟧\hfill⟦{...}⟧ & The file to embed.\cr
+⟦string ⟧\hfill⟦{...}⟧ & The string to embed.\cr
+⟦global⟧ & Attach to the document catalog.\cr
+⟦uncompressed⟧ & Do not compress the file stream.\cr
+⟦mimetype ⟧\hfill⟦{...}⟧ & The file’s mime type.\cr
+⟦moddate ⟧\hfill⟦{...}⟧\rlap{*} & The modification date (see * below).\cr
+⟦desc ⟧\hfill⟦{...}⟧ & A description (the ⟦/Desc⟧ key).\cr
+⟦relation ⟧\hfill⟦{...}⟧ & The ⟦/AFRelationship⟧ value as defined in pdf/a-3.\cr
+⟦name ⟧\hfill⟦{...}⟧ & The file name (only required when writing a ⟦string⟧).\cr }
+
+* The modification date must be of the form ⟦yyyy[-m[m][-d[d]]]⟧. A default
+moddate can be set with ⟦*\setembeddedfilesmoddate {default}⟧.
+The ⟦default⟧ date will be expanded fully at the time of embedding.
+With the minim-xmp package, a useful setting is
+⟦\setembeddedfilesmoddate {\getmetadata date}⟧.
+
+\section Lua module % 1
+
+The interface of the lua module (available via
+⟦local M = require('minim-pdf')⟧) is not stable yet, and may change.
+One function of interest, however, is
+⟦M.pdf_string(...)⟧, wich converts a lua string to a pdf string. The
+surrounding ⟦<>⟧ or ⟦()⟧ characters are included in the return value.
+
+
+% 
+
+\chapter Tagged PDF
+
+This chapter is a continuation of the previous and describes the parts of
+minim-pdf that concern the creation of tagged pdf. All features in this chapter
+must be explicitly enabled by setting ⟦*\writedocumentstructure⟧ to a positive
+value. This will be done automatically if you declare pdf/a conformance (see
+above).
+
+This part of the package is rather low-level and this chapter rather technical.
+For a more general introduction to and discussion of tagged pdf, please read
+the (excellent) manual of latex’s tagpdf package.
+
+
+\section Purpose, limitations and pitfalls % 1
+
+The main purpose of this package is semi-automatically marking up the
+(hierarchical) structure of your document, thereby creating so-called tagged pdf.
+The mechanism presented here is not quite as versatile as the pdf format
+allows. The most important restriction is that all content of the document must
+be seen by tex’s stomach in the \emph{logical} order.
+
+Furthermore, while the macros in this package are sophisticated enough that
+tagging can be done without any manual intervantion, it is quite possible and
+rather easy to generate the wrong document structore, or even cause syntax
+errors in the resulting pdf code.
+You should always check the result in an external application.
+
+This is the full list of limitations, pitfalls and shortcomings:
+\startlist
+\item1. Document content must be seen by tex in its logical order (although you
+can mark out-of-order content explicitly if you know what you are doing; see
+below).
+\item2. Artifacts cannot be split across pages. A pagebreak inmidst an artifact
+will cause incorrect pdf without error or warning.
+\item3. The contents of ⟦\localleftbox⟧ and ⟦\localrightbox⟧ must be marked
+manually, probably as artifact.
+\item4. You must mark page header, page footer and footnote rule yourself; no
+default is set.
+\item5. There currently is no way of marking xforms or other pdf objects as
+content items of themselves.
+\item6. The content of xforms (i.e. pdf objects created by ⟦\useboxresource⟧)
+should not contain tagging commands.
+\item7. Likewise, you should be careful with box reuse: it might work, but you
+should check.
+\item8. The use of structure element attributes is currently not supported
+except in a limited number of cases.
+\item9. This package currently only supports pdf~1.7 tagging and is not yet
+ready for use with pdf~2.0.
+\stoplist
+
+In order to help you debugging, some errors will refer you to the resulting pdf
+file. If you get such errors, decompress the pdf and search for the string
+‘Warning:’. It will appear in the pdf stream at the exact spot the problem
+occurs.
+
+
+\section General overview % 1
+
+When speaking about tagging, we have to do with two (or perhaps three) separate
+and orthogonal tagging processes.
+The first is the creation of a hierarchical \emph{document structure}, made up
+of \emph{structure elements} (SEs). The document structure describes the
+logical structure of a document, made up of chapters, paragraphs, references
+etc.
+The second tagging process is the tagging of \emph{marked content items}
+(MCIs): this is the partition of the actual page contents into (disjoint)
+blocks that can be assigned to the proper structure element.
+Finally, as a separate process, some parts of the page can be marked as
+\emph{artifacts}, excluding their content from both content and structure
+tagging.
+
+When using this package, artifacts and structure elements (excluding
+paragraphs; see below) must be marked explicitly, while marked content items
+will be created, marked and assigned automatically.
+There is some (partial and optional) logic for automatically arranging
+structure elements in their correct hierarchical relation.
+
+The mechanism through which this is achieved uses attributes and whatsits for
+marking the contents and borders of SEs, MCIs and artifacts. At the end of the
+output routine, just before the pdf page is assembled, this information will be
+converted into markers inserted in the pdf stream.
+
+
+\section Marked content items % 1
+
+Content items are automatically delineated at page, artifact and structure
+element boundaries and terminated at paragraph or display skips.
+This should relieve you from any manual intervention. However, if you run into
+problems, the commands below might be helpful.
+
+Use of ⟦ActualText⟧, ⟦Alt⟧ or ⟦Lang⟧ attribute on MCIs, while allowed by the
+pdf standard, is not supported by this package. You should set these on the
+structure element instead.
+
+The begining and ending of a content item can be forced with
+⟦*\startcontentitem⟧ and ⟦*\stopcontentitem⟧, while ⟦*\ensurecontentitem⟧ will
+only open a new content item if you are currently outside any.
+If you need some part to be a single content item, that can use
+⟦*\startsinglecontentitem ... \stopsinglecontentitem⟧.
+This will disable all SE and MCI tagging inside.
+
+Tagging (both of MCIs and SEs) can be disabled and re-enabled locally with
+⟦*\stoptagging⟧ and ⟦*\starttagging⟧.
+
+
+\section Artifacts % 1
+
+Artifacts can be marked in two ways: with ⟦*\markartifact {type} {...}⟧ or with
+⟦*\startartifact {type} ... \stopartifact⟧.
+The ⟦type⟧ is written to the pdf attribute dictionary directly, so that if you
+need a subtype, you can write e.g.
+⟦\startartifact {Pagination /Subtype/Header} etc⟧.
+Do make sure your artifact does not contain a page break, as this will result
+in invalid output.
+
+Inside artifacts, other structure content markers will be ignored. Furthermore,
+this package makes sure artifacts are never part of marked content items,
+automatically closing and re-opening content items before and after the
+artifact.
+While the pdf standard does not require the latter, not enforcing this seems to
+confuse some pdf software.
+
+
+\section Document structure % 1
+
+Like artifacts, structure elements can be given as ⟦*\markelement {Tag} {...}⟧
+or ⟦*\startelement {Tag} ... \stopelement {Tag}⟧.
+Here, in many cases the ⟦\stopelement⟧ is optional: whenever opening an element
+would cause a nesting of incompatible ⟦Tag⟧s, the current element will be
+closed until such a nesting is possible.
+Thus, opening a ⟦TR⟧ will close the previous ⟦TR⟧, opening an ⟦H1⟧ will
+automatically close any open inline or block structure elements, opening
+a ⟦TOCI⟧ will close all elements up until the current ⟦TOC⟧ etc. etc.
+
+As a special case, the tags ⟦Document⟧, ⟦Part⟧, ⟦Art⟧, ⟦Sect⟧ and ⟦Div⟧ (and
+their aliases) will try and close all open structure elements up to and
+including the last structure element with the same tag.
+(An alias will of course only match the same alias.)
+
+While the above can greatly reduce the effort of tagging, the logic is neither
+perfect nor complete. You should always check the results in an external
+application.
+Particular care should be taken when ‘skipping’ structure levels: the sequence
+chapter – subsection – section will result in the section beneath the subsection.
+If you are in doubt about an element being closed already, you can use
+⟦*\ensurestopelement {Tag}⟧ instead of ⟦\stopelement⟧
+to prevent an error being raised.
+
+All these helpful features can also be disabled by setting
+⟦*\strictstructuretagging⟧ to a positive value. Then, every structure element
+will have to be closed by an explicit closing tag, as in xml.
+In this case, ⟦\stopelement⟧ and ⟦\ensurestopelement⟧ will be equivalent.
+
+By default, ⟦P⟧ structure elements are inserted automatically at the start of
+every paragraph. The tag can be changed with ⟦*\nextpartag {Tag}⟧; leaving the
+argument empty will prevent marking the next paragraph.
+Auto-marking paragraphs can be (locally) disabled or enabled by saying
+⟦*\markparagraphsfalse⟧ or ⟦*\markparagraphstrue⟧.
+
+
+\section Structure element aliases % 1
+
+New structure element tags can be created with
+⟦*\addstructuretype [options] Existing Alias⟧.
+This will create a new structure tag named ⟦Alias⟧ with the same properties as
+⟦Existing⟧.
+The properties can be modified by specifying ⟦options⟧: these will set values
+of the corresponding entry in the ⟦structure_types⟧ table (see the lua source
+file for this package).
+Any aliases you declare will be written to the pdf’s ⟦RoleMap⟧ only if they
+have actually been used.
+
+
+\section Manipulating the logical order % 1
+
+With the process outlined above, the logical order of structure elements has to
+coincide with the order in which the SEs are ‘digested’ by tex.
+This, together with the marked content items being assigned to structure
+elements in their order of appearance, lies behind the restriction that logical
+and processing orders should match.
+
+With manual intervention, this restriction can be relaxed somewhat.
+Issuing the pair ⟦*\savecurrentelement ... \continueelement⟧ will append the
+MCIs following ⟦\continueelement⟧ to the SE containing ⟦\savecurrentelement⟧.
+Since the assignments made here are global, this process cannot be nested;
+in more complicated situations you should therefore use
+⟦*\savecurrentelementto\name ... \continueelementfrom\name⟧ which restores the
+current SE from a named identifier ⟦\name⟧.
+
+
+\section Structure element options % 1
+
+The ⟦\startcontentitem⟧ command allows a few options that are not mentioned
+above: its full syntax is ⟦*\startcontentitem <options> {Tag}⟧.
+The three most useful options are ⟦alt⟧ for setting an alt-text (the ⟦/Alt⟧
+entry in the structure element dicionary), ⟦actual⟧ for a text replacement
+(⟦/ActualText⟧) and ⟦lang⟧ for the language (⟦/Lang⟧; see the next section).
+The alternative and actual texts can also be given after the fact with
+⟦*\setalttext{...}⟧ and ⟦*\setactualtext{...}⟧. These apply to the current
+structure element.
+
+Setting structure element attributes is not supported at this moment, except
+the placement attributes ⟦block⟧ and ⟦inline⟧, which can be given as options.
+
+
+\section Languages % 1
+
+If you do not specify a language code for a structure element, its language
+will be determined automatically.
+In order for this to work, you must associate a language code to every used
+language; you can do so with ⟦*\setlanguagecode name code⟧, where ⟦name⟧ must
+be an identifier used with ⟦\uselanguage {name}⟧ and ⟦code⟧ must be a two or
+three-letter language code, optionally followed by a dialect specification,
+a country code, and/or some other tag.
+Note that the language code is associated to a language \emph{name}, not to the
+numerical value of the ⟦\language⟧ parameter. This allows you to assign
+separate codes to dialects.
+
+There is a small set of default language code associations, which can be found
+in the file ⟦minim-languagecodes.lua⟧.
+It covers most languages defined by the hyph-utf8 package, as well as (due to
+their ubiquitous use) many ancient languages.
+
+An actual language change introduced by ⟦\uselanguage⟧ will not otherwise be
+acted upon by this package. Therefore, you will probably want to add
+⟦\startelement{Span}⟧ after every in-line invocation of ⟦\uselanguage⟧.
+
+You can set the document language with ⟦*\setdocumentlanguage language-code⟧.
+If unset, the language code associated with the first ⟦\uselanguage⟧ statement
+will be used, or else ⟦und⟧ (undetermined). The only function of the document
+language is that it is mentioned in the pdf catalog: it has no other influence.
+
+New languages can be declared with ⟦*\newnamedlanguage {name} {lhm} {rhm}⟧ and
+new dialects with ⟦*\newnameddialect {language name} {dialect name}⟧.
+Dialects will use the same hyphenation patterns (and will indeed have the same
+⟦\language⟧ value) as their parent languages; newly declared languages will
+start with no hyphenation patterns.
+Do note that you will probably also have to specify language codes for new
+languages or dialects.
+
+This package ensures the existence of the ⟦nohyph⟧, ⟦nolang⟧, ⟦uncoded⟧ and
+⟦undetermined⟧ dummy languages, all without hyphenation.
+
+
+\section Helper macros
+
+For marking up an entry in a table of contents, you can use the macro
+⟦*\marktocentry {dest} {lbl} {title} {filler} {pageno}⟧, which should insert all
+tags in the correct way. (The ⟦dest⟧ is a link destination and can be empty;
+the ⟦lbl⟧ is a section number and can also be empty.)
+
+For marking up tables, a whole array of helper macros is available. First,
+⟦*\marktable⟧ should be given \emph{before} the ⟦\halign⟧.
+Then, in the template, the first cell should start with ⟦*\marktablerow⟧ and
+each subsequent cell with ⟦*\marktablecell⟧.
+If your table starts with a header, insert ⟦*\marktableheader⟧ before it and
+⟦*\marktablebody⟧ after.
+Before a table footer, insert ⟦*\marktablefooter⟧.
+
+For greater convenience, insert just ⟦*\automarktable⟧ before the ⟦\halign⟧.
+Then you can leave out all the above commands (unless you ⟦\omit⟧ a template of
+course).
+This assumes the table has a single header row and more than one column.
+If you use a table for typesetting a list, you can use ⟦*\marktableaslist⟧
+instead, which marks the first column as list label and the second column as
+list item. Of course, this only works with two-column tables.
+
+Finally, you can auto-tag equations as formulas by specifing
+⟦*\autotagformulas⟧. This is especially dangerous, because sometimes equations
+are used for lay-out and should not be marked as such.
+After the latter command, auto-tagging can be switched off and on with
+⟦*\stopformulatagging⟧ and ⟦*\startformulatagging⟧.
+
+Both alt and actualtext of the ⟦Formula⟧ structure element will be set to the
+(unexpanded) source code of the equation, surrounded by the appropriate number
+of dollar signs.
+Furthermore, if ⟦\pdfaconformancelevel⟧ equals three, the source of the formula
+will be attached in an embedded file with the ⟦/AFRelation⟧ set to ⟦Source⟧.
+The name of this file can be changed by redefining ⟦*\formulafilename⟧ inside
+the equation.
+
+
+% 
+
+\endmanual
+