diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/pdfx/src |
Initial commit
Diffstat (limited to 'macros/latex/contrib/pdfx/src')
19 files changed, 6395 insertions, 0 deletions
diff --git a/macros/latex/contrib/pdfx/src/Armenian-example-UTF8.png b/macros/latex/contrib/pdfx/src/Armenian-example-UTF8.png Binary files differnew file mode 100644 index 0000000000..a463eb1b3a --- /dev/null +++ b/macros/latex/contrib/pdfx/src/Armenian-example-UTF8.png diff --git a/macros/latex/contrib/pdfx/src/MANIFEST b/macros/latex/contrib/pdfx/src/MANIFEST new file mode 100644 index 0000000000..5a872ffa1e --- /dev/null +++ b/macros/latex/contrib/pdfx/src/MANIFEST @@ -0,0 +1,18 @@ +Armenian-example-UTF8.png +Makefile +TL-POL-meta.png +TL-RU-LICRs.png +TL-RU-metadata.png +TL-RU-toc.png +arm-start.tex +armtex-meta.png +koi8-example.tex +koi8-example2.tex +latin2-example.tex +math-assign5.png +pdfx.dtx +pdfx.ins +pdfx.sty +rvdtx.sty +text89.def +usage-meta.png diff --git a/macros/latex/contrib/pdfx/src/Makefile b/macros/latex/contrib/pdfx/src/Makefile new file mode 100644 index 0000000000..7681e19012 --- /dev/null +++ b/macros/latex/contrib/pdfx/src/Makefile @@ -0,0 +1,42 @@ +## +## Makefile +## +## +## +## +## + +file=pdfx + + +all: pdf out index changes + make pdf + +out: + if [ -f $(file).links ] ; then cp $(file).links tmp.links; fi ; +# sed 's/BOOKMARK/fxmark/g;' tmp.out > x.out; mv x.out tmp.out ; + +pdf: + pdflatex -recorder $(file).dtx + +index: + makeindex -s gind.ist -o $(file).ind $(file).idx + +changes: + makeindex -s gglo.ist -o $(file).gls $(file).glo + +xview: + mupdf -r 100 $(file).pdf &>/dev/null + +view: + acroread $(file).pdf + +ins: + latex pdfx.ins + +diff: + diff $(file).sty ../$(file).sty |less + +copy: + cp $(file).sty ../ + diff --git a/macros/latex/contrib/pdfx/src/TL-POL-meta.png b/macros/latex/contrib/pdfx/src/TL-POL-meta.png Binary files differnew file mode 100644 index 0000000000..0401996fc7 --- /dev/null +++ b/macros/latex/contrib/pdfx/src/TL-POL-meta.png diff --git a/macros/latex/contrib/pdfx/src/TL-RU-LICRs.png b/macros/latex/contrib/pdfx/src/TL-RU-LICRs.png Binary files differnew file mode 100644 index 0000000000..baab67fd52 --- /dev/null +++ b/macros/latex/contrib/pdfx/src/TL-RU-LICRs.png diff --git a/macros/latex/contrib/pdfx/src/TL-RU-metadata.png b/macros/latex/contrib/pdfx/src/TL-RU-metadata.png Binary files differnew file mode 100644 index 0000000000..dfc60c4423 --- /dev/null +++ b/macros/latex/contrib/pdfx/src/TL-RU-metadata.png diff --git a/macros/latex/contrib/pdfx/src/TL-RU-toc.png b/macros/latex/contrib/pdfx/src/TL-RU-toc.png Binary files differnew file mode 100644 index 0000000000..b5cbdfc3ce --- /dev/null +++ b/macros/latex/contrib/pdfx/src/TL-RU-toc.png diff --git a/macros/latex/contrib/pdfx/src/arm-start.tex b/macros/latex/contrib/pdfx/src/arm-start.tex new file mode 100644 index 0000000000..6f06c8c79a --- /dev/null +++ b/macros/latex/contrib/pdfx/src/arm-start.tex @@ -0,0 +1,59 @@ +|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|\\ +|%%|\\ +|%% This is the `manual.tex' file (ArmTeX manual in Armenian).|\\ +| ... |\\ +|%%|\\ +|%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%|\\ +|\providecommand{\pdfxopts}{a-2u,armxmp,AR8xmp}|\\ +|\immediate\write18{rm \jobname.xmpdata}|\\ +|\begin{filecontents*}{\jobname.xmpdata}|\\ +|\Title{ArmTeX is a system for writing in Armenian with Plain TeX and/or LaTeX(2e).\textLF|\\ +| \textARM{\ArmTeX` {\aroff\TeX}-um ev {\aroff\LaTeX}-um Hayeren Lezvov Grelu Hamakarg}}|\\ +|\Author{Sergue\"i Dachian \textARM{--- Sergey DASHYAN}\sep Arnak Dalalyan |\\ +| \textARM{--- Ar'nak DALALYAN}\sep Vardan Akopian \textARM{--- Vardan HAKOBYAN}}|\\ +|\Copyright{\textcopyright 1997\textendash 2013 ArmTeX may be distributed and/or modified |\\ +| under the conditions of the LaTeX Project Public License, either version 1.3 of this |\\ +| license or (at your option) any later version.}|\\ +|\CopyrightURL{http://www.latex-project.org/lppl.txt}|\\ +|\Subject{WARNING! This is the (almost unchanged) manual of the version 2.0. It will be |\\ +| replaced by the manual of the version 3.0 before this beta release becomes official. |\\ +| A (temporary) brief description of the new features of \latArmTeX~3.0 can be found at |\\ +| the end of the ``readme.txt'' file. \textLF|\\ +{\catcode`\|=12 \color{verbcolor}\texttt{ \string\textLF\string\textARM% + \{OWSHADROWT'YO|WN:}} |Sa tarberak 2.0-i (grethe anphophox) dzer'narkn e': Ayn |\\ +| kphoxarinvi tarberak 3.0-i dzer'narkov naxqan ays beta tho\-ghark\-man pashtonakanacowmu': |\\ +| \ArmTeX~3.0-i nor hnaravoruthyunneri (g'a\-ma\-na\-ka\-vor) hamar'ot nkaragrowmu' (angleren|\\ +| lezvov) karogh eq gu't\armuh nel~``}readme.txt\textARM{'' fayli verjum:}|\\ +| \textLF\textLF\textARM{Hamakargu' o'gtagorc'elu hamar bavakan e' karoghanal ayn kanchel dzer|\\ +| fayleric, tirapetel tar'qatesakneru' phoxogh hramannerin ev i\-ma\-nal the inchpes petq e' |\\ +| nermuc'el teqstu' steghnasharic: Ays gor\-c'o\-ghu\-thyun\-ne\-ru' nkaragrvac' en hajordogh |\\ +| ereq bag'innerum:}}|\\ +|\Keywords{\textARM{si\-ra\-marg}\sep \textARM{bu'\armuh nuthyun}\sep \textARM{Se\armuh van}|\\ +| \sep \textARM{tare\*verj}\sep \textARM{``mat''}\sep \textARM{``mat"}\sep \textARM{d\*zzal}|\\ +| \sep \textARM{t\*haj'}\sep \textARM{t\*has}}|\\ +|\CoverDisplayDate{1 June 1999 (\textARM{1-u' hunisi 1999 th.})}|\\ +|\Creator{pdfTeX + pdfx.sty with \pdfxopts\space options}|\\ +|\pdfxEnableCommands{\let\sl\empty%|\\ +| \xdef\sectAtitle{\textARM{Nerac'uthyun}}%|\\ +| \xdef\sectBtitle{\textARM{Tar'eri ev ketadrakan nshanneri greladzevu'}}%|\\ +| ... |\\ +| \xdef\sectFtitle{\textARM{Arm\TeX-i phophoxman patmuthyunu'}}%|\\ +|}|\\ +|\end{filecontents*}|\\ +| |\\ +|\documentclass[12pt,a4paper]{article}|\\ +|\usepackage[\pdfxopts]{pdfx}|\\ +|\hypersetup{colorlinks,allcolors=blue}|\\ +| ... |\\ +|\title{\ArmTeX$\,$` $\,${\aroff \TeX}-um ev {\aroff \LaTeX}-um Hayeren Lezvov |\\ +| Grelu Hamakarg\\ {\normalsize\aroff (\latArmTeX: a System for Writing in Armenian |\\ +| with \TeX\ and \LaTeX)}}|\\ +|\author{ ... }%|\\ +|\date{1-u' hunisi 1999 th.}|\\ +| ... |\\ +|\begin{document}|\\ +|\maketitle|\\ +| ... |\\ +|%\section{\sectAtitle}%{Nerac'uthyun}}|\\ +|\pdfxBookmark{\section}{\sectAtitle}{Nerac'uthyun}|\\ +| | diff --git a/macros/latex/contrib/pdfx/src/armtex-meta.png b/macros/latex/contrib/pdfx/src/armtex-meta.png Binary files differnew file mode 100644 index 0000000000..b66dc60e8a --- /dev/null +++ b/macros/latex/contrib/pdfx/src/armtex-meta.png diff --git a/macros/latex/contrib/pdfx/src/koi8-example.tex b/macros/latex/contrib/pdfx/src/koi8-example.tex new file mode 100644 index 0000000000..fd2322edb9 --- /dev/null +++ b/macros/latex/contrib/pdfx/src/koi8-example.tex @@ -0,0 +1,36 @@ +|% $Id: texlive-ru.tex 34060 2014-05-16 19:52:41Z boris $|\\ +|% |\\ +|%\def\Status{1}|\\ +|\providecommand{\pdfxopts}{a-2u,KOIxmp}|\\ +|\providecommand{\thisyear}{2015}|\\ +|%\immediate\write18{rm \jobname.xmpdata}% uncomment for Unix-based systems |\\ +|\begin{filecontents*}{\jobname.xmpdata}|\\ +|\Title{\textKOI{Руководство пользователя} TeX Live \textemdash \thisyear}|\\ +|\Author{\textKOI{Редактор: Карл Берри}}|\\ +|\Subject{\textKOI{В этом документе описаны основные возможности программного продукта } |\\ +| TeX Live \textKOI{--- дистрибутива }TeX\textKOI{а и других программ для} GNU/Linux |\\ +| \textKOI{и других }UNIX\textKOI{ов}, MacOSX\textKOI{ и Windows.}}|\\ +|\Keywords{TeX Live \thisyear\sep \textKOI{Структура}\sep \textKOI{установки}\sep \TeX}|\\ +|\CoverDisplayDate{\textKOI{Май} \thisyear}|\\ +|\CoverDate{2015-05-06}|\\ +|\Copyrighted{False}|\\ +|\Copyright{Public Domain}|\\ +|\CopyrightURL{http://tug.org/texlive/}|\\ +|\Creator{pdfTeX + pdfx.sty with options \pdfxopts }|\\ +|\end{filecontents*}|\\ +|\documentclass{article}|\\ +|\usepackage[\pdfxopts]{pdfx}[2016/03/09]|\\ +|\PassOptionsToPackage{obeyspaces}{url}|\\ +|\let\tldocrussian=1 % for live4ht.cfg |\\ +|\usepackage{cmap}|\\ +|\usepackage{tex-live}|\\ +|\usepackage[koi8-r]{inputenc}|\\ +|\usepackage[russian]{babel}|\\ +| ... |\\ +|\begin{document}|\\ +|\title{%|\\ +| {\huge \textit{Руководство пользователя \protect\TL{} "--- \thisyear}}%|\\ +|}|\\ +|\author{Редактор: Карл Берри\\[3mm]|\\ +| \url{http://tug.org/texlive/}}|\\ +|\date{Май \thisyear}| diff --git a/macros/latex/contrib/pdfx/src/koi8-example2.tex b/macros/latex/contrib/pdfx/src/koi8-example2.tex new file mode 100644 index 0000000000..6c8e451ed5 --- /dev/null +++ b/macros/latex/contrib/pdfx/src/koi8-example2.tex @@ -0,0 +1,45 @@ +|% $Id: texlive-ru.tex 34060 2014-05-16 19:52:41Z boris $|\\ +|% |\\ +|%\def\Status{1}|\\ +|\providecommand{\pdfxopts}{a-2u,KOIxmp}|\\ +|\providecommand{\thisyear}{2015}|\\ +|%\immediate\write18{rm \jobname.xmpdata}% uncomment for Unix-based systems |\\ +|\begin{filecontents*}{\jobname.xmpdata}|\\ +|\Title{\IeC {\CYRR }\IeC {\cyru }\IeC {\cyrk }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyro }|\\ +| \IeC {\cyrd }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyrv }\IeC {\cyro } \IeC {\cyrp }\IeC {\cyro }|\\ +| \IeC {\cyrl }\IeC {\cyrsftsn }\IeC {\cyrz }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyra }\IeC {\cyrt }|\\ +| \IeC {\cyre }\IeC {\cyrl }\IeC {\cyrya } TeX Live \textemdash \thisyear}|\\ +|\Author{\IeC {\CYRR }\IeC {\cyre }\IeC {\cyrd }\IeC {\cyra }\IeC {\cyrk }\IeC {\cyrt }|\\ +| \IeC {\cyro }\IeC {\cyrr }: \IeC {\CYRK }\IeC {\cyra }\IeC {\cyrr }\IeC {\cyrl } |\\ +| \IeC {\CYRB }\IeC {\cyre }\IeC {\cyrr }\IeC {\cyrr }\IeC {\cyri }|\\ +|\Keywords{TeX Live \thisyear\sep \IeC {\CYRS }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyru }|\\ +| \IeC {\cyrk }\IeC {\cyrt }\IeC {\cyru }\IeC {\cyrr }\IeC {\cyra }\sep \IeC {\cyru }|\\ +| \IeC {\cyrs }\IeC {\cyrt }\IeC {\cyra }\IeC {\cyrn }\IeC {\cyro }\IeC {\cyrv }\IeC {\cyrk }|\\ +| \IeC {\cyri }\sep \TeX}|\\ +|\Subject{\IeC {\CYRV } \IeC {\cyrerev }\IeC {\cyrt }\IeC {\cyro }\IeC {\cyrm } \IeC {\cyrd }|\\ +| \IeC {\cyro }\IeC {\cyrk }\IeC {\cyru } ... |\\ +| ... |\\ +|\CoverDisplayDate{\IeC {\CYRM }\IeC {\cyra }\IeC {\cyrishrt } 2015}|\\ +|\CoverDate{2015-05-06}|\\ +|\Copyrighted{False}| +\endinput +|\Copyright{Public Domain}|\\ +|\CopyrightURL{http://tug.org/texlive/}|\\ +|\Creator{pdfTeX + pdfx.sty with options \pdfxopts }|\\ +|\end{filecontents*}|\\ +|\documentclass{article}|\\ +|\usepackage[\pdfxopts]{pdfx}[2016/03/09]|\\ +|\PassOptionsToPackage{obeyspaces}{url}|\\ +|\let\tldocrussian=1 % for live4ht.cfg |\\ +|\usepackage{cmap}|\\ +|\usepackage{tex-live}|\\ +|\usepackage[koi8-r]{inputenc}|\\ +|\usepackage[russian]{babel}|\\ +| ... |\\ +|\begin{document}|\\ +|\title{%|\\ +| {\huge \textit{Руководство пользователя \protect\TL{} "--- \thisyear}}%|\\ +|}|\\ +|\author{Редактор: Карл Берри\\[3mm]|\\ +| \url{http://tug.org/texlive/}}|\\ +|\date{Май \thisyear}| diff --git a/macros/latex/contrib/pdfx/src/latin2-example.tex b/macros/latex/contrib/pdfx/src/latin2-example.tex new file mode 100644 index 0000000000..80ba7874dc --- /dev/null +++ b/macros/latex/contrib/pdfx/src/latin2-example.tex @@ -0,0 +1,46 @@ +|% iso8859-2|\\ +|% $Id: texlive-pl.tex, v. 53 2015/05/17|\\ +|% TeX Live documentation.|\\ +|% Originally written by Sebastian Rahtz and Michel Goossens,|\\ +|% now maintained by Karl Berry and others.|\\ +|% Polish translation and additions by Staszek Wawrykiewicz|\\ +|% (with a little help from my friends, while my guitar gently weeps ;-)|\\ +|% Public domain.|\\ +|% ----|\\ +|% UWAGA dla recenzentСw/tЁumaczy: %%! to moje komentarze (StaW)|\\ +|% |\\ +|\providecommand{\pdfxopts}{a-2u,LATxmp}|\\ +|\providecommand{\thisyear}{2015}|\\ +|\begin{filecontents*}{\jobname.xmpdata}|\\ +|\Title{Przewodnik po TeX Live \thisyear}|\\ +|\Author{Redakcja: Karl Berry\sep \textLII{tЁumaczenie: Staszek Wawrykiewicz}}|\\ +|\Subject{\textLII{Niniejsza dokumentacja opisuje oprogramowanie \TeX\ Live |\\ +| -- dystrybucjЙ \TeX-a wraz z~programami pomocniczymi, dostЙpn╠ dla rС©nych wersji Unix,|\\ +| w~tym GNU/Linux, MacOSX i~Cygwin, oraz Windows.}\textLF\textLF Documentation originally|\\ +| written by Sebastian Rahtz and Michel Goossens, now maintained by Karl Berry and others.}|\\ +|\Keywords{TeX Live \thisyear\sep documentation\sep installation\sep \TeX}|\\ +|\Copyright{Public domain}\Copyrighted{False}|\\ +|\CopyrightURL{http://tug.org/texlive/}|\\ +|\CoverDisplayDate{Maj \thisyear}|\\ +|\CoverDate{\thisyear-05-17}|\\ +|\Creator{pdfTeX + pdfx.sty with options \pdfxopts, from TeX Live 2016}|\\ +|\end{filecontents*}|\\ +|% |\\ +|\documentclass{article}|\\ +|\let\tldocenglish=0 % for live4ht.cfg|\\ +|\let\textsl\textit|\\ +|\usepackage[\pdfxopts]{pdfx}[2016/04/13]|\\ +|\PassOptionsToPackage{obeyspaces}{url}|\\ +|\PassOptionsToPackage{breaklinks,colorlinks,linkcolor=hypercolor,citecolor=hypercolor,%|\\ +| urlcolor=hypercolor,filecolor=hypercolor,bookmarksopen,hyperindex}{hyperref}|\\ +|\hypersetup{breaklinks,colorlinks,allcolors=hypercolor}|\\ +|\usepackage{tex-live}|\\ +|\usepackage{polski} %% for PL|\\ +|\usepackage[latin2]{inputenc} %% for PL|\\ +|\usepackage[T1]{fontenc}|\\ +|...|\\ +|\begin{document}|\\ +|\title{\huge \textit{Przewodnik po \protect\TL{} 2015}}|\\ +|\author{Redakcja: Karl Berry; tЁumaczenie: Staszek Wawrykiewicz \\[3mm]|\\ +| \url{http://tug.org/texlive/}}|\\ +|\date{Maj 2015}| diff --git a/macros/latex/contrib/pdfx/src/math-assign5.png b/macros/latex/contrib/pdfx/src/math-assign5.png Binary files differnew file mode 100644 index 0000000000..b9dbf11cde --- /dev/null +++ b/macros/latex/contrib/pdfx/src/math-assign5.png diff --git a/macros/latex/contrib/pdfx/src/pdfx.dtx b/macros/latex/contrib/pdfx/src/pdfx.dtx new file mode 100644 index 0000000000..ffdb92ee01 --- /dev/null +++ b/macros/latex/contrib/pdfx/src/pdfx.dtx @@ -0,0 +1,5634 @@ +% \iffalse meta-comment +% +% File: pdfx.dtx +% +% Copyright (c) 2019, CV Radhakrishnan <cvr@river-valley.org>, +% Han The Thanh <thanh@river-valley.org>, +% Ross Moore <ross.moore@mq.edu.au>, +% Peter Selinger <selinger@mathstat.dal.ca> +% +% This file may be distributed and/or modified under the conditions +% of the LaTeX Project Public License, either version 1.2 of this +% license or (at your option) any later version. The latest version +% of this license is in: +% +% http://www.latex-project.org/lppl.txt +% +% and version 1.2 or later is part of all distributions of LaTeX +% version 1999/12/01 or later. +% +% \fi +% +% \CheckSum{6309} +% \iffalse +% +%<*driver> +\pdfcompresslevel 9 +\providecommand{\pdfxopt}{a-2u} +\providecommand{\lastyear}{2018} +\providecommand{\thisyear}{2019} +\begin{filecontents*}{./\jobname.xmpdata} +\Title{Generation of PDF/X- and PDF/A-compliant PDFs with pdfTeX \textemdash\ pdfx.sty} +\Author{\CVR\sep \Thanh\sep Ross Moore\sep Peter Selinger} +\Subject{This package supports generation of PDF/X-, PDF/A- and PDF/E-compliant documents, in most of their variants, using pdfLaTeX, LuaLaTeX and XeLaTeX.} +\Keywords{PDF/X-, PDF/A- and PDF/E-compliance\sep Multilingual Metadata\sep installation\sep \TeX Live \thisyear} +\PublicationType{manual} +\Contributor{Norbert Preining: 'colorprofiles' package} +\Copyright{Public domain.} +\Copyrighted{False} +\CopyrightURL{http://tug.org/texlive/} +\CoverDisplayDate{March \thisyear} +\CoverDate{\thisyear-03-10} +\CreatorTool{LaTeX + pdfx.sty with option \pdfxopt, from TeX Live \thisyear} +\Date{2017-05-18\sep 2017-06-23\sep 2018-11-29\sep 2018-12-22\sep 2019-02-08\sep 2019-03-10} +\Advisory{An earlier version of this documentation was published as: TUGboat 36, No.2, pp.136\textendash 142 (2015)} +\Advisory{v1.6: Added XMP support for PDF/UA-1. Added more Metadata fields and Language support.} +\Advisory{v1.6: Default RGB and CMYK profiles now require the colorprofiles.sty package.} +\Relation{Requires the colorprofiles package for RGB and CMYK default profiles.} +\Advisory{v1.6: Access more profiles, incl. to pdfaPilot's color profile folders.} +\Advisory{v1.6: Revised glyphtounicode.sty to use variation selectors.} +\Advisory{v1.6: altered maps to PUA codepoints.} +\Advisory{v1.6: added more glyphs via glyphtounicode-ntx.tex } +\Advisory{v1.6: Support for 8-bit Hebrew encodings, some Arabic and Devanagari.} +\Advisory{v1.6: Updated documentation, incl. for LaTeX changes.} +\Advisory{v1.6.1: Fixed issue with ifthen package; improved Metadata with LuaTeX and XeTeX.} +\Advisory{v.1.6.1: Flexibility with page boxes for PDF/X.} +\Advisory{v.1.6.2: Fixed passing of options to xcolor, and some glyphtounicode values.} +\Advisory{v.1.6.2: Fixed encoding issue. Extra warning when colorprofiles.tex is missing.} +\Advisory{v.1.6.3: Properly fixed encoding issue; supports \string\pdfomitcharset\ primitive.} +\Advisory{v.1.6.3: Reference to veraPDF validation software; additions to glyphtounicode-ntx.tex.} +\Advisory{v.1.6.3: Patched \string\mathaccentV\ to output accents after the base character.} +\pdfxEnableCommands{% + \def\CVR{C.V. Radhakrishnan}\def\Thanh{H\`an Th\eee Thanh}% + \def\eee{^^c3^^aa^^cc^^81 }} +\end{filecontents*} +\PassOptionsToPackage{dvipsnames,svgnames}{xcolor} +\documentclass[a4paper]{ltxdoc} +\usepackage[\pdfxopt]{pdfx} +\usepackage{rvdtx} +\usepackage{graphicx} +\usepackage[latin10]{inputenc} +\input text89.def +\usepackage[T1]{fontenc} +\hypersetup{citecolor=blue} +\pdfstringdefDisableCommands{\def\thinspace{}} +\newcommand{\fixmd}{${}^{\mathrm f}$} +\newcommand{\starmd}{${}^{\ast}$} +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\begin{document} + \DocInput{\jobname.dtx} + \PrintChanges + \PrintIndex +\end{document} +%</driver> +% \fi +% +% \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 +% Lower-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 +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% \GetFileInfo{pdfx.dtx} +% +% \DoNotIndex{\newcommand,\newenvironment} +% +% \DoNotIndex{\def,\edef,\gdef,\xdef,\global,\long,\let} +% \DoNotIndex{\expandafter,\string,\the,\ifx,\else,\fi} +% \DoNotIndex{\csname,\endcsname,\relax,\begingroup,\endgroup} +% \DoNotIndex{\DeclareTextCommand,\DeclareTextCompositeCommand} +% \DoNotIndex{\space,\@empty,\special,\@nil,\advance\@nnil,\z@,\@@mod} +% \DoNotIndex{\\,\@gobble,\@@,\@fornoop,\@fortmp,\@ifundefined,\@firstoftwo,\@secondoftwo} +% \DoNotIndex{\@tempcnta,\@tempcntb,\@tempboxa,\ifnot@empty,\@this,\@firstofone} +% \DoNotIndex{\{,\},\alph,\bgroup,\dp,\ht,\kern,\egroup} +% \DoNotIndex{\do,\end,\HN,\ifcase,\ifnum,\IfFileExists,\ifvmode} +% \DoNotIndex{\ignorespaces,\immediate,\input,\item,\jobname} +% \DoNotIndex{\leavevmode,\loop,\repeat,\makeatletter,\makeatother} +% \DoNotIndex{\meaning,\newcounter,\next,\or,\par,\renewcommand} +% \DoNotIndex{\renewcommand,\renewenvironment,\stepcounter} +% \DoNotIndex{\Tg,\thepage,\unskip,\write,\advance,\{,\}} +% \DoNotIndex{\@ifpackageloaded,\@ifclassloaded,\@pdfcreationdate,\@pdfcreator} +% \DoNotIndex{\@pdfmoddate,\AtBeginDocument,\catcode,\DeclareOption} +% \DoNotIndex{\endinput,\endlinechar,\errmessage,\everyeof,\futurelet} +% \DoNotIndex{\Hy@DisableOption,\Hy@UseMaketitleInfos,\hypersetup} +% \DoNotIndex{\inputencoding,\InputIfFileExists,\NeedsTeXFormat} +% \DoNotIndex{\newif,\noexpand,\obeyspaces,\PackageError,\PDF@FinishDoc} +% \DoNotIndex{\pdfcatalog,\pdfcreationdate,\pdfgeninterwordspace} +% \DoNotIndex{\pdfinterwordspace,\pdfinterwordspaceoff,\pdfgentounicode} +% \DoNotIndex{\pdfinfo,\pdfinterwordspaceon,\pdflastobj,\pdfmapline} +% \DoNotIndex{\pdfmdfivesum,\pdfminorversion,\pdfobj,\pdfobjcompresslevel} +% \DoNotIndex{\pdfpageattr,\pdfresetpageorigin,\pdfstringdef} +% \DoNotIndex{\pdftexbanner,\ProcessOptions,\ProvidesPackage,\RequirePackage} +% \DoNotIndex{\scantokens,\typeout,\vrule,\wd} +% +% \changes{v1.00}{2008/12/01}{Initial commit to the CVS.} +% \changes{v1.01}{2008/12/10}{glyphtounicode-cmr.tex included with the package.} +% \changes{v1.3}{2008/12/01}{Fix copyright in xmp files.} +% \changes{v1.5.4}{2015/02/28}{Fixed timezone bug; Unicode support; more +% PDF variants; added color profiles.} +% \changes{v1.5.5}{2015/03/23}{Support for PDF/X-4p and PDF/X-5pg +% with external color profiles.} +% \changes{v1.5.6}{2016/02/05}{Suppressed `dummy-space' font warning; +% removed spurious '?' in XMP packets; improved handling of Color Profiles; +% ensure Hy@pdfatrue when building PDF/A, for link flags; +% properly enables xcolor conversion of color models.} +% \changes{v1.5.7}{2016/02/17}{Removed UTF-8 characters that appear in +% the documentation only, within comments in the package source, +% but result in a validation failure. Language support in XMP metadata. +% Added macros for Windows and Mac system color profile directories.} +% \changes{v1.5.8}{2016/05/03}{MediaBox, TrimBox, etc. derived from +% the paperheight, paperwidth. Improved language support, incl. KOI8-R +% encoded cyrillics, Armenian OT6, and LGR Greek encoding, incl. polytonic Greek. +% All the encodings Latin-1--9 are supported for upper 8-bit characters. +% Fixed the quoted file-name problem, evident with LuaTeX. +% Method to generate correct bookmarks with non-active (transliterated) input. +% Added support for XeLaTeX, improvements with LuaTeX. Updated documentation.} +% \changes{v1.5.82}{2017/05/12}{% +% Adjusted to changes in the LaTeX core, affecting macros for composite +% commands; incl. \texttt{\textbackslash textsuperscript} and others.}% +% \changes{v1.5.83}{2017/05/16}{Improved support for XeLaTeX and LuaLaTeX.}% +% \changes{v1.5.84}{2017/05/18}{Fully expand options for hyperref. Better support +% for extended IPA letters and modifiers. Adjusted release versions and dates.}% +% \changes{v1.5.85}{2017/06/23}{Fixed bugs, and fully implemented L8U as +% a pseudo-encoding; renamed L8U files into the form *-penc.def }% +% \changes{v1.6}{2018/11/18}{Added XMP support for PDF/UA-1. +% Added more Metadata fields and Language support. +% Default RGB and CMYK profiles now require the colorprofiles.sty package. +% Added file CallasColorProfiles.tex . +% Revised glyphtounicode.sty to use variation selectors, altered maps to PUA +% codepoints; added more glyphs via glyphtounicode-ntx.tex . +% Support for 8-bit Hebrew encodings, some Arabic and Devanagari. +% Updated documentation, incl. for LaTeX changes. +% }% +% \changes{v1.6.1}{2018/12/22}{Fixed issue with ifthen package; +% improved Metadata with LuaTeX and XeTeX. Flexibility with page boxes for PDF/X.}% +% \changes{v1.6.2}{2019/01/04}{Fixed passing of options to xcolor, and some glyphtounicode values.}% +% \changes{v1.6.3}{2019/02/27}{Fixed encoding issues; support for new pdfomitcharset primitive; +% reference to veraPDF validation software; additions to glyphtounicode-ntx.tex.}% +% \title{Generation of PDF/X- and PDF/A-\penalty-200 compliant PDFs with \pdftex --- \texttt{pdfx.sty}} +% \date{2019/02/27} +% \version{1.6.3} +% \keywords{PDF, PDF/A, PDF/X, pdf\TeX, \LaTeX, Multilingual Metadata} +% \author{C.\,V.\,Radhakrishnan, \Thanh, Ross Moore {\upshape\small +% and} Peter Selinger} +% \contact{\texttt{[cvr,thanh]@river-valley.org},\\% +% \texttt{ross.moore@mq.edu.au}, \texttt{selinger@mathstat.dal.ca}\hss} +% +% \maketitle +% +% \StopEventually{} +% +% \section[Introduction]{Introduction} +% +% This package\footnote{An earlier version of this documentation +% was published as \cite{pdfx}. All the changes since then have been developed +% and coded by the 3rd-listed author.} +% currently supports generation of PDF/X-, PDF/A- and PDF/E-compliant +% documents, using \pdftex, in most of their variants; +% see the complete list in Section~\ref{ssec-options} below. +% As of \TeX\,Live 2016 it now also works with Lua\LaTeX\ and Xe\LaTeX, +% when using appropriate command-line options\footnote{% +% The required invokation is:\quad +% |xelatex --shell-escape -output-driver="xdvipdfmx -z 0" <filename>.tex |}, but +% with some limitations --- see Sections~\ref{sssec-xetex} and \ref{sssec-luatex}. +% By `supports', we mean that the package provides correct and sufficient +% means to declare that a document conforms with a stated PDF variant +% (PDF/X, PDF/A, PDF/E, PDF/VT, PDF/UA, etc.) along with the version and/or +% level of conformance. +% This package also allows appropriate Metadata and Color Profile +% to be specified, according to the requirements of the PDF variant. +% +% Metadata elements, most of which must ultimately be written as XML +% using the UTF-8 encoding, is provided via a file named |\jobname.xmpdata|, +% for the running \LaTeX\ job. Without such a file, providing some required +% information as well as a large range of optional data, a fully validating +% PDF file cannot be achieved. The PDF can be created, having the correct +% visual appearance on all pages, but it will not pass validation checks. +% Sections~\ref{ssec-metadata} and \ref{ssec-multi} describe +% how this file should be constructed. +% +% \medskip +% What this package \emph{does not do} is to check for all the details +% of document structure and type of content that may be required +% (or restricted) within a PDF variant. For example, PDF/VT \cite{PDFVT} requires +% well-structured parts, using Form XObject sections tagged as `/DPart'. +% Similarly PDF/A-1a (and 2a and 3a) \cite{PDFA,PDFA2,PDFA3} require +% a fully `Tagged PDF', including a detailed structure tagging which +% envelops the complete contents of the document, as does also PDF/UA \cite{PDF-UA}. +% This is beyond the current version of \LaTeX\ engines, as commonly shipped. +% So while this package provides enough to meet the declaration, +% metadata and font-handling aspects for these PDF/A variants, +% it is not sufficient to produce fully conforming PDFs. +% However, with extra \pdftex-based software or macro coding that \emph{is} capable +% of producing `Tagged PDF', this package can be used as part of +% the overall workflow to produce fully conforming documents. +% +% +% \subsection{PDF standards}\label{ssec-standards} +% +% PDF/X and PDF/A are umbrella terms used to denote several ISO +% standards \cite{PDFX,PDFX3,PDFX1a,PDFX4,PDFX5,PDFA,PDFA2,PDFA3} +% that define different subsets of the PDF standard \cite{PDF17,ISO32000}. +% The objective of PDF/X is to facilitate graphics exchange between +% document creator and printer and therefore, has all requirements +% related to printing. For instance, in PDF/X, all fonts need to be +% embedded and all images need to be CMYK or spot colors. PDF/X-2 and +% PDF/X-3 accept calibrated RGB and CIELAB colors along with all other +% specifications of PDF/X. +% Since 2005 other variants of PDF/X have emerged, as extra effects +% (such as layering and transparency) have been supported within the PDF +% standard itself. The full range of versions and conformance supported +% in this package is discussed below in Section~\ref{ssec-options}. +% +% PDF/A defines a profile for archiving PDF documents, which ensures +% the documents can be reproduced in the exact same way in years to +% come. A key element to achieving this is that PDF/A documents +% are 100\% self-contained. All the information needed to display the +% document in the same manner every time is embedded in the file. +% A PDF/A document is not permitted to be reliant on information from +% external sources. Other restrictions include avoidance of +% audio/video content, JavaScript and encryption. +% Mandatory inclusion of fonts, color profile and standards-based metadata +% are absolutely essential for PDF/A. +% Later versions allow for use of image compression and file attachments. +% +% PDF/E is an ISO standard \cite{PDFE} intended for documents used in engineering workflows. +% PDF/VT \cite{PDFVT} allows for high-volume customised form printing, such as utility bills. +% PDF/UA (`Universal Accessibility') has emerged as a standard \cite{PDF-UA,PDFUA1,PDFUABSI} +% supporting Assistive Technologies, incorporating web-accessibility guidelines (WCAG) +% for electronic documents. +% In future, PDF/H may emerge for health records and medical-related +% documents. Other applications can be envisaged. +% Declarations and Metadata are supported for the first three of these. +% The others are the subject of further work; revised versions of this +% package can be expected in later years. +% +% More complete descriptions of these standards and their usage can be +% found on Wikipedia pages~\cite{wikiPDF}. These pages also include +% comprehensive links to web resources, guides, commentaries, discussions +% and whatever else is relevant to how the standards have been established +% and how they can be used. +% +% \section[Usage]{Usage}\label{sec-usage} +% +% The package can be loaded with the command: +% \begin{decl} +% \defmacro{usepackage}|[<option>]{pdfx}| +% \end{decl} +% where the options are as follows. +% +% \subsection{Package options}\label{ssec-options} +% +% \subsubsection{PDF/A options} +% +% PDF/A is an ISO standard~\cite{PDFA,PDFA2,PDFA3} intended for long-term archiving of +% electronic documents. It therefore emphasizes self-containedness and +% reproducibility, as well as machine-readable metadata. The PDF/A +% standard has three conformance levels `a', `b', and `u'. Level +% `a' is the strictest, but is not yet fully implemented by the +% |pdfx| package. Conformance level `u' has the same requirements as +% level `b', but with the additional requirement that all text in +% the document must have a Unicode mapping. However, the |pdfx| +% package produces such Unicode mappings even in level `b' files. +% The standard also has three different versions 1, 2, and 3, which +% were standardized in 2005, 2011 and 2012, respectively. Earlier +% versions contain a subset of the features of later versions, so for +% maximum portability, it is preferable to use a lower-numbered +% version, when the extra features allowed in higher versions are not used. +% There is no conformance level `u' in version 1 of the standard. +% Thus for many typical uses of PDF/A, it is sufficient to use PDF/A-1b. +% +% \begin{itemize} +% \item |a-1a|: generate PDF/A-1a. Experimental, not fully implemented. +% \item |a-1b|: generate PDF/A-1b. +% \item |a-2a|: generate PDF/A-2a. Experimental, not fully implemented. +% \item |a-2b|: generate PDF/A-2b. +% \item |a-2u|: generate PDF/A-2u. +% \item |a-3a|: generate PDF/A-3a. Experimental, not fully implemented. +% \item |a-3b|: generate PDF/A-3b. +% \item |a-3u|: generate PDF/A-3u. +% \end{itemize} +% By `Experimental, not fully implemented' here we mean primarily that +% the document structure, as required for `Tagged PDF', is not handled +% by this package. Using other \pdftex-based software that \emph{is} +% capable of producing such complete tagging, conforming documents +% can indeed be produced. +% +% \subsubsection{PDF/E options} +% +% PDF/E is an ISO standard~\cite{PDFE} intended for documents used in engineering +% workflows. There is only one version of the PDF/E standard so far, +% and it is called PDF/E-1. +% +% \begin{itemize} +% \item |e-1|: generate PDF/E-1. +% \item |e|: same as |e-1|. +% \end{itemize} +% +% \subsubsection{PDF/UA options} +% +% PDF/UA is an ISO and ANSI standard~\cite{PDF-UA,PDFUABSI} intended for making +% structured documents readable and navigable using Assistive Technology; +% e.g., screen-readers, Braille keyboards and such-like. +% Documents prepared this way can be easily saved in other formats which +% preserve the structure, such as XML, HTML, and (Microsoft) Word-based formats. +% +% \begin{itemize} +% \item |ua-1|: generate PDF/UA-1. +% \item |ua|: same as |ua-1|. +% \end{itemize} +% +% \subsubsection{PDF/VT options} +% +% PDF/VT is an ISO standard intended as an exchange format for +% variable and transactional printing, and is an extension of the +% PDF/X-4 standard. The standard specifies three PDF/VT conformance +% levels. Level 1 is for single-file exchange, level 2 is for +% multi-file exchange, and level 2s is for streamed delivery. +% Currently, none of the PDF/VT conformance levels are fully +% implemented by the |pdfx| package. +% +% \begin{itemize} +% \item |vt-1|: generate PDF/VT-1, based on PDF/X-4. Experimental, not fully implemented +% \item |vt-2|: generate PDF/VT-2, based on PDF/X-5pg. Experimental, not fully implemented. +% \item |vt-2s|: generate PDF/VT-2s. Experimental, not fully implemented. +% \end{itemize} +% By `Experimental, not fully implemented' here we mean primarily that +% the structuring of a document into `/DPart' sections, as Form XObjects, +% is not handled by this package. +% This \emph{is} possible with current \pdftex\ software, +% but not yet in a way that lends itself easily to full automation, due to +% requirements of knowing the internal object number of certain internal +% PDF constructs. All the other aspects: PDFInfo declaration, Metadata +% and Color Profile, of the PDF/VT variants are correctly handled. +% +% \subsubsection{PDF/X options} +% +% PDF/X is an ISO standard intended for graphics interchange. It +% emphasizes printing-related requirements, such as embedded fonts and +% color profiles. The PDF/X standard has a large number of variants +% and conformance levels. The basic variants are X-1, X-1a, +% X-3, X-4, and X-5. (Note that a revised version of the X-2 standard +% was published in 2003 but withdrawn as an ISO standard in 2011, +% basically due to lack of interest in using it). +% The PDF/X-1a standard exists in revisions of 2001 and 2003, +% the PDF/X-3 standard exists in revisions of 2002 and 2003, +% and the PDF/X-4 and PDF/X-5 standards exist in revisions of 2008 and 2010. +% Moreover, some of these standards have a `p' version, which permits the +% use of an externally supplied color profile (instead of an embedded one), +% and/or a `g' version, which permits the use of external graphical +% content. Moreover, PDF/X-5 has an `n' version, which extends +% PDF/X-4p by permitting additional `Custom' color spaces other than Grayscale, +% RGB, and CMYK. For many typical uses of PDF/X, it is sufficient to +% use PDF/X-1a. +% +% \begin{itemize} +% \item |x-1|: generate PDF/X-1; now obsolete, doesn't validate. +% \item |x-1a|: generate PDF/X-1a. Options |x-1a1| and |x-1a3| are +% also available to specify PDF/X-1a:2001 or PDF/X-1a:2003 explicitly. +% \item |x-2|: generate PDF/X-2; unpublished, doesn't validate. +% \item |x-3|: generate PDF/X-3. Options |x-302| and |x-303| are +% also available to specify PDF/X-3:2002 or PDF/X-3:2003 explicitly. +% \item |x-4|: generate PDF/X-4. Options |x-408| and |x-410| are +% also available to specify PDF/X-4:2008 or PDF/X-4:2010 explicitly. +% \item |x-4p|: generate PDF/X-4p. Options |x-4p08| and |x-4p10| are +% also available to specify PDF/X-4p:2008 or PDF/X-4p:2010 explicitly. +% \item |x-5g|: generate PDF/X-5g. Options |x-5g08| and |x-5g10| are +% also available to specify PDF/X-5g:2008 or PDF/X-5g:2010 explicitly. +% \item |x-5n|: generate PDF/X-5n. Options |x-5n08| and |x-5n10| are +% also available to specify PDF/X-5n:2008 or PDF/X-5n:2010 explicitly. +% Experimental, not fully implemented. +% \item |x-5pg|: generate PDF/X-5pg. Options |x-5pg08| and |x-5pg10| are +% also available to specify PDF/X-5pg:2008 or PDF/X-5pg:2010 explicitly. +% \end{itemize} +% +% \subsubsection{Other options} +% +% These options are experimental and should not normally be used. +% +% \begin{itemize} +% \item |useBOM|: generate an explicit UTF-8 byte-order marker in the +% embedded XMP metadata, and make the XMP packet writable. Neither +% of these features are required by the PDF/A standard, but there +% exist some PDF/A validators (reportedly |validatepdfa.com|) that +% seem to require them. Note: the implementation of this feature is +% experimental and may break with future updates to the |xmpincl| +% package. +% \item |noBOM|: do not generate the optional byte-order marker. (default) +% \item |noerr|: avoids stopping when making PDF/X with an RGB profile, +% and at other unusual situations; e.g., PDF/UA without also PDF/A. +% \item |pdf12|: use PDF 1.2, overriding the version specified by the +% applicable standard.\\This may produce a non-standard-conforming PDF file. +% \item |pdf13|: use PDF 1.3, overriding the version specified by the +% applicable standard.\\This may produce a non-standard-conforming PDF file. +% \item |pdf14|: use PDF 1.4, overriding the version specified by the +% applicable standard.\\This may produce a non-standard-conforming PDF file. +% \item |pdf15|: use PDF 1.5, overriding the version specified by the +% applicable standard.\\This may produce a non-standard-conforming PDF file. +% \item |pdf16|: use PDF 1.6, overriding the version specified by the +% applicable standard.\\This may produce a non-standard-conforming PDF file. +% \item |pdf17|: use PDF 1.7, overriding the version specified by the +% applicable standard.\\This may produce a non-standard-conforming PDF file. +% \item |nocharset|: do not generate the Charset entry for fonts (\pdftex\ only). +% \item |usecharset|: generate the Charset entry for fonts (\pdftex\ only). +% \end{itemize} +% The latter two options affect the value of the |\pdfomitcharset| primitive, +% added to \pdftex\ in 2019, due to differing requirements for PDF/A-1 +% and other PDF/A versions. Indeed use of the |/Charset| entry for a font +% is deprecated entirely for PDF 2.0~\cite{PDF20} and later. +% +% \subsubsection{XMP language options}\label{ssec-xmplang} +% +% These options allow for characters in alphabets other than those +% used for English and Western European languages to be used +% within the |.xmpdata| file (see Section~\ref{ssec-metadata}), +% supported through \LaTeX\ character representation macros. +% \begin{itemize} +% \item |latxmp|: extended Latin blocks, |Ux0180|--|Ux024F| +% and |Ux1E00|--|Ux1EFF| +% \item |armxmp|: armenian letters and ligatures, |Ux0530|--|Ux058F|, +% via macros |\armyba|, |\armfe|, |\armcomma|, etc. +% \item |cyrxmp|: cyrillic letters and accents, |Ux0400|--|Ux04FF| +% and |Ux0500|--|Ux0527| via macros |\cyra|, |\CYRN|, etc. +% \item |grkxmp|: greek letters and diacritics, |Ux0370|--|Ux03FF| +% and |Ux1F00|--|Ux1FFF| via macros |\textalpha|, |\textPi|, etc. +% \item |hebxmp|: some hebrew letters and marks, |Ux05C0|--|Ux05F4| +% via macros |\hebalef|, |\hebtav|, |\doubleyod|, etc. +% \item |arbxmp|: some arabic letters and marks, |Ux0600|--|Ux06FF| +% via macros |\hamza|, |\alef|, |\sukun|, etc. +% \item |vnmxmp|: vietnamese letters and accents, |Ux1EA0|--|Ux1EFF| +% via macros |\abreve|, |\uhorn|, |\ECIRCUMFLEX|, etc. +% \item |ipaxmp|: phonetic extensions, |Ux0250|--|Ux02AF| +% and |Ux1D00|--|Ux1DFF| +% \item |mathxmp|: mathematical letters, symbols, operators +% arrows, alphanumeric forms. +% \item |allxmp|: all of the above, as well as those listed next; +% used primarily for testing compatibility with other packages. +% \end{itemize} +% The characters supported by these options include those supported +% by |hyperref.sty| via the |PDFdoc| encodings (|PD1| and |PU|) +% for inclusion in PDF files. Extra support is provided for math +% alphabets. For Armenian, the macros defined by Arm\TeX\ are supported. +% +% \medskip +% Further options allow direct (enclosed) input of upper 8-bit +% characters, from encodings such as Latin-1--Latin-9, KOI8-R, +% LGR (Greek), ArmSSCI8, and a few more. +% Use of these requires a carefully controlled parsing regime. +% Here we list the package options that declare such content +% may be present in the |.xmpdata| file. +% A detailed account of how these are used is given +% in~Section~\ref{ssec-multi} (``Multilingual Metadata''). +% \begin{itemize} +% \item |LATxmp|: support for direct use of the upper-range characters +% (byte codes 160--255) for input encodings Latin1--Latin9, for +% Latin-based alphabets as used in European countries and elsewhere. +% This defines parser macros |\textLAT|, |\textLII|, \dots, |\textLIX|. +% All support from |latxmp| is loaded also. +% \item |KOIxmp|: support for direct use of cyrillic letters by use +% of upper-range characters (byte codes 148--255) under input +% encodings KOI8-R and KOIR8-RU, using |\textKOI| as parser macro. +% All support from |cyrxmp| is loaded also. +% \item |LGRxmp|: support for greek letters entered using either +% the LGR input transliteration of ASCII characters, or the ISO-8859-7 +% encoding of upper-range characters (byte codes 160--255), +% or a combination of both, using |\textLGR| as parser macro. +% All support from |grkxmp| is loaded also. +% \item |AR8xmp|: support for armenian letters entered using the +% Arm\TeX~2.0 input transliteration of ASCII characters, or the +% ArmSCII8 encoding of upper-range characters (byte codes 160--255), +% or a combination of both, using |\textARM| as parser macro. +% All support from |armxmp| is loaded also. +% \item |HEBxmp|: support for hebrew letters entered using either +% LHE input transliteration of ASCII characters, or the CP1255, CP862 +% or ISO-8859-8 (HE8) encoding of upper-range characters (byte codes 160--255), +% or a combination of these using |\textLHE|, |\textHEBO|, |\textHEB| as parser macros. +% All support from |hebxmp| is loaded also. +% \end{itemize} +% These `parser' options have received limited testing, so please +% report any mistakes in the UTF-8 output that you may encounter. +% +% \subsection{Data file for metadata}\label{ssec-metadata} +% +% As mentioned above, standards-compliant PDF documents require +% document-level metadata to be included. +% This, known as an `XMP packet'~\cite{XMP-spec,XMP-ISO}, +% is like having a library catalog card included within the PDF itself. It is an unencrypted +% portion of the PDF file, with data expressed in Extensible Markup Language (XML), +% using Resource Description Format (RDF~\cite{RDF}) syntax, encoded as UTF-8 +% so readable by any text editing software on any modern computing platform. +% +% Some advantages of doing this are clear. +% \begin{itemize} +% \item For a librarian: cataloguing information is available within the file itself, +% without the need to search explicitly in the visual layout of the content or elsewhere; +% \item All actual libraries cataloguing this PDF can have consistent information; +% including web-based indexing sites such as Google. +% \item For the author(s): who can specify the kind of information most appropriate +% to help readers understand the nature and purpose of the document. +% \end{itemize} +% +% The |pdfx| package builds the XMP metadata from information supplied via a special data file +% called |\jobname.xmpdata|. Here, |\jobname| is usually the basename of the document's main +% |.tex| file. For example, if your document source is in the file |main.tex|, +% then the metadata must be in a file called |main.xmpdata|. +% None of the individual metadata fields are mandatory, but for most documents, it makes sense +% to specify at least the title and the author. For more technical aspects of metadata +% and its uses, consult the work of the Dublin Core Initiative~\cite{DC} and PRISM~\cite{PRISM}. +% +% Here is a short |.xmpdata| file: +% \begin{decl}[] +% |\Title{Baking through the ages}|\\ +% |\Author{A. Baker\sep C. Kneader}|\\ +% |\Language{en-GB}|\\ +% |\Keywords{cookies\sep muffins\sep cakes}|\\ +% |\Publisher{Baking International}| +% \end{decl} +% You should note that multiple authors and keywords have been separated +% by |\sep|. This |\sep| macro serves a technical purpose and is +% permitted within the |\Author|, |\Keywords|, and |\Publisher| fields, +% as well as some others. See \S\ref{mdfields} below for a complete listing +% of the supported author-supplied metadata fields. +% +% After processing, the local directory contains a file named such as +% |pdfa.xmpi| or |pdfe.xmpi| or |pdfx.xmpi| according to the PDF variant desired. +% This file is the complete XMP Metadata packet. +% It can be checked for validity, using an online validator, such as at +% \href{http://www.pdflib.com/knowledge-base/xmp-metadata/free-xmp-validator/}{www.pdflib.com}. +% \textsf{veraPDF}~\cite{veraPDF} is Open Source software providing validation for PDF/A, +% and other checkers useful in a PDF/A production setting. +% +% \textbf{Warning}: The |\jobname.xmpdata| file may be included in the +% main document source, within a |{filecontents*}| environment, +% provided this comes \emph{before} the |\documentclass| command, as follows. +% \begin{decl}[] +% |\begin{filecontents*}{\jobname.xmpdata}|\\ +% | \Title{Baking through the ages}|\\ +% | \Author{A. Baker\sep C. Kneader}|\\ +% | \Language{en-GB}|\\ +% | \Keywords{cookies\sep muffins\sep cakes}|\\ +% | \Publisher{Baking International}|\\ +% |\end{filecontents*}|\\ +% |\documentclass[11pt,a4paper]{article}|\\ +% |...| +% \end{decl} +% Including the metadata with the \LaTeX\ source is very convenient. +% Having it at the top of the file also brings attention to it, placing emphasis on +% the desirability of including metadata, and keeping it accurate while the main +% content of the document is subject to changes or revision. +% Macro definitions can also occur prior to the |\documentclass| command, +% including any that may be needed within the metadata. +% An example of this is apparent in Figure~\ref{koi8-code} occurring later. +% +% However, this ordering is also extremely important, else any non-ascii UTF-8 byte +% sequences can become active characters and expand upon data being written out, +% rather than remaining as inactive bytes. +% If you edit the metadata supplied this way, remember to remove the +% existing copy of |\jobname.xmpdata| file before the next processing run, +% as \LaTeX\ does not write a new copy of the file when it exists on disk already, +% within the current working directory or elsewhere that \LaTeX\ may find. +% In development or testing situations the filename may need to be given as +% |./\jobname.xmpdata|, else an older version may be loaded in error. +% +% Experienced users/programmers can employ the \verb|\write18| mechanism% +% \footnote{If you don't already know what this is, they you probably +% should not try using it |:-)|.}, together with the |--shell-escape| command-line +% option, to automatically execute a shell command that removes |\jobname.xmpdata| +% on every (or on selected) processing runs. +% This is only useful when the metadata changes, for whatever reason. +% +% \medskip +% Other places for the |{filecontents*}| environment can work, +% but \emph{only} when it contains \emph{no} non-ascii UTF-8 byte sequences. +% Since 2018, with default +% See Section~\ref{ssec-symbols} below for more information on the macros +% that can be safely used within |.xmpdata| metadata files. +% +% \subsection{List of supported metadata fields}\label{mdfields} +% +% Following is a complete list of user-definable metadata fields currently supported, +% separated into particular groupings. +% Each command is accompanied by the specific XML tagged field name (with namespace) +% that is placed into the document-level Metadata packet, as well as the kind of information +% being conveyed. +% More may be added in the future. +% These commands can \emph{only} be used within the |.xmpdata| file. +% +% Most commands take an optional argument specifying the natural language, +% using RFC5646 (BCP 47)~\cite{BCP47} codes, in which the metadata field is given. +% Languages for multiple entries can use e.g., |\sep[de] ...|. +% Only those fields requiring a specific format (e.g. dates) do \emph{not} +% support language specifiers; these are indicated with \fixmd. +% Fields allowing more than one value are indicated with \starmd. +% Multiple values may be given as separate instances of the macro, or as a single +% instance with the values delimited by |\sep|, as in the example above. +% +% \subsubsection{General information:} +% +% \begin{itemize} +% \item \starmd|\Author|: \hfill (|dc:creator|)\\ +% the document's human author(s). Separate multiple authors with |\sep|. +% \item \starmd|\Title|: \hfill (|dc:title|)\\ +% the document's title; multiple language versions are supported. +% \item \starmd\fixmd|\Language|: \hfill (|dc:language|)\\ +% list of languages used within the document. +% \item \starmd|\Keywords|: \hfill (|dc:subject|)\\ +% list of keywords, separated with |\sep|. +% \item \starmd|\Publisher|: \hfill (|dc:publisher|)\\ +% the publisher(s). Multiple pieces in a publishing chain should be separated with |\sep|. +% \item \starmd|\Subject|: \hfill (|dc:description|)\\ +% the abstract, or short description. +% \end{itemize} +% +% \subsubsection{Copyright information:}\label{sssec-copy} +% +% \begin{itemize} +% \item |\Copyright|: \hfill (|dc:rights|)\\ +% a copyright statement. +% \item \fixmd|\CopyrightURL|: \hfill (|xmpRights:WebStatement|)\\ +% location of a web page describing the owner +% and/or rights statement for this document. +% \item \fixmd|\Copyrighted|: \hfill (|xmpRights:Marked|)\\ +% `True' if the document is copyrighted, and `False' if it isn't. +% This is automatically set to `True' if either |\Copyright| or |\CopyrightURL| is specified, +% but this can be overridden. +% For example, if the copyright statement is `Public Domain', +% then specify also |\Copyrighted{False}|. +% \item \starmd|\Owner|: \hfill (|xmpRights:Owner|)\\ +% specifies the owner(s) of the document or resource. +% \item \fixmd|\CertificateURL|: \hfill (|xmpRights:Certificate|)\\ +% gives the URL to online proof of ownership, if available. +% \end{itemize} +% +% \subsubsection{more Dublin Core metadata:}\label{sssec-dc} +% From version 1.6 of |pdfx.sty|, the following fields can be used to provide a greater +% range of information to be specified as metadata. +% \begin{itemize} +% \item \starmd|\Contributor|: \hfill (|dc:contributor|)\\ +% contributor(s) other than author(s) of the PDF document. +% \item |\Coverage|: \hfill (|dc:coverage|)\\ +% statement about the extent or scope of the document's contents. +% \item \starmd\fixmd|\Date|: \hfill (|dc:date|)\\ +% date(s) when something significant occurred relating to the resource (e.g., version changes); +% must be in ISO date format |YYYY-MM-DD| or |YYYY-MM|. +% \item \fixmd|\PublicationType|: \hfill (|dc:type|)\\ +% The type of publication. If specified, must be one of `book', `catalog', `feed', `journal', +% `magazine', `manual', `newsletter', `pamphlet'. This is automatically set to `journal' +% if |\Journaltitle| is specified (see below), but can be overridden. +% \item \starmd|\Relation|: \hfill (|dc:relation|)\\ +% how this PDF or resource relates to other document(s) or resources. +% \item \fixmd|\Source|: \hfill (|dc:source|)\\ +% specifies a source document from which the PDF is derived. +% \item \fixmd|\Doi|: \hfill (|dc:identifier|, |prism:doi|, |prism:url|)\\ +% Digital Object Identifier (DOI) for the document, without the leading `doi:'. +% \item \fixmd|\ISBN|: \hfill (|dc:identifier|)\\ +% the ISBN for the PDF itself, or Book/Monograph of which it is part. +% \item \fixmd|\URLlink|: \hfill (|dc:identifier|, |prism:url|)\\ +% gives a URL address for an online copy of the document. +% \end{itemize} +% +% The remaining Dublin Core field |(dc:format)| is always set to `|application/pdf|'. +% +% \subsubsection{Publication information:}\label{sssec-publ} +% The following macros allow for inclusion of publication related metadata fields, +% as specified by PRISM~\cite{PRISM} to meet publishing requirements. +% \begin{itemize} +% \item |\Journaltitle|: \hfill (|prism:issueName|)\\ +% The title of the journal in which the document was published. +% \item \fixmd|\Journalnumber|: \hfill (|prism:issn|)\\ +% The ISSN for the journal/series in which the document was published. +% \item \fixmd|\Volume|: \hfill (|prism:volume|)\\ +% Journal volume. +% \item \fixmd|\Issue|: \hfill (|prism:number|)\\ +% Journal issue/number. +% \item \fixmd|\Firstpage|: \hfill (|prism:startingPage|, |prism:pageRange|)\\ +% First page number of the published version of the document. +% \item \fixmd|\Lastpage|: \hfill (|prism:endingPage|, |prism:pageRange|)\\ +% Last page number of the published version of the document. +% \item |\CoverDisplayDate|: \hfill (|prism:coverDisplayDate|)\\ +% Date on the cover of the journal issue, as a human-readable text string. +% \item \fixmd|\CoverDate|: \hfill (|prism:coverDate|)\\ +% Date on the cover of the journal issue, in a format suitable for storing in a database +% field with a `date' data type; e.g. |YYYY-MM|, or |YYYY-MM-DD|. +% \end{itemize} +% This is an area which can be expanded, to deal with more kinds +% of publication and metadata fields. +% The ExtensionSchema \cite{TN0009} technique is used to add new fields. +% Examples of this can be found in the template files |pdfx.xmp|, |pdfa.xmp|, |pdfe.xmp|. +% +% \subsubsection{Backward Compatibility} +% The following macros are also recognised, for backward compatibility +% with earlier versions of the package. +% \begin{itemize} +% \item \starmd|\AuthoritativeDomain|: \hfill (|pdfx:AuthoritativeDomain|)\\ +% specifies extra names (e.g., of companies) associated to the existence of the PDF or resource. +% \item |\Creator|: \hfill (|xmp:CreatorTool|)\\ +% synonymous with |\CreatorTool| which is usually handled automatically anyway, +% but can be over-ridden. +% \item |\Org|: synonymous with |\Publisher|. +% \item |\WebStatement|: synonymous with |\CopyrightURL|. +% \end{itemize} +% +% \subsubsection{more XMP metadata:}\label{sssec-xmp} +% +% \begin{itemize} +% \item \starmd|\Advisory|: \hfill (|xmp:Advisory|)\\ +% noteworthy information; e.g., revision data or changes. +% \item \fixmd|\BaseURL|: \hfill (|xmp:BaseURL|)\\ +% base-URL for relative hyperlinks within the PDF. +% \item \starmd|\Identifier|: \hfill (|xmp:Identifier|)\\ +% more advance forms than (|dc:identifier|); see~\cite{XMP-spec,XMP-ISO}. +% \item |\Nickname|: \hfill (|xmp:Nickname|)\\ +% a pseudonym or `nickname' as a colloquial identifier for the resource. +% \item \starmd|\Thumbnails|: \hfill (|xmp:Thumbnails|)\\ +% allows small page images to be associated with each page of the PDF. +% An appropriate XML-compatible representation is required for such images. +% \end{itemize} +% +% \subsubsection{PDF standards metadata:}\label{sssec-pdfstd} +% The following metadata fields are generated automatically by the \LaTeX\ engine. +% Some are dependent on the particular loading options that specify the desired compliance +% with a PDF standard, and level of conformance. +% There are no separate user-macros to alter these. +% The first three dates are usually set to be identical. +% +% \begin{itemize} +% \item (|xmp:CreateDate|) : creation date\&time of the PDF. +% \item (|xmp:MetadataDate|) : creation date\&time of the Metadata for the PDF. +% \item (|xmp:ModifyDate|) : date\&time of latest modifications to the PDF. +% \item (|xmpMM:DocumentID|) : unique identifier for the PDF, based on MD5 sum. +% \item (|xmpMM:InstanceID|) : unique identifier based on creation date\&time. +% \item (|pdf:Producer|) : \TeX\ engine used; either `Lua\TeX', `Xe\TeX', `\pdftex'. +% \item (|pdf:Trapped|) : currently always set to `False'. +% \item (|pdfaid:part|) : |1|, |2| or |3| for PDF/A-? +% \item (|pdfaid:conformance|) : |a|, |b| or |u| for PDF/A-?? +% \item (|pdfuaid:part|) : currently |1| for PDF/UA-1 +% \item (|pdfe:ISO_PDFEVersion|) : currently |1| for PDF/E-1 +% \item (|pdf:Version|) : |PDF/X-1|, |PDF/X-2| or |PDF/X-3| +% \item (|pdfx:GTS_PDFXVersion|) : e.g., |PDF/X-1a:2003| up to PDF/X-3 ; +% but no year for PDF/X-4 and PDF/X-5 variants +% \item (|pdfx:GTS_PDFXConformance|) : e.g., |PDF/X-1a:2003| up to PDF/X-2 +% \item (|pdfxid:GTS_PDFXVersion|) : e.g., |PDF/X-4p:2008| after PDF/X-3 +% \item (|pdfvtid:GTS_PDFVTVersion|) : e.g., |PDF/VT-2s| for PDF/VT +% \item (|pdfvtid:GTS_PDFVTModDate|) : same as |xmp:ModifyDate| +% \end{itemize} +% +% \subsection{Symbols permitted in metadata}\label{ssec-symbols} +% +% Within the metadata, all printable ASCII characters except +% |\|, |{|, |}| and |%| represent themselves. Also, all printable Unicode characters +% from the basic multilingual plane (i.e., up to code point U+FFFF) +% can be used directly with the UTF-8 encoding. +% (Please note: encodings other than UTF-8 are not supported in the metadata, +% except as arguments to `parser-macros'; see Section~\ref{ssec-xmplang}). +% Consecutive whitespace characters are combined into a single space. +% Whitespace after a macro such as |\copyright|, |\backslash|, or |\sep| is ignored. +% Blank lines are not permitted. +% Moreover, the following markup can be used: +% +% \begin{itemize} +% \item ``|\ |'': a literal space (for example after a macro) +% \item |\%|: a literal |%| +% \item |\{|: a literal |{| +% \item |\}|: a literal |}| +% \item |\backslash|: a literal backslash |\| +% \item |\copyright|: the copyright symbol \textcopyright +% \end{itemize} +% The macro |\sep| is permitted within |\Author|, |\Keywords|, +% |\Publisher|, and other macros marked with \starmd\ above. +% It's purpose is to separate multiple authors, keywords, etc. +% to appear as separate list items appropriately and consistently +% in the different ways that such information is represented +% within the PDF file. +% The package takes care of this when |\sep| is used. +% For example, in the XMP metadata, it expands as |</rdf:li><rdf:li>| tagging. +% +% \subsubsection{PDF Info strings}\label{sssec-info} +% When |\sep| is not used within its argument, the metadata from |\Title|, +% |\Author| and |\Keywords| is also included in the PDF |/Info| dictionary. +% When this is the case, validation for the declared standard +% will occur only if the corresponding |/Info| item and XMP metadata field +% convert to exactly the same Unicode string. +% This cannot happen when |\sep| is used, so the |/Info| items are then not populated. +% +% Unfortunately not all PDF browsers (in particular, older ones and much Apple software) +% give ready access to the XMP metadata packet. Some authors want to see everything +% using e.g., the Unix/Linux command: |pdfinfo -enc UTF-8 |. In fact there is the |-meta| +% option to get the complete metadata packet (in UTF-8 encoding). +% This can give more than what one wants, so use it as follows: +% \begin{decl}[] +% pdfinfo -meta <filename>.pdf \textbar\ grep 'dc:' +% \end{decl} +% to extract just the Dublin Core metadata fields. +% +% Another possibility is to \emph{not} use |\sep| with multiple authors and/or keywords. +% Instead replace it with simply `|, |'. We do not recommend doing this, as more sophisticated +% metadata tools will see the result as a single value, rather than multiple authors, say. +% Different language codes cannot be applied when done this way. +% However, some authors may find this a satisfactory solution that suits their own tools. +% +% +% \subsection{Macros permitted in metadata}\label{ssec-macros} +% +% Other \TeX\ macros actually can be used, provided the author is very +% careful and not ask for too-complicated \TeX\ or \LaTeX\ expansions +% into internal commands or non-character primitives; basically just accents, +% macros for Latin-based special characters, and simple textual replacements, +% perhaps with a simple parameter. A special macro |\pdfxEnableCommands{...}| +% is provided to help resolve difficulties that may arise. +% +% Here is an example\footnote{ Other use cases are discussed with regard to +% Figures~\ref{arm-code} and \ref{math-wflow}.} of the use of |\pdfxEnableCommands|, +% which occurs with the name of one of our authors {(H\`an Th\'{\^e} Thanh)} +% due to the doubly-accented letter \'{\^e}. +% It is usual to define a macro such as: |\def\thanh{H\`an Th\'{\^e} Thanh}|. +% In previous versions of the |pdfx| package, use of such a macro +% within the |.xmpdata| file, in the |Copyright| information say, +% could result in the accent macros expanding into internal primitives, such as +% \begin{decl}[] +% | H\unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa ... | +% \end{decl} +% going on for many lines. This clearly has no place within the XMP metadata. +% To get around this, one could try using simplified macro definitions +% \begin{decl}[] +% | \pdfxEnableCommands{|\\ +% | \def\`#1{#1^^cc^80}\def\'#1{#1^^cc^81}\def\^#1{#1^^cc^82}}| +% \end{decl} +% \removelastskip\noindent +% where the |^^cc^80|, |^^cc^81|, |^^cc^82| cause \TeX\ to generate the correct +% UTF-8 bytes for `combining accent' characters. +% +% This works fine for metadata fields that appear just in the XMP packet. +% However, it is not sufficient for the PDF |/Author| key, which must exactly match +% with the |dc:creator| metadata element. What is needed instead is +% \begin{decl}[] +% | \pdfxEnableCommands{|\\ +% | \def\thanh{H^^c3^^a0n Th\eee Thanh}\def\eee{^^c3^^aa^^cc^^81 }}| +% \end{decl} +% \removelastskip\noindent +% or the above with `\`a' typed directly as UTF-8 instead of |^^c3^^a0| +% and `\^e' in UTF-8 for |^^c3^^aa|. +% The reason for this is due to the |\pdfstringdef| command, which constructs +% the accented latin letters as single combined characters \`a and \^e, +% without resorting to combining accents, wherever possible. +% If the Metadata does not have the same, irrespective of Unicode normalisation, +% then validation fails. +% +% With version (1.5.6) of the |pdfx| package, such difficulties +% have been overcome, at least for characters used in Western European, +% Latin-based languages. The input encoding used when reading the |.xmpdata| +% file now includes interpretations of \TeX's usual accent commands to +% produce the required UTF-8 byte sequences. +% +% \medskip +% Since version (1.5.8) this input encoding was extended to include +% macro definitions covering \LaTeX's internal character representation +% of other alphabets (e.g., extended Latin, Cyrillic, Greek, etc.). +% However this can become memory intensive, requiring a large number of +% macro definitions, most of which will never be used. So loading options +% are provided, enabling a document author to choose only those that may +% be relevant. Currently these are as in Section~\ref{ssec-xmplang}. +% +% A significant portion of the Unicode Basic Plane characters can be covered +% this way. Modules could even be provided for CJK character sets and +% mathematical symbols, etc. However, as this can become memory intensive, +% significant testing will be required before these become a standard +% part of the |pdfx| package. +% +% +% \subsection{Color profiles}\label{sec-profiles} +% +% Most standards compliant PDF documents require a \emph{color +% profile} to be embedded within the file. In a nutshell, such a profile +% determines precisely how the colors used in the document will be +% rendered when printed to a physical medium. This can be used to +% ensure that the document will look exactly the same, even when it is +% printed on different printers, with different paper types, etc. +% The inclusion of a color profile is necessary to make the document +% completely self-contained. +% +% Since most \LaTeX\ users are not graphics professionals and are not +% particularly picky about colors, the |pdfx| package includes default +% profiles that will be included when nothing else is specified. +% Therefore, the average user doesn't have to do anything +% special about color. +% +% For users who have a specific color profile they wish to use, it is +% possible to do so by including a |\setRGBcolorprofile| or +% |\setCMYKcolorprofile| command in the |.xmpdata| file. Note that +% PDF/A and PDF/E require a profile of type `|mnrt|' (monitor) which +% is usually an RGB color profile, while PDF/X and PDF/VT require type `|prtr|' +% (printer) which is usually a CMYK color profile; but valid documents +% can be created with the correct type designed for the other color space. +% Use the following commands to specify an RGB or CMYK color profile, +% respectively: +% +% \begin{decl} +% \defmacro{setRGBcolorprofile}\marg{filename}\marg{identifier}\marg{info +% string}\marg{registry URL} +% \\[1ex] +% \defmacro{setCMYKcolorprofile}\marg{filename}\marg{output +% intent}\marg{identifier}\marg{registry URL} +% \end{decl} +% Within the arguments of these macros, the characters |<|, |>|, |&|, +% |^|, |_|, |#|, |$|, and |~| can be used as themselves, but +% |%| must be escaped as |\%|. +% +% From version (1.6) the default RGB and CMYK color profiles are now supplied +% using the |colorprofiles| package by Norbert Preining and Ross Moore~\cite{colorp}. +% Earlier versions of \texttt{pdfx.sty} set the defaults via: +% \begin{decl}[] +% |\setRGBcolorprofile{sRGB_IEC61966-2-1_black_scaled.icc}|\\ +% | {sRGB_IEC61966-2-1_black_scaled}|\\ +% | {sRGB IEC61966 v2.1 with black scaling}|\\ +% | {http://www.color.org}|\\[4pt] +% |\setCMYKcolorprofile{coated_FOGRA39L_argl.icc}|\\ +% | {Coated FOGRA39}|\\ +% | {FOGRA39 (ISO Coated v2 300\% (ECI))}|\\ +% | {http://www.argyllcms.com/}| +% \end{decl} +% These can still be used if the files from earlier version are available +% on your \TeX\ system, but they will need to be requested, as above. +% Other color profile files may be obtained from the International +% Color Consortium. Please take a look at +% \url{http://www.color.org/iccprofile.xalter}. +% +% Alternatively, color profiles are shipped with many Adobe software +% applications; these are then available for use also with non-Adobe +% software. Now the |pdfx| package includes coding to streamline +% inclusion of these profiles in PDF documents, or to specify +% them as `external' profiles, with PDF/X-4p and PDF/X-5pg variants. +% Two files |AdobeColorProfiles.tex| and |AdobeExternalProfiles.tex| +% are distributed with the |pdfx| package. The latter is for use +% with PDF/X-4p and PDF/X-5pg, which do not require color profiles to +% be embedded, while the former can be used with other PDF/X variants. +% Both define commands to use Color Profiles as follows. +% \begin{decl}[] +% \begin{tabular}{ll} +% \texttt{\string\FOGRAXXXIX} & Coated FOGRA39 (ISO 12647-2:2004)\\ +% \texttt{\string\SWOPCGATSI} & U.S. Web Coated (SWOP) v2\\ +% \texttt{\string\JapanColorMMICoated} & Japan Color 2001 Coated\\ +% \texttt{\string\JapanColorMMIUncoated} & Japan Color 2001 Uncoated\\ +% \texttt{\string\JapanColorMMIINewspaper} & Japan Color 2002 Newspaper\\ +% \texttt{\string\JapanWebCoatedAd} & Japan Web Coated (Ad)\\ +% \texttt{\string\CoatedGRACoL} & Coated GRACoL 2006 (ISO 12647-2:2004)\\ +% \texttt{\string\SNAPCGATSII} & CGATS TR 002\\ +% \texttt{\string\SWOPCGATSIII} & CGATS TR 003\\ +% \texttt{\string\SWOPCGATSV} & CGATS TR 005\\ +% \texttt{\string\ISOWebCoated} & Web Coated FOGRA28 (ISO 12647-2:2004)\\ +% \texttt{\string\ISOCoatedECI} & ISO Coated v2 (ECI)\\ +% \texttt{\string\CoatedFOGRA} & Coated FOGRA27 (ISO 12647-2:2004)\\ +% \texttt{\string\WebCoatedFOGRA} & Web Coated FOGRA28 (ISO 12647-2:2004)\\ +% \texttt{\string\UncoatedFOGRA} & Uncoated FOGRA29 (ISO 12647-2:2004)\\ +% \texttt{\string\IFRAXXVI} & ISOnewspaper26v4 ISO/DIS 12647-3:2004\\ +% \texttt{\string\IFRAXXX} & ISOnewspaper30v4 ISO/DIS 12647-3:2004\\ +% \end{tabular} +% \end{decl} +% As of the time of first compiling this list, only the first six of these result in PDFs +% which can validate with external profiles (i.e., for PDF/X-4p and PDF/X-5pg) +% using the then-current versions of Adobe Acrobat Pro software. It is unclear +% whether the others (incl.\,\verb|\IFRAXXVI| and \verb|\IFRAXXX|) failed due +% to incorrect data or problems in the validation software. +% Since then, with updates to Acrobat Pro, almost all the others have been verified +% to work, except \verb|\IFRAXXX| which seems no longer available. +% Thus these commands come with a `use at own risk' clause. +% +% For `external' profiles, there is a command |\setEXTERNALprofile|, taking 9 arguments, +% that must be used. Consult |AdobeExternalProfiles.tex| for examples of its use. +% +% All but the last of the macros listed above can also be used for valid embedded profiles, +% providing the corresponding files can be found. +% The following macros are used to set the (absolute or relative) path, +% on the local operating system, to the location of color profile files. +% \begin{decl} +% \defmacro{pdfxSetRGBcolorProfileDir}\marg{path to RGB color profiles}\\ +% \defmacro{pdfxSetCMYKcolorProfileDir}\marg{path to CMYK profiles} +% \end{decl} +% On a Macintosh, there are various places where the color profiles may be found. +% One can use either a macro |\MacOSColordir| which expands +% into the path for system-provided profiles: +% \begin{decl}[] +% |/System/Library/ColorSync/Profiles/| +% \end{decl} +% or the macro |\MacOSLibraryColordir| expanding to: +% \begin{decl}[] +% |/Library/ColorSync/Profiles/| +% \end{decl} +% or |\AdobeMacOSdir| which expands into the path: +% \begin{decl}[] +% |/Library/Application Support/Adobe/Color/Profiles/Recommended/| +% \end{decl} +% Under Windows an available macro is |\WindowsColordir| which expands to: +% \begin{decl}[] +% |C:\Windows\System32\Spool\Drivers\Color/| +% \end{decl} +% being the common location for color profiles. +% Use these within the \verb|.xmpdata| file as, e.g., +% \begin{decl}[] +% |\pdfxSetCMYKcolorProfileDir{\AdobeMacOSdir}| +% \end{decl} +% Authors may change the paths to suit their own circumstances, either +% \emph{before} loading |pdfx.sty| or within the \verb|.xmpdata| file. +% +% PDF/A and PDF/E usually need an RGB profile, while PDF/X and PDF/VT +% require a CMYK profile. It is possible to use a CMYK profile with PDF/A +% or PDF/E by specifying |\setRGBcolorprofile{}{}{}{}| in the \verb|.xmpdata| file. +% Beware however, that with PDF/A any coloured hyperlink annotations can +% cause a validation problem, as these are interpreted as RGB colours +% even when 4 components are given. This may be a bug in validators, +% as PDF specifies that the number of components should match the color space. +% +% \subsubsection{`Custom' color spaces}\label{ssec-custom} +% +% It is also possible to specify `Custom' color spaces, other than RGB or CMYK. +% Here is an example command |\viiIndigoTAC|, defined as follows: +% \begin{decl}[] +% \%\% Custom profile: 7C Indigo TAC370 (ColorLogic)\\ +% |\gdef\viiIndigoTAC{\let\CallasMacOSdir\CallasMacOSpdfaPilotdir |\\ +% | \setCUSTOMcolorprofile |\\ +% | {7C Indigo_TAC370_ColorLogic.icc}%|\\ +% | {\CallasProfilesdir}%|\\ +% | {7C Indigo TAC370 \string\(ColorLogic\string\)}% /ProfileName |\\ +% | {http://www.colorlogic.de}% /RegistryName |\\ +% | {7CLR}% number of colors specifier |\\ +% | {02400000}% ICC version |\\ +% | {/Cyan /Magenta /Yellow /Black /Orange /Green /Violet}% colour names |\\ +% | {48110b8b410ee6be015f3932c3167869}% CheckSum |\\ +% |}| +% \end{decl} +% which uses a profile that accompanies the \texttt{pdfaPilot} software from +% Callas Software Gmbh~\cite{pdfaPilot}. +% The macro |\CallasMacOSpdfaPilotdir|, defined in the file \texttt{CallasColorProfiles.tex}, +% specifies the directory where this Custom profile is located, when installed under MacOS. +% One needs to |\input CallasColorProfiles.tex| \emph{before} loading the |pdfx| package. +% Macros for other directories are also defined in this file. +% +% \subsection{Notes on the internal representation of metadata} +% +% Within the PDF file, metadata is deposited in two places: some data +% goes into the native PDF |/Info| dictionary, and some data goes into +% an XMP packet stored separately within the file. XMP is Adobe's +% Extensible Metadata Platform~\cite{XMP-spec,XMP-ISO}, and is an XML-based format. +% See \href{http://www.adobe.com/devnet/xmp/}{Adobe XMP Development Center} +% for more exhaustive information about XMP. +% An XMP Toolkit SDK which supports the GNU/Linux, Macintosh and Windows operating +% systems is also available under modified BSD licence. +% +% Some of the metadata, such as the author, title, and keywords, can be +% stored \emph{both} in the XMP packet and in the |/Info| dictionary. +% For the resulting file to be standards-compliant, the two copies of the data +% must be identical. This is taken care of automatically by the |pdfx| package, +% except when |\sep| is used to handle multiple entries, as discussed above +% in \S\ref{sssec-info}. In such cases the string is not included within the |/Info| +% dictionary. Note that this is in accordance with the PDF 2.0 specification~\cite{PDF20}, +% which deprecates use of the |/Info| dictionary for such metadata. +% +% In principle, users can resort to alternate ways to create an XMP file +% for inclusion in PDF. In this case, one should create a customised template +% file |pdfa.xmp| or |pdfx.xmp| or |pdfe.xmp| (etc., depending on the PDF flavor) +% containing the pre-defined data. This can be done by modifying the ones supplied +% with the |pdfx| package. However, this is an error-prone process and is +% \emph{not} recommended for most users. +% If there is a particular field of metadata that you need and that is not currently +% supported, please contact the package authors. +% +% |pdfx| makes use of the |xmpincl| package to include XMP data into +% the PDF. The documentation of |xmpincl| package may help interested +% users to understand the process of XMP data inclusion. +% +% \subsection{Tutorials and technical notes} +% +% A tutorial with step-by-step instructions for generating PDF/A files +% can be found at: +% \url{http://www.mathstat.dal.ca/~selinger/pdfa/}. +% +% Some technical notes about production problems the authors have +% encountered while generating PDF/A compliant documents are available +% here: +% \url{http://support.river-valley.com/wiki/index.php?title=Generating_PDF/A_compliant_PDFs_from_pdftex}. +% Be aware that this is based on use of an earlier version of the |pdfx| package, +% so some of the advice may have been superseded. +% +% +% \section[Installing]{Installing} +% The |pdfx.dtx| package is available on CTAN as usual, via +% \url{http://ctan.org/pkg/pdfx}. It is also included in +% \TeX\ distributions such as Mac\TeX, \TeX\ Live and MiK\TeX. +% Thus most users will not need to handle installation at all. +% +% For those wishing to do a manual installation, here are some notes. +% The file |pdfx.dtx| is a composite document of program code and +% documentation in \LaTeX{} format, in the tradition of \emph{literate +% programming}. After having installed the package, +% to get the documentation that you are reading now, +% run (\textsc{pdf})\LaTeX{} on the file |pdfx.dtx|. +% The resulting PDF should be valid as PDF/A-2u. +% Or better, use the included |Makefile|, which will also regenerate the index. +% +% To install the package, first extract the program code; i.e., the +% file |pdfx.sty|, by running \LaTeX{} or \TeX{} on the file |pdfx.ins|. +% Create a directory named |pdfx| under |$TEXMF/tex/latex| and copy the files +% |pdfx.sty|, |8bit.def|, |glyphtounicode-cmr.tex|, |glyphtounicode-ntx.tex| as well +% as the other |*.tex|, |l8u*-penc.def| and |*.xmp| files, into it. Then update +% \TeX's file database using the appropriate command for your distribution +% and operating system (such as |texhash| or |mktexlsr|, or similar). +% +% \subsection{Limitations and dependencies} +% +% The |pdfx.sty| package works with \pdftex\ and also Lua\TeX\ and Xe\TeX\ +% with some minor limitations. +% It further depends on the following other packages. +% \begin{enumerate} +% \item |xmpincl| for insertion of metadata into PDF. +% \item |inputenc| to establish input-encoding infrastructure --- +% see Section~\ref{ssec-L8U}. +% \item |hyperref| for ensuring data is correctly encoded when being +% written into the PDF file, and supporting features such as +% hyperlinking, bookmarks, etc. +% \item |xcolor| for ensuring consistent use of the color model +% appropriate the PDF variant, within text and hyperlinks (when allowed). +% \item |glyphtounicode.tex| (not Xe\LaTeX) maps glyph names +% to corresponding Unicode code-points. +% \item |ifluatex| allowing coding specific to Lua\LaTeX. +% \item |ifxetex| allowing coding specific to Xe\LaTeX. +% \item |luatex85| or |pdftexcmds| (Lua\TeX\ only) for access +% to primitive commands using \pdftex\ macro names. +% \item |stringenc| used to help generate proper bookmarks with transliterated input; +% e.g., with |\textLGR| or |\textARM| --- see Section~\ref{sssec-arm}. +% \end{enumerate} +% Other files and packages are loaded as sub-packages or as +% configuration files for these. Since some of these packages +% may be loaded by existing documents we provide here advice on +% how to deal with potential loading and option conflicts. +% +% Firstly, it is best if |pdfx| is the first package loaded; e.g., +% directly after the |\documentclass| line. This is not a strict requirement, +% but it is worthwhile to deal with the metadata at the top of your \LaTeX\ source, +% allowing correct options to be loaded to cope with validation aspects. +% +% Secondly, replace |\usepackage[<options>]{hyperref}| with |\hypersetup{<options>}|. +% This deals with most loading issues with the |hyperref| package. +% Note that PDF/X is a format intended for printing. +% It forbids inclusion of hyperlinks and other actions, including via bookmarks. +% To produce a validating PDF/X document, |pdfx| overrides internal macros +% while keeping colors associated with link anchors. +% To inhibit these colors also, you could specify options as follows. +% \begin{decl}[] +% |\hypersetup{colorlinks,allcolors=black}| +% \end{decl} +% Furthermore, options to set metadata components (such as |pdfauthor|, +% |pdftitle|, |pdfsubject|, |pdfkeywords|, etc.) are disabled, since +% |pdfx| has already taken care of this information. +% +% Thirdly, conflicts with other packages may be dealt with by simply +% changing |\usepackage| to |\RequirePackage| within the document's +% preamble. But this may not be possible when the |\usepackage| +% or |\RequirePackage| command occurs within another package, or with +% a specific set of options, thereby causing processing to stop. +% Few packages have a command analogous to |\hypersetup|. +% Instead |\PassOptionsToPackage{<options>}{<package>}| can help. +% For |<options>| specify the ones associated with the loading yet to come. +% This can give a smooth processing run, but you'll need to check whether +% the results from those options have actually taken effect. +% Some examples of this can be seen later, in Figures~\ref{koi8-code} +% and \ref{tldoc-pol}. +% +% \subsubsection{Limitations using Xe\LaTeX}\label{sssec-xetex} +% +% To process a file using Xe\LaTeX, to produce a document that can +% validate to a particular PDF standard, one need to use a command +% to run the \TeX\ engine, as follows. +% \begin{decl}[] +% |xelatex -shell-escape -output-driver="xdvipdfmx -z 0" <filename>.tex | +% \end{decl} +% The |-shell-escape| option allows a command-line task to be run, +% which writes the creation-date \& time of the running job into +% a small file on disk. This data, written in a specific format, is then +% read by the job for inclusion into several metadata fields. +% This emulates the result of \pdftex's |\pdfcreationdate| primitive. +% As there are security implications in allowing arbitrary commands to be run, +% this need for |-shell-escape| must be viewed as imposing a limitation on the +% work-flows in which this can be safely used. +% +% The |-output-driver="xdvipdfmx -z 0"| suppresses compression, which +% is not allowed for the XMP metadata packet. Without this, the resulting PDF +% may fail to pass validation tests. +% +% Xe\TeX\ is designed for processing UTF-8 input only. When presented +% with \LaTeX\ source using a legacy encoding, such as |latin2| or |koi8-r|, +% the input is accepted and a PDF produced. Yet there will be garbage +% characters corresponding to each character entered from the upper range +% (128--255). This is evident in the PDF content and bookmarks; +% yet |pdfx| produces the correct XMP metadata packet. +% So while the techniques explained later in Section~\ref{ssec-multi} are +% valid, the PDF itself does not contain correct content. +% +% Not all fonts, in particular Open-Type fonts (OTF), naturally come with +% mappings of the glyphs to Unicode code points. This is a requirement +% with PDF/A, PDF/E and PDF/UA standards. +% Use of such fonts can result in validation errors, such as: +% \begin{itemize} +% \item +% CIDset in subset font is incomplete (font contains glyphs that are not listed). +% \item +% Type 2 CID font: CIDToGID map is invalid or missing. +% \end{itemize} +% +% If one has access to Adobe's |Acrobat Pro| software, then its |Preflight| +% utility can rewrite the uncompressed output from Xe\LaTeX\ into a valid +% PDF standard, using compression of the contents but not of the XMP packet. +% Similarly |Preflight| can sometimes fix the missing font information. +% +% +% \subsubsection{Limitations using Lua\LaTeX}\label{sssec-luatex} +% +% Lua\LaTeX\ can handle the OTF font issues mentioned for Xe\LaTeX, +% so can produce valid PDF/A documents where Xe\LaTeX\ fails. +% However, since Lua\TeX\ expects all input source to be UTF8-encoded, +% it cannot work at all with documents using older legacy encodings. +% Instead one gets error messages such as: +%\begin{decl} +% |! String contains an invalid utf-8 sequence.|\\ +% |l.5 \Copyright{\textLII{UWAGA dla recenzent|\\ +% | О©╫w/tбЁumaczy}}|\\ +% |? | +%\end{decl} +% from a document using |latin2| encoded characters. +% Thus most of Section~\ref{ssec-multi} is just not applicable for Lua\LaTeX, +% whereas it is for \pdftex. +% This is essentially the same problem as described above for Xe\TeX, +% but here Lua\TeX\ advises that there are problems as soon as it +% encounters an invalid (for UTF-8) character. Some would regard +% this as better than having the job run to completion, only to later +% discover garbage content within the PDF. +% +% +% \subsection{Files included} +% +% The following files are included in the package. +% Some can be created from |pdfx.dtx|, using the |Makefile|. +% +% \subsubsection{Package files} +% +% \begin{itemize} +% \item |pdfx.sty| --- main package file generated from |pdfx.dtx|. +% \item |pdfa.xmp| --- specimen |xmp| template for PDF/A. +% \item |pdfe.xmp| --- specimen |xmp| template for PDF/E. +% \item |pdfvt.xmp| --- specimen |xmp| template for PDF/VT. +% \item |pdfx.xmp| --- specimen |xmp| template for PDF/X. +% \item |8bit.def| --- custom input encoding. +% \item |l8u-penc.def| --- input encoding macro declarations. +% \item |l8uarb-penc.def| --- input macro declarations for Arabic. +% \item |l8uarm-penc.def| --- input macro declarations for Armenian. +% \item |armglyphs.dfu| --- Unicode mapping for Armenian letters. +% \item |l8ucyr-penc.def| --- input macro declarations for Cyrillic alphabet. +% \item |l8udev-penc.def| --- input macro declarations for Devanagari. +% \item |l8ugrk-penc.def| --- input macro declarations for Greek alphabet. +% \item |l8uheb-penc.def| --- input macro declarations for Hebrew alphabet. +% \item |l8ulat-penc.def| --- input macro declarations for Latin 1--9 encodings. +% \item |l8umath-penc.def| --- input macro declarations for mathematical symbols. +% \item |glyphtounicode-cmr.tex|, |glyphtounicode-ntx.tex| --- maps glyph names +% to corresponding Unicode for Computer Modern and other \TeX-specific fonts. +% \item |AdobeColorProfiles.tex| --- macros for inclusion of Adobe-supplied color profiles. +% \item |AdobeExternalProfiles.tex| --- macros for use of external color profiles. +% \item |CallasColorProfiles.tex| --- macros for profiles included with Callas pdfaPilot software. +% \end{itemize} +% +% \subsubsection{Documentation \& Examples} +% +% \begin{itemize} +% \item |README| --- usual top-level information. +% \item |manifest.txt| --- file list. +% \item |pdfx.pdf| --- package documentation. +% \item |sample.tex|, |sample.xmpdata| --- a sample file with sample metadata. +% \item |small2e-pdfx.tex| --- sample file with included metadata. +% \end{itemize} +% +% \subsubsection{Sources} +% +% \begin{itemize} +% \item |src/pdfx.dtx| --- composite package and documentation. +% \item |src/pdfx.ins| --- installer batch file. +% \item |src/pdfx.xmpdata| --- metadata for the documentation. +% \item |src/rvdtx.sty| --- used by |pdfx.dtx|. +% \item |src/Makefile| --- a Makefile for building the documentation. +% \item |src/MANIFEST| --- list of files in this directory. +% \item |src/text89.def| --- used with Figure\,\ref{ex-arm} in the documentation. +% \item |src/{arm-start,koi8-example,koi8-example2,latin2-example}.tex| +% --- used in the documentation with figures showing example coding. +% \item |src/{TL-POL-meta,TL-RU-LICRs,TL-RU-metadata,TL-RU-toc,Armenian-example-UTF8,|\\ +% |armtex-meta,usage-meta,math-assign5}.png| --- screenshot images showing multilingual +% and other metadata. +% \end{itemize} +% +% \subsection{Miscellaneous information} +% +% The package is released under the \LaTeX{} Project Public +% Licence. Bug reports, suggestions, feature requests, etc., may be +% sent to the original authors at +% \href{mailto:cvr@river-valley.org}{\ttfamily cvr@river-valley.org} +% and/or +% \href{mailto:thanh@river-valley.org}{\ttfamily thanh@river-valley.org}, +% or to the more recent contributors at +% \href{mailto:ross.moore@mq.edu.au}{\ttfamily ross.moore@mq.edu.au} +% and/or +% \href{mailto:selinger@mathstat.dal.ca}{\ttfamily selinger@mathstat.dal.ca}. +% +% +% \section[Multilingual and Technical Considerations]{Multilingual and Technical Considerations}\label{sec-meta} +% +% \TeX\ and \LaTeX\ have an on-going practice of including metadata within +% the source files and package documentation. Usually this is done as comments +% at the beginning of the file; such as the following from the English +% language version of the 2015 \TeX\ Live documentation\footnote{% +% found at |/usr/local/texlive/2016/texmf-dist/doc/texlive/texlive-en/|.}. +% \begin{decl}[] +% |$Id: texlive-en.tex 37205 2015-05-05 21:36:33Z karl $|\\ +% |TeX Live documentation. Originally written by Sebastian Rahtz and|\\ +% |Michel Goossens, now maintained by Karl Berry and others.|\\ +% |Public domain.| +% \end{decl} +% This provides information, ideally suited for copyright metadata +% fields, as in Section~\ref{sssec-copy}, as well as for |\Subject| +% and |\CoverDate| from Section~\ref{sssec-publ}. +% +% Also near the top of the file one finds front-matter content +% \begin{decl}[] +% |\title{%|\\ +% | {\huge \textit{The \TeX\ Live Guide---2015}}|\\ +% |}|\\ +% |\author{Karl Berry, editor \\[3mm]|\\ +% | \url{http://tug.org/texlive/}|\\ +% | }|\\ +% |\date{May 2015}| +% \end{decl} +% which supplies metadata information for the commands |\Title|, |\Author|, +% |\CoverDisplayDate| also from Section~\ref{sssec-publ}, and |\CopyrightURL|. +% +% Most of the hundreds of thousands, if not millions of documents prepared +% using \TeX, \LaTeX\ and other \TeX-based formats, include similar +% metadata information, much of which currently does not accompany the +% resulting PDF. It is becoming increasingly common, if not yet a legal +% requirement, for PDFs to satisfy a standard that requires inclusion +% of metadata. This is especially so for government agencies and institutions +% receiving government funding, in several countries around the world. +% +% It is an aim of the |pdfx| to simplify the process of capturing and +% including metadata within \LaTeX-produced PDFs, from both the author's +% view and that of archivists. The extra features introduced with version +% 1.5.8 take a large step in that direction. +% This includes the ability, described in the next subsection, to reliably +% include data presented in different text encodings, rather than being +% restricted to UTF-8 only. It is a role of the software to make the +% conversion, rather than rely on some 3rd party for a translation. +% +% +% \subsection[Multilingual Metadata]{Multilingual Metadata}\label{ssec-multi} +% +% A cursory search of the documentation (|.../texmf-dist/doc|) subtree +% of the forthcoming \TeX\,Live 2016 release reveals more than 730 different +% |.tex| or |.dtx| document sources which specify an input encoding, +% via the |\usepackage[...]{inputenc}| command. Roughly 380 (a bit more +% than half) declare UTF-8 as the input encoding. +% Of the remainder there are $\approx 20$ other encodings specified, +% covering a range of languages for at least part of their content. +% At some point in time, these documents may be required to have accurate +% accompanying metadata, as part of conformance to a designated PDF +% (or other) standard. There are libraries and archives that already must +% meet such standards. +% +% We have shown above, in Section~\ref{ssec-metadata}, how the |.xmpdata| +% file can be inserted into the document source, which then ensures that +% metadata is reliably transferred along with the source itself. +% This seems a good strategy, but are there any problems with it, +% especially in a multi-lingual context? +% +% Modern editing software can require an encoding to be associated +% with each file. This is what allows the correct characters to be shown, +% from what is otherwise just a sequence of 8-bit bytes. The flip-side +% is that arbitrary editing is not permitted. Add some UTF-8 data into +% a file that is encoded as Latin-2 then try to save it. You may be asked +% to specify a new encoding, or the application may even crash out entirely. +% Maybe this happens \emph{accidentally}. It is not hard for a curly quote +% (`) or endash (--) to be included; many editors have settings which can +% do this with normal ascii input. Turn \emph{off} such settings. +% +% The approach that we advocate is that when editing to add metadata, +% best is to: +% \begin{enumerate} +% \item +% use the \emph{same encoding} as is specified for the file itself, +% if known (as is usually the case); +% \item +% even if 1. is not possible, use Copy/Paste \emph{within} the document source +% (e.g., for authors' names, addresses, affiliations, etc.) and from comments, +% as in Section~\ref{sec-meta} above; +% \item +% avoid typing new characters, especially quotes and dashes, and be extra +% careful with back-spacing to preserve the real meaning of copied content. +% \end{enumerate} +% Even if the original encoding is not known, use of Copy/Paste from other +% parts of the document is normally not going to change its encoding. +% This should not cause the file to become invalid due to mixed content. +% In some situations it may be necessary to use an ASCII-only representation, +% such as \LaTeX's LICR\footnote{LICR: \LaTeX\ Internal Character Representation; +% or think `I $=$ Interchange'.} macros~\cite[\S\,7.11]{LC2}. +% +% \begin{figure}[htb] +% \centering +% \includegraphics[scale=.33]{TL-RU-metadata} +% \caption{Metadata generated from the coding shown in Figure\,\ref{koi8-code}, +% viewed using Acrobat Pro's `Additional Metadata \dots' panel.}\label{koi8-meta} +% \end{figure} +% \begin{figure}[htb] +% {\UseRawInputEncoding +% \begin{decl}[] +% \input{koi8-example} +% \end{decl} +% }% +% \setbox0=\hbox{\kern-10cm\texttt{\`{ }\^{ }\~{ }\"{ }\r{ }\^{ }\u{ }\H{ }\'{ }\k{ }\v{ }\.{ }\i}}% +% \ht0=0pt\dp0=0pt\box0\vskip-\baselineskip +% \caption{Example of cyrillics in metadata, shown as if \texttt{T1}-encoded. +% See Figure\,\ref{koi8-meta} for the actual result.}\label{koi8-code} +% \end{figure} +% +% \subsubsection[Metadata with Cyrillics]{Metadata with Cyrillics}\label{sssec-cyr} +% +% Here is a `real-world' example, with Figure\,\ref{koi8-meta} showing the metadata +% as could be produced for the Russian language version of the \TeX\ Live documentation, +% from coding as shown in Figure\,\ref{koi8-code}. +% The source file itself is actually encoded for KOI8-R, as indicated by the presence +% of the code line |\usepackage[koi8-r]{inputenc}|, +% but is deliberately shown here encoded as |T1|~\cite[p.\,449]{LC2}. +% This difference is immaterial for checking the validity of the metadata. +% For example, the stream of upper (accents, etc.) characters within +% |\Title{\textKOI{ ... }}| is the same as within |\title{...\textit{ ... }}|. +% Similarly for |\Author{\textKOI{...}}| and |\author{...}|, and |\CoverDate| and |\date|. +% Strings for the |\Subject| and |\Keywords| are taken from the first actual paragraph +% in the document, and from early subsection titles. +% +% It is the `parser' command/macro |\textKOI{ ... }| that indicates that the upper range +% characters (having byte codes 128--255) are to be treated as KOI8-R characters, +% rather than as part of UTF-8 byte sequences. It works by examining each byte in sequence, +% and returning the appropriate UTF-8 2-byte sequence for the required cyrillic character. +% This happens during the processing of data from |\jobname.xmpdata| for fleshing-out +% the XMP metadata packet to be included within the final PDF/A document. +% +% The `parser' macros defined for various encodings, are given in Figure\,\ref{parsers}. +% In Section\,\ref{ssec-xmplang} the package options are given +% for loading the appropriate support for desired languages or alphabets. +% Support for other encodings can be added, if there proves to be a need. +% +%\begin{figure}[ht] +% \centering +% \begin{tabular}{lll}\hline +% macro & encodings & bytes 128--255 with languages\\\hline +% |\textLAT| & Latin-1 & Western European \\ +% |\textLII| & Latin-2 & Middle European \\ +% |\textLIII| & Latin-3 & South European \\ +% |\textLIV| & Latin-4 & North European \\ +% |\textLTV| & Latin-5 & Turkish \\ +% |\textLVI| & Latin-6 & Nordic \\ +% |\textLVII| & Latin-7 & Baltic Rim \\ +% |\textLIIX| & Latin-8 & Celtic \\ +% |\textLIX| & Latin-9 & Western European, incl. \texteuro \\ +% |\textKOI| & KOI8-R, KOI8-RU & cyrillic alphabets \\ +% |\textLGR| & LGR, ISO-8859-7 & Greek \& Polytonic Greek\\ +% |\textARM| & Arm\TeX, ArmSCII8 & Armenian\\ +% |\textHEB| & HE8, ISO-8859-8, CP1255 & Hebrew\\ +% |\textHEBO| & CP862 & Hebrew\\ +% |\(...\)| & parses simple mathematical expressions\\\hline +% \end{tabular} +% \caption{Parser macros, defined for specific types of input.}\label{parsers} +% \end{figure} +% \begin{figure}[hbt] +% \centering +% \includegraphics[scale=.5]{TL-RU-LICRs} +% \caption{How to see LICRs in the \texttt{.log} window.}\label{koi8-LICR} +% \end{figure} +% +% With encoded characters marked in this way with a `parser' macro, +% it is actually possible to mix UTF-8 metadata with other bytes; +% provided, of course, you have an editor that allows such a file +% to be created and saved. On the other hand, if you are unhappy with mixing +% content having different encodings, then there is another way, based upon +% \LaTeX's LICR macros~\cite[\S\,7.11]{LC2} for representing accented +% and non-latin characters. +% These are normally hidden away (`I $=$ Internal') but in fact can be seen +% within auxiliary files, such as |.aux| and |.toc|, |.lof| and |.lot|. +% This is how \LaTeX\ stores the knowledge of such characters for use in +% a part of the document processing which may not have the same encoding +% as the document as a whole, or may require characters generated using several +% different encodings. Thus LICRs allow for a reliable representation +% passed to a different context; think `I $=$ Interchange'. +% +% \begin{figure}[hbt] +% {\UseRawInputEncoding +% \begin{decl}[] +% \input{koi8-example2} +% \end{decl} +% }% +% \caption{Example of cyrillics in metadata, using LICRs.}\label{koi8-code2} +% \end{figure} +% \begin{figure}[htbp] +% \centering +% \includegraphics[scale=.5]{TL-RU-toc} +% \caption{How to get desired LICRs into the \texttt{.toc} file.}\label{koi8-toc} +% \end{figure} +% +% Figure~\ref{koi8-LICR} shows how to see this. +% The document source in the lower portion clearly shows the cyrillic +% input, whereas the |.log| messages in a command-line window above +% reveal the LICR representation. A command |\showLICRs| is available +% with |pdfx.sty| version 1.5.8, specifically to allow this. +% Now the LICR representation can be copied directly from the |.log| file, +% modulo slight difficulties due to the way long lines are broken. +% As this representation is entirely with ASCII characters, it should not +% cause any conflict with any UTF-8 metadata that you want within the same file. +% The |.xmpdata| file might now look as in Figure~\ref{koi8-code2}. +% Although very verbose, this should be resistant to any corruption due to +% character encodings, and produces the same result within the PDF, +% as in Figure~\ref{koi8-meta}. +% +% Alternatively one can exploit the |.toc| file, using \LaTeX's command +% |\addtocontents|, as shown in Figure~\ref{koi8-toc}. +% After processing the file, you can copy the LICR representations out +% of the |.toc| file, taking care to remove anything of a non-character +% nature (e.g., implementing the size and spacing of the letters in \TeX). +% +% Of course once you have harvested the metadata in this format, remove +% or comment-out those extra |\showLICRs| to get uninterrupted processing. +% Similarly comment-out the extra |\addtocontents| lines, else the real +% Table-of-Contents will become corrupted with unwanted entries. +% A couple more \LaTeX\ processing runs should restore the PDF to the +% way you want it. +% +% \subsubsection[Metadata with Polish]{Metadata with Polish}\label{sssec-pol} +% +% The next example has upper-range bytes intended to represent Latin-2 encoded +% characters, as used in Polish. +% With the \LaTeX\ source starting as in Figure~\ref{tldoc-pol}, +% the resulting metadata is shown in Figure~\ref{tlmeta-pol}. +% +%\begin{figure}[htb] +% \centering +% \includegraphics[scale=.45]{TL-POL-meta} +%\caption{Metadata generated from the coding shown in Figure~\ref{tldoc-pol} +% for the Polish version of \TeX\ Live 2015 documentation, showing Latin-2 encoded +% characters. The document is valid for PDF/A-2, after having been processed with +% pdf-\LaTeX.}\label{tlmeta-pol} +%\end{figure} +% +%\begin{figure}[!htp] +% {\UseRawInputEncoding +%\begin{decl}[] +% \input{latin2-example} +%\end{decl} +% }% +%\caption{Start of the \LaTeX\ source for the Polish version of \TeX\ Live +% documentation. Although Latin-2 encoded, the bytes are shown here using +% \LaTeX's \texttt{T1} encoding \cite[p.\,449]{LC2}.}\label{tldoc-pol} +%\end{figure} +% +% Here the `parser macro' is |\textLII|, which can be seen in Figure~\ref{tldoc-pol} +% to surround either complete metadata entries, or just those parts containing +% polish accented (or other) characters in entries that also contain english words. +% The macro |\textLF| provides a line-feed character for the UTF-8 output. +% +% As a technical note, the |\jobname.xmpdata| file is read with |\obeyspaces| +% in effect. This causes space runs in the input to be replaced by a single +% `active space' character, which ultimately expands into a normal space upon output. +% This is needed to preserve inter-word spaces, which would otherwise +% get lost during parsing, due to \TeX's pattern matching when reading macro arguments. +% Each byte is examined individually, with normal letters |a-zA-Z| and most punctuation +% characters passed through unchanged. +% +% \medskip\goodbreak +% Let's understand better how this example was created. There are three files involved. +%\begin{itemize} +% \item |pdfx.dtx|, the source for this documentation, open in an editor with +% encoding declared as UTF-8; +% \item |texlive-pl.tex| the Polish documentation for \TeX\ Live, open in the +% same editor with Latin-2 encoding; +% \item |latin2-example.tex| which starts life as an empty file on disk. +%\end{itemize} +% \noindent +% This latter file must be opened in the editor, with encoding declared as +% Latin-2 (ISO-8859-2). +% Next the preamble is copied from |texlive-pl.tex| and pasted into |latin2-example.tex| +% which is then saved to disk. Further editing is done to |latin2-example.tex| to +% add verbatim markers (\texttt{$\vert$...$\vert$}) and adjust line lengths for display +% within Figure~\ref{tldoc-pol}. This file's contents is included as part of the +% documentation via |\input{latin2-example}| within an environment that handles +% presentation aspects, and (since 2018) declares |\UseRawInputEncoding|. +% +% What \emph{cannot} be done is to paste the preamble content directly into |pdfx.dtx|. +% Consider what would then happen, using `t{\l}umaczy' (`translators', on line 10 +% following `UWAGA'). This word shows correctly in the Latin-2 encoded files. +% It was typeset here using |\l| for the `\l' letter, having Unicode code-point +% |Ux0142| (so UTF-8 byte pair |"C5|\,|"82|). +% However, it occurs at slot |"B3| within Latin-2 encoding. +% In the |T1| font encoding \cite[p.\,449]{LC2} the character glyph name +% for slot |"B3| is |/scedilla|, which is what shows in Figure~\ref{tldoc-pol}. +% When the `\l' is pasted directly into a UTF-8 file and shown verbatim, +% the result is the pair of glyphs |"C5| (|/Aring|) and |"82| (|/Cacute|); +% \emph{viz.} {\UseRawInputEncoding |tе┌umaczy|}. +% +% As with Figure~\ref{koi8-code} it is not important that the correct characters +% are shown here, but that the metadata in |\jobname.xmpdata| corresponds to what +% is used on the titlepage of the PDF; e.g., the contents of |\Title| and |\title|, +% |\Author| and |\author|, etc. +% +% +% \subsubsection[Metadata with Greek]{Metadata with Greek}\label{sssec-grk} +% +%\begin{figure}[!hb] +% \centering +% \includegraphics[scale=.43]{usage-meta} +%\caption{Metadata generated from the coding shown in Figure~\ref{greek-code} +% using the greek language specified via the LGR encoding.}\label{greek-meta} +%\end{figure} +% +%\begin{figure}[!htp] +%\begin{decl}[] +%|% ... |\\ +%|% This file is part of the Babel system.|\\ +%|% --------------------------------------|\\ +%|% |\\ +%|% It may be distributed and/or modified under the |\\ +%|% conditions of the LaTeX Project Public License, either version 1.3|\\ +%|% ... |\\ +%{\color{verbcolor}\texttt{\% The Current Maintainer of this work is G\"unter Milde.}}\\ +%|% ... |\\ +%| |\\ +%|\providecommand{\pdfxopts}{a-2u,LGRxmp,LATxmp}|\\ +%|\begin{filecontents*}{\jobname.xmpdata}|\\ +%|\Title{Writing Greek with the "greek" option of the "babel" package}|\\ +%{\color{verbcolor}\texttt{\string\Author\{Apostolos Syropoulos\string\sep\ G\"unter Milde\}}}\\ +%|\Subject{This document describes the use of the Latin transliteration for Greek that is |\\ +%| defined by the LGR font encoding. Today, all modern LaTeX distributions support literal|\\ +%| input of Greek, which is the preferred method for new documents. [G. Milde 2013/12/02]}|\\ +%|\Keywords{\textLGR{monotonik'o}\sep \textLGR{polutonik'o}\sep \textgreek{oxe'ia} \sep |\\ +%{\catcode `\|=11 \color{verbcolor} +%\texttt{\ \ \string\textgreek\{>a'erac\}\string\sep\ \string\textgreek\{>anate'ilh|\}\string\sep\ \string\textgreek\{qa"ide'uh|c\}\}}}| \sep |\\ +%| \textgreek{D'uskoloc} of \textgreek{M'enandroc}\textLF \textLGR{T'i f'hic? <Id`wn |\\ +%| >enj'ede pa~id'' >eleuj'eran\textLF t`ac plhs'ion N'umfac stefano~usan, S'wstrate,|\\ +%| \textLF >er~wn 'ap~hljec e>uj'uc? \sep |\\ +%| \textaristerikeraia\textalpha\textsampi\textqoppa\textzeta\textdexiakeraia\sep |\\ +%| \textaristerikeraia\textAlpha\textSampi\textQoppa\textZeta\textdexiakeraia}}|\\ +%|\CoverDate{1997-10-15}|\\ +%|\CoverDisplayDate{October 15, 1997}|\\ +%|\Copyright{This file is part of the Babel system.\textLF This file may be distributed and/or|\\ +%| modified under the conditions of the LaTeX Project Public License, either version 1.3 |\\ +%| of this license or (at your option) any later version.}|\\ +%|\CopyrightURL{http://www.latex-project.org/lppl.txt}|\\ +%|\end{filecontents*}|\\ +%|%|\\ +%|\documentclass[11pt]{article}|\\ +%|\usepackage[\pdfxopts]{pdfx}[2016/04/13]|\\ +%|\hypersetup{colorlinks,allcolors=blue}|\\ +%|\usepackage[american,greek]{babel}|\\ +%|\languageattribute{greek}{polutoniko}|\\ +%|\usepackage{athnum,grmath}|\\ +%|\newcommand{\sg}{\selectlanguage{greek}}|\\ +%|\newcommand{\sa}{\selectlanguage{american}}|\\ +%|\begin{document}|\\ +%|\selectlanguage{american}|\\ +%|\title{Writing Greek with the \ttfamily greek\rmfamily\ option of the |\\ +%| \ttfamily babel\rmfamily\ package}|\\ +%|\author{Apostolos Syropoulos\\|\\ +%| ...\\...}|\\ +%|\date{October 15, 1997}|\\ +%|\maketitle|\\ +%|\abstract{\noindent|\\ +%|This document describes the use of the Latin transliteration for Greek that|\\ +%|is defined by the LGR font encoding. Today, all modern LaTeX distributions|\\ +%|support literal input of Greek, which is the preferred method for new|\\ +%|documents. [G. Milde 2013/12/02]}| +%\end{decl} +%\caption{Start of enriched \LaTeX\ source for a document describing how to typeset +% in Greek, with added metadata demonstrating the LGR transliteration encoding. +% }\label{greek-code} +%\end{figure} +% +% Prior to proper support for UTF-8 input, a method for preparing document source +% for the modern Greek language (and also for polytonic Greek), involved the use +% of LGR encoded fonts. Such a font has Greek (instead of Latin) letters in the +% slots for |a-zA-Z|, see~\cite[\S9.4.2]{LC2}. Thus ordinary ASCII letters are used +% to produce the Greek characters; the mapping of ASCII to Greek is referred to as +% a `transliteration' scheme. It serves as \emph{both} an input encoding, and as +% a font encoding. Accents and diacritic marks are provided through ligatures +% built-in to the fonts. Various documents can be found on the web\footnote{e.g., +% \url{http://milde.users.sourceforge.net/LGR/}} and +% within \TeX\ Live distributions\footnote{% +% TeXLive: \textcolor{urlcolor}{\texttt{.../2016/texmf-dist/doc/generic/babel-greek/}}}. +% +% Indeed the current maintainer G\"unther Milde states +% ``The LGR transliteration does not work for PDF metadata''. +% This is because there is no translation of LGR input into \LaTeX\ LICRs, +% as happens with say |\usepackage[utf8]{inputenc}| for UTF-8 input, +% or when upper 8-bit characters are present using |\usepackage[iso-8859-7]{inputenc}|. +% With these, LICRs such as |\textAlpha|, |\textOmicron|, \dots, |\textomega| +% are produced, which result in the correct characters for metadata and bookmarks, +% perhaps employing Unicode `combining' characters for accented letters. +% Using |pdfx| the UTF-8 characters can be put directly into the |.xmpdata| file; +% LICRs are interpreted provided the |grkxmp| loading option has been specified. +% +% Using the methods of |pdfx| the metadata difficulty is remedied, as can be seen in +% Figure~\ref{greek-meta} using coding as shown in Figure~\ref{greek-code}. This requires +% the |LGRxmp| option and |\textLGR| `parser' macro. The original document source, +% called |usage.tex|, can be found in the directory specified in the footnote below. +% As this document is essentially an English description of how to use LGR for Greek, +% we have used the `Keywords' field to provide examples of such usage. +% Since a macro |\textgreek| can be used for greek portions within such documents, +% this macro name is aliased to |\textLGR| within the context where metadata is processed. +% Furthermore, parsing using |\textLGR| generates correct pre-composed characters +% for letters with accents or diacritics. Bookmarks can also be generated from +% LGR input, using a technique described in Section~\ref{sssec-arm}. +% +% \bigskip\noindent +% The features available with different loading options are summarised here. +% \begin{itemize} +% \item +% no option: all metadata in |.xmpdata| file is in UTF-8 (incl. ASCII) +% \item +% |grkxmp|: LICRs can be present; e.g. |\textAlpha|, |\textOmega|, etc. +% \item +% |LGRxmp|: supports LGR-encoded input and |ISO-8859-7| upper range characters, +% using the |\textLGR| `parser' macro. +% \end{itemize} +% With |LGRxmp| specified, the features of |grkxmp| are also available; so any +% lower-listed option allows data to be mixed with that for higher-listed ones. +% +% +% The final piece to get validation for PDF/A from LGR input, is to specify +% a Unicode point for the `|v|' used only in the strong `|sv|' ligature to obtain +% a non-final `sigma' typeset in isolation. +%\begin{decl}[] +% |\pdfglyphtounicode{internalchar2}{200D}| +%\end{decl} +% This gives an interpretation as `zero-width joiner'. +% There are two instances of this within |usage.tex|. Copy/Paste works as desired. +% Using \pdftex\ the above command is done automatically. +% Drivers, such as Xe\LaTeX\ lacking an implementation of |\pdfglyphtounicode|, +% can fail to produce a valid PDF due to this rather minor deficiency. +% +% Greek numerals, using |\greeknumeral| or |\Greeknumeral| cannot work directly within +% a |.xmpdata| file. However if such is desired, the following technique allows +% correct LICRs to be found for use in the metadata. +% At any convenient place within the \LaTeX\ source; e.g., near where the required +% number is used, insert coding such as: +% \begin{decl}[] +% |{\pdfxGreeknumeralsHack \textgreek{\edef\num{\greeknumeral{1997}}\show\num}}%| +% \end{decl} +% Upon processing, the following will be written to the console or |.log|-window. +% \begin{decl}[] +%|> \num=macro:|\\ +%|->\LGR\textaristerikeraia \LGR\textalpha \LGR\textsampi \let \protect \LGR\text|\\ +%|dexiakeraia \LGR\textqoppa \let \protect \LGR\textdexiakeraia \LGR\textzeta \le|\\ +%|t \protect \LGR\textdexiakeraia \protect \LGR\textdexiakeraia .|\\ +%|<argument> ...um {\greeknumeral {1997}}\show \num |\\ +%| |\\ +%|l.90 ...k{\edef\num{\greeknumeral{1997}}\show\num}|\\ +%| }|\\ +%|? | +% \end{decl} +% from which the desired string of LICRs, is extracted; \emph{viz}. +% \begin{decl}[] +% |\textaristerikeraia\textalpha\textsampi\textqoppa\textzeta\textdexiakeraia| +% \end{decl} +% The corresponding trick does not work with |\Greeknumeral|, but the uppercasing +% can be done manually from the string obtained using |\greeknumeral|, +% \begin{decl}[] +% |\textaristerikeraia\textAlpha\textSampi\textQoppa\textZeta\textdexiakeraia| +% \end{decl} +% leaving the initial and final |\text...keraia| macros as all lowercase. +% For smooth processing, remove or comment-out the added line after collecting the LICRs. +% +% +% \def\ArmTeX{Arm\kern -0.15em\TeX}% +% \subsubsection[Metadata with Armenian]{Metadata with Armenian}\label{sssec-arm} +% +% \begin{figure}[!htbp] +% \centering +% \includegraphics[scale=.42]{armtex-meta} +%\caption{Metadata generated from the coding shown in Figure~\ref{arm-code} +% using the Armenian language specified using \ArmTeX\ transliteration. +% Bookmarks have been generated in Armenian. Figure ~\ref{ex-arm} explains +% how the word indicated in red is obtained via parsing.}\label{arm-meta} +% \end{figure} +% +% \begin{figure}[!htbp] +% \let\small\scriptsize +% {\UseRawInputEncoding +% \begin{decl}[] +% \input{arm-start.tex}% +% \end{decl} +% }% +% \caption{Enriched \LaTeX\ source for the Armenian version of the \ArmTeX\ manual, +% with added metadata demonstrating the \ArmTeX\ transliteration scheme for \texttt{OT6} encoding. +% Also shown is coding used to produce bookmarks from the transliteration.}\label{arm-code} +% \end{figure} +% +% The \ArmTeX\ package\footnote{documentation: % +% TeXLive: \textcolor{urlcolor}{\texttt{.../2016/texmf-dist/doc/generic/armenian/}}} +% provides the method to typeset Armenian, with input being specified in various ways +% including a transliteration scheme from ASCII input. This transliteration is directed +% at the use of the |OT6| encoding, developed for this purpose. +% Each way is supported by |pdfx.sty| with appropriate loading options, similar +% to the support for Greek~(see Section~\ref{sssec-grk}). +% \begin{itemize} +% \item +% no option: all metadata in |.xmpdata| file is in UTF-8 (incl. ASCII) +% \item +% |armxmp|: using LICR-like macro names; e.g. |\armAyb|, |\armsha|, |\armfe| etc. +% \item +% |AR8xmp|: using the \ArmTeX\ (|OT6|) transliteration scheme or with upper-range +% characters in |ArmSCII8| encoding, using the `parser' macro |\textARM|. +% \end{itemize} +% +% \goodbreak\noindent +% There are 39 letters in the Armenian alphabet, so the transliteration includes +% many 2-letter combinations to specify the desired character. Whereas Greek uses +% punctuation symbols to specify diacritics, Armenian requires either ligatures +% implemented in the |OT6|-encoded font, or careful parsing of the input into +% LICR-like macros. +% \LaTeX\ source\footnote{TeXLive: % +% \textcolor{urlcolor}{\texttt{.../2016/texmf-dist/doc/generic/armenian/examples/latex/}}} +% for the \ArmTeX\ documentation is available in both English and Armenian. +% Figure~\ref{arm-meta} shows the result of enriching the Armenian version with relevant +% metadata, using coding as shown in Figure~\ref{arm-code}. +% +% As in earlier examples, that metadata has come from the extensive comments at the head +% of the \LaTeX\ source file (represented by |...| in Figure~\ref{arm-code}), and other +% title-page material, such as title and author names in both English and Armenian. +% Within the keywords are armenian words that are mentioned in the documentation as being +% slightly tricky to represent in transliteration, to verify that the required tricks have +% been correctly implemented. +% +% Also apparent in Figure~\ref{arm-meta} is the use of Armenian letters in the Bookmarks +% pane, having been generated from the transliteration source. This requires a 3-step +% process, as follows. +% \begin{enumerate} +% \item +% conversion of transliterated source into UTF-8. +% This is done as the |.xmpdata| file is processed, using |\pdfxEnableCommands| +% to make global definitions; e.g, +%\begin{decl}[] +% |\xdef\sectAtitle{\textARM{Nerac'uthyun}}| +%\end{decl} +% capturing the section title in the form supplied in the \LaTeX\ source. +% This can be seen in Figure~\ref{arm-code}, near the end of the |{filecontents*}| +% environment, and at the bottom where the |\section| command would occur. +% \item +% conversion of the UTF-8 representation into |UTF16-be|, suitable for bookmark +% strings within the PDF file. With \pdftex\ thishis is done using +% |\StringEncodingConvert| from Heiko Oberdiek's |stringenc.sty| package. +% Lua\LaTeX\ and Xe\LaTeX\ can use the UTF-8 representation directly. +% \item +% integration of the |UTF16-be| string (\pdftex) or UTF-8 string (Lua\TeX\ and Xe\TeX) +% into the coding that would normally generate the bookmark from a provided section title, +% in transliterated form. +% \end{enumerate} +% These last two steps are combined into a single command, to replace the usual +% command for a section title; |\section|, |\subsection|, etc. +% \begin{decl}[] +% |\pdfxBookmark{\section}{\sectAtitle}{Nerac'uthyun}| +% \end{decl} +% Now |\pdfxBookmark| first checks that the macro passed as the 2nd argument +% actually exists. If it does not, an error message is given and upon continuation +% would just do |\section{Nerac'uthyun}| as normal. +% When it does exist, then step 2 is done (by \pdftex) storing the result as |\pdfx@temp|. +% With Lua\TeX\ and Xe\TeX, |\pdfx@temp| stores a copy of the UTF-8 data. +% Then the commands needing to be executed are essentially +%\begin{decl}[] +% |\pdfstringdefDisableCommands{\let\sectAtitle\pdfx@temp}|\\ +% |\def\sectAtitle{Nerac'uthyun}|\\ +% |\section{\sectAtitle}| +%\end{decl} +% so that the correct section heading is displayed on the page, +% but when |\sectAtitle| is processed to create a bookmark it is replaced +% by the pre-prepared contents of |\pdfx@temp|. +% There are some technicalities\footnote{In fact a small change is made +% to how \textcolor{verbcolor}{\texttt{\string\@@writetorep}} is used.} +% to make this work cleanly, +% as just doing these commands would interfere with other uses of |\pdfstringdef|. +% In case a long sectioning command has an optional argument, or a $*$-variant +% is needed, then include it this way. +%\begin{decl}[] +% |\pdfxBookmark[Ar'avot e'r]{\section*}{\sectAtitle}{Ar'avot e'r, Araratyan dashti ...}| +%\end{decl} +% +% +% \subsubsection[Other Languages]{Other Languages}\label{sssec-other} +% +% There is support for Metadata using characters from other languages, +% with corresponding loading options, as follows. +% \begin{itemize} +% \item |arbxmp| : Arabic; +% via LICRs |\textarabicalef|, |\textarabicqaf|,\\ |\textarabicaleflowerhamza|, etc. +% \item |devxmp| : Devanagari; +% via LICRs |\textdevanagaria|, |\textdevanagarivocalicr|,\\ |\textdevanagaricandrabindu|, etc. +% \item |hebxmp| : Hebrew; +% via LICRs |\hebalef|, |\hebsamekh|, |\hebfinalpe| and accent marks |\segol|, |\qubuts|, etc. +% \item |vnmxmp| : Vietnamese; +% via LICRs |\ABREVE|, |\OCIRCUMFLEX|, |\uhorn| etc. and the combinations of multiple accents +% applied as usual via |\'|, |\`|, |\^|, etc. +% \end{itemize} +% The LICRs include support mapping accented letters to precomposed glyphs, falling back on +% `combining characters' only in unusual situations. Special input conventions or methods, +% such as transliteration schemes, are \emph{not yet} supported. +% Indeed, these options are largely untested, so any difficulties encountered should +% be reported to the package authors. Requests to support extra input methods or other +% language blocks should also be directed to the authors, along with pointers to where +% the desired input methods are fully described. +% Sample `real-world' documents would be greatly appreciated. +% +% +% \subsection[L8U pseudo-encoding]{L8U pseudo-encoding}\label{ssec-L8U} +% +% To understand how |pdfx| handles the translation into UTF-8 of input that is not already +% in that format, we'll briefly discuss \LaTeX's font-encoding mechanism, which is the +% basis for LICR macros~\cite[\S\,7.11]{LC2}. As an example, consider the macro |\textgamma| +% representing the lowercase Greek letter $\gamma$. +% Various \LaTeX\ packages declare this as LICR in different ways, for different purposes. +%\begin{decl}[] +% |greek-fontenc/lgrenc.def:\DeclareTextSymbol{\textgamma}{LGR}{103}|\\ +% |tipa/t3enc.def:\DeclareTextSymbol\textgamma{T3}{71} % Gamma|\\ +% |greek-fontenc/greek-euenc.def:\DeclareTextCommand{\textgamma}{\LastDeclaredEncoding}{нЁ}|\\ +% |hyperref/puenc.def:\DeclareTextCommand{\textgamma}{PU}{\83\263}%* U+03B3|\\ +% |ucs/data/uni-2.def:\uc@dclc{611}{tipa}{\textgamma}%|\\ +% |ucs/data/uni-3.def:\uc@dclc{947}{default}{\textgamma}%| +% \end{decl} +% Here the |\uc@dclc| commands associate UTF-8 input of |Ux0263| (IPA small letter gamma) +% and |Ux03B3| (Greek small letter gamma) internally with |\textgamma|, +% whereas the others deal with output formats\footnote{Whereas {\color{verbcolor}\texttt{ucs.sty}} +% handles UTF-8 input, mapping it to LICRs, with {\color{verbcolor}\texttt{pdfx.sty}} +% we need the reverse mapping into UTF-8, not just from LICRs but also from legacy +% 8-bit encodings and transliteration schemes.}. +% In four of these examples there is a number, which refers to a position in an `encoding vector' +% for the particular font used to place the character onto the printable page. +% For example |LGR| refers to greek fonts, encoded as explained in Section~\ref{sssec-grk}. +% IPA phonetics use the |T3| encoding, so |\textgamma| refers to a character +% from a different Unicode block. +% +% With two of these cases there is no specific font. +% For example, |PU| is used to create bookmark strings, +% and other PDF string inclusions, using |\pdfstringdef| from the |hyperref| package. +% With |greek-euenc.def| designed for Xe\TeX\ and Lua\TeX, the encoding can be variable, +% with the output bytes being those for the UTF-8 encoding of $\gamma$, namely |^^ce^^b3|, +% shown here as the |T1|-encoded pair |нЁ|. +% The term `pseudo-encoding' has been coined by the \LaTeX\ team. +% Although there is no actual font to determine the encoding, to an author there is essentially +% no difference in how corresponding macros can be used to get a character placed into +% an appropriate structure within the PDF. +% +% Thus there are 4 output forms for this character, +% and we've not even considered how $\gamma$ is used in mathematics! +% To handle these concurrently, one has internally-defined control-sequence names +% \begin{decl}[] +% |\LGR\textgamma=\char"67| \qquad where $6\times 16 + 7 = 103$\\ +% |\T3\textgamma=\char"47| \qquad where $4\times 16 + 7 = 71$\\ +% |\PU\textgamma=\long macro:->\83\263|\\ +% |\L8U\textgamma=\long macro:->нЁ| +% \end{decl} +% where the 2nd `\textbackslash' is part of the name\footnote{% +% obtained using {\color{verbcolor}% +% \texttt{\string\csname\space LGR\string\string\string\textgamma\string\endcsname}}.}. +% The latter macro is explained below. +% To use the specific version of the macro, \LaTeX\ maintains a `font-encoding' +% parameter, set using |\fontencoding{...}| local to the surrounding environment grouping. +% +% To the above declarations of |\textgamma|, to deal with conversion to UTF-8, +% the |pdfx| package adds the following declarations when the |LGRxmp| option is used. +% \begin{decl}[] +% |pdfx/l8ugrk.def:\DeclareTextCommand{\textgamma}{L8U}{нЁ}|\\ +% |pdfx/l8ugrk.def:\DeclareTextCompositeCommand{\textLGRenc}{L8U}{\textgamma}{нЁ}|\\ +% |pdfx/l8ugrk.def:\DeclareTextCompositeCommand{\textLGRenc}{L8U}{g}{нЁ} |\\ +% |pdfx/l8ugrk.def:\DeclareTextCompositeCommand{\textLGRenc}{L8U}{^^e3}{нЁ}| +% \end{decl} +% The pseudo-encoding name |L8U| indicates \textbf{L}ocal conversion into UTF-\textbf{8} \textbf{U}nicode, +% as required for metadata, using |pdfx.sty|. Currently this pseudo-encoding is used in one place only; +% during the interpretation of information supplied through the |\jobname.xmpdata| file. +% This happens as part of the |pdfx| package, \emph{before} it uses |xmpincl.sty|. +% Such specificity justifies being called a `Local' encoding. +% However, other tasks may emerge requiring on-the-fly conversion to UTF-8. +% In this case all the functionality of this pseudo-encoding could be shifted into a separate package, +% and the name changed to reflect this more general usage. +% Bookmarks from transliterated input, as described in Section~\ref{sssec-arm}, +% is possibly a sufficient reason to have a separate package. Another possibility is to +% generate on-the-fly creation of UTF-8 strings, to be sent to Xe\TeX\ or Lua\TeX\ running +% as a slave process to generate images of string using OTF fonts, which \pdftex\ currently +% cannot handle. The result would then be imported back into the running job as an image. +% The authors invite suggestions of how this |L8U| pseudo-encoding functionality can be put to +% good use. +% +% \goodbreak +% Accented letters normally use (e.g., from |t1enc.def|) +%\begin{decl}[] +% |\DeclareTextComposite{\`}{T1}{A}{192}| +%\end{decl} +% to get the pre-composed `\`A', rather than a composite built from \`{} and `A'. +% The last parameter is an index into a font; however the |\DeclareTextCompositeCommand| +% variant allows arbitrary coding as that final parameter, so can be the bytes for the +% UTF-8 representation of a character. +% In the above code lines, macros are defined as follows +%\begin{decl}[] +% |\\L8U\textLGRenc-\textgamma=macro:->нЁ|\\ +% |\\L8U\textLGRenc-g=macro:->нЁ|\\ +% |\\L8U\textLGRenc-|{\color{verbcolor}\texttt{\~a}}|=macro:->нЁ| +%\end{decl} +% where now the 2nd and 3rd (and perhaps 4th) `\textbackslash' are part of the name\footnote{% +% obtained using {\color{verbcolor}% +% \texttt{\string\csname\string\string\string\LGR\string\string\string\textLGRenc-\string\string\string\textgamma\string\endcsname}}.}. +% This shows how the ascii letter `g' is associated with the UTF-8 bytes for $\gamma$, +% and how the upper 8-bit character from |^^e3| can be similarly associated, +% as in |ISO-8859-7| encoding. +% +% All these associations come together in the `parser' macro |\textLGR| which works as follows. +% Firstly, |\textLGR| is declared for |L8U| pseudo-encoding only, where it expands as follows. +%\begin{decl}[] +% |\L8U\textLGR #1->\textgreekLGRstring {#1}|\\ +% |\L8U\textgreekLGRstring #1->\textgreekLGR@ii #1\@empty \@empty|\\ +% |\textgreekLGR@ii #1#2\@empty -> ... | coding to test what is in |#2|\\ +% | ... \textLGRenc{#1}\@empty | \quad if |#2| is |\@empty|\\ +% | ... \textLGRenc{#1}\textgreekLGR@i #2\@empty | \quad if |#2| has more tokens\\ +% |\textgreekLGR@i #1->\textgreekLGR@ii #1| +%\end{decl} +% Thus |\textLGRenc| is called on each token in the argument of |\textLGR|. +% Now |\textLGRenc|, which is applicable only when |L8U| pseudo-encoding is in effect, +% has a default expansion of just passing the character through unchanged; \emph{viz.} +%\begin{decl}[] +% |\DeclareTextCommand{\textLGRenc}{L8U}[1]{#1}| +%\end{decl} +% but by using |\DeclareTextCompositeCommand{\textLGRenc}{L8U}{...}{...}|, +% alternate expansions apply with specific arguments, as shown above. +% In particular, that final argument can include coding that `looks ahead' to find the next +% character. This is used, for example, with diacritics in Greek, multi-letter sequences +% for Armenian letters, and other special cases related to ligatures and punctuation symbols. +% To illustrate this Figure~\ref{ex-arm} (below) follows the conversion of a specific word, +% given in the transliteration for Armenian~(see Section~\ref{sssec-arm}). +% This conversion occurs using only \TeX's macro-expansion ability. +% Some details relevant to this example are explained there. +% +%\begin{figure}[!htbp] +%\begin{decl}[] +% |\textARM{Se\armuh van}|\\ +% |\textarmenARMstring {Se\armuh van}|\\ +% |\textarmenARM@ii Se\armuh van\@empty \@empty|\\ +% |\textARMenc {S}\textarmenARM@i e\armuh van\@empty \@empty|\\ +% |\arm@en{S}{у█}{\arm@nc{h}{у┤}{\arm@nc{H}{у┤}{у█}}}\textarmenARM@i e\armuh van\@empty ...|\\ +% |\arm@nc{h}{у┤}{\arm@nc{H}{у┤}{у█}}\textarmenARM@i e\armuh van\@empty \@empty|\\ +% |\arm@nc{H}{у┤}{у█}\textarmenARM@i e\armuh van\@empty \@empty|\\ +% |у█\textarmenARM@i e\armuh van\@empty \@empty|\\ +% |у█\textARMenc {e}\textarmenARM@i \armuh van\@empty \@empty|\\ +% |у█\textARMenc {e}\textarmenARM@i \armuh van\@empty \@empty|\\ +% |у█\arm@en{e}{у╔}{\arm@nc{'}{у╖}{\arm@nc{v}{ж┤}{у╔}}}\textarmenARM@i \armuh van\@empty ...|\\ +% |у█\arm@nc{'}{у╖}{\arm@nc{v}{ж┤}{у╔}}\textarmenARM@i \armuh van\@empty \@empty|\\ +% |у█\arm@nc{v}{ж┤}{у╔}\textarmenARM@i \armuh van\@empty \@empty|\\ +% |у█у╔\textarmenARM@i \armuh van\@empty \@empty|\\ +% |у█у╔\textARMenc {\armuh }\textarmenARM@i van\@empty \@empty|\\ +% |у█у╔\textarmuh\textarmenARM@i van\@empty \@empty|\\ +% |у█у╔\\L8U\textarmuh-\textarmenARM@i van\@empty \@empty|\\ +% |у█у╔\textarmgobblespace van\@empty \@empty|\\ +% |у█у╔\\L8U\textarmgobblespace- van\@empty \@empty|\\ +% |у█у╔\textarmenARM@i van\@empty \@empty|\\ +% |у█у╔\textARMenc {v}\textarmenARM@i an\@empty \@empty|\\ +% |у█у╔\arm@en{v}{у╬}{\arm@nc{n}{О╛√}{у╬}}\textarmenARM@i an\@empty \@empty|\\ +% |у█у╔\arm@nc{n}{О╛√}{у╬}\textarmenARM@i an\@empty \@empty|\\ +% |у█у╔у╬\textarmenARM@i an\@empty \@empty|\\ +% |у█у╔у╬\textARMenc {a}\textarmenARM@i n\@empty \@empty|\\ +% |у█у╔у╬у║\textarmenARM@i n\@empty \@empty|\\ +% |у█у╔у╬у║\textARMenc {n}\@empty|\\ +% |у█у╔у╬у║у╤\@empty|\\ +% |у█у╔у╬у║у╤| +%\end{decl} +% The macro |\armen@en| (named for \textbf{e}mpty or \textbf{n}ext), +% looks ahead to see if the 5th-next argument token is |\@empty|, +% signifying that there is nothing left of the original input. +% (A closed bracing |{...}| counts as a single argument.) If |\@empty| the tokens in +% the 2nd bracing are substituted, otherwise those in the 3rd bracing. +% Similarly |\armen@nc| (named for \textbf{n}ext \textbf{c}haracter) +% looks to see whether that 5th argument token matches with the character in the +% 1st bracing. If so, the 2nd bracing's tokens are substituted, else those of the 3rd bracing. +% This is how to cope with `Sh' or `SH', implemented as ligatures in an |OT6| encoded font, +% denoting a different letter from a single `S'. The macro |\armuh| is used here +% to \emph{prevent} a ligature from |ev| that would otherwise occur. +% One writes |e\armuh v| to get the separate letters. As the space becomes an active token, +% we need |\textarmgobblespace| to restart parsing appropriately. +% Of course |\textarmenARM@i| behaves like |\textgreekLGR@i| +% as explained earlier, with a test for |\@empty| as the 2nd token. +% At the end, any remaining |\@empty| expand into nothing. +% +% \caption{Partial tracing of the conversion of an Armenian word, indicated by the red oval +% in Figure~\ref{arm-meta}, from {\color{verbcolor}\texttt{OT6}} transliterated form into UTF-8 bytes. +% In each line, \TeX\ expansion occurs at the position of the left-most `\textbackslash'. +% The resulting bytes are shown here in {\color{verbcolor}\texttt{T1}} encoding, +% as in previous examples, with {\color{verbcolor}\texttt{?}} indicating an invisible character +% in the byte range {\color{verbcolor}\texttt{Ox80}--\texttt{Ox9f}}. +% See Figure\,\ref{src-arm} for how this source appears with UTF-8 encoding. +% }\label{ex-arm} +% \bigskip +%\end{figure} +% +% Note how in Figure~\ref{ex-arm} the Arm\TeX\ user macro |\armuh| gets aliased +% to an LICR called |\textarmuh|. Since |\armuh| is already defined, not as an LICR, +% it cannot be declared to be one without creating problems. +% Instead, within the environment grouping where |L8U| pseudo-encoding is specified, +% one uses |\let\armuh\textarmuh| within a `rebinding' macro command +% |\LIIXUmaparmenianletters|\footnote{The start of the macro name is derived from pseudo-Roman +% numerals: IX = 9, IIX = 8} +% to get LICR functionality from user-commands. +%\begin{decl}[] +% |\def\LIIXUmaparmenianletters{%|\\ +% | \let\ArmTeX\textArmTeX|\\ +% | \let\Armayb\textArmayb|\\ +% | ... |\\ +% | \let\armuh\textarmuh |\\ +% | ... |\\ +% | \def\armbf{}%|\\ +% | ... }| +%\end{decl} +% As well as rebinding each command for a letter, the font style-switching commands +% are aliased to do nothing, as these are not relevant to creating UTF-8 output. +% Being localised by the |L8U| grouping, this causes no problem elsewhere within the document. +% These are similar to macros |\psdaliasnames| and |\psdmapshortnames| from |hyperref.sty|, +% which rebind user macros to LICRs, so that |PU| encoded versions of LICRs can be used. +% +% \begin{figure}[htb] +% \includegraphics[scale=.625]{Armenian-example-UTF8.png} +% \caption{Image of part of the source coding for Figure~\ref{ex-arm}, +% viewed as UTF-8 encoded, within editing software.}\label{src-arm} +% \end{figure} +% +% Several other `rebinding' commands are defined, mostly with package-loading options. +%\begin{itemize} +% \item |\LIIXUmapTeXnames| always defined +% \item |\LIIXUscriptcommands| handles |\textsuperscript|, |\textsubscript|, |\t| +% \item |\LIIXUtipacommands| handles IPA letters and symbols +% \item |\LIIXUmaparabicletters| with |arbxmp| +% \item |\LIIXUmaparmenianletters| with |armxmp| and |AR8xmp| +% \item |\LIIXUmapdevaccents| with |devxmp| +% \item |\LIIXUmapgreekletters| with |grkxmp| and |LGRxmp| +% \item |\LIIXUmaphebrewletters| with |hebxmp| and |HEBxmp| +% \item |\LIIXUmaplatinchars| and |\LIIXUcancelfontswitches| with |LATxmp| +% \item |\LIIXUmapmathletterlikes| always defined +% \item |\LIIXUmapmathspaces| always defined +% \item |\LIIXUmapmath...| with |mathxmp| --- see Section~\ref{ssec-math} below. +%\end{itemize} +% It may well be that more macro names can be added to some of these commands, +% to allow macro usage within the metadata. +% Suggestions for such additions should be sent to the |pdfx| package authors, along +% with example documents. Similarly support for more languages can be requested. +% +% \subsection[Nested Parsing\,\textemdash\,Mathematics in Metadata]% +% {Nested Parsing\,\textemdash\,Mathematics in Metadata}\label{ssec-math} +% +% Macro commands for many mathematical symbols can be used directly in metadata without extra +% support; e.g., basic arithmetic operations, letter-like symbols, spacing commands. +% Super- and subscripted letters and numerals can use |\textsuperscript| and |\textsubscript| +% when there is an appropriate Unicode character (digits, comma, $+$/$-$/$=$, parentheses, +% many letters but not all). +% +% When the |mathxmp| loading option is specified, many more symbols become available, +% using `rebinding' macros. These are necessary, as the macros for mathematical symbols +% are generally \emph{not} defined as LICRs, but use |\mathchar|. Thus new LICRs are needed, +% and existing names bound to these. +%\begin{decl}[] +% |\LIIXUmapmathaccents| using `combining' characters from Unicode ranges at |Ux0300|, |Ux1DC0|, |Ux20D0|\\ +% |\LIIXUmapisomathgreek| using |Ux0391|--|Ux03F8| for greek symbols\\ +% |\LIIXUmapmatharrowsA| supporting symbols in the |Ux2190|--|Ux21FF| block\\ +% |\LIIXUmapmathoperatorsA| supporting symbols in the |Ux2200|--|Ux227F| block\\ +% |\LIIXUmapmathoperatorsB| supporting symbols in the |Ux2280|--|Ux22FF| block\\ +% |\LIIXUmapmiscmathsymbolsA| supporting some symbols in the |Ux27C0|--|Ux27EF| range\\ +% |\LIIXUmapsupparrowsA| supporting some symbols in the |Ux27F0|--|Ux27FF| block\\ +% |\LIIXUmapsupparrowsB| supporting some symbols in the |Ux2900|-Б─⌠|Ux297F| block\\ +% |\LIIXUmapmiscmathsymbolsB| supporting symbols in the |Ux2980|--|Ux29FF| block\\ +% |\LIIXUmapsuppmathoperators| supporting symbols in the |Ux2A00|--|Ux2AFF| block\\ +% |\LIIXUmapunimathgreek| using |Ux1D6E2|--|Ux1D71B| for greek symbols\\ +% |\LIIXUmapmathalphabets| allows access to symbols in the |Ux1D400|--|Ux1D755| block +%\end{decl} +% +% The `parser' macro idea can extends to handle a large class of mathematical expressions. +%\begin{decl}[] +% |\let\(\textinlinemath|\\ +% |\DeclareTextCommand{\textinlinemath}{L8U}{\liixu@getinlinemath}|\\ +% |\def\liixu@getinlinemath#1\){\space\textmathnormalstring{#1}\space}|\\ +% |\DeclareTextCommand{\textmathnormalstring}{L8U}[1]{\textmathnormal@ii#1\@empty\@empty}|\\ +% |\textmathnormal@ii #1#2\@empty -> ... | coding to test what is in |#2|\\ +% | ... \textmathnormal{#1}\@empty | \quad if |#2| is |\@empty|\\ +% | ... \textmathnormal{#1}\textmathnormal@i #2\@empty | \quad if |#2| has more tokens\\ +% |\let\[\textdisplaymath| defined similarly to call |\textmathnormalstring| +%\end{decl} +% This allows |\textmathnormal| to test each token, in particular mapping letters A--Za--z +% into the Unicode range |Ux1D44E|--|Ux1D467| (except for $h$). +% Mathematical styles, such as |\mathrm|, |\mathbf|, |\mathbb| etc. can now be handled +% using declarations such as: +%\begin{decl}[] +% |\Dec...positeCommand{\textmathnormal}{L8U}{\mathrm}{\liixu@mathreorder\textmathrmstring}|\\ +% |\Dec...positeCommand{\textmathnormal}{L8U}{\mathbf}{\liixu@mathreorder\textmathbfstring}|\\ +%\end{decl} +% where |\liixu@mathreorder| uses some \TeX\ pattern-matching to allow the |\textmathrmstring| +% parser macro to work on the argument to |\mathrm| before allowing |\textmathnormal| parsing +% to continue afterwards. We refer to this as `nested parsing'. +% +% Similarly `nested parsing' can be used with superscripts and subscripts using |^{...}| and |_{...}| +% and to specify linebreaks, and even super-/subscripts within styles; viz. +%\begin{decl}[] +% |\Declar...CompositeCommand{\textmathnormal}{L8U}{^}{\liixu@mathreorder\textsuperstring}|\\ +% |\DeclareTextCompositeCommand{\textmathnormal}{L8U}{_}{\liixu@mathreorder\textsubstring}|\\ +% |\DeclareTextCompositeCommand{\textmathnormal}{L8U}{\\}{\textLF}|\\ +% |\DeclareTextCompositeCommand{\textmathnormal}{L8U}{\cr}{\textLF}|\\ +% |\DeclareTextCompositeCommand{\textmathrm}{L8U}{^}{\liixu@mathreorder\textsuperstring}|\\ +% |\DeclareTextCompositeCommand{\textmathrm}{L8U}{_}{\liixu@mathreorder\textsubstring}| +%\end{decl} +% Such `nested parsing' seems to be quite robust\footnote{% +% ... so far, barring multi-line aligned environments.}, but a great deal more testing +% is required to uncover cases which may require special handling. +% An ultimate aim is to be able to just copy the \LaTeX\ source for the `Abstract' of a technical +% paper into the |\Subject{...}| field of the |.xmpdata| file, with a large expectation that +% it will `just work', or need only trivial edits to make it so. +% +% +% \subsection[Metadata in a Production Workflow]{Metadata in a Production Workflow}\label{ssec-wflow} +% +%\begin{figure}[htbp] +% \centering +% \includegraphics[scale=.45]{math-assign5.png} +% \caption{Metadata from student assignment papers, using information drawn from a database. +% The start of the \LaTeX\ coding for this example is shown in Figure~\ref{math-wflow}.}\label{wflow-meta} +%\end{figure} +% \noindent +% At Macquarie University, the Mathematics Department produces personalised topmatter +% or coversheets for student assignments and tutorial papers using \LaTeX, incorporating +% information that has been stored in a database. This is done by writing extra definitions +% at the top of a copy of the \LaTeX\ source as prepared by the lecturers. +% For example information analogous to the following +%\begin{decl}[] +% |\def\thestudentname{\utext{Moore} Ross}|\\ +% |\def\thestudentid{55507247}|\\ +% |\def\theunitcode{MATH337}|\\ +% |\def\theoffering{S116}|\\ +% |\def\thetaskname{Assignment 5}|\\ +% |\def\theassignmentnumber{5}|\\ +% |\def\theduedate{09/05 2016}|\\ +% |...| +%\end{decl} +% is prepended to the file shown in Figure~\ref{math-wflow}, +% for each student downloading their personalised assignment paper. +% The \LaTeX\ source makes use of this information, including recording some of it +% within the Metadata. +%\begin{figure}[!htbp] +%\begin{decl}[] +% |\providecommand{\theassignmentnumber}{5}|\\ +% |\providecommand{\assignLecturer}{Dr Ross Moore}|\\ +% |\providecommand{\theunitcode}{MATH337}|\\ +% |\providecommand{\theunitname}{Algebra IIIA}|\\ +% |\providecommand{\theyear}{2016}|\\ +% |...|\\ +% |\def\assigntopics{orbits, stabilisers, groups of matrices}|\\ +% |\providecommand{\pdfxopts}{a-1b}|\\ +% |%% XMP metadata for PDF/A conformance|\\ +% |\begin{filecontents*}{\jobname.xmpdata}|\\ +% |\Title{\theunitcode\ \theoffering: Assignment \theassignmentnumber}|\\ +% |\Author{\assignLecturer}|\\ +% |\Copyright{Macquarie University, Mathematics Department}|\\ +% |\Subject{Assignment \theassignmentnumber, with coversheet personalised for \thestudentname,|\\ +% | id = \thestudentid}|\\ +% |\Keywords{\assigntopics}|\\ +% |\Creator{pdfTeX + pdfx.sty with \pdfxopts\space option}|\\ +% |\pdfxEnableCommands{\def\utext#1{#1,}}|\\ +% |\end{filecontents*}|\\ +% ||\\ +% |\documentclass[a4paper,11pt]{article}|\\ +% |\RequirePackage{assignments}|\\ +% |\usepackage[\pdfxopts]{pdfx}| +%\end{decl} +% \caption{Start of the \LaTeX\ source for an assignment paper, using macro expansion values +% supplied via definitions prepended to this file.}\label{math-wflow} +%\end{figure} +% When preparing such documents \LaTeX's |\providecommand| is used to supply default values, +% not drawn from the database; but when actually used, these are ignored as the required +% information has been supplied using \TeX's |\def| command. +% The resulting metadata is as in Figure~\ref{wflow-meta}, showing also how the information +% is displayed at the top of the PDF file that is produced. +% Notice how a command |\utext| is included to obtain the underlining of the surname within +% the produced PDF. This is modified, using |\pdfxEnableCommands| in the |\jobname.xmpdata| +% file, to just place a comma after the surname in the metadata, as it precedes the given name. +% +%\newpage\noindent +% Another way that jobs can be customised using essentially the same \LaTeX\ source, +% is via the command used to initiate the job. For example the file |sample.tex|, +% accompanying the |pdfx| distribution, can be used to test the loading options to create +% PDFs conforming to the various flavours of PDF/A, PDF/E and PDF/X. +% Consider a shell script containing the following (Unix/Linux) commands. +%\begin{decl}[] +% |pdflatex "\def\pdfxopt{a-2b}\input sample.tex"|\\ +% |pdflatex "\def\pdfxopt{a-2b}\input sample.tex"|\\ +% |mv sample.pdf sample-a2b.pdf|\\ +% ||\\ +% |pdflatex "\def\pdfxopt{a-2u}\input sample.tex"|\\ +% |pdflatex "\def\pdfxopt{a-2u}\input sample.tex"|\\ +% |mv sample.pdf sample-a2u.pdf|\\ +% |...| +%\end{decl} +% With a 3-line block for each flavour, this produces a corresponding PDF +% from the same \LaTeX\ source, named according to each particular variant. +% A default |\providecommand{\pdfxopt}{a-1b}| at the start of |sample.tex| catches the case +% of normal typesetting, doing nothing when |\pdfxopt| already has an expansion value. +% +% \goodbreak +% \subsection[Further Developments]{Further Developments}\label{ssec-further} +% +% Prospects for further development of the |pdfx| package are as follows, +% listed not necessarily in order of perceived importance. +% \begin{itemize} +% \item +% Support for the |dvips| driver with Ghostscript as PDF producer; possible since |gs v9.21|. +% \item +% Separate the |L8U| pseudo-encoding support into a separate package. +% \item +% Conformance to multiple PDF standards; e.g. both PDF/A and PDF/E, +% both PDF/A and PDF/X with RGB or CMYK color profile, other combinations. +% \item +% Explore delaying the processing of metadata until |\begin{document}|, +% thereby allowing some fields to be set automatically from other information +% supplied within the document preamble. +% \item +% Support for input using other legacy 8-bit encodings and transliterations. +% \item +% Support for more mathematical environments within the metadata. +% \item +% Support for more PRISM metadata fields, incl. PRISM 3.0~\cite{PRISM}. +% \item +% Explore ways to overcome incompatibilities that may arise with other packages. +% \item +% Full support for PDF/VT; in particular, transparency groups and PDF/VT-2s. +% \item +% Support for more aspects of PDF/UA and `Tagged PDF'. +% \item +% Develop ways to usefully use |L8U| apart from metadata and bookmarks. +% \item +% Support emerging standards based on PDF 2.0~\cite{PDF20}. +% \end{itemize} +% +% +% \section[Bibliography]{Bibliography}% +% {\let\newpage\relax +% \begin{thebibliography}{999} +% +% \bibitem{PDF17}Adobe Systems Inc.; +% {PDF} Reference 1.7, November 2006. +% Also available as \cite{ISO32000}.\\ +% \url{http://www.adobe.com/devnet/pdf/pdf_reference.html}. +% +% \bibitem{XMP-spec}Adobe Systems Inc.; +% XMP Specification, Adding Intelligence to Media. September 2005. +% Also available as ISO 16684-1:2012\,\cite{XMP-ISO}.\\ +% \url{http://www.adobe.com/devnet/xmp/}. +% +% \bibitem{PDFUA1} ANSI\,/\,AIIM\,/\,ISO\,14289-1:2012; +% Document management applications --- Electronic document file format enhancement for accessibility +% --- Part 1: Use of ISO\,32000-1\,(PDF/UA-1); +% Technical Committee ISO/TC\,171/SC\,2 (July 2012). +% \url{http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=54564}.\\ +% Revised as ISO\,14289-1:2014 (December 2014): +% \url{http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=64599}.\\ +% Available from ANSI at \url{https://webstore.ansi.org/Standards/ISO/ISO142892014}. +% +% \bibitem{PDFUABSI} BS,/\,ISO\,14289-1:2014; Document Management Applications. +% Electronic Document File Format Enhancement For Accessibility. Use Of ISO 32000-1 (PDF/UA-1) (British Standard) +% \url{https://webstore.ansi.org/Standards/BSI/BSISO142892014}. +% +% \bibitem{pdfaPilot} Callas Software Gmbh.; +% \texttt{pdfaPilot}, plug-in or desktop software for PDF/A versions. +% \url{https://www.callassoftware.com/en/products/pdfapilot}. +% +% \bibitem{DC} +% Dublin Core Metadata Element Set, Version 1.1, October 2010\\ +% \url{http://dublincore.org/documents/dces/}. +% +% \bibitem{BCP47}IETF; Best Current Practice \#47: Tags for Identifying Languages. +% Incorporates RFC\,5646; obsoletes RFC\,4646. IETF Network Working Group, September 2009. +% \url{https://tools.ietf.org/pdf/bcp47.pdf}. +% +% \bibitem{PDFX}ISO\,15930-1:2001; +% Graphic technology --- Prepress digital data exchange --- Use of PDF --- Part 1: +% Complete exchange using CMYK data (PDF/X-1 and PDF/X-1a). +% Technical Committee ISO/TC\,130 (December 2001). +% \url{http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=29061}. +% +% \bibitem{PDFX3}ISO\,15930-3:2002; +% Graphic technology --- Prepress digital data exchange --- Use of PDF --- Part 3: +% Complete exchange suitable for colour-managed workflows (PDF/X-3). +% Technical Committee ISO/TC\,130 (September 2002). +% \url{http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=34941}. +% +% \bibitem{PDFX1a}ISO\,15930-4:2003; +% Graphic technology --- Prepress digital data exchange --- Use of PDF --- Part 4: +% Complete exchange of CMYK and spot colour printing data using PDF 1.4 (PDF/X-1a). +% Technical Committee ISO/TC\,130 (December 2003). +% \url{http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=39938}. +% +% \bibitem{PDFX3a}ISO\,15930-6:2003; +% Graphic technology --- Prepress digital data exchange --- Use of PDF --- Part 6: +% Complete exchange of printing data suitable for colour-managed workflows using PDF 1.4 (PDF/X-3). +% Technical Committee ISO/TC\,130 (December 2003). +% \url{http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=39940}. +% +% \bibitem{PDFX4}ISO\,15930-7:2010; +% Graphic technology --- Prepress digital data exchange --- Use of PDF --- Part 7: +% Complete exchange of printing data (PDF/X-4) and partial exchange of printing data with external profile reference (PDF/X-4p) using PDF 1.6. +% Technical Committee ISO/TC\,130 (July 2010). +% \url{http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=55843}. +% +% \bibitem{PDFX5}ISO\,15930-8:2010; +% Graphic technology --- Prepress digital data exchange --- Use of PDF --- Part 8: +% Partial exchange of printing data using PDF 1.6 (PDF/X-5). \hfil +% Technical Committee ISO/TC\,130 (July 2010). \hfil +% \url{http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=55844}. +% Revision via Corrigendum: ISO\,15930-8:2010/Cor\,1:2011 (August 2011); +% \url{http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=60210}. +% +% \bibitem{PDFVT}ISO\,16612-2:2010; +% Graphic technology\,---\,Variable data exchange\,---\,Part 2:\hfil +% Using PDF/X-4 \penalty-5000 and PDF/X-5 (PDF/VT-1 and PDF/VT-2). +% Technical Committee ISO/TC\,130 (December 2005). \hfil +% \href{http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=38013}% +% {{\small\tt http://www.iso.org/iso/home/store/catalogue\_tc/catalogue\_detail.htm?\penalty-200csnumber=38013}}. +% +% \bibitem{XMP-ISO}ISO\,16684-1:2012; +% Graphic technology --- Extensible metadata platform (XMP) specification --- Part 1: +% Data model, serialization and core properties. +% Technical Committee ISO/TC\,130 (February 2012). +% \url{http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=57421}. +% +% \bibitem{PDFA}ISO\,19005-1:2005; +% Document Management --- Electronic document file format for long term preservation +% --- Part 1: Use of PDF\,1.4\,(PDF/A-1); +% Technical Committee ISO/TC\,171/SC\,2 (Sept. 2005). +% Revisions via Corrigenda: ISO\,19005-1:2005/Cor\,1:2007 (March 2007); +% ISO\,19005-1:2005/Cor\,2:2011 (Dec. 2011). \\ +% \url{http://www.iso.org/iso/catalogue_detail?csnumber=38920}. +% +% \bibitem{PDFA2}ISO\,19005-2:2011; +% Document Management --- Electronic document file format for long term preservation +% --- Part 2: Use of ISO\,32000-1\,(PDF/A-2); \hfill +% Technical Committee ISO/\penalty-200 TC\,171/SC\,2 (June 2011).\\ +% \url{http://www.iso.org/iso/catalogue_detail?csnumber=50655}. +% +% \bibitem{PDFA3}ISO\,19005-3:2012; +% Document Management --- Electronic document file format for long term preservation +% --- Part 3: Use of ISO\,32000-1 with support for embedded files (PDF/A-3); +% Technical Committee ISO/TC\,171/SC\,2 (October 2012).\\ +% \url{http://www.iso.org/iso/catalogue_detail?csnumber=57229}. +% +% \bibitem{PDFE}ISO\,24517-1:2008; +% Document Management --- Engineering document format using PDF --- Part 1: +% Use of PDF 1.6 (PDF/E-1); +% Technical Committee ISO/TC\,171/SC\,2 (May 2008).\\ +% \url{http://www.iso.org/iso/catalogue_detail?csnumber=42274}. +% +% \bibitem{ISO32000}ISO\,32000-1:2008; +% Document management\,---\,Portable document format\,(PDF\,1.7); +% Technical Committee ISO/TC\,171/SC\,2 (July 2008). +% Also available as \cite{PDF17}.\\ +% \url{http://www.iso.org/iso/catalogue_detail?csnumber=51502}. +% +% \bibitem{PDF20}ISO\,32000-2:2017; +% Document management --- Portable document format --- Part~2: PDF\,2.0; +% Technical Committee ISO/TC\,171/SC\,2 Document file formats, EDMS systems +% and authenticity of information. (July 2017)\\ +% \url{https://www.iso.org/standard/63534.html}. +% +% \bibitem{LC2} F.\,Mittelbach, M.\,Goossens with J.\,Braams, D.\,Carlisle, C.\,Rowley; +% The \LaTeX\ Companion --- 2nd edition. Addison--Wesley (now Pearson Education Inc.), 2004. +% ISBN 0-201-36299-6 (paperback). +% +% \bibitem{TN0009}PDF/A Competence Centre; +% TechNote 0009: XMP Extension Schemas in PDF/A-1. (March 2008) +% \href{https://www.pdfa.org/publication/technical-note-tn-0009-xmp-extension-schemas-in-pdfa-1/}% +% {\small\tt https://www.pdfa.org/publication/technical-note-tn-0009-xmp-extension\penalty-200 -schemas-in-pdfa-1/}. +% +% \bibitem{PDF-UA} +% PDF/UA Technical Implementation Guide: Understanding ISO\,14289-1 (PDF/UA-1). \penalty-200 +% AIIM Global Community of Information Professionals. \hfil +% \href{http://www.aiim.org/Research-and-Publications/standards/committees/PDFUA/Technical-Implementation-Guide}% +% {\small\tt http://www.aiim.org/Re\penalty-200 search-and-Publications/standards/committees/PDFUA/Technical-Implementation\penalty-200 -Guide}. +% +% \bibitem{colorp} N.\,Preining; +% \texttt{colorprofiles} \textemdash\ Collection of free ICC profiles. +% \TeX\ and \LaTeX\ package (by R.\,Moore), distributed with \TeX{}Live. (November 2018)\\ +% \url{https://ctan.org/pkg/colorprofiles}. +% +% \bibitem{PRISM}PRISM; Publishing Requirements for Industry Standard Metadata. +% PRISM Metadata Initiative; Idealliance Working Group. +% \url{http://www.idealliance.org/specifications/prism-metadata-initiative/prism} +% +% \bibitem{pdfx}C.\,V.\,Radhakrishnan, \Thanh, Ross Moore, Peter Selinger; +% Generation of PDF/X- and PDF/A-compliant PDFs with \pdftex --- \texttt{pdfx.sty}. +% TUGboat Vol.\,36, No.\,2; TUG 2015 Conference Proceedings. \TeX\ Users Group, 2015; pp.\,136--142. +% +% \bibitem{veraPDF} veraPDF. Industry Supported PDF/A Validation. +% Software, dual-licensed under the GNU General Public License v3 or later (GPLv3+) +% and Mozilla Public License v2 or later (MPLv2+). \url{https://verapdf.org}. +% Wiki: \url{https://github.com/veraPDF/veraPDF-validation-profiles/wiki} +% +% \bibitem{RDF} World Wide Web Consortium (W3C); +% Resource Description Format: RDF 1.1 XML Syntax. W3C Recommendation. (February 2014) +% \url{https://www.w3.org/TR/rdf-syntax-grammar/}. +% +% \bibitem{wikiPDF}Wikipedia; +% PDF/A: \url{https://en.wikipedia.org/wiki/PDF/A}\newline +% PDF/E: \url{https://en.wikipedia.org/wiki/PDF/E}\newline +% PDF/VT: \url{https://en.wikipedia.org/wiki/PDF/VT}\newline +% PDF/UA: \url{https://en.wikipedia.org/wiki/PDF/UA}\newline +% PDF/X: \url{https://en.wikipedia.org/wiki/PDF/X} +% +% \end{thebibliography} +% }\goodbreak +% \section[Implementation]{Implementation} +% +% \iffalse +%<*package> +% \fi \hfuzz=2.5pt% +% \begin{macrocode} +\@ifpackageloaded{pdfxmult}{% + \PackageError{pdfx}% + {^^JThis package may not be used in conjunction with the \space + pdfxmult \space package}% + {Type \space x <return> \space to exit; or just \space <return> \space + to continue without this package.}% + \expandafter\let\csname opt@pdfx.sty\endcsname\@empty\endinput +}{}% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{pdfx} + [2019/02/27 v1.6.3 PDF/X and PDF/A support (CVR/HTH/RRM/PS)] + +\newif\ifpdfx@noBOM \pdfx@noBOMfalse % use a BOM in the XMP packet +\newif\ifpdfx@x \pdfx@xfalse % PDF/X mode +\newif\ifpdfx@e \pdfx@efalse % PDF/E mode; not fully implemented yet +\newif\ifpdfx@ua\pdfx@uafalse % PDF/UA mode; not fully implemented yet +\newif\ifpdfx@vt \pdfx@vtfalse % PDF/VT mode, extension of PDF/X +\newif\ifno@iccprofile % used with PDF/X-4p and PDF/X-5pg +\newif\ifpdfx@noerr % error messages become just warnings +\newif\ifpdfx@omitcharset % used with pdfomitcharset primitive + +\DeclareOption{noerr}{\pdfx@noerrtrue} + +%% Not all combinations of the following parameters are meaningful. +\def\xmp@Part{1} % PDF/A part: 1, 2, or 3 +\def\xmp@Conformance{B} % Conformance level: A, B, or U +\def\xmp@ReleaseDate{2005} % 2001 for PDF/X-1, 2005 for PDF/A-1, + % 2010 for PDF/A-2, 2012 for PDF/A-3. + +\newcount\pdfx@minorversion +\expandafter\ifx\csname pdfminorversion\endcsname\relax +\else + \global\pdfx@minorversion=\the\pdfminorversion +\fi + +\def\pdfx@ErrorWarning#1#2#3#4{% + \ifpdfx@noerr \PackageWarning{pdfx}{#1.^^J #2#3.^^J}% + \else \PackageError{pdfx}{#1}{#2#4.^^J + Use option 'noerr' to avoid this message.^^J}% + \fi} + +\def\pdfx@Xvn@message{% + \pdfx@ErrorWarning{PDF/X-5n has no default profile}% + {Provide your own}{; continuing to build a non-valid document}% + {, else continue to build a non-valid document}% +} + +%% support pdfomitcharset primitive, added to pdfTeX in 2019 +\DeclareOption{nocharset}{\pdfx@omitcharsettrue} +\DeclareOption{usecharset}{\pdfx@omitcharsetfalse} + +%% PDF/A options +%% default is to create PDF/A-1b +%% options can change this for PDF/X or higher levels of PDF/A +\DeclareOption{a-1a}{\global\pdfx@xfalse\def\xmp@Part{1}% + \def\xmp@Conformance{A}\def\xmp@ReleaseDate{2005}% + \pdfx@omitcharsetfalse} +\DeclareOption{a-1b}{\global\pdfx@xfalse\def\xmp@Part{1}% + \def\xmp@Conformance{B}\def\xmp@ReleaseDate{2005}% + \pdfx@omitcharsetfalse} +\DeclareOption{a-2a}{\global\pdfx@xfalse\def\xmp@Part{2}% + \def\xmp@Conformance{A}\def\xmp@ReleaseDate{2010}% + \pdfx@omitcharsettrue} +\DeclareOption{a-2b}{\global\pdfx@xfalse\def\xmp@Part{2}% + \def\xmp@Conformance{B}\def\xmp@ReleaseDate{2010}% + \pdfx@omitcharsettrue} +\DeclareOption{a-2u}{\global\pdfx@xfalse\def\xmp@Part{2}% + \def\xmp@Conformance{U}\def\xmp@ReleaseDate{2010}% + \pdfx@omitcharsettrue} +\DeclareOption{a-3a}{\global\pdfx@xfalse\def\xmp@Part{3}% + \def\xmp@Conformance{A}\def\xmp@ReleaseDate{2012}% + \pdfx@omitcharsettrue} +\DeclareOption{a-3b}{\global\pdfx@xfalse\def\xmp@Part{3}% + \def\xmp@Conformance{B}\def\xmp@ReleaseDate{2012}% + \pdfx@omitcharsettrue} +\DeclareOption{a-3u}{\global\pdfx@xfalse\def\xmp@Part{3}% + \def\xmp@Conformance{U}\def\xmp@ReleaseDate{2012}% + \pdfx@omitcharsettrue} +%% +%% PDF/X options +%% comments added, using +%% https://www.eci.org/_media/downloads/pdfx/pdfx_faq_english_nov05.pdf +%% https://en.wikipedia.org/wiki/PDF/X#List_of_the_PDF.2FX_standards +%% +\DeclareOption{x-1}{\global\pdfx@xtrue\def\xmp@Part{1}% obsolete + \def\xmp@Conformance{a}\def\xmp@ReleaseDate{1999}% CMYK only + \global\pdfx@minorversion=2\relax + \pdfx@ErrorWarning{PDF/X-1:1999 is no longer an accepted standard}% + {Use option x-1a1 or x-1a3 }{; continuing to build a non-valid document}% + {, else continue to build a non-valid document.}% + }% effectively same as x-1a1 +\DeclareOption{x-1a}{\global\pdfx@xtrue\def\xmp@Part{1}% CMYK only + \def\xmp@Conformance{a}\def\xmp@ReleaseDate{2003}% + \global\pdfx@minorversion=3 }% same as x-1a3 +\DeclareOption{x-1a1}{\global\pdfx@xtrue\def\xmp@Part{1}% + \def\xmp@Conformance{a}\def\xmp@ReleaseDate{2001}% ISO 15930-1:2001 + \global\pdfx@minorversion=3 } +\DeclareOption{x-1a3}{\global\pdfx@xtrue\def\xmp@Part{1}% + \def\xmp@Conformance{a}\def\xmp@ReleaseDate{2003}% ISO 15930-4:2003 + \global\pdfx@minorversion=3 } +\DeclareOption{x-2}{\global\pdfx@xtrue\def\xmp@Part{2}% XMP Metadata +%% \def\xmp@Conformance{}\def\xmp@ReleaseDate{2002}% ISO 15930-2:2003 + \def\xmp@Conformance{}\def\xmp@ReleaseDate{2003}% ISO 15930-5, withdrawn 2011 + \global\pdfx@minorversion=4\relax + \pdfx@ErrorWarning{PDF/X-2:2003 was never published as a standard}% + {Use option x-1a or x-3 }{; continuing to build a non-valid document}% + {, else continue to build a non-valid document}% + }% external OPI workflow, i.e. multiple files involved +\DeclareOption{x-3}{\global\pdfx@xtrue\def\xmp@Part{3}% RGB allowed, but rare! + \def\xmp@Conformance{}\def\xmp@ReleaseDate{2003}% + \global\pdfx@minorversion=4 }% same as x-303 +\DeclareOption{x-302}{\global\pdfx@xtrue\def\xmp@Part{3}% + \def\xmp@Conformance{}\def\xmp@ReleaseDate{2002}% ISO 15930-3:2002 + \global\pdfx@minorversion=3 } +\DeclareOption{x-303}{\global\pdfx@xtrue\def\xmp@Part{3}% + \def\xmp@Conformance{}\def\xmp@ReleaseDate{2003}% ISO 15930-6:2003 + \global\pdfx@minorversion=4 } +%%% Later versions, yet to be fully implemented +\DeclareOption{x-4}{\global\pdfx@xtrue\def\xmp@Part{4}% + \def\xmp@Conformance{}\def\xmp@ReleaseDate{2010}% ISO 15930-7:2010 + \global\pdfx@minorversion=6 }% same as x-410 +\DeclareOption{x-4p}{\global\pdfx@xtrue\global\no@iccprofiletrue + \def\xmp@Part{4}\def\xmp@Conformance{p}\def\xmp@ReleaseDate{2010}% + \global\pdfx@minorversion=6 }% same as x-4p10 +\DeclareOption{x-408}{\global\pdfx@xtrue\def\xmp@Part{4}% + \def\xmp@Conformance{}\def\xmp@ReleaseDate{2008}% ISO 15930-7:2008 + \global\pdfx@minorversion=6 } +\DeclareOption{x-410}{\global\pdfx@xtrue\def\xmp@Part{4}% + \def\xmp@Conformance{}\def\xmp@ReleaseDate{2010}% ISO 15930-7:2010 + \global\pdfx@minorversion=6 } +\DeclareOption{x-4p08}{\global\pdfx@xtrue\global\no@iccprofiletrue + \def\xmp@Part{4}\def\xmp@Conformance{p}\def\xmp@ReleaseDate{2008}% + \global\pdfx@minorversion=6 }% ISO 15930-7:2010 +\DeclareOption{x-4p10}{\global\pdfx@xtrue\global\no@iccprofiletrue + \def\xmp@Part{4}\def\xmp@Conformance{p}\def\xmp@ReleaseDate{2010}% + \global\pdfx@minorversion=6 }% ISO 15930-7:2010 +\DeclareOption{x-5}{\global\pdfx@xtrue\def\xmp@Part{5}% + \def\xmp@Conformance{g}\def\xmp@ReleaseDate{2008}% + \global\pdfx@minorversion=6 }% ISO 15930-8:2010 +\DeclareOption{x-5g}{\global\pdfx@xtrue\def\xmp@Part{5}% + \def\xmp@Conformance{g}\def\xmp@ReleaseDate{2008}% + \global\pdfx@minorversion=6 }% ISO 15930-8:2010 +\DeclareOption{x-5n}{\global\pdfx@xtrue %\global\no@iccprofiletrue + \def\xmp@Part{5}\def\xmp@Conformance{n}\def\xmp@ReleaseDate{2010}% + \global\pdfx@minorversion=6 \pdfx@Xvn@message}% ISO 15930-8:2010 +\DeclareOption{x-5pg}{\global\pdfx@xtrue\global\no@iccprofiletrue + \def\xmp@Part{5}\def\xmp@Conformance{pg}\def\xmp@ReleaseDate{2010}% + \global\pdfx@minorversion=6 }% ISO 15930-8:2010 +\DeclareOption{x-508}{\global\pdfx@xtrue\def\xmp@Part{5}% + \def\xmp@Conformance{g}\def\xmp@ReleaseDate{2008}% + \global\pdfx@minorversion=6 }% ISO 15930-8:2008 +\DeclareOption{x-5g08}{\global\pdfx@xtrue\def\xmp@Part{5}% + \def\xmp@Conformance{g}\def\xmp@ReleaseDate{2008}% + \global\pdfx@minorversion=6 }% ISO 15930-8:2008 +\DeclareOption{x-5n08}{\global\pdfx@xtrue %\global\no@iccprofiletrue + \def\xmp@Part{5}\def\xmp@Conformance{n}\def\xmp@ReleaseDate{2008}% + \global\pdfx@minorversion=6 \pdfx@Xvn@message}% ISO 15930-8:2008 +\DeclareOption{x-5pg08}{\global\pdfx@xtrue\global\no@iccprofiletrue + \def\xmp@Part{5}\def\xmp@Conformance{pg}\def\xmp@ReleaseDate{2008}% + \global\pdfx@minorversion=6 }% ISO 15930-8:2008 +\DeclareOption{x-510}{\global\pdfx@xtrue\def\xmp@Part{5}% + \def\xmp@Conformance{g}\def\xmp@ReleaseDate{2010}% + \global\pdfx@minorversion=6 }% ISO 15930-8:2010 +\DeclareOption{x-5g10}{\global\pdfx@xtrue\def\xmp@Part{5}% + \def\xmp@Conformance{g}\def\xmp@ReleaseDate{2010}% + \global\pdfx@minorversion=6 }% ISO 15930-8:2010 +\DeclareOption{x-5n10}{\global\pdfx@xtrue %\global\no@iccprofiletrue + \def\xmp@Part{5}\def\xmp@Conformance{n}\def\xmp@ReleaseDate{2010}% + \global\pdfx@minorversion=6 \pdfx@Xvn@message}% ISO 15930-8:2010 +\DeclareOption{x-5pg10}{\global\pdfx@xtrue\global\no@iccprofiletrue + \def\xmp@Part{5}\def\xmp@Conformance{pg}\def\xmp@ReleaseDate{2010}% + \global\pdfx@minorversion=6 }% ISO 15930-8:2010 +%% +%% PDF/E options +%% +\DeclareOption{e}{\global\pdfx@xfalse\global\pdfx@etrue + \def\xmp@Part{1}\def\xmp@Conformance{}\def\xmp@ReleaseDate{2008}% + \gdef\thepdfminorversion{6}% same as e-1 + } +\DeclareOption{e-1}{\global\pdfx@xfalse\global\pdfx@etrue + \def\xmp@Part{1}\def\xmp@Conformance{}\def\xmp@ReleaseDate{2008}% + \gdef\thepdfminorversion{6}% ISO 24517-1:2008 + } +%% PDF/UA options +%% +\let\xmp@PDFUA\@empty +\DeclareOption{ua}{\global\pdfx@uatrue % ISO 14289-1:2012, 2014 + \def\xmp@UAlevel{1}\let\xmp@PDFUA\relax}% same as ua-1 +\DeclareOption{ua-1}{\global\pdfx@uatrue % ISO 14289-1:2012, 2014 + \def\xmp@UAlevel{1}\let\xmp@PDFUA\relax} +%% +%% PDF/VT options +%% +\DeclareOption{vt-1}{\global\pdfx@xtrue\global\pdfx@vttrue + \def\xmp@Part{4}\def\xmp@vtPart{1}\def\xmp@Conformance{}% + \def\xmp@vtConformance{}\def\xmp@ReleaseDate{2010}% + \gdef\xmpMM@VersionID{1}% + \global\pdfx@minorversion=6 } +\DeclareOption{vt-2}{\global\pdfx@xtrue\global\pdfx@vttrue + \global\no@iccprofiletrue \gdef\xmpMM@VersionID{1}% + \def\xmp@Part{5}\def\xmp@vtPart{2}\def\xmp@Conformance{pg}% + \def\xmp@vtConformance{}\def\xmp@ReleaseDate{2010}% + \global\pdfx@minorversion=6 } +\DeclareOption{vt-2s}{\global\pdfx@xtrue\global\pdfx@vttrue + \global\no@iccprofiletrue \gdef\xmpMM@VersionID{1}% + \def\xmp@Part{5}\def\xmp@vtPart{2}\def\xmp@Conformance{pg}% + \def\xmp@vtConformance{s}\def\xmp@ReleaseDate{2010}% + \global\pdfx@minorversion=6 } + +%% options to alter PDF minor version, in case needed in special circumstances +\DeclareOption{pdf12}{\global\pdfx@minorversion=2 }% 1999 +\DeclareOption{pdf13}{\global\pdfx@minorversion=3 }% 2001 Acrobat 4 (ISBN 0-201-61588-6) +\DeclareOption{pdf14}{\global\pdfx@minorversion=4 }% 2003 Acrobat 5 (ISBN 0-201-75839-3) +\DeclareOption{pdf15}{\global\pdfx@minorversion=5 }% 2005 Acrobat 6 +\DeclareOption{pdf16}{\global\pdfx@minorversion=6 }% 2006 Acrobat 7 (ISBN 0-321-30474-8) +\DeclareOption{pdf17}{\global\pdfx@minorversion=7 }% 2008 ISO 32000-1:2008 + +%% inhibits writing the XMP byte-order marker +\DeclareOption{noBOM}{\pdfx@noBOMtrue} +\DeclareOption{useBOM}{\pdfx@noBOMfalse} + +%% options for language character macros in XMP metadata +\newif\ifcyrxmp +\newif\ifcyrKOIxmp +\newif\ifgrkxmp +\newif\ifgrkLGRxmp +\newif\ifhebxmp +\newif\ifhebHEBxmp +\newif\ifarbxmp +\newif\ifarmxmp +\newif\ifarmSCIxmp +\newif\ifdevxmp +\newif\ifvnmxmp +\newif\iflatEXTxmp +\newif\iflatLATxmp +\newif\ifipaxmp +\newif\ifmathxmp + +\DeclareOption{latxmp}{\global\latEXTxmptrue} +\DeclareOption{LATxmp}{\global\latLATxmptrue\global\latEXTxmptrue} +\DeclareOption{cyrxmp}{\global\cyrxmptrue} +\DeclareOption{KOIxmp}{\global\cyrKOIxmptrue\global\cyrxmptrue} +\DeclareOption{grkxmp}{\global\grkxmptrue} +\DeclareOption{LGRxmp}{\global\grkLGRxmptrue\global\grkxmptrue} +\DeclareOption{hebxmp}{\global\hebxmptrue} +\DeclareOption{HEBxmp}{\global\hebHEBxmptrue\global\hebxmptrue} +\DeclareOption{arbxmp}{\global\arbxmptrue} +\DeclareOption{armxmp}{\global\armxmptrue} +\DeclareOption{AR8xmp}{\global\armSCIxmptrue\global\armxmptrue} +\DeclareOption{devxmp}{\global\devxmptrue} +\DeclareOption{vnmxmp}{\global\vnmxmptrue} +\DeclareOption{ipaxmp}{\global\ipaxmptrue\global\latEXTxmptrue} +\DeclareOption{mathxmp}{\global\mathxmptrue\global\grkxmptrue} + +%% all the above +\DeclareOption{allxmp}{% + \global\cyrxmptrue + \global\cyrKOIxmptrue + \global\grkxmptrue + \global\grkLGRxmptrue + \global\hebxmptrue + \global\hebHEBxmptrue + \global\arbxmptrue + \global\armxmptrue + \global\armSCIxmptrue + \global\devxmptrue + \global\vnmxmptrue + \global\latEXTxmptrue + \global\latLATxmptrue + \global\vnmxmptrue + \global\ipaxmptrue + \global\mathxmptrue + \global\let\pdfx@useactivespacestrue\pdfx@useactivespacesfalse +} + +\newif\ifpdfx@useactivespaces + +\ExecuteOptions{noBOM,a-1b} +\ProcessOptions + +\ifpdfx@ua\ifpdfx@x\else + \expandafter\if\xmp@Conformance A\else + \pdfx@ErrorWarning{PDF/UA requires 'Tagged PDF' for any structure.^^J + Then PDF/A Conformance must be 'a'}% + {Use option 'a-\xmp@Part a'}% + {; continuing with a likely invalid document}% + {, or continue for a likely invalid document}% +%%% \gdef\xmp@Conformance{A}% do we want this? +\fi\fi\fi + +\expandafter\ifx\csname pdflastobj\endcsname\relax +\else + \ifnum\pdflastobj >\z@ % pdftex has already written objects + \ifnum\pdfx@minorversion=\pdfminorversion\else + \PackageError{pdfx}% + {^^J(pdfx) Cannot change the \string\pdfminorversion^^J% + (pdfx) PDF version remains at 1.\the\pdfminorversion.^^J% + (pdfx) Use \string\pdfminorversion=\the\pdfx@minorversion\space + before \string\documentclass}% + {(pdfx) Another package or document-class has written objects into the PDF.^^J% + (pdfx) Hit return to continue with PDF version 1.\the\pdfminorversion.% + }% + \global\pdfx@minorversion=\the\pdfminorversion + \fi + \else + \global\pdfminorversion\pdfx@minorversion + \fi +\fi + +\expandafter\ifx\csname thepdfminorversion\endcsname\relax + \expandafter\ifx\csname pdfminorversion\endcsname\relax + \else + \xdef\thepdfminorversion{\the\pdfminorversion} +\fi\fi + +\expandafter\ifx\csname pdfminorversion\endcsname\relax + \gdef\thepdfminorversion{4}% assumed with XeTeX + \def\pdf@minorversion@xetex=#1{\gdef\thepdfminorversion{#1}}% + \let\pdfminorversion\pdf@minorversion@xetex +\else + \ifnum\pdfminorversion < 4\relax + \ifpdfx@x + % more testing needed with PDF/X + \else + \pdfminorversion=4\relax % assumed for PDF/A ; options may change this for PDF/X + \gdef\thepdfminorversion{4}% + \fi + \else + \ifnum\pdfminorversion<\thepdfminorversion\relax + \global\pdfminorversion=\thepdfminorversion\relax + \fi + \fi +\fi +\expandafter\ifx\csname pdfresetpageorigin\endcsname\relax\else + \pdfresetpageorigin=0 +\fi + +\expandafter\ifx\csname pdfomitcharset\endcsname\relax\else + \ifpdfx@omitcharset + \pdfomitcharset = 1 % + %% do not create /Charset listings of font glyphs; + %% optional for PDF/A-2,3 and PDF 2.x + \else + \pdfomitcharset = 0 % + %% create the /Charset listings of font glyphs, required with PDF/A-1 + \fi +\fi + +\newif\ifpdfx@nopdfinfo +\ifmathxmp\pdfx@nopdfinfotrue +\else + \iflatLATxmp\pdfx@nopdfinfotrue +\else + \ifgrkLGRxmp\pdfx@nopdfinfotrue +\else + \ifhebHEBxmp\pdfx@nopdfinfotrue +\else + \ifcyrKOIxmp\pdfx@nopdfinfotrue +\else + \ifarmSCIxmp\pdfx@nopdfinfotrue +\fi\fi\fi\fi\fi\fi + +\iflatLATxmp\pdfx@useactivespacestrue\fi +\ifgrkLGRxmp\pdfx@useactivespacestrue\fi +\ifhebHEBxmp\pdfx@useactivespacestrue\fi +\ifcyrKOIxmp\pdfx@useactivespacestrue\fi +\ifarmSCIxmp\pdfx@useactivespacestrue\fi + +\newif\ifpdfx@transliterated +\ifgrkLGRxmp\pdfx@transliteratedtrue\fi +\ifhebHEBxmp\pdfx@transliteratedtrue\fi +\ifarmSCIxmp\pdfx@transliteratedtrue\fi + +\RequirePackage{iftex} +\RequirePackage{ifpdf} +%% Support for pdfTeX primitives when using XeTeX: +\RequirePackage{ifxetex} +\ifxetex + \def\pdfx@pages@xetex#1{\special{pdf:put @pages <<#1>>}} + \def\pdfx@pageattr@xetex#1{\special{pdf:put @thispage <<#1>>}} + \def\pdfx@docinfo@xetex#1{\special{pdf:put @docinfo <<#1>>}} + \def\pdfx@catalog@xetex#1{\special{pdf:put @catalog <<#1>>}} + \def\pdfx@mapline@xetex#1{\special{pdf:mapline #1}}%% does this work ?? +%% \def\pdfx@mapline@xetex#1{} + \def\pdf@compress@xetex=#1{} +%% + \let\pdfpagesattr\pdfx@pages@xetex + \let\pdfinfo\pdfx@docinfo@xetex + \let\pdfcatalog\pdfx@catalog@xetex + \let\pdfmapline\pdfx@mapline@xetex + \let\pdfcompresslevel\pdf@compress@xetex + \let\pdfobjcompresslevel\pdf@compress@xetex +\fi + +%%\newif\ifpdfx@pdfmark % control future support for dvips + +\RequirePackage{everyshi} +\RequirePackage{ifluatex} +\ifluatex + \IfFileExists{luatex85.sty}{% 2016+ + \RequirePackage{luatex85}% + \edef\pdfcreationdate{\pdfcreationdate}% + }{% earlier versions + }% + \RequirePackage{pdftexcmds}% + \let\pdfx@mdfivesum\pdf@mdfivesum + \let\pdfescapestring\pdf@escapestring +\else + \ifxetex + \expandafter\ifx\csname mdfivesum\endcsname\relax + % too early a version of XeTeX + \let\pdfx@mdfivesum\relax + \else + % since mid-2015 + \let\pdfx@mdfivesum\mdfivesum + \fi + \else + \let\pdfx@mdfivesum\pdfmdfivesum + \fi +\fi +\def\pdfx@encodingfile{l8u-penc.def} + +\expandafter\ifx\csname pdftexbanner\endcsname\relax + \expandafter\ifx\csname luatexbanner\endcsname\relax + \else % luatex85 + \let\pdftexbanner\luatexbanner + \fi +\else % pdfTeX, but which version ??? + {\endlinechar=-1 + \everyeof{\noexpand}% + \xdef\pdfx@bannerstring{\expandafter\scantokens\expandafter{\pdftexbanner}} + }% + \def\pdfx@testbannerstr{% + This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014/dev) + kpathsea version 6.2.0dev}% + \ifx\pdfx@bannerstring\pdfx@testbannerstr + \typeout{This version of pdfTeX cannot write out upper-range character bytes, + 128-255.}% + \typeout{Any UTF-8 Unicode characters in the Metadata will not be written + correctly.}% + \typeout{Please update to a more stable version of pdfTeX.^^J}% + \fi +\fi + +%% How to support XeTeX here ? +\ifpdfx@x + \pdfobjcompresslevel=0 \relax + \expandafter\ifx\csname pdfinterwordspaceoff\endcsname\relax\else + \pdfinterwordspaceoff + \let\pdfinterwordspaceon\pdfinterwordspaceoff + \let\pdfinterwordspace\relax + \fi + \expandafter\ifx\csname pdfgeninterwordspace\endcsname\relax\else + \pdfgeninterwordspace=0 \relax + \fi + \begingroup + \dimen0=0.996264009963\paperwidth\relax + \edef\pdfx@mwidth{\strip@pt\dimen0}% + \advance\dimen0 -25\p@ + \edef\pdfx@twidth{\strip@pt\dimen0}% + \dimen0=0.996264009963\paperheight\relax + \edef\pdfx@mheight{\strip@pt\dimen0}% + \advance\dimen0 -20\p@ + \edef\pdfx@theight{\strip@pt\dimen0}% + \ifxetex + \xdef\pdfx@everypage@xetex{% + /MediaBox[0 0 \pdfx@mwidth\space \pdfx@mheight]^^J + /BleedBox[0 0 \pdfx@mwidth\space \pdfx@mheight]^^J + /CropBox[0 0 \pdfx@mwidth\space \pdfx@mheight]^^J + /TrimBox[25 20 \pdfx@twidth\space \pdfx@theight]% + }% + \fi + \edef\next{\endgroup\pdfpagesattr{% + /MediaBox[0 0 \pdfx@mwidth\space \pdfx@mheight]^^J +%% /ArtBox[0 0 \pdfx@mwidth\space \pdfx@mheight]^^J + /BleedBox[0 0 \pdfx@mwidth\space \pdfx@mheight]^^J + /CropBox[0 0 \pdfx@mwidth\space \pdfx@mheight]^^J + /TrimBox[25 20 \pdfx@twidth\space \pdfx@theight]} + }\next + \ifxetex + \AtBeginDvi{% + \expandafter\immediate\pdfx@pageattr@xetex{\pdfx@everypage@xetex}}% + \EveryShipout{% + \expandafter\immediate\pdfx@pageattr@xetex{\pdfx@everypage@xetex}}% + \else + \EveryShipout{% + \expandafter\ifx\expandafter\relax\the\pdfpageattr\relax + \immediate\pdfpageattr\expandafter{\the\pdfpagesattr}% + \fi }% + \fi +\else +%% PDF/A-1b doesn't allow object compression + \ifnum\xmp@ReleaseDate=2005\relax + \expandafter\ifx\csname pdfobjcompresslevel\endcsname\relax + \else + \pdfobjcompresslevel=0\relax + \fi \fi +\fi +\ifxetex +%% How to support XeTeX here ? +\else + \ifnum\thepdfminorversion >3 \relax + \expandafter\ifx\csname pdfsuppresswarningdupmap\endcsname\relax + \expandafter\ifx\csname pdfmapline\endcsname\relax\else + \pdfmapline{+dummy-space <dummy-space.pfb} + \fi + \else + \advance\pdfsuppresswarningdupmap 1 + \pdfmapline{+dummy-space <dummy-space.pfb} + \advance\pdfsuppresswarningdupmap -1 + \fi + \expandafter\ifx\csname pdfgeninterwordspace\endcsname\relax\else + \pdfgeninterwordspace=1 \relax + \fi + \fi +\fi + +\ifluatex\else\ifxetex\else + \@ifpackageloaded{inputenc}{% + }{% + \RequirePackage{inputenc} + % allow this to be loaded again cleanly + \expandafter\let\csname ver@inputenc.sty\endcsname\relax + } +\fi\fi + +%% pseudo-declare the L8U encoding +\expandafter\let\csname L8U-cmd\expandafter\endcsname\csname OT1-cmd\endcsname +\@namedef{T@L8U}{}% +\@namedef{D@L8U}{}% +\@namedef{M@L8U}{}% + +%% adjust to LaTeX's 2018 change to the default encoding +\expandafter\ifx\csname inputencodingname\endcsname\relax +\else + \def\pdfx@restoreencoding#1{% + \@tempcnta=128 + \loop + \catcode\@tempcnta=13 + \advance\@tempcnta\@ne + \ifnum\@tempcnta<256 + \repeat + \inputencoding{#1}% + \let\LastDeclaredEncoding\pdfx@LastDeclaredEncoding + \let\DeclareFontEncoding@\pdfx@DeclareFontEncoding@ + \let\DeclareUnicodeCharacter\pdfx@DeclareUnicodeCharacter + }% + \AtEndOfPackage{\pdfx@restoreencoding\pdfx@inputencodingname}% + \let\pdfx@inputencodingname\inputencodingname + \global\let\pdfx@DeclareUnicodeCharacter\DeclareUnicodeCharacter + \global\let\pdfx@DeclareFontEncoding@\DeclareFontEncoding@ + \UseRawInputEncoding +\fi +\InputIfFileExists{\pdfx@encodingfile}{}{} +\expandafter\ifx\csname pdfx@inputencodingname\endcsname\relax +\else + \let\inputencodingname\pdfx@inputencodingname +%% \global\let\DeclareUnicodeCharacter\pdfx@DeclareUnicodeCharacter +%% \global\let\DeclareFontEncoding@\DeclareFontEncoding@saved + \global\let\pdfx@LastDeclaredEncoding\LastDeclaredEncoding + \expandafter\inputencoding\expandafter{\inputencodingname}% +\fi + +%%---------------------------------------------------------------------- +%% Macros for reading XMP data with special catcodes. Usage: +%% +%% \xmp@parse{continuation}{data} +%% +%% The effect is to read the data with special catcodes: '<', '>', and +%% '&' are "active", and '^', '_', '#', '$', '~' are "other". The data +%% is then bound to the locally scoped name \@this, and the +%% continuation is called. +\def\xmp@parse#1{% + \begingroup + \catcode`\<=13\catcode`\>=13\catcode`\&=13\catcode`\^=12 + \catcode`\_=12\catcode`\#=12\catcode`\$=12\catcode`\~=12 + \ifpdfx@useactivespaces\obeyspaces\fi % capture spaces as active characters + \xmp@doparse{#1}% +} +\def\afterxmp@parse{}% methods may change this +\def\xmp@doparse#1#2{% + \def\@this{#2}#1 + \endgroup + % do any post-processing + \afterxmp@parse + \def\afterxmp@parse{}% +} + +%%---------------------------------------------------------------------- +%% Local commands. They are only brought into scope during the reading +%% of xmpdata. Some fields can have a 'xml:lang' attribute; others must have. +%% LANG values as in: (BCP 47) https://tools.ietf.org/html/rfc5646#appendix-A +%% +\def\xmp@lang@Default{x-default} +\let\xmp@lang@Title\xmp@lang@Default +\let\xmp@lang@Author\xmp@lang@Default +\let\xmp@lang@Keywords\xmp@lang@Default +\let\xmp@lang@Subject\xmp@lang@Default +%%\def\xmp@lang@CreatorTool{\xmp@lang@Default} +\let\xmp@lang@Producer\xmp@lang@Default +%%\def\xmp@lang@Volume{\xmp@lang@Default} +%%\def\xmp@lang@Issue{\xmp@lang@Default} +\let\xmp@lang@Copyright\xmp@lang@Default +\let\xmp@lang@PublicationType\xmp@lang@Default +\let\xmp@lang@Publisher\xmp@lang@Default +\let\xmp@lang@Coverage\xmp@lang@Default +\let\xmp@lang@Contributor\xmp@lang@Default +\let\xmp@lang@Relation\xmp@lang@Default +%%% PRISM fields +\let\xmp@lang@CoverDisplayDate\xmp@lang@Default +\let\xmp@lang@JournalTitle\xmp@lang@Default +%%\def\xmp@lang@JournalNumber{\xmp@lang@Default} +%%% xmp: & xmpRights: fields +\let\xmp@lang@Advisory\xmp@lang@Default +\let\xmp@lang@Identifier\xmp@lang@Default +\let\xmp@lang@Nickname\xmp@lang@Default +\let\xmp@lang@Owner\xmp@lang@Default + +%% some validators require a language attribute for +%% dc:title set via \Title +%% dc:description set via \Subject +%% dc:rights set via \Copyright +%% xmpRights:UsageTerms set via \Copyright +%% +{\catcode `\" 12 \catcode`\: 12 \catcode`\= 12 + \gdef\pdfx@xmp@checklang#1{% + \ifx #1\xmp@lang@Default\else\space xml:lang="#1"\fi} + \gdef\pdfx@xmp@strictlang#1{\space xml:lang="#1"} +}% end of \catcodes +\let\xmp@checklang\pdfx@xmp@checklang +\let\xmp@strictlang\pdfx@xmp@strictlang + +\newcommand{\pdfx@Title}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@Title{#1}\fi + \xmp@parse{\global\let\xmp@Title\@this}} + +%% allow for multiple authors, keywords and languages +%% also: contributor, date, relation, type, thumbnails +%% and AuthoritativeDomain, Advisory, Identifier, Owner +\newcommand{\pdfx@Author}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@Author{#1}\fi + \def\afterxmp@parse{\let\Author\pdfx@extraAuthor}% + \xmp@parse{\global\let\xmp@Author\@this}} +\newcommand{\pdfx@Keywords}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@Keywords{#1}\fi + \def\afterxmp@parse{\let\Keywords\pdfx@extraKeywords}% + \xmp@parse{\global\let\xmp@Keywords\@this}} +\newcommand{\pdfx@Language}{% + \def\afterxmp@parse{\let\Language\pdfx@extraLanguages}% + \xmp@parse{\global\let\xmp@Language\@this}} + +\newcommand{\pdfx@AuthoritativeDomain}{% + \def\afterxmp@parse{\let\AuthoritativeDomain\pdfx@extraAuthoritativeDomain}% + \xmp@parse{\global\let\xmp@AuthoritativeDomain\@this}} +\newcommand{\pdfx@Date}{% + \def\afterxmp@parse{\let\Date\pdfx@extraDate}% + \xmp@parse{\global\let\xmp@Date\@this}} +\newcommand{\pdfx@Contributor}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@Contributor{#1}\fi + \def\afterxmp@parse{\let\Contributor\pdfx@extraContributor}% + \xmp@parse{\global\let\xmp@Contributor\@this}} +\newcommand{\pdfx@Relation}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@Relation{#1}\fi + \def\afterxmp@parse{\let\Relation\pdfx@extraRelation}% + \xmp@parse{\global\let\xmp@Relation\@this}} +%%\newcommand{\pdfx@Type}[1][]{% +%% \ifx\relax#1\relax\else\gdef\xmp@lang@Type{#1}\fi +%% \def\afterxmp@parse{\let\Type\pdfx@extraType}% +%% \xmp@parse{\global\let\xmp@Type\@this}} + +\newcommand{\pdfx@Advisory}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@Advisory{#1}\fi + \def\afterxmp@parse{\let\Advisory\pdfx@extraAdvisory}% + \xmp@parse{\global\let\xmp@Advisory\@this}} +\newcommand{\pdfx@Identifier}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@Identifier{#1}\fi + \def\afterxmp@parse{\let\Identifier\pdfx@extraIdentifier}% + \xmp@parse{\global\let\xmp@Identifier\@this}} +\newcommand{\pdfx@Thumbnails}{% + \def\afterxmp@parse{\let\Thumbnails\pdfx@extraThumbnails}% + \xmp@parse{\global\let\xmp@Thumbnails\@this}} + +\newcommand{\pdfx@Owner}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@Owner{#1}\fi + \def\afterxmp@parse{\let\Owner\pdfx@extraOwner}% + \xmp@parse{\global\let\xmp@Owner\@this}} + +{\obeyspaces% + \ifpdfx@useactivespaces\gdef\pdfx@insert@sep{\sep }% + \else\gdef\pdfx@insert@sep{\sep}\fi% +} +\newcommand{\pdfx@extraAuthor}[1][]{% + \ifx\relax#1\relax + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Author + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Author\pdfx@insert@sep}% + \else + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Author + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Author\pdfx@insert@sep[#1]}% + \fi + \def\afterxmp@parse{% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Author + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Author\xmp@extraAuthor}% + }% + \xmp@parse{\global\let\xmp@extraAuthor\@this}% + }% +\newcommand{\pdfx@extraKeywords}[1][]{% + \ifx\relax#1\relax + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Keywords + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Keywords\pdfx@insert@sep}% + \else% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Keywords + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Keywords\pdfx@insert@sep[#1]}% + \fi% + \def\afterxmp@parse{% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Keywords + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Keywords\xmp@extraKeywords}}% + \xmp@parse{\global\let\xmp@extraKeywords\@this}% + }% +\newcommand{\pdfx@extraLanguages}{% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Language + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Language\pdfx@insert@sep}% + \def\afterxmp@parse{% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Language + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Language\xmp@extraLanguages}}% + \xmp@parse{\global\let\xmp@extraLanguages\@this}% + }% + +\newcommand{\pdfx@extraContributor}[1][]{% + \ifx\relax#1\relax + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Contributor + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Contributor\pdfx@insert@sep}% + \else + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Contributor + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Contributor\pdfx@insert@sep[#1]}% + \fi + \def\afterxmp@parse{% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Contributor + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Contributor\xmp@extraContributor}% + }% + \xmp@parse{\global\let\xmp@extraContributor\@this}% + }% + +\newcommand{\pdfx@extraAuthoritativeDomain}{% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@AuthoritativeDomain + \expandafter\expandafter\expandafter{% + \expandafter\xmp@AuthoritativeDomain\pdfx@insert@sep}% + \def\afterxmp@parse{% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@AuthoritativeDomain + \expandafter\expandafter\expandafter{% + \expandafter\xmp@AuthoritativeDomain\xmp@extraAuthoritativeDomain}% + }% + \xmp@parse{\global\let\xmp@extraAuthoritativeDomain\@this}% + }% + +\newcommand{\pdfx@extraDate}{% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Date + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Date\pdfx@insert@sep}% + \def\afterxmp@parse{% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Date + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Date\xmp@extraDate}% + }% + \xmp@parse{\global\let\xmp@extraDate\@this}% + }% + +\newcommand{\pdfx@extraRelation}[1][]{% + \ifx\relax#1\relax + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Relation + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Relation\pdfx@insert@sep}% + \else + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Relation + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Relation\pdfx@insert@sep[#1]}% + \fi + \def\afterxmp@parse{% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Relation + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Relation\xmp@extraRelation}% + }% + \xmp@parse{\global\let\xmp@extraRelation\@this}% + }% + +%%\newcommand{\pdfx@extraType}[1][]{% +%%% \show\xmp@Type +%% \ifx\relax#1\relax +%% \expandafter\expandafter\expandafter\gdef +%% \expandafter\expandafter\expandafter\xmp@Type +%% \expandafter\expandafter\expandafter{% +%% \expandafter\xmp@Type\pdfx@insert@sep}% +%% \else +%% \expandafter\expandafter\expandafter\gdef +%% \expandafter\expandafter\expandafter\xmp@Type +%% \expandafter\expandafter\expandafter{% +%% \expandafter\xmp@Type\pdfx@insert@sep[#1]}% +%% \fi +%% \def\afterxmp@parse{% +%% \expandafter\expandafter\expandafter\gdef +%% \expandafter\expandafter\expandafter\xmp@Type +%% \expandafter\expandafter\expandafter{% +%% \expandafter\xmp@Type\xmp@extraType}% +%% %\show\xmp@Type +%% }% +%% \xmp@parse{\global\let\xmp@extraType\@this}% +%% }% + +\newcommand{\pdfx@extraAdvisory}[1][]{% + \ifx\relax#1\relax + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Advisory + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Advisory\pdfx@insert@sep}% + \else + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Advisory + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Advisory\pdfx@insert@sep[#1]}% + \fi + \def\afterxmp@parse{% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Advisory + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Advisory\xmp@extraAdvisory}% + }% + \xmp@parse{\global\let\xmp@extraAdvisory\@this}% + }% + +\newcommand{\pdfx@extraIdentifier}[1][]{% + \ifx\relax#1\relax + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Identifier + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Identifier\pdfx@insert@sep}% + \else + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Identifier + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Identifier\pdfx@insert@sep[#1]}% + \fi + \def\afterxmp@parse{% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Identifier + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Identifier\xmp@extraIdentifier}% + }% + \xmp@parse{\global\let\xmp@extraIdentifier\@this}% + }% + +\newcommand{\pdfx@extraThumbnails}[1][]{% + \ifx\relax#1\relax + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Thumbnails + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Thumbnails\pdfx@insert@sep}% + \else + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Thumbnails + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Thumbnails\pdfx@insert@sep[#1]}% + \fi + \def\afterxmp@parse{% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Thumbnails + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Thumbnails\xmp@extraThumbnails}% + }% + \xmp@parse{\global\let\xmp@extraThumbnails\@this}% + }% + +\newcommand{\pdfx@extraOwner}[1][]{% + \ifx\relax#1\relax + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Owner + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Owner\pdfx@insert@sep}% + \else + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Owner + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Owner\pdfx@insert@sep[#1]}% + \fi + \def\afterxmp@parse{% + \expandafter\expandafter\expandafter\gdef + \expandafter\expandafter\expandafter\xmp@Owner + \expandafter\expandafter\expandafter{% + \expandafter\xmp@Owner\xmp@extraOwner}% + }% + \xmp@parse{\global\let\xmp@extraOwner\@this}% + }% + +\newcommand{\pdfx@Subject}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@Subject{#1}\fi + \xmp@parse{\global\let\xmp@Subject\@this}} +\newcommand{\pdfx@Producer}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@Producer{#1}\fi + \xmp@parse{\global\let\xmp@Producer\@this}} +\newcommand{\pdfx@Publisher}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@Publisher{#1}\fi + \xmp@parse{\global\let\xmp@Publisher\@this}} +\newcommand{\pdfx@Copyright}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@Copyright{#1}\fi + \xmp@parse{\global\let\xmp@Copyright\@this% + \ifx\xmp@Copyrighted\@empty\gdef\xmp@Copyrighted{True}\fi}} + +\newcommand{\pdfx@Coverage}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@Coverage{#1}\fi + \xmp@parse{\global\let\xmp@Coverage\@this}} + +%% PRISM Text fields +\newcommand{\pdfx@CoverDisplayDate}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@CoverDisplayDate{#1}\fi + \xmp@parse{\global\let\xmp@CoverDisplayDate\@this}} +\newcommand{\pdfx@JournalTitle}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@JournalTitle{#1}\fi + \ifx\xmp@PublicationType\@empty\gdef\xmp@PublicationType{journal}\fi + \xmp@parse{\global\let\xmp@JournalTitle\@this}} + +%% Uses PRISM Controlled Vocabulary: +%% http://prismstandard.org/vocabularies/3.0/aggregationtype.xml +%% blog, book, bookazine, catalog, feed, journal, magazine, manual +%% newsletter, newspaper, other, report, pamphlet, vook, whitepaper +%% +\newcommand{\pdfx@PublicationType}[1][]{% + \ifx\relax#1\relax\else\gdef\xmp@lang@PublicationType{#1}\fi + \xmp@parse{\global\let\xmp@PublicationType\@this}} + +\def\pdfx@localcommands{ + \let\Title\pdfx@Title + \let\Author\pdfx@Author + \let\Keywords\pdfx@Keywords + \let\Subject\pdfx@Subject + \let\Language\pdfx@Language + \def\CreatorTool{\xmp@parse{\global\let\xmp@CreatorTool\@this}} + \let\Producer\pdfx@Producer + \def\Volume{\xmp@parse{\global\let\xmp@Volume\@this}} + \def\Issue{\xmp@parse{\global\let\xmp@Issue\@this}} + \let\CoverDisplayDate\pdfx@CoverDisplayDate + \def\CoverDate{\xmp@parse{\global\let\xmp@CoverDate\@this}} + \let\Copyright\pdfx@Copyright + \def\CopyrightURL{\xmp@parse{\global\let\xmp@CopyrightURL\@this% + \ifx\xmp@Copyrighted\@empty\gdef\xmp@Copyrighted{True}\fi}} + \def\Copyrighted{\xmp@parse{\global\let\xmp@Copyrighted\@this}} + \def\Doi{\xmp@parse{\global\let\xmp@Doi\@this}} + \def\ISBN{\xmp@parse{\global\let\xmp@ISBN\@this}} + \def\URLlink{\xmp@parse{\global\let\xmp@URL\@this}} + \def\Lastpage{\xmp@parse{\global\let\xmp@Lastpage\@this}} + \def\Firstpage{\xmp@parse{\global\let\xmp@Firstpage\@this}} + \let\PublicationType\pdfx@PublicationType + \let\Journaltitle\pdfx@JournalTitle + \def\Journalnumber{\xmp@parse{\global\let\xmp@Journalnumber\@this}} + \let\Publisher\pdfx@Publisher + \let\Coverage\pdfx@Coverage + \def\Source{\xmp@parse{\global\let\xmp@Source\@this}} + \let\Contributor\pdfx@Contributor + \let\Date\pdfx@Date + \let\Relation\pdfx@Relation + \let\Advisory\pdfx@Advisory + \def\BaseURL{\xmp@parse{\global\let\xmp@BaseURL\@this}} + \let\Identifier\pdfx@Identifier + \let\Nickname\pdfx@Nickname + \let\Thumbnails\pdfx@Thumbnails + \let\Owner\pdfx@Owner + \def\CertificateURL{\xmp@parse{\global\let\xmp@CertificateURL\@this}} + \def\MMversionID{\xmp@parse{\global\let\xmpMM@versionID\@this}} +%% \let\Type\pdfx@Type +%% +%% currently unused; for backward compatibility only + \let\AuthoritativeDomain\pdfx@AuthoritativeDomain + \let\Creator\CreatorTool % for backward compatibility + \let\Org\Publisher % for backward compatibility + \let\WebStatement\CopyrightURL % for backward compatibility +} + +%%---------------------------------------------------------------------- +%% The following characters and markup can be used within the XMP data +%% defined by \Author, \Title, and so on. +%% +%% * All printable non-whitespace ASCII characters except +%% '%', '{', '}', '\' can be used as themselves. +%% +%% * All printable non-whitespace UTF-8 encoded Unicode characters +%% from the basic multilingual plane can be used as themselves. +%% +%% * As usual, consecutive whitespace characters are contracted to a +%% single space. Whitespace after a macro such as \copyright is +%% ignored. Blank lines are not permitted. +%% +%% * The following markup can be used: +%% '\ ' - a literal space (for example after a macro) +%% \% - a literal '%' +%% \{ - a literal '{' +%% \} - a literal '}' +%% \backslash - a literal '\' +%% \copyright - the (c) copyright symbol +%% +%% \sep - only permitted within \Author, \Keywords, \Publisher. +%% +%% * For backward compatibility, \& and \TextCopyright are also +%% provided. Their use is deprecated. + +%%---------------------------------------------------------------------- +%% The macro \pdfx@actives binds the active characters +%% '&', '<', and '>' to \pdfx@amp, \pdfx@lt, and \pdfx@gt, +%% respectively, without actually making them active. +\begingroup + \catcode`\<=13 + \catcode`\>=13 + \catcode`\&=13 + \gdef\pdfx@actives{ + \def&{\pdfx@amp} + \def<{\pdfx@lt} + \def>{\pdfx@gt} + } +\endgroup + +%%---------------------------------------------------------------------- +%% Markup bindings to be used during XMP generation. + +{% + \catcode`\<=12 \catcode`\>=12 \catcode`\/=12 \catcode`\:=12 \catcode`\"=12 +\obeyspaces\ifpdfx@useactivespaces% + \gdef\pdfx@sep {\pdfx@check@lang}% +\else% + \gdef\pdfx@sep{\pdfx@check@lang}% +\fi% + \xdef\pdfx@sep@nolang{</rdf:li>^^J <rdf:li>}% + \xdef\pdfx@sep@lang[#1]{</rdf:li>^^J <rdf:li xml:lang="#1">}% +}% end of \obeyspaces and \catcode .... + +\def\pdfx@check@lang#1{% + \ifx[#1\expandafter\@firstoftwo + \else\expandafter\@secondoftwo\fi + {\pdfx@sep@lang#1}{\pdfx@sep@nolang#1}} + +\def\pdfx@xmpmarkup{% + \pdfx@actives + \edef\@amp{\expandafter\@gobble\string\&}% + \edef\@hash{\expandafter\@gobble\string\#}% + \edef\ {\expandafter\@gobble\string\ }% + \edef\%{\expandafter\@gobble\string\%}% + \edef\{{\expandafter\@gobble\string\{}% + \edef\}{\expandafter\@gobble\string\}}% + \edef\backslash{\expandafter\@gobble\string\\}% + \def\@unicode##1{\@amp\@hash x##1;}% + \def\pdfx@amp{\@unicode{0026}}% + \def\pdfx@lt{\@unicode{003c}}% + \def\pdfx@gt{\@unicode{003e}}% + \def\copyright{\@unicode{00A9}}% + \let\&\pdfx@amp % for backward compatibility + \let\TextCopyright\copyright % for backward compatibility + \let\sep\pdfx@sep + \pdfx@xmpunimarkup % only need this when writing XMP + \the\pdfxsafeforxmp@toks +} + +%% cope with active spaces with LGR encoding +%% and the spaces written out with \IeC in KOI8-r +%% It's possible to have both together. +\def\liixu@IeC#1#{\liixu@IeCi} +\def\liixu@IeCi#1{\liixu@IeCii#1} +\def\liixu@IeCii#1#2{#1} +\def\liixu@enableIeC{\ifpdfx@useactivespaces + \let\IeC\liixu@IeC\else\def\IeC##1{##1}\fi} +\def\liixu@numberline#1#{\liixu@numberlinei} +\def\liixu@numberlinei#1{\liixu@numberlineii#1} +\def\liixu@numberlineii#1{\textLF #1. } +\def\liixu@enablenumberline{\ifpdfx@useactivespaces + \let\numberline\liixu@numberline + \else\def\numberline##1{\textLF ##1. }\fi} + +\def\pdfx@xmpunimarkup{% + \liixu@enableIeC + \liixu@enablenumberline + \def\empty{}% used in LICR patterns + \LIIXUscriptcommands + \LIIXUtipacommands + \LIIXUmapTeXnames +%% from Hyperref's psdextra.def + \csname psdmapshortnames\endcsname + \csname psdaliasnames\endcsname +%% from lu8enc.def + \csname LIIXUmapmathletterlikes\endcsname + \csname LIIXUmapmathspaces\endcsname + \iflatLATxmp + \LIIXUmaplatinchars + \LIIXUcancelfontswitches + \fi + \ifmathxmp + \let\(\textinlinemath + \let\[\textdisplaymath + \LIIXUmapmathaccents + \LIIXUmapisomathgreek + \LIIXUmapmatharrowsA + \LIIXUmapmathoperatorsA + \LIIXUmapmathoperatorsB + \LIIXUmapmiscmathsymbolsA + \LIIXUmapsupparrowsA + \LIIXUmapsupparrowsB + \LIIXUmapmiscmathsymbolsB + \LIIXUmapsuppmathoperators + \LIIXUmapunimathgreek + \LIIXUmapmathalphabets + \fi + \ifarbxmp \LIIXUmaparabicletters\fi + \ifarmxmp \LIIXUmaparmenianletters\fi + \ifdevxmp\LIIXUmapdevaccents\fi + \ifgrkxmp \LIIXUmapgreekletters\fi + \ifhebxmp \LIIXUmaphebrewletters\fi +} + +%% In case macros are used in XMP Metadata, need a way to map these +%% to simple text, rather than specific font characters, or whatever: +\newtoks\pdfxsafeforxmp@toks +\def\pdfxEnableCommands{% user command + \begingroup + \ifpdfx@useactivespaces\obeyspaces\fi + \pdfx@EnableCommands +} +\def\pdfx@EnableCommands#1{% internal command + \expandafter\global\expandafter\pdfxsafeforxmp@toks + \expandafter{\the\pdfxsafeforxmp@toks#1}% + \endgroup +} + +%%---------------------------------------------------------------------- +%% Markup bindings to be used during PDF string generation. + +\def\pdfx@pdfmarkup{% + \pdfx@actives + \edef\%{\expandafter\@gobble\string\%}% + \edef\{{\expandafter\@gobble\string\{}% + \edef\}{\expandafter\@gobble\string\}}% + \edef\pdfx@backslash{\expandafter\@gobble\string\\}% + \def\backslash{\pdfx@backslash000\pdfx@backslash134}% + \edef\pdfx@amp{\expandafter\@gobble\string\&}% + \edef\pdfx@lt{\expandafter\@gobble\string\<}% + \edef\pdfx@gt{\expandafter\@gobble\string\>}% + \let\TextCopyright\copyright % for backward compatibility + \def\sep{; }% + %\let\sep\pdfx@sep +%% Note: '\ ', \&, \copyright are already predefined by hyperref. +%% allow LICRs to expand into PDF strings + \def\cf@encoding{PU}% + \def\9##1{\ifcase##1\string\0\or\string\1\or\string\2\or\string\3\fi}% + \def\8{\string\00}% + \def\0{\string\0}\def\1{\string\1}\def\2{\string\2}\def\3{\string\3}% + \pdfx@xmpunimarkup + \the\pdfxsafeforxmp@toks +} + +%%---------------------------------------------------------------------- +%% Defaults +\ifxetex + \def\xmp@Producer{XeTeX} +\else\ifluatex + \def\xmp@Producer{LuaTeX} +\else + \def\xmp@Producer{pdfTeX} +\fi\fi +\global\let\pdfxProducer\xmp@Producer + +\global\let\xmp@CreatorTool\@empty +\global\let\xmp@Title\@empty +\global\let\xmp@Author\@empty +\global\let\xmp@Keywords\@empty +\global\let\xmp@Subject\@empty +\global\let\xmp@Language\@empty +\global\let\xmp@Volume\@empty +\global\let\xmp@Issue\@empty +\global\let\xmp@CoverDisplayDate\@empty +\global\let\xmp@CoverDate\@empty +\global\let\xmp@Copyright\@empty +\global\let\xmp@Copyrighted\@empty +\global\let\xmp@CopyrightURL\@empty +\gdef\xmp@WebStatement{\xmp@CopyrightURL} +\global\let\xmp@Doi\@empty +\global\let\xmp@ISBN\@empty +\global\let\xmp@URL\@empty +\global\let\xmp@Lastpage\@empty +\global\let\xmp@Firstpage\@empty +\global\let\xmp@PublicationType\@empty +\global\let\xmp@Journaltitle\@empty +\global\let\xmp@Journalnumber\@empty +%%\global\let\xmp@Type\@empty +\global\let\xmp@Contributor\@empty +\global\let\xmp@Coverage\@empty +\global\let\xmp@Date\@empty +\global\let\xmp@Relation\@empty +\global\let\xmp@Source\@empty +\global\let\xmp@Publisher\@empty +\gdef\xmp@Org{\xmp@Publisher} +\global\let\xmp@AuthoritativeDomain\@empty +\global\let\xmp@Advisory\@empty +\global\let\xmp@BaseURL\@empty +\global\let\xmp@Identifier\@empty +\global\let\xmp@Nickname\@empty +\global\let\xmp@Thumbnails\@empty +\global\let\xmp@Owner\@empty +\global\let\xmp@CertificateURL\@empty + +%%---------------------------------------------------------------------- +%% Alternative way to get the CreationDate using Lua for XeTeX +\ifdefined\pdfcreationdate\else + \begingroup %% ensure correct catcodes, not done by \dospecials + \catcode`\:=12 \catcode`\.=12 +\begin{filecontents*}{creationdate.lua} + os.remove("creationdate.timestamp") + io.output("creationdate.timestamp"):write(os.date("\\edef\\tempa{\\string D:%Y%m%d%H%M%S}\n\\def\\tempb{%z}")) +\end{filecontents*} + \endgroup + \ifnum\shellescape=1 + \begingroup %% ensure correct catcodes when file is read in + \catcode`\'=12 \catcode`\.=12 \catcode`\:=12 \catcode`\+=12 + \immediate\write18{texlua creationdate.lua} + \input{creationdate.timestamp} + \def\tempc#1#2#3#4#5{#1#2#3'#4#5'} + \edef\tempb{\expandafter\tempc\tempb} + \edef\x{\endgroup\def\noexpand\pdfcreationdate{\tempa\tempb}}\x + \else + \begingroup %% ensure correct catcodes in the error/warning messages + \catcode`\<=12 \catcode`\>=12 \catcode`\"=12 \catcode`\-=12 + \catcode`\: 12 \catcode`\' 12 \catcode`\= 12 + \ifpdfx@noerr + \PackageWarning{pdfx}{% + CreationDate is not properly supported;^^J + PDF validation may fail. To avoid this problem use:^^J + xelatex -shell-escape -output-driver="xdvipdfmx -z 0" <filename>^^J} + \else + \PackageError{pdfx}{% + CreationDate is not properly supported;^^J + PDF validation may fail.}{To avoid this problem use:^^J + xelatex -shell-escape -output-driver="xdvipdfmx -z 0" <filename> } + \fi + %% Using a constant date, to allow processing to finish smoothly. + \edef\x{\endgroup + \def\noexpand\pdfcreationdate{\string D:20181028075445+10'00'}}% + \x + \fi +\fi + +%%---------------------------------------------------------------------- +\def\pdfx@findUUID#1{\edef\pdfx@tmpstring{\pdfx@mdfivesum{#1}} + \expandafter\pdfx@eightofnine\pdfx@tmpstring\end} +\def\pdfx@eightofnine#1#2#3#4#5#6#7#8#9\end{% + \xdef\pdfx@eightchars{#1#2#3#4#5#6#7#8} + \pdfx@fouroffive#9\end} +\def\pdfx@fouroffive#1#2#3#4#5\end{\xdef\pdfx@ffourchars{#1#2#3#4} + \pdfx@sfouroffive#5\end} +\def\pdfx@sfouroffive#1#2#3#4#5\end{\xdef\pdfx@sfourchars{#1#2#3#4} + \pdfx@tfouroffive#5\end} +\def\pdfx@tfouroffive#1#2#3#4#5\end{\xdef\pdfx@tfourchars{#1#2#3#4} + \xdef\pdfx@laststring{#5}} + +\def\pdfx@uuid{\pdfx@eightchars-% + \pdfx@ffourchars-% + \pdfx@sfourchars-% + \pdfx@tfourchars-% + \pdfx@laststring} + +\expandafter\ifx\csname pdfx@mdfivesum\endcsname\relax + \PackageError{pdfx}{% + No implementation for \string\pdfx@mdfivesum.^^J + \ifxetex XeTeX needs to be 2015 or later\fi + }{% + Continue without, but the PDF will not validate. + }% + \def\xmp@docid{}% + \def\pdfx@findUUID#1{}% + \def\pdfx@uuid{}% +\else + \pdfx@findUUID{\jobname.pdf} + \edef\xmp@docid{\pdfx@uuid} +\fi + +\expandafter\ifx\csname pdfcreationdate\endcsname\relax\relax + \PackageWarning{pdfx}{% + No implementation for \string\pdfxcreation . + }% + \def\xmp@instid{}% +%% +\else %% use the MD5 sum methods +%% + \pdfx@findUUID{\pdfcreationdate}% + \edef\xmp@instid{\pdfx@uuid} +\fi + +%%---------------------------------------------------------------------- +%% load xcolor before hyperref to get the link colors correct +%% +\PassOptionsToPackage{nosetpagesize}{color} +\PassOptionsToPackage{nosetpagesize}{graphics} +\@ifpackageloaded{xcolor}{% + % Beamer will have already loaded xcolor + % need to understand what options it used +}{ +\ifpdfx@x + \RequirePackage[cmyk,hyperref]{xcolor} +\else + \RequirePackage[rgb,hyperref]{xcolor} +\fi +}% + +%% loading puenc.def will kill a lot of what mathtext.sty established +\@ifpackageloaded{mathtext}{% + \PackageWarningNoLine{pdfx}{pdfx.sty and hyperref.sty should be loaded^^J + before mathtext.sty , otherwise text symbols may not show in math mode.}% +}{} + +\newif\ifpdfx@hluatex +\IfFileExists{hluatex.def}{\pdfx@hluatextrue}{\pdfx@hluatexfalse} + +%% the "pdftex" option seems to work fine with LuaTeX +\def\pdfx@luatest{\ifpdfx@hluatex luatex\else pdftex \fi} + +%% Hyperref options for PDF/X +\edef\pdfx@pdfX@opts@pdftex{% + draft,pdftex,pdfpagemode=UseNone,bookmarks=false,% + pdfversion=1.\thepdfminorversion,pdfstartview=} +\edef\pdfx@pdfX@opts@xetex{% + draft,xetex,pdfpagemode=UseNone,bookmarks=false,% + pdfversion=1.\thepdfminorversion,pdfstartview=} + \edef\pdfx@pdfX@opts@luatex{% + draft,\pdfx@luatest,pdfpagemode=UseNone,bookmarks=false,% + pdfversion=1.\thepdfminorversion,pdfstartview=}% + +\newif\ifpdfx@hyperrefloaded +\expandafter\ifx\csname ifHy@pdfa\endcsname\relax\else\pdfx@hyperrefloadedtrue\fi + +%% Hyperref options for PDF/A and PDF/E +\newtoks\pdfx@tmptoks +\pdfx@tmptoks{% +\ifHy@pdfa + \edef\pdfx@pdfAE@opts@pdftex{pdftex}% + \edef\pdfx@pdfAE@opts@xetex{xetex,pdfversion=1.\thepdfminorversion}% + \edef\pdfx@pdfAE@opts@luatex{\pdfx@luatest,pdfversion=1.\thepdfminorversion}% + \edef\pdfx@pdfAE@opts@pdfmark{pdfmark,pdfversion=1.\thepdfminorversion}% + \else + \edef\pdfx@pdfAE@opts@pdftex{pdftex,pdfa}% + \edef\pdfx@pdfAE@opts@xetex{xetex,pdfa,pdfversion=1.\thepdfminorversion}% + \edef\pdfx@pdfAE@opts@luatex{\pdfx@luatest,pdfa,pdfversion=1.\thepdfminorversion}% + \edef\pdfx@pdfAE@opts@pdfmark{pdfmark,pdfa,pdfversion=1.\thepdfminorversion}% + \fi +} +\ifpdfx@hyperrefloaded + \the\pdfx@tmptoks\relax +\else + \edef\pdfx@pdfAE@opts@pdftex{pdftex,pdfa}% + \edef\pdfx@pdfAE@opts@xetex{xetex,pdfa,pdfversion=1.\thepdfminorversion}% + \edef\pdfx@pdfAE@opts@luatex{\pdfx@luatest,pdfa,pdfversion=1.\thepdfminorversion}% + \edef\pdfx@pdfAE@opts@pdfmark{pdfmark,pdfa,pdfversion=1.\thepdfminorversion}% +\fi +\pdfx@tmptoks{}% + +\ifpdfx@x + \@ifpackageloaded{hyperref}{% + \ifxetex + \expandafter\hypersetup\expandafter{\pdfx@pdfX@opts@xetex} + \else\ifluatex + \expandafter\hypersetup\expandafter{\pdfx@pdfX@opts@luatex} + \else + \expandafter\hypersetup\expandafter{\pdfx@pdfX@opts@pdftex} + \fi\fi + }{% + \ifxetex + \expandafter\RequirePackage\expandafter[\pdfx@pdfX@opts@xetex]{hyperref} + \else\ifluatex + \expandafter\RequirePackage\expandafter[\pdfx@pdfX@opts@luatex]{hyperref} + \else + \expandafter\RequirePackage\expandafter[\pdfx@pdfX@opts@pdftex]{hyperref} + \fi\fi + }% +\else + \ifpdfx@e + \@ifpackageloaded{hyperref}{% + \ifxetex + \expandafter\hypersetup\expandafter{\pdfx@pdfAE@opts@xetex} + \else\ifluatex + \expandafter\hypersetup\expandafter{\pdfx@pdfAE@opts@luatex} + \else + \expandafter\hypersetup\expandafter{\pdfx@pdfAE@opts@pdftex} + \fi\fi + }{% + \ifxetex + \expandafter\RequirePackage\expandafter[\pdfx@pdfAE@opts@xetex]{hyperref} + \else\ifluatex + \expandafter\RequirePackage\expandafter[\pdfx@pdfAE@opts@luatex]{hyperref} + \else + \expandafter\RequirePackage\expandafter[\pdfx@pdfAE@opts@pdftex]{hyperref} + \fi\fi + }% + \else % generating PDF/A or ... + \@ifpackageloaded{hyperref}{% + \ifxetex + \expandafter\hypersetup\expandafter{\pdfx@pdfAE@opts@xetex}% + \else\ifluatex + \expandafter\hypersetup\expandafter{\pdfx@pdfAE@opts@luatex}% + \else + \expandafter\hypersetup\expandafter{\pdfx@pdfAE@opts@pdftex}% + \fi\fi + }{% + \ifxetex + \expandafter\RequirePackage\expandafter[\pdfx@pdfAE@opts@xetex]{hyperref} + \else\ifluatex + \expandafter\RequirePackage\expandafter[\pdfx@pdfAE@opts@luatex]{hyperref} + \else + \expandafter\RequirePackage\expandafter[\pdfx@pdfAE@opts@pdftex]{hyperref} + \fi\fi + }% +\fi\fi +\hypersetup{pdfencoding=auto}% unicode +\expandafter\ifx\csname KV@Hyp@psdextra\endcsname\relax\else + \hypersetup{psdextra} +\fi + +%% hyperref doesn't set the minor version for XeTeX +\ifxetex + \special{pdf:minorversion \thepdfminorversion} +\fi + +\ifx\xmp@CreatorTool\@empty + \edef\xmp@CreatorTool{\@pdfcreator} +\fi + +\newif\ifpdfx@cmyk +\newif\ifpdfx@custom +\ifpdfx@x % PDF/X normally needs a CMYK color profile for printing + \global\pdfx@cmyktrue +\fi +%%---------------------------------------------------------------------- +%% ----- Color Profiles ------- +%% Define how to specify the profile, so the default +%% can be over-ridden in the .xmpdata file. +%% +%% --- user-command --- RGB profile needed with PDF/A-?? +%% \setRGBcolorprofile{<filename>}{<identifier>} +%% {<info string>}{<registry URL>} +\def\setRGBcolorprofile{% + \begingroup + \catcode`\_ 11\relax\catcode`\& 11\relax\catcode`\~ 11\relax + \catcode`\% 11\relax + \edef\({\string\(}\edef\){\string\)}% + \pdfx@setrgbprofile} +%% +%% --- user-command --- CMYK profile needed with PDF/X-?? +%% \setCMYKcolorprofile{<filename>}{<output intent>} +%% {<identifier>}{<registry URL>} +\def\setCMYKcolorprofile{% + \begingroup + \catcode`\_ 11\relax\catcode`\& 11\relax\catcode`\~ 11\relax + \catcode`\% 11\relax + \edef\({\string\(}\edef\){\string\)}% + \pdfx@setcmykprofile} +%% +%% --- user-command --- DeviceGray profile needed with PDF/E-1 +%% \setGRAYcolorprofile{<filename>}{<output intent>} +%% {<identifier>}{<registry URL>} +\def\setGRAYcolorprofile{% + \begingroup + \catcode`\_ 11\relax\catcode`\& 11\relax\catcode`\~ 11\relax + \catcode`\% 11\relax + \edef\({\string\(}\edef\){\string\)}% + \pdfx@setgrayprofile} +%% +%% --- user-command --- External profile with PDF/X-4p and PDF/X-5pg +%% \setEXTERNALprofile{<profilename>}{<output intent>} +%% {<identifier>}{<registry URL>}{<color-space>}% +%% {<ICC Version>}{<provider URL>}{<extra info>}{<Check Sum>} +\def\setEXTERNALprofile{% + \begingroup + \catcode`\_ 11\relax\catcode`\& 11\relax\catcode`\~ 11\relax + \catcode`\% 11\relax + \edef\({\string\(}\edef\){\string\)}% + \ifno@iccprofile + \expandafter\pdfx@externalprofile + \else + \expandafter\pdfx@externalprofile@gobble + \fi + } +%% +%% +\def\pdfx@setRGBcolorprofiledir#1{% + \xdef\pdfx@RGBcolorprofiledir{#1}% +} +\def\pdfx@setCMYKcolorprofiledir#1{% + \xdef\pdfx@CMYKcolorprofiledir{#1}% +} +\pdfx@setRGBcolorprofiledir{} +\pdfx@setCMYKcolorprofiledir{} + +%% This does indeed work! Use it in .xmpdata files +\providecommand{\MacOSColordir}{/System/Library/ColorSync/Profiles/} +\providecommand{\MacOSLibraryColordir}{/Library/ColorSync/Profiles/} +\providecommand{\AdobeMacOSdir}% + {/Library/Application Support/Adobe/Color/Profiles/Recommended/} +\edef\pdfx@tmp{C:\string\Windows\string\System32\string\Spool% + \string\Drivers\string\Color\string/} +\expandafter\providecommand\expandafter + {\expandafter\WindowsColordir\expandafter}\expandafter{\pdfx@tmp} +%%\pdfx@setcolorprofiledir{\AdobeMacOSdir} + +%% overide that value using the following commands: +\let\pdfxSetCMYKcolorProfileDir\pdfx@setCMYKcolorprofiledir +\let\pdfxSetRGBcolorProfileDir\pdfx@setRGBcolorprofiledir +%% for back-compatibility +\let\pdfxSetColorProfileDir\pdfxSetCMYKcolorProfileDir +%% +\def\pdfx@setrgbprofile#1#2#3#4{% + \xdef\pdfx@rgb@profile{\pdfx@RGBcolorprofiledir#1}% valid file path/name + \xdef\pdfx@rgb@profilename{#1}% valid file name + \gdef\pdfx@rgb@identifier{#2}% + \gdef\pdfx@rgb@info{#3}% + \pdfstringdef\pdfx@rgb@registry{#4}% valid URL + \endgroup + \global\pdfx@cmykfalse + }% closes-off \setRGBcolorprofile +%% +\def\pdfx@setcmykprofile#1#2#3#4{% + \xdef\pdfx@cmyk@profile{\pdfx@CMYKcolorprofiledir#1}% valid file path/name + \xdef\pdfx@cmyk@profilename{#1}% valid file name +%% \expandafter\gdef\expandafter\pdfx@cmyk@profile\expandafter +%% {\pdfx@colorprofiledir#1}% valid file name + \gdef\pdfx@cmyk@intent{#2}% +%% \pdfstringdef\pdfx@cmyk@intent{#2}% color intent + \gdef\pdfx@cmyk@identifier{#3}% +%% \pdfstringdef\pdfx@cmyk@identifier{#3}% text string identifier + \gdef\pdfx@cmyk@registry{#4}% +%% \pdfstringdef\pdfx@cmyk@registry{#4}% valid URL + \endgroup + \global\pdfx@cmyktrue + }% closes-off \setcmykcolorprofile +%% +\def\setCUSTOMcolorprofile{% + \begingroup + \catcode`\_ 11\relax\catcode`\& 11\relax\catcode`\~ 11\relax + \catcode`\% 11\relax + \edef\({\string\(}\edef\){\string\)}% + \pdfx@setcustomprofile +} +\def\pdfx@setcustomprofile#1#2#3#4#5#6#7#8{% + \xdef\pdfx@customcolorprofiledir{#2}% valid directory location + \xdef\pdfx@custom@profile{#1}% valid file name + \gdef\pdfx@custom@identifier{#3}% + \gdef\pdfx@custom@registry{#4}% + \gdef\pdfx@custom@numcolors{#5}% num-colors specifier + \gdef\pdfx@iccversion{#6}% Hex string for /ICCVersion < ... > + \gdef\pdfx@custom@colornames{#7}% + \gdef\pdfx@profile@checksum{#8}% Hex string for /CheckSum < ... > +\endgroup + \global\pdfx@cmykfalse + \global\pdfx@customtrue + }% closes-off \pdfx@setcustomprofile +%% +\def\pdfx@setgrayprofile#1#2#3#4{% + \gdef\pdfx@gray@profile{#1}% valid file name + \gdef\pdfx@gray@intent{#2}% + \gdef\pdfx@gray@identifier{#3}% + \pdfstringdef\pdfx@gray@registry{#4}% valid URL + \endgroup}% closes-off \setGRAYcolorprofile +%% +\def\pdfx@externalprofile#1#2#3#4#5#6#7#8#9{% + \gdef\pdfx@extprofile{#1}% PDF string for /ProfileName + \gdef\pdfx@cmyk@intent{#2}% PDF string for /OutputCondition + \gdef\pdfx@cmyk@identifier{#3}% PDF string for /OutputConditionIdentifier + \gdef\pdfx@cmyk@registry{#4}% {http://www.color.org}% + \gdef\pdfx@profileCS{#5}% 4 bytes for /ProfileCS + \gdef\pdfx@iccversion{#6}% Hex string for /ICCVersion < ... > + \gdef\pdfx@colorURL{#7}% URL + \gdef\pdfx@cmyk@info{#8}% for /Info + \gdef\pdfx@profile@checksum{#9}% Hex string for /CheckSum < ... > + \endgroup}% closes-off \setEXTERNALprofile +\def\pdfx@externalprofile@gobble#1#2#3#4#5#6#7#8#9{% + \PackageError{pdfx}{Wrong option for using an External Color profile}% + {Use one of the options: x-4p , x-4p08 , x-4p10 or x-5pg .}% + \endgroup} +%% +%% default color profiles + +{\catcode`\_ 12 \catcode`\& 12 \catcode`\~ 12 + \gdef\pdfx@xprofile@cmykdefault{coated_FOGRA39L_argl.icc} + \gdef\pdfx@aprofile@rgbdefault{sRGB_IEC61966-2-1_black_scaled.icc} + \gdef\pdfx@eprofile@graydefault{Gray_linear.icc} + \gdef\pdfx@pprofile@externaldefault{FOGRA39} +}% end of \catcode +\xdef\pdfx@rgb@profile{\pdfx@aprofile@rgbdefault} +\xdef\pdfx@cmyk@profile{\pdfx@xprofile@cmykdefault} +\xdef\pdfx@gray@profile{\pdfx@eprofile@graydefault} +\xdef\pdfx@external@profile{\pdfx@pprofile@externaldefault} + +%%---------------------------------------------------------------------- +%% License for the file sRGB_IEC61966-2-1_black_scaled.icc : +%% +%% Copyright International Color Consortium, 2009 -- http://www.color.org/ +%% +%% It is hereby acknowledged that the file "sRGB_IEC61966-2-1_black_scaled.icc" +%% is provided "AS IS" WITH NO EXPRESS OR IMPLIED WARRANTY. +%% +%% Licensing +%% +%% This profile is made available by the International Color Consortium, +%% and may be copied, distributed, embedded, made, used, and sold without +%% restriction. Altered versions of this profile shall have the original +%% identification and copyright information removed and shall not be +%% misrepresented as the original profile. +%% +%% Terms of use +%% +%% To anyone who acknowledges that the file "sRGB_IEC61966-2-1_black_scaled.icc" +%% is provided "AS IS" WITH NO EXPRESS OR IMPLIED WARRANTY, permission to use, +%% copy and distribute these file for any purpose is hereby granted without fee, +%% provided that the file is not changed including the ICC copyright notice tag, +%% and that the name of ICC shall not be used in advertising or publicity +%% pertaining to distribution of the software without specific, written prior +%% permission. ICC makes no representations about the suitability of this +%% software for any purpose. +%% +%%---------------------------------------------------------------------- + +\newif\ifpdfx@tryoldprofiles + +%% The colorprofiles package was added to TeXLive in October 2018. +%% It allows the default Color Profiles to be maintained independent +%% of the pdfx package. +%% In particular sRGB_IEC61966-2-1_black_scaled.icc is no longer +%% distributed with TeXLive 2018 and later. +%% Older versions still have this file. +%% +\IfFileExists{colorprofiles.tex}{% + \RequirePackage{colorprofiles}[2018/11/01]% + \ifx\colorpro@rgb@profile\relax + \expandafter\pdfx@tryoldprofilestrue + \else + \begingroup %% \endgroup occurs within the macro expansion + \pdfx@setrgbprofile{\colorpro@rgb@profile + }{\colorpro@rgb@identifier + }{\colorpro@rgb@info + }{\colorpro@rgb@registry + }% + \begingroup %% \endgroup occurs within the macro expansion + \pdfx@setcmykprofile{\colorpro@cmyk@profile + }{\colorpro@cmyk@intent + }{\colorpro@cmyk@identifier + }{\colorpro@cmyk@registry + }% + \expandafter\pdfx@tryoldprofilesfalse + \fi +}{% + \PackageWarning{pdfx}{% + The 'colorprofiles' package is not installed correctly.^^J + File 'colorprofiles.tex' is missing. Proceeding without it. + }% + \pdfx@tryoldprofilestrue +} + +{\catcode`\| 14 \catcode`\% 12 \catcode`\_ 12 \catcode`\: 12 + \catcode`\. 12 \catcode`\- 12 \catcode`\/ 12 + \edef\@bchar{\expandafter\@gobble\string\\}| + \edef\({\string\(}\edef\){\string\)}| +\ifpdfx@tryoldprofiles + || this will be used by TeXLive installations up to 2017. + \begingroup | \endgroup occurs within the macro expansion +\expandafter\pdfx@setrgbprofile\expandafter + {sRGB_IEC61966-2-1_black_scaled.icc}| + {sRGB_IEC61966-2-1_black_scaled}| + {sRGB IEC61966 v2.1 with black scaling}| + {http://www.color.org}| + \begingroup | \endgroup occurs within the macro expansion +\pdfx@setcmykprofile{coated_FOGRA39L_argl.icc}| coated_FOGRA39L_argl.icc + {Coated FOGRA39}| + {FOGRA39 \string\(ISO Coated v2 300%\space \string\(ECI\string\)\string\)}| + {http://www.argyllcms.com/}|{http://www.color.org}| +\fi || end of \ifpdfx@tryoldprofiles + \begingroup | \endgroup occurs within the macro expansion +\pdfx@setgrayprofile{Gray_linear.icc}| + {}| + {Custom}| + {http://www.freedesktop.org/wiki/OpenIcc}| +\ifno@iccprofile + \begingroup | \endgroup occurs within the macro expansion + \pdfx@externalprofile{Coated FOGRA39 \(ISO 12647-2:2004\)}| + {Offset commercial and specialty printing according to ISO 12647-2:2004 | + / Amd 1, paper type 1 or 2 \(gloss or matte coated offset, 115 g/m2\), | + screen frequency 60/cm.}| + {FOGRA39}{http://www.color.org}{CMYK}{02100000}{http://www.adobe.com}| + {Coated FOGRA39 \(ISO 12647-2:2004\)}{74FF62F330BF0DBE4495B5720542D511}| +\fi +}% end of \catcode + +%% +%%---------------------------------------------------------------------- +%% License for the file coated_FOGRA39L_argl.icc : +%% +%% The zlib/libpng License +%% +%% Copyright (c) 2008 Kai-Uwe Behrmann +%% +%% This software is provided 'as-is', without any express or implied +%% warranty. In no event will the authors be held liable for any damages +%% arising from the use of this software. +%% +%% Permission is granted to anyone to use this software for any purpose, +%% including commercial applications, and to alter it and redistribute +%% it freely, subject to the following restrictions: +%% +%% 1. The origin of this software must not be misrepresented; you +%% must not claim that you wrote the original software. If you use +%% this software in a product, an acknowledgment in the product +%% documentation would be appreciated but is not required. +%% +%% 2. Altered source versions must be plainly marked as such, and +%% must not be misrepresented as being the original software. +%% +%% 3. This notice may not be removed or altered from any source +%% distribution. +%%---------------------------------------------------------------------- + +\newif\ifexternalICCprofiles +\newif\ifpdfx@noXMPdata + +\begingroup +%% override unneeded color-profile specifier + \ifpdfx@x + \ifno@iccprofile % PDF/X-4p and PDF/X-5pg PDF/VT-2 + \begingroup + \def\pdfx@extprofiles@store{AdobeExternalProfiles.tex}% + \InputIfFileExists{\pdfx@extprofiles@store}% + {\global\externalICCprofilestrue \catcode `\# 12\relax}% + {\typeout{** pdfx: No file \pdfx@extprofiles@store\space + found for PDF/X-4p or PDF/X-5pg}}% + \endgroup + \else + \begingroup + \def\pdfx@profiles@store{AdobeColorProfiles.tex}% + \InputIfFileExists{\pdfx@profiles@store}% + {\global\externalICCprofilesfalse \catcode `\# 12\relax}% + {\typeout{** pdfx: No file \pdfx@profiles@store\space + found for PDF/X variants}}% + \endgroup +%% \def\setRGBcolorprofile#1#2#3#4{% +%% \PackageError{pdfx}{PDF/X requires a CMYK color profile}% +%% {Just continue using the default CMYK profile.^^J}}% + \fi + \else +%% load it, in case the macros are used in .xmpdata + \InputIfFileExists{AdobeColorProfiles.tex}{}{}% + \ifpdfx@e + \else + \def\setCMYKcolorprofile#1#2#3#4{}% + \def\setGRAYcolorprofile#1#2#3#4{}% + \fi\fi +%% + \ifluatex\else\ifxetex\else + \inputencoding{8bit}% + \fi\fi + \makeatletter + \pdfx@localcommands +%% Do this in a box, so any stray characters don't get into TeX's lists. +\setbox0\hbox{% + \InputIfFileExists{\jobname.xmpdata}% + {\typeout{** pdfx: Metadata file \jobname.xmpdata read successfully.}}% + {\typeout{** pdfx: No file \jobname.xmpdata . + Metadata will be incomplete!}\aftergroup\pdfx@noXMPdatatrue}} +\endgroup +%% ---------------------------------------------------------------------- + +\def\pdfx@LanguageSpec{} +\def\pdfx@mainLanguage{en-US}% absolute default +\def\pdfx@checkfor@sep#1#2\sep#3\pdfx@endparse{\def#1{#2}} +\ifx\@empty\xmp@Language\else + \expandafter\pdfx@checkfor@sep\expandafter\pdfx@mainLanguage\xmp@Language + \sep\pdfx@endparse +\fi +\edef\pdfx@LanguageSpec{/Lang (\pdfx@mainLanguage)} + +%% ---------------------------------------------------------------------- +\begingroup + \catcode`\_ 12 \catcode`\" 12 \catcode`\' 12 + \catcode`\< 12 \catcode`\> 12 \catcode`\/ 12 \catcode`\[ 12 \catcode`\] 12 + \edef\@pctchar{\expandafter\@gobble\string\%} + \edef\@bchar{\expandafter\@gobble\string\\} + \edef\0{\string\0} + \edef\({\string\(} + \edef\){\string\)} +%% + \def\pdfx@outcatalog@dict{% + \pdfx@LanguageSpec + /ViewerPreferences <</DisplayDocTitle true >> + /OutputIntents \pdfx@outintents % needs appropriate expansion + }% +\ifpdfx@x % PDF/X needs a CMYK or RGB color profile for printing + \ifno@iccprofile % PDF/X-4p and PDF/X-5pg +%% +%% URL and metadata for the desired external Color Profile +%% + \edef\pdfx@colorURL@dict{<</FS/URL/F(\pdfx@colorURL)>>} + \def\pdfx@colorprofile@dict{<< % + /CheckSum <\pdfx@profile@checksum>^^J% + /ICCVersion <\pdfx@iccversion>% + /ProfileCS (\pdfx@profileCS)^^J% + /ProfileName (\pdfx@extprofile)^^J% + /URLs [\OBJ@URLs] >> + } +%% How to specify the PDF objects with different drivers + \ifxetex + \def\OBJ@URLs{ @colorURL }% + \def\OBJ@ICC{ @colorprofile }% + \immediate\special{pdf:obj \OBJ@URLs \pdfx@colorURL@dict }% + \immediate\special{pdf:obj \OBJ@ICC \pdfx@colorprofile@dict }% + \else % pdfTeX & LuaTeX + \immediate\pdfobj{\pdfx@colorURL@dict}% + \edef\OBJ@URLs{\the\pdflastobj\space 0 R}% + \immediate\pdfobj{\pdfx@colorprofile@dict}% + \edef\OBJ@ICC{\the\pdflastobj\space 0 R}% + \fi +%% Output Intent dictionary, with object reference + \edef\pdfx@outintent@dict{% + /Type/OutputIntent + /S/GTS_PDFX^^J + /OutputCondition (\pdfx@cmyk@intent)^^J + /OutputConditionIdentifier (\pdfx@cmyk@identifier)^^J + /Info(\pdfx@cmyk@intent)^^J + /RegistryName(\pdfx@cmyk@registry)^^J +%% extra dictionary required for PDF/X-4p and PDF/X-5pg + /DestOutputProfileRef \OBJ@ICC + }% +%% + \else % PDF/X-1 , PDF/X-1a , PDF/X-3 , PDF/X-4 , PDF/X-5g +%% + \ifpdfx@cmyk + \IfFileExists{"\pdfx@cmyk@profile"}{% + % embedded CMYK color profile + %% + %% Output Intent dictionary, with object reference + \def\pdfx@outintent@dict{% + /Type/OutputIntent + /S/GTS_PDFX^^J + /OutputCondition (\pdfx@cmyk@intent)^^J + /OutputConditionIdentifier (\pdfx@cmyk@identifier)^^J + /Info(\pdfx@cmyk@intent)^^J + /RegistryName(\pdfx@cmyk@registry) + /DestOutputProfile \OBJ@CMYK + }% + \def\pdfx@numcoords{/N 4}% +%% + \ifxetex + \def\OBJ@CMYK{@colorprofile}% + \immediate\special{% + pdf:fstream \OBJ@CMYK (\pdfx@cmyk@profile) <<\pdfx@numcoords >>}% + \else % pdfTeX + \immediate\pdfobj stream attr{\pdfx@numcoords} file {\pdfx@cmyk@profile}% + \edef\OBJ@CMYK{\the\pdflastobj\space 0 R}% + \fi + \pdfcatalog{% + \pdfx@LanguageSpec + /OutputIntents [ << + /Type/OutputIntent + /S/GTS_PDFX + /OutputCondition (\pdfx@cmyk@intent)% + /OutputConditionIdentifier (\pdfx@cmyk@identifier)% + /Info(\pdfx@cmyk@intent)% + /RegistryName(\pdfx@cmyk@registry) + /DestOutputProfile \OBJ@CMYK + >> ]}% + }{% + \PackageError{pdfx}{No color profile \pdfx@cmyk@profilename\space found + to use for CMYK printing colors.}% + {Is this the correct directory: \pdfx@CMYKcolorprofiledir\space ?}% + }% end of \IfFileExists for CMYK + \else\ifpdfx@custom +%% allow Custom profile with PDF/X-5n + \IfFileExists{"\pdfx@customcolorprofiledir\pdfx@custom@profile"}{% +%% embedded Custom color profile +%% + %% Output Intent dictionary, with object reference + \def\pdfx@outintent@dict{% + /Type/OutputIntent + /S/GTS_PDFX^^J + /OutputConditionIdentifier (Custom)^^J + /OutputCondition (\pdfx@custom@identifier)^^J + /Info(\pdfx@custom@profile)^^J + /RegistryName(\pdfx@custom@registry) + /Registry(\pdfx@custom@registry) + /DestOutputProfileRef \OBJ@CustomDir + }% + \def\OBJ@CustomDir{<< + \pdfx@numcoords^^J + /URLs [ << /Type /Filespec ^^J/EF \OBJ@CustomFile^^J + /F (\pdfx@custom@profile) /UF (\pdfx@custom@profile) >>]^^J + >>} +%% need more attributes: + \def\pdfx@numcoords{% + /CheckSum <\pdfx@profile@checksum>^^J% + /ICCVersion <\pdfx@iccversion>% + /ProfileName (\pdfx@custom@profile)^^J% + /ProfileCS (\pdfx@custom@numcolors)^^J% + /ColorantTable [\pdfx@custom@colornames] + }% + \def\pdfx@custom@filespec{% + /Type /EmbeddedFile >>^^J + /Subtype (application/vnd.iccprofile ) + }% +%% + \ifxetex + \def\OBJ@CustomFile{@colorprofile}% + \immediate\special{pdf:fstream \OBJ@CustomFile + (\pdfx@customcolorprofiledir\pdfx@custom@profile) <<\pdfx@custom@filespec >>}% + \else % pdfTeX + \immediate\pdfobj stream attr{\pdfx@custom@filespec} file % + {\pdfx@customcolorprofiledir\pdfx@custom@profile}% + \edef\OBJ@CustomFile{\the\pdflastobj\space 0 R}% + \fi + \pdfcatalog{% + \pdfx@LanguageSpec + /OutputIntents [ << \pdfx@outintent@dict >>]}% + }{% + \PackageError{pdfx}% + {No color profile \pdfx@custom@profile\space found to use for Custom printing colors.}% + {Is this the correct directory: \pdfx@customcolorprofiledir\space ?}% + }% end of \IfFileExists for Custom + \global\pdfx@cmyktrue % for TeX coloring +%% + \else % allow RGB profile with PDF/X ??? + \ifpdfx@noerr + \PackageWarning{pdfx}{PDF/X normally requires a CMYK color profile.^^J + Assuming RGB profile is of type 'prtr' not 'mntr'.^^J^^J}% + \else + \PackageError{pdfx}{PDF/X normally requires a CMYK color profile.}% + {To use RGB ensure profile is of type 'prtr' not 'mntr'.^^J^^J}% + \fi + % embedded RGB color profile + %% + %% Output Intent dictionary, with object reference + \def\pdfx@outintent@dict{% + /Type /OutputIntent + /S/GTS_PDFX^^J + /OutputConditionIdentifier (\pdfx@rgb@identifier)^^J + /DestOutputProfile \OBJ@RGB^^J + /Info(\pdfx@rgb@info)^^J + /RegistryName(\pdfx@rgb@registry) + }% + \IfFileExists{"\pdfx@rgb@profile"}{% + \def\pdfx@numcoords{/N 3 /Alternate/DeviceRGB} + \ifxetex + \immediate\special{% + pdf:fstream @colorprofile (\pdfx@rgb@profile) << \pdfx@numcoords >>} + \def\OBJ@RGB{@colorprofile}% + \else + \immediate\pdfobj stream attr{\pdfx@numcoords} file{\pdfx@rgb@profile}% + \edef\OBJ@RGB{\the\pdflastobj\space 0 R}% + \fi + \edef\pdfx@outintent@dict{% + /Type /OutputIntent + /S/GTS_PDFX + /OutputConditionIdentifier (\pdfx@rgb@identifier)% + /DestOutputProfile \OBJ@RGB + /Info(\pdfx@rgb@info) + /RegistryName(\pdfx@rgb@registry) + }% + \ifxetex + \def\OBJ@RGB{ @colorprofile }% + \immediate\special{% + pdf:fstream @colorprofile (\pdfx@rgb@profile) <<\pdfx@numcoords >>} + \else %% pdfTeX or LuaTeX + \immediate\pdfobj stream attr{\pdfx@numcoords} file{\pdfx@rgb@profile}% + \edef\OBJ@RGB{\the\pdflastobj\space 0 R}% + \fi + }{% + \PackageError{pdfx}% + {No color profile \pdfx@rgb@profilename\space found to use for RGB screen colors.}% + {Is this the correct directory: \pdfx@RGBcolorprofiledir\space ?}% + }% end of \IfFileExists for RGB + \fi % end of \ifpdfx@custom + \fi % end of \ifpdfx@cmyk + \fi % end of \ifno@iccprofile +%% end of PDF/X +\else +%% PDF/A and PDF/E can specify a CMYK profile + \expandafter\ifx\expandafter\relax\pdfx@rgb@profile\relax + \global\pdfx@cmyktrue + \IfFileExists{"\pdfx@cmyk@profile"}{% + \def\pdfx@numcoords{/N 4} + % embedded CMYK color profile + \ifxetex + \def\OBJ@CMYK{@colorprofile}% + \special{pdf:fstream @colorprofile (\pdfx@cmyk@profile) <<\pdfx@numcoords >>} + \else %% pdfTeX or LuaTeX + \immediate\pdfobj stream attr{\pdfx@numcoords} file{\pdfx@cmyk@profile}% + \edef\OBJ@CMYK{\the\pdflastobj\space 0 R}% + \fi + \edef\pdfx@outintent@dict{% + /Type /OutputIntent + \ifpdfx@e + /S/ISO_PDFE1 + \else + /S/GTS_PDFA1 + \fi + /OutputCondition (\pdfx@cmyk@intent)% use this or /Info ? + /OutputConditionIdentifier (\pdfx@cmyk@identifier)% + /DestOutputProfile \OBJ@CMYK + /Info(\pdfx@cmyk@intent)% + /RegistryName(\pdfx@cmyk@registry) + }% + }{% + \PackageError{pdfx}{No color profile \pdfx@cmyk@profilename\space found + to use for CMYK printing colors.}% + {Is this the correct directory: \pdfx@CMYKcolorprofiledir\space ?}% + }% end of \IfFileExists for CMYK + \else +%% PDF/A and PDF/E usually need an RGB color profile for on-screen rendering + \global\pdfx@cmykfalse + \expandafter\IfFileExists\expandafter{\pdfx@rgb@profile}{% + \def\pdfx@numcoords{/N 3 /Alternate/DeviceRGB} + \ifxetex + \def\OBJ@RGB{ @colorprofile }% + \immediate\special{pdf:fstream @colorprofile (\pdfx@rgb@profile) <<\pdfx@numcoords >>} + \else + \immediate\pdfobj stream attr{\pdfx@numcoords} file{\pdfx@rgb@profile}% + \edef\OBJ@RGB{\the\pdflastobj\space 0 R}% + \fi + \edef\pdfx@outintent@dict{% + /Type /OutputIntent + \ifpdfx@e + /S/ISO_PDFE1 + \else + /S/GTS_PDFA1 + \fi + /OutputConditionIdentifier (\pdfx@rgb@identifier)% + /DestOutputProfile \OBJ@RGB + /Info(\pdfx@rgb@info) + /RegistryName(\pdfx@rgb@registry) + }% + }{% + \PackageError{pdfx}% + {No color profile \pdfx@rgb@profilename\space found to use for RGB screen colors.}% + {Is this the correct directory: \pdfx@RGBcolorprofiledir\space ?}% + }% end of \IfFileExists for RGB + \fi % end of ifx for PDF/A or PDF/E +\fi % end of ifpdfx@x +%% + \expandafter\ifx\csname pdfx@outintent@dict\endcsname\relax + \else +%% +%% build the OutputIntent array +%% + \ifxetex + \def\pdfx@outintents{ @outintentsarray }% + \def\pdfx@outintentref{ @outintent@dict }% + \immediate\special{pdf:obj \pdfx@outintentref << \pdfx@outintent@dict >>} + \immediate\special{pdf:obj \pdfx@outintents [ ]}% + \immediate\special{pdf:put \pdfx@outintents \pdfx@outintentref }% + \else + \immediate\pdfobj{<<\pdfx@outintent@dict>>}% + \edef\pdfx@outintents{[\the\pdflastobj\space 0 R]}% + \fi +%% +%% make the Catalog entry, if not already done +%% + \ifx\pdfx@outcatalog@dict\relax + \else + \pdfcatalog{\pdfx@outcatalog@dict}% + \fi +\fi % end of OutputIntent array and Catalog entry +\endgroup + +%% ---------------------------------------------------------------------- +%% Make a version of \xmp@Keywords and \xmp@Author where \sep has been +%% replaced by a comma. The first is for the pdf:Keywords property, +%% which accepts a comma-separated string of keywords, and seems to be +%% mandatory for PDF/A-1 compliance. The second is for the dc:creator +%% property. Although it is defined to be a sequence of authors, Adobe +%% Acrobat will in fact ignore and delete all except the first author. +%% Therefore, it's safer to always separate authors by commas. + +\begingroup + \let\pdfx@xmpunimarkup\relax + \pdfx@xmpmarkup + \ifluatex\else\ifxetex\else + \inputencoding{8bit}% + \fi\fi + \makeatletter + \IfFileExists{\pdfx@encodingfile}{% + \def\cf@encoding{L8U}\fontencoding{L8U}% + }{}% + \let\protect\@typeset@protect + \pdfx@xmpmarkup %% !!!!! no longer needed +%% \xdef\xmp@@Author{\xmp@Author}% no need to expand + \global\let\xmp@@Author\xmp@Author + \def\sep{; }% expand to replace \sep !!! no longer needed +%% \xdef\xmp@@Copyright{\xmp@Copyright}% + \global\let\xmp@@Copyright\xmp@Copyright +%% \xdef\xmp@@Keywords{\xmp@Keywords}% +%% \global\let\xmp@@Keywords\xmp@Keywords +%% \global\let\xmp@Keywords\@empty % + \global\let\xmp@@Keywords\@empty % don't use pdf:Keywords +\endgroup + +%% ---------------------------------------------------------------------- +\def\xmp@convertDate{\pdfx@getYear} +{\catcode`\D=12 \catcode`\:=12 + \gdef\pdfx@getYear D:#1#2#3#4{\edef\pdfx@xYear{#1#2#3#4}\pdfx@getMonth} +} +\def\pdfx@getMonth#1#2{\edef\pdfx@xMonth{#1#2}\pdfx@getDay} +\def\pdfx@getDay#1#2{\edef\pdfx@xDay{#1#2}\pdfx@getHour} +\def\pdfx@getHour#1#2{\edef\pdfx@xHour{#1#2}\pdfx@getMin} +\def\pdfx@getMin#1#2{\edef\pdfx@xMin{#1#2}\pdfx@getSec} +\def\pdfx@getSec#1#2{\edef\pdfx@xSec{#1#2}\pdfx@getTZh} +\def\pdfx@getTZh{\futurelet\pdfx@next\pdfx@getTzh@branches} + +{\catcode`\@=11 \catcode`\Z=12 \catcode`\+=12 \catcode`\-=12 +\gdef\pdfx@getTzh@branches{% + \ifx\pdfx@next Z\let\pdfx@getTzbranch\pdfx@getTznozone + \else\ifx\pdfx@next +\let\pdfx@getTzbranch\pdfx@getTzplus + \else\ifx\pdfx@next -\let\pdfx@getTzbranch\pdfx@getTzminus + \else\let\pdfx@getTzbranch\pdfx@getTzerror + \fi\fi\fi \pdfx@getTzbranch } + +\catcode`\0=12 +\gdef\pdfx@getTznozone Z#1\pdfx@getTzend{% + \edef\pdfx@xTzh{+00}\edef\pdfx@xTzm{00}} +\gdef\pdfx@getTzplus +#1'#2'#3\pdfx@getTzend{% + \edef\pdfx@xTzh{+#1}\edef\pdfx@xTzm{#2}% + \ifx\relax#2\relax\def\pdfx@xTzm{00}\fi} +\gdef\pdfx@getTzminus -#1'#2'#3\pdfx@getTzend{% + \edef\pdfx@xTzh{-#1}\edef\pdfx@xTzm{#2}% + \ifx\relax#2\relax\def\pdfx@xTzm{00}\fi} +%% +%% How to support XeTeX here ? +\expandafter\ifx\csname pdfcreationdate\endcsname\relax +%% \xdef\pdfx@convDate{2016-04-01}% April fool! +%% \xdef\xmp@convDate{2016-04-01}% April fool! +\else + \expandafter\expandafter\expandafter\xmp@convertDate\pdfcreationdate''\pdfx@getTzend + \xdef\pdfx@convDate{\pdfx@xYear\pdfx@xMonth\pdfx@xDay\pdfx@xHour + \pdfx@xMin\pdfx@xSec\pdfx@xTzh'\pdfx@xTzm'}% + \xdef\xmp@convDate{\pdfx@xYear-\pdfx@xMonth-\pdfx@xDay + T\pdfx@xHour:\pdfx@xMin:\pdfx@xSec\pdfx@xTzh:\pdfx@xTzm}% +\fi +}% end of \catcode + +%% ---------------------------------------------------------------------- +%% \pdfx@topdfstring\toka\tokb: Convert the string in \tokb to a format +%% appropriate for PDF /Info strings, i.e., PDFDoc encoding or UTF-16 +%% encoding, and store the result in \toka As a special case, if \tokb +%% is \@empty, set \toka to \@empty. + +\def\pdfx@topdfstring#1#2{% + \ifx#2\@empty + \global\let#1\empty + \else + \begingroup + \ifluatex\else\ifxetex\else + \inputencoding{utf8}% + \fi\fi + \hypersetup{pdfencoding=auto}% + \pdfstringdef#1{#2}% + \endgroup + \fi +} + +%% ---------------------------------------------------------------------- +%% if high-bit characters are already encoded as active +%% then \pdfstringdef probably changes their meaning +%% so save these for later reversion. +%% +\newif\ifpdf@activechars +{\ifnum\catcode`^^c0 = 13\relax \aftergroup\pdf@activecharstrue\fi}% +%% +%% normally not used with XeTeX or LuaTeX +%% + +\ifpdf@activechars + \global\let\pdfx@save@co ^^c0\relax + \global\let\pdfx@save@ci ^^c1\relax + \global\let\pdfx@save@cii ^^c2\relax + \global\let\pdfx@save@ciii ^^c3\relax + \global\let\pdfx@save@civ ^^c4\relax + \global\let\pdfx@save@cv ^^c5\relax + \global\let\pdfx@save@cvi ^^c6\relax + \global\let\pdfx@save@cvii ^^c7\relax + \global\let\pdfx@save@cviii ^^c8\relax + \global\let\pdfx@save@cix ^^c9\relax + \global\let\pdfx@save@ca ^^ca\relax + \global\let\pdfx@save@cb ^^cb\relax + \global\let\pdfx@save@cc ^^cc\relax + \global\let\pdfx@save@cd ^^cd\relax + \global\let\pdfx@save@ce ^^ce\relax + \global\let\pdfx@save@cf ^^cf\relax + \global\let\pdfx@save@do ^^d0\relax + \global\let\pdfx@save@di ^^d1\relax + \global\let\pdfx@save@dii ^^d2\relax + \global\let\pdfx@save@diii ^^d3\relax + \global\let\pdfx@save@div ^^d4\relax + \global\let\pdfx@save@dv ^^d5\relax + \global\let\pdfx@save@dvi ^^d6\relax + \global\let\pdfx@save@dvii ^^d7\relax + \global\let\pdfx@save@dviii ^^d8\relax + \global\let\pdfx@save@dix ^^d9\relax + \global\let\pdfx@save@da ^^da\relax + \global\let\pdfx@save@db ^^db\relax + \global\let\pdfx@save@dc ^^dc\relax + \global\let\pdfx@save@dd ^^dd\relax + \global\let\pdfx@save@de ^^de\relax + \global\let\pdfx@save@df ^^df\relax + \global\let\pdfx@save@eo ^^e0\relax + \global\let\pdfx@save@ei ^^e1\relax + \global\let\pdfx@save@eii ^^e2\relax + \global\let\pdfx@save@eiii ^^e3\relax + \global\let\pdfx@save@eiv ^^e4\relax + \global\let\pdfx@save@ev ^^e5\relax + \global\let\pdfx@save@evi ^^e6\relax + \global\let\pdfx@save@evii ^^e7\relax + \global\let\pdfx@save@eviii ^^e8\relax + \global\let\pdfx@save@eix ^^e9\relax + \global\let\pdfx@save@ea ^^ea\relax + \global\let\pdfx@save@eb ^^eb\relax + \global\let\pdfx@save@ec ^^ec\relax + \global\let\pdfx@save@ed ^^ed\relax + \global\let\pdfx@save@ee ^^ee\relax + \global\let\pdfx@save@ef ^^ef\relax + \global\let\pdfx@save@fo ^^f0\relax + \global\let\pdfx@save@fi ^^f1\relax + \global\let\pdfx@save@fii ^^f2\relax + \global\let\pdfx@save@fiii ^^f3\relax +\fi + +%% ---------------------------------------------------------------------- +%% detect when \sep is used for multiple authors +%% then suppress the /Author field in PDF /Info +\newif\ifpdfx@sep@infield@ +\let\pdfx@endparse\relax +\def\pdfx@parseforsep#1\sep#2\pdfx@endparse{% + \pdfx@sep@infield@false + \ifx\relax#2\relax\else\pdfx@sep@infield@true\fi +} + +\begingroup + \let\CATCODE\catcode + \let\ENDGROUP\endgroup + \let\GDEF\gdef + \CATCODE`\m 12 \CATCODE`\a 12 \CATCODE`\c 12 \CATCODE`\r 12 \CATCODE`\o 12 + \CATCODE`\: 12 \CATCODE`\- 12 \CATCODE`\> 12 + \GDEF\pdfx@DOSTRIP@MACRO macro:->#1\@{#1}% +\ENDGROUP +\def\pdfx@strip@macro#1{% + \expandafter\edef\expandafter#1\expandafter{% + \expandafter\pdfx@DOSTRIP@MACRO\meaning#1\@}% +} + +%% Convert the relevant XMP properties to PDF strings, expanding markup +%% (such as \sep, \&, \copyright, etc) in an appropriate way. +%% These PDF strings are actually not always necessary, but if supplied they +%% must match exactly what is in the XMP version. This may be impossible +%% if math symbols are used; e.g. Plane-1 alphanumerics. +%% Generally, it is better to *not* provide PDF-info strings; +%% instead just providing metadata through XMP. +%% This is not always enough Б─■ a driver may add it by default! +%% +%% But some PDF readers don't support XMP, so it is nice to have +%% /Info fields, when this can be done reliably. +%% +%% 2018-12-16: load package outside the grouping +\RequirePackage{stringenc}% +\begingroup + \catcode`\| 0 + \catcode `\\ 12 + |gdef |pdfx@parsebackslash#1{% + |begingroup + |def |pdfx@parsemacro{#1}% + |def |pdfx@parseout{}% + |expandafter |pdfx@doparsebackslash#1\|pdfx@endparse + } + |gdef |pdfx@doparsebackslash#1\#2|pdfx@endparse{% + |edef |pdfx@parseout{|pdfx@parseout#1}% + |ifx |relax#2|relax + |let |next |pdfx@parseend + |else + |edef |pdfx@parseout{|pdfx@parseout \\}% + |def |next{|pdfx@doparsebackslash#2|pdfx@endparse}% + |fi |next + } +|endgroup +\def\pdfx@parseend{% + \edef\next{\endgroup\def\expandafter\noexpand\pdfx@parsemacro{\pdfx@parseout}}% + \next +}% +\begingroup +%% \expandafter\ifx\csname pdf@escapehex\endcsname\relax +%% \PackageWarning{pdfx}{% +%% Missing an implementation of \string\pdf@escapehex ^^J +%% Translated Metadata cannot be generated as PDF strings.^^J}% +%% \def\pdfx@GeneratePdfString#1#2{}% +%% \def\pdfx@ConvertUTFtoBE#1#2{}% +%% \fi %%\else + \gdef\pdfx@GeneratePdfString#1#2{% + % converts a UTF-8 string to UTF-16be + \StringEncodingConvert{#1}{#2}{utf8}{utf16be}% + \edef\pdfx@tempii{#1}\relax + \xdef#1{\string\376\string\377\pdfescapestring{\pdfx@tempii}}% + }% + \gdef\pdfx@ConvertUTFtoBE#1#2{% + \setbox0=\hbox{% catch any rubbish escaping to the MVL + \def\cf@encoding{L8U}\fontencoding{L8U}% + \ifluatex +%% \let\pdfescapestring\luaescapestring + \else\ifxetex\else + \inputencoding{8bit}% + \fi\fi +%% \pdfx@xmpmarkup %% don't want some things + \pdfx@xmpunimarkup + \let\backslash\textbackslash + \edef\pdfx@temp{#2}% ensure XMP expands to UTF8 + \ifluatex + \pdfx@parsebackslash\pdfx@temp + \pdfstringdef{#1}{\pdfx@temp}% + \else\ifxetex + \pdfx@parsebackslash\pdfx@temp + \pdfstringdef{#1}{\pdfx@temp}% + \else + \pdfx@GeneratePdfString{#1}{\pdfx@temp}% + \fi\fi + }% end of \setbox + }% +%% \fi + \pdfx@pdfmarkup + \global\let\pdfx@pdfAuthor\@empty + \global\let\pdfx@pdfTitle\@empty + \global\let\pdfx@pdfSubject\@empty + \global\let\pdfx@pdfKeywords\@empty + \ifpdfx@nopdfinfo % transliterated strings present +%% RRM: this may still work with parser macros ??? + \expandafter\ifx\expandafter\relax\xmp@Title\relax\else + \pdfx@ConvertUTFtoBE{\pdfx@pdfTitle}{\xmp@Title}% + \fi + \expandafter\ifx\expandafter\relax\xmp@Subject\relax\else + \pdfx@ConvertUTFtoBE{\pdfx@pdfSubject}{\xmp@Subject}% + \fi +\else %% pdfx@nopdfinfofalse + \expandafter\ifx\expandafter\relax\xmp@Title\relax\else + \ifluatex + \pdfx@ConvertUTFtoBE\pdfx@pdfTitle\xmp@Title + \else\ifxetex + \pdfx@ConvertUTFtoBE\pdfx@pdfTitle\xmp@Title + \else +%% \pdfx@GeneratePdfString\pdfx@pdfTitle\xmp@Title % why does this fail ??? + \pdfx@ConvertUTFtoBE{\pdfx@pdfTitle}{\xmp@Title}% ??? RRM 2019-02-17 + \fi\fi + \fi + \expandafter\ifx\expandafter\relax\xmp@Subject\relax\else + \ifluatex + \pdfx@ConvertUTFtoBE\pdfx@pdfSubject\xmp@Subject + \else\ifxetex + \pdfx@ConvertUTFtoBE\pdfx@pdfSubject\xmp@Subject + \else +%% \pdfx@GeneratePdfString\pdfx@pdfSubject\xmp@Subject % why does this fail ??? + \pdfx@ConvertUTFtoBE{\pdfx@pdfSubject}{\xmp@Subject}% 2019-02-17 + \fi\fi + \fi + \fi % end of \ifpdfx@nopdfinfo + \pdfx@topdfstring\pdfx@CreatorTool\xmp@CreatorTool + \pdfx@topdfstring\pdfx@Producer\xmp@Producer +%% \pdfescapestring needed +%% \expandafter\ifx\csname pdfescapestring\endcsname\relax +%% \else + \expandafter\ifx\expandafter\relax\xmp@Author\relax + \else +%% check for multiple authors with parser macro + \expandafter\pdfx@parseforsep\xmp@Author\sep\pdfx@endparse + \ifpdfx@sep@infield@ + \else + \pdfx@ConvertUTFtoBE{\pdfx@pdfAuthor}{\xmp@Author}% + \fi %% end of \ifpdfx@sep@infield@ + \fi %% end of \xmp@Author test + \expandafter\ifx\expandafter\relax\xmp@Keywords\relax + \else +%% check for multiple keywords with parser macro + \expandafter\pdfx@parseforsep\xmp@Keywords\sep\pdfx@endparse + \ifpdfx@sep@infield@ + \else + \pdfx@ConvertUTFtoBE{\pdfx@pdfKeywords}{\xmp@Keywords}% + \fi %% end of \ifpdfx@sep@infield@ + \fi %% end of \xmp@Keywords test +%% +%% \fi %% end of \pdfescapestring test +\endgroup + +%% Affects CMap creation for certain fonts, according to glyph names +%% How to support XeTeX here ? +%% Maybe it's best to be using an updated mmap.sty ? +\ifxetex +\else + \input glyphtounicode.tex + \input glyphtounicode-cmr.tex + \input glyphtounicode-ntx.tex + \pdfgentounicode=1 +\fi +\ifgrkLGRxmp + \ifxetex\else + \pdfglyphtounicode{internalchar2}{200D}% +\fi \fi + +%% patch to place accents *after* the base character, rather than before +%% based on coding from mmap.sty by RRM +\newif\ifPDFX@inaccent +\let\LTX@add@accent\add@accent +\def\PDFX@add@accent#1#2{% + \hmode@bgroup + \let \hmode@start@before@group \@firstofone + \setbox\@tempboxa\hbox{\PDFX@inaccenttrue + #2\global\mathchardef\accent@spacefactor\spacefactor}% + #2\kern-\wd\@tempboxa +%% \ifdim\ht\@tempboxa>1ex\relax + \dimen@=\ht\@tempboxa\advance\dimen@-1ex\relax +%%% reduce how much a nested accent is raised + \ifPDFX@inaccent\advance\dimen@-.2ex\relax\fi + \raise\dimen@\hbox to\wd\@tempboxa{\hss + \accent#1{\vphantom{#2}}\hss}% +%% \else +%% \accent#1{%\vphantom{#2} +%% \vrule width\z@ height\ht\@tempboxa depth\dp\@tempboxa}% +%% \fi + \egroup + \spacefactor\accent@spacefactor +} +%% same for named accents in math-mode +\def\pdfx@mathaccentV#1#2#3#4#5{% + #5{\mathsurround=\z@\relax + \everymath{}% + \mathchoice + {\setbox\z@\hbox{$\displaystyle #5$}\kern-\wd\z@}% + {\setbox\z@\hbox{$\textstyle #5$}\kern-\wd\z@}% + {\setbox\z@\hbox{$\scriptstyle #5$}\kern-\wd\z@}% + {\setbox\z@\hbox{$\scriptscriptstyle #5$}\kern-\wd\z@}% + }% + \AMS@mathaccentV{#1}{#2}{#3}{#4}{\phantom{#5}}% +} +\AtBeginDocument{% + \@ifpackageloaded{amsmath}{% + \let\AMS@mathaccentV\mathaccentV + \let\mathaccentV\pdfx@mathaccentV}% +}% + +%% How to support XeTeX here ? +%%%%% adjust accent characters to the Unicode Combining variant %%%% +\def\PDFX@combiningchars@unicode{% + \pdfglyphtounicode{grave}{0300}% + \pdfglyphtounicode{acute}{0301}% + \pdfglyphtounicode{circumflex}{0302}% + \pdfglyphtounicode{tilde}{0303}% + \pdfglyphtounicode{macron}{0304}% + \pdfglyphtounicode{Macronsmall}{0304}% + \pdfglyphtounicode{breve}{0306}% + \pdfglyphtounicode{dotaccent}{0307}% + \pdfglyphtounicode{Dotaccent}{0307}% + \pdfglyphtounicode{Dotaccentsmall}{0307}% + \pdfglyphtounicode{dieresis}{0308}% + \pdfglyphtounicode{ogonek}{0309}% + \pdfglyphtounicode{ring}{030A}% + \pdfglyphtounicode{hungarumlaut}{030B}% + \pdfglyphtounicode{caron}{030C}% + \pdfglyphtounicode{cedilla}{0327}% + \pdfglyphtounicode{commaaccent}{0326}% droid + % tie accents in berenisadf lm stix and others + \pdfglyphtounicode{tieaccentlowercase}{0311}% + \pdfglyphtounicode{tieaccentcapital}{0361}% + \pdfglyphtounicode{newtieaccentlowercase}{0311}% + \pdfglyphtounicode{newtieaccentcapital}{0361}% + % cm-unicode + \pdfglyphtounicode{space_uni030D}{030D}% + \pdfglyphtounicode{space_uni030E}{030E}% + \pdfglyphtounicode{space_uni030F}{030F}% + \pdfglyphtounicode{space_uni0311}{0311}% + \pdfglyphtounicode{space_uni0321}{0321}% + \pdfglyphtounicode{space_uni0322}{0322}% + \pdfglyphtounicode{space_uni032A}{032A}% + \pdfglyphtounicode{space_uni032B}{032B}% + \pdfglyphtounicode{space_uni0335}{0335}% + \pdfglyphtounicode{space_uni0337}{0337}% + \pdfglyphtounicode{space_uni033A}{033A}% + \pdfglyphtounicode{space_uni033B}{033B}% + \pdfglyphtounicode{space_uni033C}{033C}% + \pdfglyphtounicode{space_uni034D}{034D}% +} + +\def\pdfx@check@accents{% + \ifx\add@accent\LTX@add@accent + \let\add@accent\PDFX@add@accent + \else + \expandafter\ifx\csname MT@orig@add@accent\endcsname\relax + \@ifpackageloaded{mmap}{}{% + \pdfx@ErrorWarning{another package has patched \string\add@accent }% + {Hit <return> to continue}{}{}}% + \else + \expandafter\let\csname MT@orig@add@accent\endcsname\PDFX@add@accent + \fi\fi + \ifxetex + \else + \PDFX@combiningchars@unicode +%% this is now handled by glyphtounicode-ntx.tex +%% \@ifpackageloaded{newtxmath}{% +%% \pdfglyphtounicode{vec}{20D7}% +%% \pdfglyphtounicode{rvec}{20D6}% +%% \pdfglyphtounicode{lrvec}{20E1}% +%% }{}% + \fi % end of \ifxetex + \let\pdfx@check@accents\unDefiNeD +} +\AtBeginDocument{\pdfx@check@accents} + +%% suppress hyperlinks when generating PDF/X +\def\pdfx@linkfile@pdfX#1#2#3{% + \Hy@colorlink\@filecolor#1\Hy@xspace@end} +\def\pdfx@linkstart@pdfX#1#2#3{% + \Hy@colorlink\@linkcolor#3\endgroup\Hy@xspace@end} +\def\pdfx@linkurl@pdfX#1#2{% + \Hy@colorlink\@urlcolor#1\endgroup\Hy@xspace@end} +\def\pdfx@StartlinkName@pdfX#1#2{} +\def\pdfx@close@pdflink{\Hy@VerboseLinkStop\Hy@endcolorlink}% +\def\pdfx@Acrobatmenu@noaction#1#2{#2} + +\ifpdfx@x + \let\hyper@linkfile\pdfx@linkfile@pdfX + \let\hyper@linkurl\pdfx@linkurl@pdfX + \let\hyper@linkstart\pdfx@linkstart@pdfX + \let\hyper@linkend\relax + \let\Hy@StartlinkName\pdfx@StartlinkName@pdfX + \let\close@pdflink\pdfx@close@pdflink + \let\AcrobatMenu\pdfx@Acrobatmenu@noaction + \Hy@bookmarksfalse +%% {\def\sep{;}% should not be needed, but just in case + \AtBeginDocument{% + % cancel annotations and links + % + \def\PDF@FinishDoc{% ??? What uses this ??? + \begingroup + \def\sep{; }% should not be needed, but just in case + \pdfinfo{% + \ifx\pdfx@pdfTitle\@empty\else /Title(\pdfx@pdfTitle)^^J\fi + \ifx\pdfx@pdfAuthor\@empty\else /Author(\pdfx@pdfAuthor)^^J\fi + \ifx\pdfx@pdfSubject\@empty\else /Subject(\pdfx@pdfSubject)^^J\fi + \ifx\pdfx@pdfKeywords\@empty\else /Keywords(\pdfx@pdfKeywords)^^J\fi + /Creator(\pdfx@CreatorTool)^^J% + \ifx\@pdfcreationdate\@empty + /CreationDate(D:\pdfx@convDate)% + \else + \ifxetex\else + /CreationDate(\@pdfcreationdate)% + \fi\fi + \ifx\@pdfmoddate\@empty + /ModDate(D:\pdfx@convDate)% + \else + /ModDate(\@pdfmoddate)% + \fi + ^^J/Producer(\pdfx@Producer)% + /Trapped/False^^J% + \ifnum\xmp@Part=1 + /GTS_PDFXVersion(PDF/X-1\ifnum\xmp@ReleaseDate>2001 + \xmp@Conformance\fi:\xmp@ReleaseDate)% + \else + /GTS_PDFXVersion(PDF/X-\xmp@Part\xmp@Conformance + \ifnum\xmp@Part< 4 :\xmp@ReleaseDate\fi)% + \fi + \ifnum\xmp@Part < 3 + /GTS_PDFXConformance(PDF/X-\xmp@Part\xmp@Conformance + :\xmp@ReleaseDate)% + \fi + \ifpdfx@vt +%% support for PDF/VT extensions of PDF/X-4 and PDF/X-5 + /GTS_PDFVTVersion(PDF/VT-\xmp@vtPart\xmp@vtConformance)% + \fi + }%% end of PDF/X info + \endgroup %% end of scope for \sep + }%% end of \PDF@FinishDoc + }% end of \AtBeginDocument +%% \pdfinfo{% order of these dictionary keys should not matter +%% \ifx\pdfx@Author\@empty\else /Author(\pdfx@Author)\fi +%% /CreationDate(D:\pdfx@convDate)% +%% /Creator(\pdfx@CreatorTool)% +%% \ifnum\xmp@Part=1 +%% /GTS_PDFXVersion(PDF/X-1\ifnum\xmp@ReleaseDate>2001 +%% \xmp@Conformance\fi:\xmp@ReleaseDate)% +%% \else +%% /GTS_PDFXVersion(PDF/X-\xmp@Part\xmp@Conformance +%% \ifnum\xmp@Part< 4 :\xmp@ReleaseDate\fi)% +%% \fi +%% \ifnum\xmp@Part < 3 +%% /GTS_PDFXConformance(PDF/X-\xmp@Part\xmp@Conformance +%% :\xmp@ReleaseDate)% +%% \fi +%% +%% \ifpdfx@vt +%%% support for PDF/VT extensions of PDF/X-4 and PDF/X-5 +%% /GTS_PDFVTVersion(PDF/VT-\xmp@vtPart\xmp@vtConformance)% +%% \fi +%% \ifx\pdfx@Keywords\@empty\else /Keywords(\pdfx@Keywords)\fi +%% /ModDate(D:\pdfx@convDate)% +%% /Producer(\pdfx@Producer)% +%% \ifx\pdfx@Subject\@empty\else /Subject(\pdfx@Subject)\fi +%% \ifx\pdfx@Title\@empty\else /Title(\pdfx@Title)\fi +%% /Trapped/False% +%% }% end of PDF/X info +%% }% end of scope for \sep +\else + \ifpdfx@e %% PDF/E + \AtBeginDocument{% + \def\PDF@FinishDoc{% ??? What uses this ??? + \begingroup + \def\sep{; }% should not be needed, but just in case + \pdfinfo{% + \ifx\pdfx@pdfTitle\@empty\else /Title(\pdfx@pdfTitle)^^J\fi + \ifx\pdfx@pdfAuthor\@empty\else /Author(\pdfx@pdfAuthor)^^J\fi + \ifx\pdfx@pdfSubject\@empty\else /Subject(\pdfx@pdfSubject)^^J\fi + \ifx\pdfx@pdfKeywords\@empty\else /Keywords(\pdfx@pdfKeywords)^^J\fi + /Creator(\pdfx@CreatorTool)^^J% + \ifx\@pdfcreationdate\@empty + /CreationDate(D:\pdfx@convDate)% + \else + \ifxetex\else + /CreationDate(\@pdfcreationdate)% + \fi\fi + \ifx\@pdfmoddate\@empty + /ModDate(D:\pdfx@convDate)% + \else + /ModDate(\@pdfmoddate)% + \fi + ^^J/Producer(\pdfx@Producer)% + /Trapped/False^^J% + /GTS_PDFEVersion(PDF/E-1\xmp@Conformance:\xmp@ReleaseDate)% + }% end of PDF/E info + \endgroup %% end of scope for \sep + }% end of \PDF@FinishDoc + }% end of \AtBeginDocument +%% {\def\sep{;}% should not be needed, but just in case +%% \pdfinfo{% order of these dictionary keys should not matter +%% \ifx\pdfx@Title\@empty\else /Title(\pdfx@Title)\fi +%% \ifx\pdfx@Author\@empty\else /Author(\pdfx@Author)\fi +%% \ifx\pdfx@Subject\@empty\else /Subject(\pdfx@Subject)\fi +%% \ifx\pdfx@Keywords\@empty\else /Keywords(\pdfx@Keywords)\fi +%% \ifx\pdfx@Author\@empty\else /Author(\pdfx@Author)\fi +%% /CreationDate(\pdfx@convDate)% +%% /Creator(\pdfx@CreatorTool)% +%% /GTS_PDFEVersion(PDF/E-1\xmp@Conformance:\xmp@ReleaseDate)% +%% \ifx\pdfx@Keywords\@empty\else /Keywords(\pdfx@Keywords)\fi +%% /ModDate(D:\pdfx@convDate)% +%% /Producer(\pdfx@Producer)% +%% \ifx\pdfx@Subject\@empty\else /Subject(\pdfx@Subject)\fi +%% \ifx\pdfx@Title\@empty\else /Title(\pdfx@Title)\fi +%% /Trapped/False% +%% }% end of PDF/E info +%% }% end of scope for \sep + \else %% PDF/A + \def\pdfx@confA{a}% + \def\pdfx@confB{b}% + \def\pdfx@confU{u}% + \expandafter\def\expandafter\xmp@conf\expandafter + {\csname pdfx@conf\xmp@Conformance\endcsname}% + \AtBeginDocument{% + \def\PDF@FinishDoc{% ??? What uses this ??? + \begingroup + \def\sep{; }% should not be needed, but just in case + \pdfinfo{% + \ifx\pdfx@pdfTitle\@empty\else /Title(\pdfx@pdfTitle)^^J\fi + \ifx\pdfx@pdfAuthor\@empty\else /Author(\pdfx@pdfAuthor)^^J\fi + \ifx\pdfx@pdfSubject\@empty\else /Subject(\pdfx@pdfSubject)^^J\fi + \ifx\pdfx@pdfKeywords\@empty\else /Keywords(\pdfx@pdfKeywords)^^J\fi + /Creator(\pdfx@CreatorTool)^^J% + \ifx\@pdfcreationdate\@empty + /CreationDate(D:\pdfx@convDate)% + \else + \ifxetex\else + /CreationDate(\@pdfcreationdate)% + \fi\fi + \ifx\@pdfmoddate\@empty + /ModDate(D:\pdfx@convDate)% + \else + /ModDate(\@pdfmoddate)% + \fi + ^^J/Producer(\pdfx@Producer)% + /Trapped/False^^J% + /GTS_PDFA1Version (PDF/A-\xmp@Part\xmp@conf:\xmp@ReleaseDate)% + }% end of PDF/A info + \endgroup %% end of scope for \sep + }% end of \PDF@FinishDoc + }% end of \AtBeginDocument +\fi\fi + +%%---------------------------------------------------------------------- +%% 2018-12-16: xmpincl needs the ifthen package +%% it should be loaded outside the grouping, else biblatex may barf +%% +\RequirePackage{ifthen} +\begingroup +%% override the \ifpdf check of xmpincl package, inside the grouping + \pdftrue + \RequirePackage{xmpincl} +%% combine coding from xmpincl and hyperxml to support XeTeX +\def\pdfx@xmpincl@xetex#1{% + \IfFileExists{#1.xmp}{% + \mcs@xmpincl@patchFile{#1}% + \begingroup + \special{pdf:fstream @pdfx@Metadata (#1.xmpi) + << + /Type /Metadata + /Subtype /XML + >> + }% + \special{pdf:put @catalog + << + /Metadata @pdfx@Metadata + >> + }% + \endgroup + }{% + \newcommand{\mcs@xmpincl@filename}{#1.xmp}% + \PackageError{xmpincl}% + {The file \mcs@xmpincl@filename\space was not found}% + {The file \mcs@xmpincl@filename\space The metadata file + wasn't found.\MessageBreak Oops.}% + } +} +\ifxetex + \let\includexmp\pdfx@xmpincl@xetex +\fi + +%% macro provided by Leonardo E. Segovia on 2017-05-15 +%% <leonardo.segovia@cs.uns.edu.ar> +\def\pdfx@xmpincl@luatex#1{% + \IfFileExists{#1.xmp}{% + \mcs@xmpincl@patchFile{#1}% + \begingroup + \pdfcompresslevel=0 + \immediate\pdfobj uncompressed stream attr {/Type /Metadata /Subtype /XML} + file{#1.xmpi}% + \pdfcatalog{%\pdfx@LanguageSpec + /Metadata \the\pdflastobj\space 0 R}% + \endgroup + }{% + \newcommand{\mcs@xmpincl@filename}{#1.xmp}% + \PackageError{xmpincl}% + {The file \mcs@xmpincl@filename\space was not found}% + {The file \mcs@xmpincl@filename\space The metadata file + wasn't found.\MessageBreak Oops.}% + } +} +\ifluatex + \let\includexmp\pdfx@xmpincl@luatex +\fi + +%%---------------------------------------------------------------------- +\begingroup + \ifpdfx@x + \ifpdfx@vt + \def\xmp@template{pdfvt}% + \else + \def\xmp@template{pdfx}% formerly pdfx-1a + \fi + \else + \ifpdfx@e + \def\xmp@template{pdfe}% + \else + \def\xmp@template{pdfa}% + \fi\fi + \catcode`\'=12 \catcode`\<=12 \catcode`\>=12 \catcode`\?=12 + \catcode`\"=12 \catcode`\= 12 %% used within the template file +%% patch commands from xmpincl.sty ... + \def\pdfx@xmpinclStart{% supply byte-order marker + <?xpacket begin='^^ef^^bb^^be' id='W5M0MpCehiHzreSzNTczkc9d' ?> % + }% + \def\pdfx@xmpinclStartAlt{% no byte-order marker + <?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d' ?> % + }% + \def\pdfx@xmpinclEnd{% allow XMP packet to be writable + <?xpacket end='w'?> % + }% + \let\mcs@xmpinclStart\pdfx@xmpinclStart + \let\mcs@xmpinclStartAlt\pdfx@xmpinclStartAlt + \ifpdfx@noBOM % don't use the byte-order marker + \let\mcs@xmpinclStart\pdfx@xmpinclStartAlt + \fi + \let\mcs@xmpinclEnd\pdfx@xmpinclEnd +%% ... preventing their redefinition + \def\newcommand#1#2{}% +%% +%% \def\pdfx@endeval{% +%% \noexpand \TE@setvaltrue \noexpand \else +%% \noexpand \TE@setvalfalse \noexpand \fi +%% \noexpand \TE@negatefalse \noexpand \fi}% +%% \let\TE@endeval\pdfx@endeval + \ifluatex\else\ifxetex\else + \inputencoding{8bit}% + \fi\fi + \makeatletter + \def\cf@encoding{L8U}\fontencoding{L8U}% + \providecommand{\ifnot@empty}[2]{\ifx#1\@empty\relax\else#2\fi}% + \pdfx@xmpmarkup +\expandafter\global\expandafter + \let\csname L8U-cmd\expandafter\endcsname\csname U-cmd\endcsname + \def\cf@encoding{L8U}\fontencoding{L8U}% + \providecommand{\ifnot@empty}[2]{\ifx#1\@empty\relax\else#2\fi}% + \obeyspaces% +%% beware 128 space characters -- for padding end of XMP packet + \gdef\paddingline{ }% + \typeout{Using XMP template file: \xmp@template.xmp}% + \includexmp{\xmp@template}% +\endgroup + +%% +%% revert active characters to previous encoding +%% +\ifpdf@activechars + \global\let ^^c0\pdfx@save@co + \global\let ^^c1\pdfx@save@ci + \global\let ^^c2\pdfx@save@cii + \global\let ^^c3\pdfx@save@ciii + \global\let ^^c4\pdfx@save@civ + \global\let ^^c5\pdfx@save@cv + \global\let ^^c6\pdfx@save@cvi + \global\let ^^c7\pdfx@save@cvii + \global\let ^^c8\pdfx@save@cviii + \global\let ^^c9\pdfx@save@cix + \global\let ^^ca\pdfx@save@ca + \global\let ^^cb\pdfx@save@cb + \global\let ^^cc\pdfx@save@cc + \global\let ^^cd\pdfx@save@cd + \global\let ^^ce\pdfx@save@ce + \global\let ^^cf\pdfx@save@cf + \global\let ^^d0\pdfx@save@do + \global\let ^^d1\pdfx@save@di + \global\let ^^d2\pdfx@save@dii + \global\let ^^d3\pdfx@save@diii + \global\let ^^d4\pdfx@save@div + \global\let ^^d5\pdfx@save@dv + \global\let ^^d6\pdfx@save@dvi + \global\let ^^d7\pdfx@save@dvii + \global\let ^^d8\pdfx@save@dviii + \global\let ^^d9\pdfx@save@dix + \global\let ^^da\pdfx@save@da + \global\let ^^db\pdfx@save@db + \global\let ^^dc\pdfx@save@dc + \global\let ^^dd\pdfx@save@dd + \global\let ^^de\pdfx@save@de + \global\let ^^df\pdfx@save@df + \global\let ^^e0\pdfx@save@eo + \global\let ^^e1\pdfx@save@ei + \global\let ^^e2\pdfx@save@eii + \global\let ^^e3\pdfx@save@eiii + \global\let ^^e4\pdfx@save@eiv + \global\let ^^e5\pdfx@save@ev + \global\let ^^e6\pdfx@save@evi + \global\let ^^e7\pdfx@save@evii + \global\let ^^e8\pdfx@save@eviii + \global\let ^^e9\pdfx@save@eix + \global\let ^^ea\pdfx@save@ea + \global\let ^^eb\pdfx@save@eb + \global\let ^^ec\pdfx@save@ec + \global\let ^^ed\pdfx@save@ed + \global\let ^^ee\pdfx@save@ee + \global\let ^^ef\pdfx@save@ef + \global\let ^^f0\pdfx@save@fo + \global\let ^^f1\pdfx@save@fi + \global\let ^^f2\pdfx@save@fii + \global\let ^^f3\pdfx@save@fiii +\fi + +\endgroup + +%% +%% controls the color model and conversions with xcolor package +%% +\ifpdfx@cmyk + % + % this will have been done already for PDF/X + % + \PassOptionsToPackage{cmyk,hyperref}{xcolor} + \def\pdfx@handlexcolor{\def\@@mod{cmyk}\selectcolormodel{cmyk}% + \convertcolorsUtrue\convertcolorsDtrue} + \ifpdfx@x + \else +%% \AtBeginDocument{% +%% \def\@linkcolor{0 1 1 0}% +%% \def\@anchorcolor{0 0 0 1}% +%% \def\@citecolor{1 0 1 0}% +%% \def\@filecolor{.5 0 0 .5}% +%% \def\@urlcolor{0 1 0 0}% +%% \def\@menucolor{0 1 1 0}% +%% \def\@runcolor{.5 0 0 .5}% +%% \def\@linkbordercolor{0 1 1 0}% +%% \def\@citebordercolor{1 0 1 0}% +%% \def\@filebordercolor{.5 0 0 .5}% +%% \def\@urlbordercolor{1 0 0 0}% +%% \def\@menubordercolor{0 1 1 0}% +%% \def\@runbordercolor{.7 0 0 .3}% +%% \def\Fld@bcolor{0 0 0 0}% +%% \def\Fld@bordercolor{0 1 1 0}% +%% } + \fi +\else + \PassOptionsToPackage{rgb,hyperref}{xcolor} + \def\pdfx@handlexcolor{\def\@@mod{rgb}\selectcolormodel{rgb}% + \convertcolorsUtrue\convertcolorsDtrue} +\fi +\@ifpackageloaded{xcolor}{\pdfx@handlexcolor + \ifpdfx@cmyk\else\color{black}\fi}{% + \AtBeginDocument{\@ifpackageloaded{xcolor}{\pdfx@handlexcolor}{}} +} + +%%---------------------------------------------------------------------- +%% Disable some actions in Beamer navigation +\@ifclassloaded{beamer}{% + \let\real@insertslidenavigationsymbol + \insertslidenavigationsymbol + \let\real@insertbackfindforwardnavigationsymbol + \insertbackfindforwardnavigationsymbol + \def\pdfx@insertslidenavigationsymbol{{% + \let\Acrobatmenu\pdfx@Acrobatmenu@noaction + \real@insertslidenavigationsymbol + }}% + \def\pdfx@insertbackfindforwardnavigationsymbol{{% + \let\Acrobatmenu\pdfx@Acrobatmenu@noaction + \real@insertbackfindforwardnavigationsymbol + }}% + \AtBeginDocument{% + \ifHy@pdfa + \let\insertslidenavigationsymbol + \pdfx@insertslidenavigationsymbol + \let\insertbackfindforwardnavigationsymbol + \pdfx@insertbackfindforwardnavigationsymbol + \fi}% +}{} + +%%---------------------------------------------------------------------- +\ifpdfx@transliterated +%% support for bookmarks with transliterated input + \ifxetex\let\pdf@escapehex\empty\fi % don't need it + \expandafter\ifx\csname pdf@escapehex\endcsname\relax + \PackageWarning{pdfx}{% + Missing an implementation of \string\pdf@escapehex ^^J + Translated Bookmarks cannot be generated.^^J}% + \newcommand{\pdfxBookmark}[4][]{#2[#1]{#4}}% + \else + \def\pdfx@GeneratePdfString#1#2{% + % converts a UTF-8 string to UTF-16be + \StringEncodingConvert{#1}{#2}{utf8}{utf16be}% + \edef#1{\string\376\string\377\pdfescapestring{#1}}% + } + \newtoks\pdfx@DisabledCommands + \def\pdfxDisableCommands#1{% + \expandafter\pdfx@DisabledCommands + \expandafter{\the\pdfx@DisabledCommands#1}} + \pdfxDisableCommands{% + \def\80{}% else \000\( --> \000\80\050 \000\000\050 + \aftergroup\let\aftergroup\HyPsd@ConvertToUnicode\aftergroup\@gobble} + \let\Hy@@writetorep\@@writetorep + \def\pdfx@@writetorep#1#2#3#4#5{% + \begingroup + \pdfx@xmpunimarkup + \pdfx@prebookmark + \edef\pdfstringdefPreHook{%\pdfstringdefPreHook + \the\pdfx@DisabledCommands}% + \Hy@@writetorep{#1}{#2}{#3}{#4}{#5}% + \endgroup + } + \newcommand{\pdfxBookmark}[4][]{% + \ifx\relax#3\relax + \PackageError{pdfx}{Unknown macro \string#3. + A proper bookmark cannot be created}% + {Proceed to process the \string#1 as usual.}% + #2{#4}% + \else + \ifluatex % use the utf8 directly + \let\pdfx@temp#3\relax + \def\pdfx@prebookmark{% + \pdfx@DisabledCommands{}% + \let#3\pdfx@temp + }% + \else\ifxetex % use the utf8 directly + \let\pdfx@temp#3\relax + \def\pdfx@prebookmark{% + \pdfx@DisabledCommands{}% + \let#3\pdfx@temp + }% + \else + % convert the utf8 to utf16be + \pdfxBookmarkString\pdfx@temp{#3}% + \fi\fi + \let\@@writetorep\pdfx@@writetorep + \ifx\empty#1\empty + \def#3{#4}% + #2{#3}% + \else + \def#3{#1}% + #2[#3]{#4}% + \fi + \let\@@writetorep\Hy@@writetorep + \fi + \ignorespaces + } +%% use as: \pdfxBookmark{\section}{\sectAtitle}{...} +%% use as: \pdfxBookmark[<opt-title>]{\section}{\sectAtitle}{...} +%% only needed by pdfTeX --- Lua-/XeTeX use the utf8 directly + \def\pdfxBookmarkString#1#2{% + \pdfx@GeneratePdfString#1{#2}% + \def\pdfx@prebookmark{% + \pdfxDisableCommands{\let#2#1}% + }% + } +%% use as: \pdfxBookmarkString\PdfSectA\sectAtitle +%% where \sectAtitle has been defined by e.g. +%% \pdfxEnableCommands{\xdef\sectAtitle{\textLGR{...}}} + + \fi % end of \ifx\pdf@escapehex\relax +\fi % end of \ifpdfx@transliterated + +%%---------------------------------------------------------------------- + +%% disable hyperref options, +%% to prevent changes that will cause an incompatibility + \Hy@DisableOption{pdfauthor}% + \Hy@DisableOption{pdftitle}% + \Hy@DisableOption{pdfsubject}% + \Hy@DisableOption{pdfcreator}% + \Hy@DisableOption{pdfcreationdate}% + \Hy@DisableOption{pdfmoddate}% + \Hy@DisableOption{pdfproducer}% + \Hy@DisableOption{pdfkeywords}% +%% once set correctly, don't let this change + \Hy@DisableOption{pdfa}\let\Hy@pdfafalse\relax\let\Hy@pdfatrue\relax +\endinput +%% +%% End of file `pdfx.sty'. +% \end{macrocode} +% \iffalse +%</package> +% \fi +% \Finale +% \let\newpage\relax +% \PrintIndex +% \PrintChanges +% \endinput diff --git a/macros/latex/contrib/pdfx/src/pdfx.ins b/macros/latex/contrib/pdfx/src/pdfx.ins new file mode 100644 index 0000000000..afd943fbb5 --- /dev/null +++ b/macros/latex/contrib/pdfx/src/pdfx.ins @@ -0,0 +1,41 @@ +\input docstrip.tex +%\keepsilent +\askforoverwritefalse + +\preamble + + Copyright (c) 2019, CV Radhakrishnan <cvr@river-valley.org>, + Han The Thanh <thanh@river-valley.org>, + Ross Moore <ross.moore@mq.edu.au>, + Peter Selinger <selinger@mathstat.dal.ca> + + This file may be distributed and/or modified under the conditions + of the LaTeX Project Public License, either version 1.2 of this + license or (at your option) any later version. The latest version + of this license is in: + + http://www.latex-project.org/lppl.txt + + and version 1.2 or later is part of all distributions of LaTeX + version 1999/12/01 or later. + +\endpreamble + +\generate{\file{pdfx.sty}{\from{pdfx.dtx}{package}}} + +\obeyspaces +\Msg{ *************************************************************} +\Msg{ * *} +\Msg{ * To finish the installation you have to move the files *} +\Msg{ * into a directory searched by TeX: *} +\Msg{ * *} +\Msg{ * *} +\Msg{ * To produce the documentation run the relevant file.dtx *} +\Msg{ * through pdfLaTeX or use the Makefile which is far *} +\Msg{ * more convenient. *} +\Msg{ * *} +\Msg{ * Happy TeXing! *} +\Msg{ * *} +\Msg{ *************************************************************} + +\endbatchfile diff --git a/macros/latex/contrib/pdfx/src/pdfx.xmpdata b/macros/latex/contrib/pdfx/src/pdfx.xmpdata new file mode 100644 index 0000000000..66eb644635 --- /dev/null +++ b/macros/latex/contrib/pdfx/src/pdfx.xmpdata @@ -0,0 +1,33 @@ +\Title{Generation of PDF/X- and PDF/A-compliant PDFs with pdfTeX \textemdash\ pdfx.sty} +\Author{\CVR\sep \Thanh\sep Ross Moore\sep Peter Selinger} +\Subject{This package supports generation of PDF/X-, PDF/A- and PDF/E-compliant documents, in most of their variants, using pdfLaTeX, LuaLaTeX and XeLaTeX.} +\Keywords{PDF/X-, PDF/A- and PDF/E-compliance\sep Multilingual Metadata\sep installation\sep \TeX Live \thisyear} +\PublicationType{manual} +\Contributor{Norbert Preining: 'colorprofiles' package} +\Copyright{Public domain.} +\Copyrighted{False} +\CopyrightURL{http://tug.org/texlive/} +\CoverDisplayDate{March \thisyear} +\CoverDate{\thisyear-03-10} +\CreatorTool{LaTeX + pdfx.sty with option \pdfxopt, from TeX Live \thisyear} +\Date{2017-05-18\sep 2017-06-23\sep 2018-11-29\sep 2018-12-22\sep 2019-02-08\sep 2019-03-10} +\Advisory{An earlier version of this documentation was published as: TUGboat 36, No.2, pp.136\textendash 142 (2015)} +\Advisory{v1.6: Added XMP support for PDF/UA-1. Added more Metadata fields and Language support.} +\Advisory{v1.6: Default RGB and CMYK profiles now require the colorprofiles.sty package.} +\Relation{Requires the colorprofiles package for RGB and CMYK default profiles.} +\Advisory{v1.6: Access more profiles, incl. to pdfaPilot's color profile folders.} +\Advisory{v1.6: Revised glyphtounicode.sty to use variation selectors.} +\Advisory{v1.6: altered maps to PUA codepoints.} +\Advisory{v1.6: added more glyphs via glyphtounicode-ntx.tex } +\Advisory{v1.6: Support for 8-bit Hebrew encodings, some Arabic and Devanagari.} +\Advisory{v1.6: Updated documentation, incl. for LaTeX changes.} +\Advisory{v1.6.1: Fixed issue with ifthen package; improved Metadata with LuaTeX and XeTeX.} +\Advisory{v.1.6.1: Flexibility with page boxes for PDF/X.} +\Advisory{v.1.6.2: Fixed passing of options to xcolor, and some glyphtounicode values.} +\Advisory{v.1.6.2: Fixed encoding issue. Extra warning when colorprofiles.tex is missing.} +\Advisory{v.1.6.3: Properly fixed encoding issue; supports \string\pdfomitcharset\ primitive.} +\Advisory{v.1.6.3: Reference to veraPDF validation software; additions to glyphtounicode-ntx.tex.} +\Advisory{v.1.6.3: Patched \string\mathaccentV\ to output accents after the base character.} +\pdfxEnableCommands{% + \def\CVR{C.V. Radhakrishnan}\def\Thanh{H\`an Th\eee Thanh}% + \def\eee{^^c3^^aa^^cc^^81 }} diff --git a/macros/latex/contrib/pdfx/src/rvdtx.sty b/macros/latex/contrib/pdfx/src/rvdtx.sty new file mode 100644 index 0000000000..1cc70d4877 --- /dev/null +++ b/macros/latex/contrib/pdfx/src/rvdtx.sty @@ -0,0 +1,409 @@ +% +% +% File: rvdtx.sty +% +% Auxiliary package to format *.dtx documents. +% +% Copyright (c) 2008, CV Radhakrishnan <cvr@river-valley.org>, +% +% This file may be distributed and/or modified under the conditions +% of the LaTeX Project Public License, either version 1.2 of this +% license or (at your option) any later version. The latest version +% of this license is in: +% +% http://www.latex-project.org/lppl.txt +% +% and version 1.2 or later is part of all distributions of LaTeX +% version 1999/12/01 or later. +% +% +\newcounter{colorscheme} + +\DeclareOption{red}{\setcounter{colorscheme}{0}} +\DeclareOption{green}{\setcounter{colorscheme}{2}} +\DeclareOption{orange}{\setcounter{colorscheme}{1}} +\ProcessOptions + +\RequirePackage[dvipsnames,svgnames]{xcolor} + +\ifcase\thecolorscheme +% +% Red color spec (default) +% + \colorlet{itemcolor}{DarkRed} + \colorlet{verbcolor}{Sepia} + \colorlet{botrulecolor}{DarkRed} + \colorlet{botbgcolor}{DarkRed} + \colorlet{botcolor}{white} + \colorlet{pgrulecolor}{DarkRed!10} + \colorlet{pgbgcolor}{DarkRed!50} + + \colorlet{quicklinkrulecolor}{white} + \colorlet{quicklinkcolor}{white} + \colorlet{topverticalrule}{white} + \colorlet{titlecolor}{white} + \colorlet{hlinkcolor}{white} + \colorlet{hlinktricolor}{white} + \colorlet{linkcolor}{orange} + \colorlet{urlcolor}{orange} + + \colorlet{arrayrulecolor}{olive!30} + \colorlet{seccolor}{brown} + + \colorlet{toprulecolor}{DarkRed} + \colorlet{topbgcolor}{DarkRed} + \colorlet{topcolor}{orange} +\or +% +% Orange color spec (default) +% + \colorlet{itemcolor}{brown} + \colorlet{verbcolor}{Sepia} + \colorlet{botrulecolor}{orange!25} + \colorlet{botbgcolor}{orange!15} + \colorlet{botcolor}{orange!80} + \colorlet{pgrulecolor}{orange} + \colorlet{pgbgcolor}{white} + + \colorlet{quicklinkrulecolor}{orange!40} + \colorlet{quicklinkcolor}{brown} + \colorlet{topverticalrule}{brown} + \colorlet{titlecolor}{brown} + \colorlet{hlinkcolor}{brown} + \colorlet{hlinktricolor}{orange!70} + \colorlet{linkcolor}{brown} + \colorlet{urlcolor}{brown} + + \colorlet{arrayrulecolor}{olive!30} + \colorlet{seccolor}{brown} + + \colorlet{toprulecolor}{orange!30} + \colorlet{topbgcolor}{orange!10} + \colorlet{topcolor}{brown!80} +% +% +\or% Green color specs +% +% + \colorlet{itemcolor}{OliveGreen} + \colorlet{verbcolor}{OliveGreen} + \colorlet{botrulecolor}{GreenYellow!25} + \colorlet{botbgcolor}{GreenYellow!30} + \colorlet{botcolor}{Green!80} + \colorlet{pgrulecolor}{GreenYellow} + \colorlet{pgbgcolor}{white} + + \colorlet{quicklinkrulecolor}{Green!40} + \colorlet{quicklinkcolor}{Green} + \colorlet{topverticalrule}{Green} + \colorlet{titlecolor}{DarkOliveGreen} + \colorlet{hlinkcolor}{DarkOliveGreen} + \colorlet{hlinktricolor}{Green!70} + \colorlet{linkcolor}{OliveGreen} + \colorlet{urlcolor}{OliveGreen} + + \colorlet{arrayrulecolor}{olive!30} + \colorlet{seccolor}{OliveGreen} + + \colorlet{toprulecolor}{GreenYellow!50} + \colorlet{topbgcolor}{GreenYellow!20} + \colorlet{topcolor}{GreenYellow!80} +\fi +% +\def\floatpagefraction{.99} +\usepackage{geometry} +\geometry{top=2in, + bottom=1in, + left=2in, + right=1in, + a4paper} + +\RequirePackage{comment,xspace} +\def\pdftex{pdf\TeX\xspace} +\def\defmacro#1{\texttt{\@bsl#1}} +\def\thanh{H\`an Th\^e Th\`anh\xspace} +\def\Thanh{H\`an Th\'{\^e} Th\`anh\xspace} + +\let\@DRAFTout@Hook\@empty +\newcommand{\DRAFTout}{\g@addto@macro\@DRAFTout@Hook} +\newcommand{\@DRAFTout@Out}{% + \afterassignment\@DRAFTout@Test + \global\setbox\@cclv= % + } +\newcommand{\@DRAFTout@Test}{% + \ifvoid\@cclv\relax + \aftergroup\@DRAFTout@Output + \else + \@DRAFTout@Output + \fi% + } +\newcommand{\@DRAFTout@Output}{% + \@DRAFTout@Hook% + \@DRAFTout@Org@Out\box\@cclv% + } +\newcommand{\@DRAFTout@Org@Out}{} +\newcommand*{\@DRAFTout@Init}{% + \let\@DRAFTout@Org@Out\shipout + \let\shipout\@DRAFTout@Out + } +\newdimen\OHeight +\setlength\OHeight{\textheight} +\addtolength\OHeight{\headheight} +\addtolength\OHeight{\headsep} +\addtolength\OHeight{\footskip} + +\newif\ifoverlay\overlayfalse + +\AtBeginDocument{\@DRAFTout@Init} +\newcommand{\@DraftOverlay@Hook}{} +\newcommand{\AddToDraftOverlay}{\g@addto@macro\@DraftOverlay@Hook} +\newcommand{\ClearDraftOverlay}{\let\@DraftOverlay@Hook\@empty} +\newcommand{\@DraftOverlay}{% + \ifx\@DraftOverlay@Hook\@empty + \else + \bgroup + \@tempdima=1in + \@tempcnta=\@tempdima + \@tempcntb=-\@tempdima + \advance\@tempcntb\paperheight + \ifoverlay + \global\setbox\@cclv\vbox{% + \box\@cclv + \vbox{\let\protect\relax% + \unitlength=1pt% + \pictur@(0,0)(\strip@pt\@tempdima,\strip@pt\@tempdimb)% + \@DraftOverlay@Hook% + \endpicture}}% + \else + \global\setbox\@cclv\vbox{% + \vbox{\let\protect\relax% + \unitlength=1sp% + \pictur@(0,0)(\@tempcnta,\@tempcntb)% + \@DraftOverlay@Hook% + \endpicture}% + \box\@cclv}% + \fi + \egroup + \fi +} + +\definecolor{gray30}{gray}{.7} +\definecolor{gray20}{gray}{.8} +\definecolor{gray10}{gray}{.9} + +\DRAFTout{\@DraftOverlay} +\long\def\puttext(#1)#2{\AddToDraftOverlay{% + \setlength{\unitlength}{1pt}\thinlines% + \put(#1){#2}}} + +\MakeShortVerb{\|} + +\IfFileExists{libertine.sty}{\RequirePackage[osf,tt]{libertine}}{} +\IfFileExists{sourcesanspro.sty} + {\RequirePackage[osf,light,semibold]{sourcesanspro}}{} +\IfFileExists{inconsolata.sty}{\RequirePackage[scaled=.95]{inconsolata} +%\IfFileExists{inconsolata.sty}{\RequirePackage[scaled=.95,noupquote]{inconsolata} + \def\ttdefault{zi4}}{\def\ttdefault{cmtt}} + +\def\theCodelineNo{\reset@font\tiny\arabic{CodelineNo}} + +\def\@seccntformat#1{\llap{\csname the#1\endcsname.\hspace*{6pt}}} +\def\section{\@startsection {section}{1}{\z@}% + {-3.5ex \@plus -1ex \@minus -.2ex}% + {2.3ex \@plus.2ex}% + {\normalfont\large\bfseries\color{seccolor}}} +\def\subsection{\@startsection{subsection}{2}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\normalfont\normalsize\bfseries\color{seccolor}}} +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\normalfont\normalsize\bfseries\color{seccolor}}} + +\let\sv@section\section + +\newwrite\qlinkwrite +\immediate\openout\qlinkwrite=\jobname.links +\renewcommand\section{\@ifstar{\star@section}{\normal@section}} +\def\star@section#1{\def\next{#1} + \sv@section*{#1}% + \immediate\write\qlinkwrite{\string\fxmark{section.\thesection}% + {\expandafter\strip@prefix\meaning\next}}% +} + +\newcommand\normal@section[2][]{\def\next{#1} + \ifx\next\@empty\def\next{#2}\else\if#1*\def\next{#1}\fi\fi + \sv@section[#1]{#2}% + \immediate\write\qlinkwrite{\string\fxmark{section.\thesection}% + {\expandafter\strip@prefix\meaning\next}}% +} + +%\RequirePackage[draft]{pdfdraftcopy} +% \draftstring{} + \puttext(0,36){\botstring}% + \puttext(0,842){\copy\topbox} + +\RequirePackage{colortbl} +\arrayrulecolor{arrayrulecolor} +\let\shline\hline +\def\hline{\noalign{\vskip3pt}\shline\noalign{\vskip4pt}} + +\RequirePackage{hyperref} +\hypersetup{pdftex,colorlinks} +\def\Hlink#1#2{\hyperlink{#2}{\color{hlinktricolor}% + $\blacktriangleright$~\color{hlinkcolor}#1}} + \def\@linkcolor{linkcolor} + \def\@urlcolor{urlcolor} + +\pagestyle{empty} +\def\version#1{\gdef\@version{#1}} +\def\@version{1.0} +\def\contact#1{\gdef\@contact{\texttt{#1}}} +\def\author#1{\gdef\@author{#1}} +\def\@author{River Valley Technologies} +\def\@contact{\texttt{support@river-valley.com}} +\def\keywords#1{\gdef\@keywords{#1}} +\def\@keywords{\LaTeX, \xml} + +\long\def\Hrule{\\[-4pt]\hspace*{-3em}% + {\color{quicklinkrulecolor}\rule{\linewidth}{0pt}}\\} + +\long\def\fxmark#1#2{\Hlink{#2}{#1}\Hrule} + +\newbox\topbox +\long\def\maketitle{\global\setbox\topbox=\vbox{\hsize=\paperwidth + \parindent=0pt + \fcolorbox{toprulecolor}{topbgcolor}% + {\parbox[t][1.5in][c]{\paperwidth}% + {\hspace*{15mm}% + \parbox[c]{.475\paperwidth}{\fontsize{18pt}{20pt}% + \raggedright\normalfont\sffamily \selectfont + \color{titlecolor} \@title\\[12pt] + \parbox{\linewidth}{\fontsize{12}{13.5}\fontseries{m}% + \sffamily\upshape\selectfont\@author\strut}% + }% + \hfill + \parbox[c][1.5in][c]{1mm}{\color{topverticalrule}% + \rule{.1pt}{1.5in}}% + \hfill + \parbox[c][1.5in][c]{.35\paperwidth}% + {\normalfont\footnotesize\sffamily\color{quicklinkcolor}% + \raggedcolumns\sffamily\fontsize{7.5}{8}\fontseries{m}\selectfont + \begin{multicols}{2}[QUICK LINKS] + \IfFileExists{tmp.links}{\input tmp.links}{}% + \end{multicols}% + }\hspace*{5mm}% + }% + }% + }% +} +\gdef\botstring{\fcolorbox{botrulecolor}{botbgcolor}% + {\parbox[t][.5in][t]{\paperwidth}% + {\normalfont\sffamily\fontseries{m}\footnotesize\selectfont% + \color{botcolor}% + \hspace*{5mm}\parbox[c][.5in][c]{.45\paperwidth}% + {\raggedright River Valley Technologies, + \href{http://www.river-valley.com}{% + \texttt{http://www.river-valley.com}}\\ + \textsc{jwra} 34, Jagathy, Trivandrum + 695014, India + }\hfill% + \parbox[c][.5in][c]{1cm} + {\centering\sffamily\fontseries{m}\selectfont + \fcolorbox{pgrulecolor}{pgbgcolor}{\thepage}% + }\hfill + \parbox[c][.5in][c]{.45\paperwidth} + {\raggedleft\sffamily\fontsize{7.5}{8}\fontseries{m}\selectfont + \begin{tabular}{rl}% + Version:&\@version/\@date\\[3pt] + Contacts:&\parbox{.3\paperwidth}{\@contact} + \end{tabular}\hspace*{5mm}% + }% + }% + }% + } + +\RequirePackage{enumitem,amsfonts,amssymb} + +\setitemize[1]{label={\small\color{itemcolor}$\blacktriangleright$},itemsep=0pt} +\setitemize[2]{label={\small\color{itemcolor}$\triangleright$},itemsep=0pt} +\setenumerate[1]{label={\small\color{itemcolor}\arabic*.},itemsep=0pt} + +\def\MacroFont{\fontencoding\encodingdefault + \fontfamily\ttdefault + \fontseries\mddefault + \fontshape\updefault + \color{verbcolor}\selectfont}% + +\def\verbatim@font{\normalfont\color{verbcolor}\fontfamily{zi4}\selectfont} + +\def\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi + \bgroup + \verb@eol@error \let\do\@makeother \dospecials + \verbatim@font\@noligs + \@ifstar\@sverb\@verb} + + +\def\@lbr{\expandafter\@gobble\string\{} +\def\@rbr{\expandafter\@gobble\string\}} +\def\@bsl{\expandafter\@gobble\string\\} +\def\@Bsl#1{\texttt{\@bsl#1}\xspace} +\def\trics#1{\protect\@Bsl{#1}} +\def\onecs#1{\protect\@Bsl{#1}} +%\let\trics\onecs + +\c@GlossaryColumns=1 +\c@IndexColumns=2 + +\def\index@prologue{\section[Index]{Index}% + \markboth{Index}{Index}% + Numbers written in italic refer to the page + where the corresponding entry is described; + numbers underlined refer to the + \ifcodeline@index + code line of the + \fi + definition; numbers in roman refer to the + \ifcodeline@index + code lines + \else + pages + \fi + where the entry is used. + } + +\renewcommand\glossary@prologue{% + \section[Change History]{Change History}\markboth {{Change History}}{{Change History}} +} +\renewenvironment{theglossary}{% + \glossary@prologue%][\GlossaryMin]% + \GlossaryParms \let\item\@idxitem \ignorespaces}% + {} + +\newenvironment{decl}[1][]% + {\par\small\addvspace{1.5ex plus 1ex}% + \vskip -\parskip + \ifx\relax#1\relax + \def\@decl@date{}% + \else + \def\@decl@date{\NEWfeature{#1}}% + \fi + \noindent%\hspace{-\leftmargini}% + \begin{tabular}{l}\hline\ignorespaces}% + {\\\hline\end{tabular}\nobreak\@decl@date\par\nobreak + \vspace{0.75ex}\vskip -\parskip\ignorespacesafterend\noindent} + +\def\Small{\fontsize{8.5}{9.5}\selectfont} +\def\PDF{\@ifnextchar/{\@PDF}{\@@PDF}} +\def\@PDF/#1{{\Small PDF/#1}} +\def\PDFVT{{\Small PDF/VT}\xspace} +\def\@@PDF{{\Small PDF}\xspace} +\def\ISO{{\Small ISO}\xspace} +\def\tsc#1{{\Small#1}\xspace} + +\endinput + +%% +%% End of file 'rvdtx.sty' +%% diff --git a/macros/latex/contrib/pdfx/src/text89.def b/macros/latex/contrib/pdfx/src/text89.def new file mode 100644 index 0000000000..30ae90ff7e --- /dev/null +++ b/macros/latex/contrib/pdfx/src/text89.def @@ -0,0 +1,32 @@ +\DeclareInputText{128}{?} +\DeclareInputText{129}{?} +\DeclareInputText{130}{?} +\DeclareInputText{131}{?} +\DeclareInputText{132}{?} +\DeclareInputText{133}{?} +\DeclareInputText{134}{?} +\DeclareInputText{135}{?} +\DeclareInputText{136}{?} +\DeclareInputText{137}{?} +\DeclareInputText{138}{?} +\DeclareInputText{139}{?} +\DeclareInputText{140}{?} +\DeclareInputText{141}{?} +\DeclareInputText{142}{?} +\DeclareInputText{143}{?} +\DeclareInputText{144}{?} +\DeclareInputText{145}{?} +\DeclareInputText{146}{?} +\DeclareInputText{147}{?} +\DeclareInputText{148}{?} +\DeclareInputText{149}{?} +\DeclareInputText{150}{?} +\DeclareInputText{151}{?} +\DeclareInputText{152}{?} +\DeclareInputText{153}{?} +\DeclareInputText{154}{?} +\DeclareInputText{155}{?} +\DeclareInputText{156}{?} +\DeclareInputText{157}{?} +\DeclareInputText{158}{?} +\DeclareInputText{159}{?} diff --git a/macros/latex/contrib/pdfx/src/usage-meta.png b/macros/latex/contrib/pdfx/src/usage-meta.png Binary files differnew file mode 100644 index 0000000000..4fb04ce4f2 --- /dev/null +++ b/macros/latex/contrib/pdfx/src/usage-meta.png |