From 55f834f428a0c05dedecc8d33a1c5300e58c91fc Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Wed, 24 Feb 2021 03:01:25 +0000
Subject: CTAN sync 202102240301

---
 .../contrib/pdfmanagement-testphase/ltdocinit.dtx  | 354 +++++++++++++++++++++
 1 file changed, 354 insertions(+)
 create mode 100644 macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx

(limited to 'macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx')

diff --git a/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx b/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx
new file mode 100644
index 0000000000..f37514d936
--- /dev/null
+++ b/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx
@@ -0,0 +1,354 @@
+% \iffalse meta-comment
+%
+%% File: ltdocinit.dtx
+%
+% Copyright (C) 2018-2021 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version.  The latest version
+% of this license is in the file
+%
+%    http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "LaTeX PDF management testphase bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+%    https://github.com/latex3/pdfresources
+%
+% for those people who are interested.
+%
+%<*driver>
+\RequirePackage{pdfmanagement-testphase}
+\DeclareDocumentMetadata{pdfstandard=A-2b}
+\makeatletter
+\declare@file@substitution{doc.sty}{doc-v3beta.sty}
+\makeatother
+\documentclass[full]{l3doc}
+\usepackage{array,booktabs,hyperxmp}
+\hypersetup{pdfauthor=The LaTeX Project,pdftitle=ltdocinit (LaTeX PDF management testphase bundle)}
+
+\begin{document}
+  \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+%   The \pkg{ltdocinit} module
+% }
+%
+% \author{^^A
+%  The \LaTeX{} Project\thanks
+%    {^^A
+%      E-mail:
+%        \href{mailto:latex-team@latex-project.org}
+%          {latex-team@latex-project.org}^^A
+%    }^^A
+% }
+%
+% \date{Version 0.95a, released 2021-02-22}
+%
+% \maketitle
+% \begin{documentation}
+%
+% \section{\pkg{ltdocinit} documentation}
+% This small module defines \cs{DeclareDocumentMetadata} and the related keys.
+% It also defines commands to store document properties in a global container.
+%
+% \subsection{\cs{DeclareDocumentMetadata}}
+%
+% \begin{function}{\DeclareDocumentMetadata}
+% \begin{syntax}
+%  \cs{DeclareDocumentMetadata}\Arg{key-value list}
+% \end{syntax}
+% \end{function}
+%
+% Currently there is no dedicated location to declare settings concerning
+% a document as a whole. Settings are placed somewhere in the preamble or
+% with the class options or even with some package options.
+% For some settings this can be too late,
+% for example the pdf version can no longer be changed if a
+% package has used code which already opened the PDF.
+%
+% \cs{DeclareDocumentMetadata} as a new command
+% should unify such settings in one place.
+% It should be used before \cs{documentclass}, directly after
+% loading \pkg{pdfmanagement-testphase}. \cs{DeclareDocumentMetadata}
+% can be used more than once.
+%
+% The keys defined for \cs{DeclareDocumentMetadata}
+% currently allows to set the PDF version, to set the PDF \texttt{/Lang},
+% to uncompress a pdf, to set the language and to declare a few PDF standards
+% and some colorprofiles.
+%
+% \cs{DeclareDocumentMetadata} is also used to
+% activate the new PDF management code and it loads
+% a number of required files for the PDF management code.
+% As this forces the loading of the backend files, a backend
+% which can't be detected automatically like |dvipdfmx|,
+% must be set in the first \cs{DeclareDocumentMetadata}.
+%
+% Currently the following keys are implemented
+%
+% \begin{description}
+%    \item[\texttt{backend}] passes the backend name to expl3.
+%    This will probably be extended to  pass the value also to packages.
+%    \item[\texttt{pdfversion}] e.g. \texttt{pdfversion=1.7}
+%    \item[\texttt{uncompress}] no value. Forces an uncompressed pdf.
+%    \item[\texttt{lang}] to set the Lang entry in the Catalog.
+%    E.g. \texttt{lang=de-DE}. The initial value is |en-US|
+%    \item[\texttt{pdfstandard}] Choice key to set the pdf standard.
+%      Currently |A-1b|, |A-2b| and |A-3b| are accepted as
+%      values. The underlying code to ensure the requirements (as far as they
+%      can be ensured) is incomplete, but a color profile is included and the
+%      /OutputIntent is set. More information can be found in the documentation
+%      of \pkg{l3pdfmeta}.
+%    \item[\texttt{colorprofiles}] This allows to load icc-colorprofiles. Details
+%    are described in the documentation of \pkg{l3pdfmeta}.
+%    \item[\texttt{pdfmanagement}] Boolean. This activates/deactivates
+%      the core management code. By default the value is true.
+%    \item[firstaidoff] This accepts a comma lists of keysword and disable the patches
+%    related to them. More information can be found in the documentation of
+%    \pkg{pdfmanagement-firstaid}.
+% \end{description}
+%
+% \subsection{Container for document properties}
+%
+% The module provides a container where classes, packages and users can store
+% properties of the document which are perhaps of interest
+% or use for other packages or the author.
+%
+% The properties are stored with a key |label/property|. The values can be
+% retrieved expandably.
+%
+% \begin{function}{\AddToDocumentProperties}
+% \begin{syntax}
+%  \cs{AddToDocumentProperties}\oarg{label}\Arg{property}\Arg{value}
+% \end{syntax}
+% This stores \meta{value} under the key \meta{label}/\meta{property}.
+% By default \meta{label} is the current package name |\@currname|. If another
+% label is choosen, it should be one which avoids clashes with other packages
+% using the container. The label |document| is reserved.
+% \end{function}
+%
+% \begin{function}{\GetDocumentProperties}
+% \begin{syntax}
+%  \cs{AddToDocumentProperties}\Arg{label/property}
+% \end{syntax}
+% Expands to the \meta{value} corresponding to \meta{label/property}
+% in the container. If \meta{label/property} is missing,
+% this has an empty expansion.
+% The result is returned within \cs{exp_not:n}, which means
+% that the \meta{value} does not expand further
+% when appearing in an x-type argument expansion.
+% \end{function}
+%
+% \begin{function}{\ShowDocumentProperties}
+% \begin{syntax}
+%  \cs{ShowDocumentProperties}
+% \end{syntax}
+% This show the current content of the container.
+% \end{function}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{ltdocinit} implementation}
+% \subsection{\cs{DeclareDocumentMetadata}}
+%    \begin{macrocode}
+%<@@=pdfmanagement>
+%<*header>
+\ProvidesExplPackage {ltdocinit} {2021-02-22} {0.95a}
+  {Initialize document metadata}
+%</header>
+%    \end{macrocode}
+% \cs{DeclareDocumentMetadata} should for now not be used after
+% \cs{documentclass} so we error in this case. It can be used more than once
+% but follow-up calls should not do the initialization code.
+%    \begin{macrocode}
+%<*package>
+\msg_new:nnn  { document } { setup-after-documentclass }
+              {
+                \token_to_str:N \DeclareDocumentMetadata \c_space_tl
+                should~be~used~only~before~\token_to_str:N\documentclass
+              }
+%    \end{macrocode}
+% \begin{macro}{\DeclareDocumentMetadata}
+%    \begin{macrocode}
+\NewDocumentCommand\DeclareDocumentMetadata { m }
+  {
+    \cs_if_eq:NNTF \documentclass \@twoclasseserror
+      { \msg_error:nn { document }{ setup-after-documentclass } }
+      {
+%    \end{macrocode}
+% The wanted backend must be detected first, we read the init key and then
+% force the loading by either loading l3pdf (+ expl3) or only expl3.
+%    \begin{macrocode}
+        \keys_set_groups:nnn { document / metadata} {init}{ #1 }
+        %should be loaded after the backend is set, and only if not in the kernel
+        \cs_if_free:NTF \pdf_uncompress:
+         {\RequirePackage{l3pdf}}{\RequirePackage{expl3}}
+%    \end{macrocode}
+% Now we load the extra backend code and set the boolean to true
+%    \begin{macrocode}
+        \ExplSyntaxOn\makeatletter
+          \file_input:n {l3backend-testphase-\c_sys_backend_str.def}
+        \ExplSyntaxOff\makeatother
+        \bool_gset_true:N \g_@@_active_bool
+%    \end{macrocode}
+% set the default language, process the rest of the keys,
+% and setup the generic driver
+%    \begin{macrocode}
+        \keys_set_filter:nnn  { document / metadata } { init } { lang=en-US, #1 }
+        \bool_if:NT \g_@@_active_bool
+          {
+            \PassOptionsToPackage{customdriver=hgeneric-testphase}{hyperref}
+          }
+%    \end{macrocode}
+% \cs{pdfmanagement_add:nnn} has collected values in this hook.
+%    \begin{macrocode}
+        \hook_use_once:n {pdfmanagement/add}
+%    \end{macrocode}
+% Redefine \cs{DeclareDocumentMetadata} so that it only process the keys.
+% We need to update the hyperref option if the active status changes.
+%    \begin{macrocode}
+        \RenewDocumentCommand\DeclareDocumentMetadata { m }
+          {
+            \keys_set_filter:nnn  { document / metadata } { init } { ##1 }
+            \bool_if:NTF \g_@@_active_bool
+             {
+               \str_remove_all:cn {opt@hyperref.sty}{customdriver=hgeneric-testphase}
+               \PassOptionsToPackage{customdriver=hgeneric-testphase}{hyperref}
+             }
+             {
+               \str_remove_all:cn {opt@hyperref.sty}{customdriver=hgeneric-testphase}
+             }
+          }
+%    \end{macrocode}
+% Load more modules and the firstaid code.
+%    \begin{macrocode}
+        \RequirePackage{pdfmanagement-firstaid}
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \subsection{Container for document Properties}
+% The container for the document properties is a prop
+% \begin{variable}{\g_@@_documentproperties_prop}
+%    \begin{macrocode}
+\prop_new:N \g_@@_documentproperties_prop %
+%    \end{macrocode}
+% \end{variable}
+% \begin{macro}{\AddToDocumentProperties}
+%    \begin{macrocode}
+\NewDocumentCommand\AddToDocumentProperties{O{\@currname}mm}
+  {
+    \exp_args:NNx
+      \prop_gput:Nnn \g_@@_documentproperties_prop
+        {
+          \tl_if_blank:eTF {#1}{top-level/}{#1/} #2
+        }
+        { #3}
+  }
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\GetDocumentProperties}
+%    \begin{macrocode}
+\NewExpandableDocumentCommand\GetDocumentProperties{m}
+  {
+    \prop_item:Nn \g_@@_documentproperties_prop {#1}
+  }
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ShowDocumentProperties}
+%    \begin{macrocode}
+\msg_new:nnn  { pdfmanagement } { show-properties }
+  {
+    The~following~document~properties~have~been~stored:
+    #1
+  }
+\NewDocumentCommand\ShowDocumentProperties {}
+  {
+    \msg_show:nnx {pdfmanagement}{show-properties}
+      {
+        \prop_map_function:NN \g_@@_documentproperties_prop \msg_show_item:nn
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+%  \subsection{The keys for \cs{DeclareDocumentMetadata}}
+%  As they use \cs{AddToDocumentProperties} they have to come after
+%  it has been defined.
+%
+%  \begin{variable}{\g_@@_firstaidoff_clist}
+%  A list to store the firstaid code which should be disabled
+%    \begin{macrocode}
+\clist_new:N \g_@@_firstaidoff_clist
+%    \end{macrocode}
+% \end{variable}
+%    \begin{macrocode}
+\keys_define:nn { document / metadata }
+  {
+    backend .code:n =
+      {
+        \PassOptionsToPackage { driver=#1 } {expl3}
+        \AddToDocumentProperties[document]{backend}{#1}
+      },
+    backend .groups:n = { init } ,
+  }
+
+\keys_define:nn { document / metadata }
+  {
+    ,pdfversion .code:n =
+      {
+        \pdf_version_gset:n { #1 }
+        \AddToDocumentProperties[document]{pdfversion}{#1}
+      }
+    ,uncompress .code:n =
+      {
+        \pdf_uncompress:
+      }
+    ,uncompress .value_forbidden:n = true
+    ,lang .code:n =
+      {
+        \pdfmanagement_add:nnn {Catalog} {Lang}{(#1)}
+        \AddToDocumentProperties[document]{lang}{#1}
+      }
+    %,xmpmeta .bool_gset:N = \g_pdfmeta_xmp_bool %see pdfmeta unused and undefined for now!
+    % this uses internal command from pdfmeta, it should probably move there ...
+    ,pdfstandard .code:n =
+      {
+        \exp_args:Nnx
+        \keys_set:nn {document / metadata} {_pdfstandard=\str_uppercase:n{#1}}
+      }
+    ,_pdfstandard .choices:nn =
+      {A-1B,A-2B,A-3B}
+      {
+        \prop_if_exist:cT { g__pdfmeta_standard_pdf/#1_prop }
+          {
+            \prop_gset_eq:Nc \g__pdfmeta_standard_prop { g__pdfmeta_standard_pdf/#1 _prop }
+          }
+        \AddToDocumentProperties [document]{pdfstandard}{#1}
+      }
+    ,_pdfstandard / unknown .code:n =
+      {
+        \msg_warning:nnn{pdf}{unknown-standard}{#1}
+      }
+    ,pdfmanagement .bool_gset:N = \g_@@_active_bool
+    ,pdfmanagement .initial:n =  {true}
+    ,firstaidoff .clist_gset:N = \g_@@_firstaidoff_clist
+  }
+%    \end{macrocode}
+%    \begin{macrocode}
+%</package>
+%    \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex
-- 
cgit v1.2.3

