texlive[72835] Master/texmf-dist: luamplib (12nov24)

commits+karl at tug.org commits+karl at tug.org
Tue Nov 12 22:26:36 CET 2024


Revision: 72835
          https://tug.org/svn/texlive?view=revision&revision=72835
Author:   karl
Date:     2024-11-12 22:26:36 +0100 (Tue, 12 Nov 2024)
Log Message:
-----------
luamplib (12nov24)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/luatex/luamplib/NEWS
    trunk/Master/texmf-dist/doc/luatex/luamplib/luamplib.pdf
    trunk/Master/texmf-dist/source/luatex/luamplib/luamplib.dtx
    trunk/Master/texmf-dist/tex/luatex/luamplib/luamplib.lua
    trunk/Master/texmf-dist/tex/luatex/luamplib/luamplib.sty

Modified: trunk/Master/texmf-dist/doc/luatex/luamplib/NEWS
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/luamplib/NEWS	2024-11-12 21:26:18 UTC (rev 72834)
+++ trunk/Master/texmf-dist/doc/luatex/luamplib/NEWS	2024-11-12 21:26:36 UTC (rev 72835)
@@ -1,5 +1,16 @@
                        History of the luamplib package
 
+2024/11/12 2.35.0
+   * even under \mplibtextextlabel{true}, the original 'infont' operator will
+   be used when the character slot of the text argument is less than 32, or is
+   equal to 35, 36, 37, 38, 92, 94, 95, 123, 125, 126 or 127.
+
+   * \mplibforcehmode will have effects on \usemplibgroup as well as ordinary
+   metapost figures.
+
+   * support tagged PDF when tagpdf package is activated. The related code is
+   currently in experimental stage. See the documentation for details.
+
 2024/08/03 2.34.5
    * provide 'withgroupbbox' macro for transparency group to enable users to
    control the bounding box

Modified: trunk/Master/texmf-dist/doc/luatex/luamplib/luamplib.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/luatex/luamplib/luamplib.dtx
===================================================================
--- trunk/Master/texmf-dist/source/luatex/luamplib/luamplib.dtx	2024-11-12 21:26:18 UTC (rev 72834)
+++ trunk/Master/texmf-dist/source/luatex/luamplib/luamplib.dtx	2024-11-12 21:26:36 UTC (rev 72835)
@@ -85,7 +85,7 @@
 %<*driver>
 \NeedsTeXFormat{LaTeX2e}
 \ProvidesFile{luamplib.drv}%
-  [2024/08/03 v2.34.5 Interface for using the mplib library]%
+  [2024/11/12 v2.35.0 Interface for using the mplib library]%
 \documentclass{ltxdoc}
 \usepackage{metalogo,multicol,xspace}
 \usepackage[x11names]{xcolor}
@@ -114,7 +114,7 @@
 ]{Linux Libertine O}
 \setmonofont[Scale=MatchLowercase]{InconsolataN}
 %setsansfont[Ligatures=TeX]{Linux Biolinum O}
-\setsansfont[Ligatures=TeX,Scale=MatchLowercase]{Iwona Medium}
+\setsansfont[UprightFont=*Medium,BoldFont=*Heavy,Ligatures=TeX,Scale=MatchLowercase]{Iwona}
 %setmathfont{XITS Math}
 
 \usepackage{hologo}
@@ -155,7 +155,7 @@
 % \author{Hans Hagen, Taco Hoekwater, Elie Roux, Philipp Gesang and Kim Dohyun\\
 % Current Maintainer: Kim Dohyun\\
 % Support: \url{https://github.com/lualatex/luamplib}}
-% \date{2024/08/03 v2.34.5}
+% \date{2024/11/12 v2.35.0}
 %
 % \maketitle
 %
@@ -238,17 +238,24 @@
 %
 %   \textsc{n.b.} As \emph{metafun} is such a complicated format,
 %   we cannot support all the functionalities producing special effects provided by \emph{metafun}.
-%   At least, however, transparency (actually opacity), transparency group, and shading (gradient colors)
+%   At least, however, transparency (actually opacity), shading (gradient colors) and transparency group
 %   are fully supported,
 %   and outlinetext is supported by our own alternative |mpliboutlinetext|
 %   (see \hyperlink{mpliboutlinetext}{below \S\,1.2}).
 %
 %   \leavevmode\llap{\textcolor{red}{☞}\kern1.2\parindent}\relax
-%   Among these, transparency is so simple that you can apply it to an object,
-%   even with the \emph{plain} format,
-%   just by appending |withprescript| |"tr_transparency=<number>"| to the sentence.
+%   Among these, transparency (|texdoc metafun| \S\,8.2) is so simple that you can apply it to an object,
+%   with \emph{plain} format as well,
+%   just by appending |withprescript| |"tr_transparency=|\hskip0pt\relax|<number>"| to the sentence.
 %   ($0 \le \hbox{\emph{<number>}} \le 1$)
 %
+%   One thing worth mentioning about shading (|texdoc metafun| \S\,8.3) is:
+%   when a color expression is given in string type,
+%   it is regarded by luamplib as
+%   a color expression of \TeX\ side.
+%   For instance, when |withshadecolors("orange", 2/3red)| is given, the first color |"orange"| will be
+%   interpreted as a \pkg{color}, \pkg{xcolor} or \pkg{l3color}'s expression.
+%
 %   \hypertarget{metafunformat}{}\relax
 %   As for transparency group, the current \emph{metafun} document \S\,8.8 is not correct.
 %   The true syntax is:
@@ -261,13 +268,6 @@
 %   Transparency group is available with \emph{plain} format as well, with extended functionality.
 %   See \hyperlink{transparencygroup}{below \S\,1.2}.
 %
-%   One thing worth mentioning about shading is:
-%   when a color expression is given in string type,
-%   it is regarded by luamplib as
-%   a color expression of \TeX\ side.
-%   For instance, when |withshadecolors("orange", 2/3red)| is given, the first color |"orange"| will be
-%   interpreted as a \pkg{color}, \pkg{xcolor} or \pkg{l3color}'s expression.
-%
 % \paragraph{\cs{mplibnumbersystem\{scaled\textbar double\textbar decimal\}}}
 %   Users can choose |numbersystem| option.
 %   The default value is |scaled|, which can be changed
@@ -345,9 +345,17 @@
 %
 %   \textsc{n.b.} In the background,
 %   luamplib redefines |infont| operator so that the right side
-%   argument (the font part) is totally ignored. Therefore the left side arguemnt
+%   argument (the font part) is totally ignored. Therefore the left side arguemnt (the text part)
 %   will be typeset with the current \TeX\ font.
-%   Also take care of |char| operator in the left side argument,
+%
+%   From v2.35, however, the redefinition of |infont| operator has been revised:
+%   when the character slot of the text argument is less than $32$~(control characters),
+%   or is equal to $35$~(|#|), $36$~(|$|), \iffalse |$|\fi
+%   $37$~(|%|), $38$~(|&|), $92$~(|\|), $94$~(|^|),
+%   $95$~(|_|), $123$~(|{|), $125$~(|}|), $126$~(|~|) or $127$~(DEL),
+%   the original |infont| operator will be used instead of |textext| operator
+%   so that the font part will be honored.
+%   Despite the revision, please take care of |char| operator in the text argument,
 %   as this might bring unpermitted characters into \TeX.
 %
 % \paragraph{\cs{mplibcodeinherit\{enable\textbar disable\}}}
@@ -527,6 +535,62 @@
 %   Frequently used settings such as \cs{everymplib}, \cs{mplibforcehmode}
 %   or \cs{mplibcodeinherit} are suitable for going into this file.
 %
+% \paragraph{Tagged PDF}
+% When \pkg{tagpdf} package is loaded and activated, |mplibcode| environment accepts additional options for tagged PDF\@.
+% The code related to this functionality is currently in experimental stage, not guaranteeing backward compatibility.
+% Like the \LaTeX's |picture| environment,
+% available optional keys are |tag|, |alt|, |actualtext|, |artifact|, |debug| and |correct-BBox|
+% (|texdoc| |latex-lab-graphic|).
+% Additionally, luamplib provides its own |text| key.
+% \begin{description}
+% \item[|tag=...|] You can choose a tag name, default value being |Figure|.
+%   BBox info will be added automatically to the PDF
+%   unless the value is |artifact|, |text|, or |false|.
+%   When the value is |false|, tagging is deactivated.
+% \item[|debug|] draws bounding box of the figure for checking, which you can correct
+%   by |correct-BBox| key with space-separated four dimen values.
+% \item[|alt=...|] sets an alternative text of the figure as given.
+%   This key is needed for ordinary \metapost figures.
+%   You can give alternative text within \metapost code as well:
+%   |verbatimtex| |\mplibalttext{...}| |etex;|
+% \item[|artifact|] starts an |artifact| MC (marked content).
+%   BBox info will not be added.
+%   This key is intended for decorative figures which have no semantic quality.
+% \item[|actualtext=...|] starts a |Span| tag implicitly and sets an actual text as given.
+%   Horizontal mode is forced by \cs{noindent} command. BBox info will not be added.
+%   This key is intended for figures which can be represented by a character or
+%   a small sequence of characters.
+%   You can give actual text within \metapost code as well:
+%   |verbatimtex| |\mplibactualtext{...}| |etex;|
+% \item[|text|] starts an |artifact| MC and enables tagging on textext
+%   (the same as |btex| |...| |etex|) boxes.
+%   Horizontal mode is forced by \cs{noindent} command. BBox info will not be added.
+%   This key is intended for figures made mostly of textext boxes.
+%   Inside text-keyed figures, reusing textext boxes is strongly discouraged.
+% \end{description}
+% These keys are provided also for \cs{mpfig} and \cs{usemplibgroup} (see \hyperlink{usemplibgroup}{below}) commands.
+%\begin{verbatim}
+%     \begin{mplibcode}[myInstanceName, alt=figure drawing a circle]
+%     ...
+%     \end{mplibcode}
+%
+%     \mpfig[alt=figure drawing a square box]
+%     ...
+%     \endmpfig
+%
+%     \usemplibgroup[alt=figure drawing a triangle]{...}
+%
+%     \mppattern{...}           % see below
+%       \mpfig[tag=false]       % do not tag this figure
+%       ...
+%       \endmpfig
+%     \endmppattern
+%\end{verbatim}
+% As for the instance name of |mplibcode| environment,
+% |instance=...| or |instancename=...| is also allowed
+% in addition to the raw instance name as shown above.
+%
+%
 % \subsection{\textsc{MetaPost}}
 %
 % \paragraph{\texttt{mplibdimen(...)}, \texttt{mplibcolor(...)}}
@@ -830,7 +894,7 @@
 % \begin{description}
 %   \let\bfseries\relax
 % \item[|withgroupname| \emph{<string>}] associates a transparency group with the given name.
-%   When this is not appended to the sentense with |asgroup| operator,
+%   When this is not appended to the sentence with |asgroup| operator,
 %   the default group name `|lastmplibgroup|' will be used.
 %
 % \item[\cs{usemplibgroup\{...\}}]
@@ -851,7 +915,7 @@
 %   default value being |(llcorner p, urcorner p)|.
 %   This option might be needed especially when you draw with a thick pen
 %   a path that touches the boundary;
-%   you would probably want to append to the sentense
+%   you would probably want to append to the sentence
 %   `|withgroupbbox| |(bot| |lft| |llcorner| |p,| |top| |rt| |urcorner| |p)|',
 %   supposing that the pen was selected by the |pickup| command.
 %
@@ -860,8 +924,8 @@
 %\begin{verbatim}
 %   \mpfig
 %     draw image(
-%       fill fullcircle scaled 100 shifted 25right withcolor .5[blue,white];
-%       fill fullcircle scaled 100 withcolor .5[red,white] ;
+%       fill fullcircle scaled 100 shifted 25right withcolor blue;
+%       fill fullcircle scaled 100 withcolor red ;
 %     ) asgroup ""
 %       withgroupname "mygroup";
 %     draw (left--right) scaled 10;
@@ -874,7 +938,8 @@
 %   \usemplibgroup{mygroup}
 %
 %   \mpfig
-%     usemplibgroup "mygroup" rotated 15;
+%     usemplibgroup "mygroup" rotated 15
+%       withprescript "tr_transparency=0.5";
 %     draw (left--right) scaled 10;
 %     draw (up--down) scaled 10;
 %   \endmpfig
@@ -906,8 +971,7 @@
 %   \usemplibgroup{mygrx}
 %
 %   \mpfig
-%     usemplibgroup "mygrx"
-%       scaled 1.5
+%     usemplibgroup "mygrx" scaled 1.5
 %       withprescript "tr_transparency=0.5" ;
 %   \endmpfig
 %\end{verbatim}
@@ -1028,8 +1092,8 @@
 
 luatexbase.provides_module {
   name          = "luamplib",
-  version       = "2.34.5",
-  date          = "2024/08/03",
+  version       = "2.35.0",
+  date          = "2024/11/12",
   description   = "Lua package to typeset Metapost with LuaTeX's MPLib.",
 }
 
@@ -1522,7 +1586,7 @@
       run_tex_code(format([[\expandafter\newbox\csname luamplib.box.%s\endcsname]], boxid))
       tex_box_id = tex.getcount'allocationnumber'
     end
-    run_tex_code(format("%s\\setbox%i\\hbox{%s}", global, tex_box_id, str))
+    run_tex_code(format("\\luamplibtagtextbegin{%i}%s\\setbox%i\\hbox{%s}\\luamplibtagtextend", tex_box_id, global, tex_box_id, str))
     local box = texgetbox(tex_box_id)
     local wd  = box.width  / factor
     local ht  = box.height / factor
@@ -2740,7 +2804,7 @@
   withprescript "mplibgroupname=" & s
 enddef;
 def usemplibgroup primary s =
-  draw maketext("\usemplibgroup{" & s & "}")
+  draw maketext("\mplibnoforcehmode\csname luamplib.group." & s & "\endcsname")
     shifted runscript("return luamplib.trgroupshifts['" & s & "']")
 enddef;
 ]],
@@ -2756,7 +2820,25 @@
   "luamplib.in_the_fig=false" &ditto& ");";
 ]],
   textextlabel = [[
-primarydef s infont f = rawtextext(s) enddef;
+let luampliboriginalinfont = infont;
+primarydef s infont f =
+  if   (s < char 32)
+    or (s = char 35) % #
+    or (s = char 36) % $
+    or (s = char 37) % %
+    or (s = char 38) % &
+    or (s = char 92) % \
+    or (s = char 94) % ^
+    or (s = char 95) % _
+    or (s = char 123) % {
+    or (s = char 125) % }
+    or (s = char 126) % ~
+    or (s = char 127) :
+    s luampliboriginalinfont f
+  else :
+    rawtextext(s)
+  fi
+enddef;
 def fontsize expr f =
   begingroup
   save size; numeric size;
@@ -3650,10 +3732,17 @@
   local trgroup = pdfetcs.tr_group
   trgroup.shifts[name] = { get_macro'MPllx', get_macro'MPlly' }
   local whd
+  local tagpdf = is_defined'picture at tag@bbox at attribute'
   if pdfmode then
     attr = tableconcat(attr) :gsub(decimals,rmzeros)
     local index = tex.saveboxresource(boxid, attr, res, true, grtype)
-    token.set_macro("luamplib.group."..name, "\\useboxresource "..index, "global")
+    token.set_macro("luamplib.group."..name, tableconcat{
+      "\\prependtomplibbox\\hbox\\bgroup",
+      tagpdf and "\\luamplibtaggingbegin\\setbox\\mplibscratchbox\\hbox\\bgroup" or "",
+      "\\useboxresource ", index,
+      tagpdf and "\\egroup\\luamplibtaggingBBox\\unhbox\\mplibscratchbox\\luamplibtaggingend" or "",
+      "\\egroup",
+    }, "global")
     whd = format("%.3f %.3f 0", wd/factor, (ht+dp)/factor) :gsub(decimals,rmzeros)
   else
     trgroup.cnt = (trgroup.cnt or 0) + 1
@@ -3670,11 +3759,16 @@
       "\\special{pdf:econtent}}",
     }
     token.set_macro("luamplib.group."..name, tableconcat{
-      "\\begingroup\\setbox\\mplibscratchbox\\hbox{\\special{pdf:uxobj ", objname, "}}",
+      "\\prependtomplibbox\\hbox\\bgroup",
+      tagpdf and "\\luamplibtaggingbegin" or "",
+      "\\setbox\\mplibscratchbox\\hbox{\\special{pdf:uxobj ", objname, "}}",
       "\\wd\\mplibscratchbox ", wd, "sp",
       "\\ht\\mplibscratchbox ", ht, "sp",
       "\\dp\\mplibscratchbox ", dp, "sp",
-      "\\box\\mplibscratchbox\\endgroup",
+      tagpdf and "\\luamplibtaggingBBox" or "",
+      "\\box\\mplibscratchbox",
+      tagpdf and "\\luamplibtaggingend" or "",
+      "\\egroup",
     }, "global")
     whd = format("%.3f %.3f %.3f", wd/factor, ht/factor, dp/factor) :gsub(decimals,rmzeros)
   end
@@ -4105,7 +4199,7 @@
 %    \begin{macrocode}
   \NeedsTeXFormat{LaTeX2e}
   \ProvidesPackage{luamplib}
-    [2024/08/03 v2.34.5 mplib package for LuaTeX]
+    [2024/11/12 v2.35.0 mplib package for LuaTeX]
 \fi
 \ifdefined\newluafunction\else
   \input ltluatex
@@ -4189,7 +4283,8 @@
 %
 %    use Transparency Group
 %    \begin{macrocode}
-\protected\def\usemplibgroup#1{\csname luamplib.group.#1\endcsname}
+\protected\def\usemplibgroup#1#{\usemplibgroupmain}
+\def\usemplibgroupmain#1{\csname luamplib.group.#1\endcsname}
 \protected\def\mplibgroup#1{%
   \begingroup
   \def\MPllx{0}\def\MPlly{0}%
@@ -4270,9 +4365,14 @@
   \ifx *\nexttok
     \expandafter\mplibprempfig
   \else
-    \expandafter\mplibmainmpfig
+    \ifx [\nexttok
+      \expandafter\expandafter\expandafter\mplibgobbleoptsmpfig
+    \else
+      \expandafter\expandafter\expandafter\mplibmainmpfig
+    \fi
   \fi
 }
+\def\mplibgobbleoptsmpfig[#1]{\mplibmainmpfig}
 \def\mplibmainmpfig{%
   \begingroup
   \mplibsetupcatcodes
@@ -4607,6 +4707,343 @@
 \fi
 %    \end{macrocode}
 %
+%    Code for \pkg{tagpdf}
+%    \begin{macrocode}
+\def\luamplibtagtextbegin#1{}
+\let\luamplibtagtextend\relax
+\ifcsname SuspendTagging\endcsname\else\endinput\fi
+\ifcsname picture at tag@bbox at attribute\endcsname \else
+  \ExplSyntaxOn
+  \keys_define:nn{luamplib/notag}
+    {
+      ,alt          .code:n = { }
+      ,actualtext   .code:n = { }
+      ,artifact     .code:n = { }
+      ,text         .code:n = { }
+      ,correct-BBox .code:n = { }
+      ,tag          .code:n = { }
+      ,debug        .code:n = { }
+      ,instance     .code:n = { \tl_gset:Nn \currentmpinstancename {#1} }
+      ,instancename .meta:n = { instance = {#1} }
+      ,unknown      .code:n = { \tl_gset:Ne \currentmpinstancename {\l_keys_key_str} }
+    }
+  \RenewDocumentCommand\mplibcode{O{}}
+    {
+      \tl_gset_eq:NN \currentmpinstancename \c_empty_tl
+      \keys_set:nn{luamplib/notag}{#1}
+      \mplibtmptoks{}\ltxdomplibcode
+    }
+  \ExplSyntaxOff
+  \let\mplibalttext \luamplibtagtextbegin
+  \let\mplibactualtext \mplibalttext
+  \endinput\fi
+\let\mplibstarttoPDForiginal\mplibstarttoPDF
+\let\mplibstoptoPDForiginal\mplibstoptoPDF
+\let\mplibputtextboxoriginal\mplibputtextbox
+\ExplSyntaxOn
+\tl_new:N \l__tag_luamplib_alt_tl
+\tl_new:N \l__tag_luamplib_alt_dflt_tl
+\tl_set:Nn\l__tag_luamplib_alt_dflt_tl {metapost~figure}
+\tl_new:N \l__tag_luamplib_actual_tl
+\tl_new:N \l__tag_luamplib_struct_tl
+\tl_set:Nn\l__tag_luamplib_struct_tl {Figure}
+\bool_new:N \l__tag_luamplib_usetext_bool
+\bool_set_false:N \l__tag_luamplib_usetext_bool
+\cs_set_nopar:Npn \luamplibtagtextbegin #1
+{
+  \bool_if:NTF \l__tag_luamplib_usetext_bool
+  {
+    \tag_mc_end_push:
+    \tag_struct_begin:n{tag=NonStruct,stash}
+    \tag_if_active:T {
+      \expandafter\xdef\csname luamplib.tagbox.#1\endcsname{\tag_get:n{struct_num}}
+    }
+    \tag_mc_begin:n{}
+  }
+  {
+    \tag_if_active:TF
+      { \chardef\mplibtmpnum\@ne }
+      { \chardef\mplibtmpnum\z@ }
+    \SuspendTagging{luamplib.textext}
+  }
+}
+\cs_set_nopar:Npn \luamplibtagtextend
+{
+  \bool_if:NTF \l__tag_luamplib_usetext_bool
+  {
+    \tag_mc_end:
+    \tag_struct_end:
+    \tag_mc_begin_pop:n{}
+  }
+  {
+    \ifnum\mplibtmpnum=\@ne
+      \ResumeTagging{luamplib.textext}
+    \fi
+  }
+}
+\msg_new:nnn {luamplib}{figure-text-reuse}
+{
+  textext~box~#1~probably~is~incorrectly~tagged.\\
+  Reusing~a~box~in~text-keyed~figures~is~strongly~discouraged.
+}
+\cs_set_nopar:Npn \mplibputtextbox #1
+{
+  \vbox to 0pt{\vss\hbox to 0pt{%
+    \bool_if:NTF \l__tag_luamplib_usetext_bool
+    {
+      \ResumeTagging{luamplib.puttextbox}
+      \tag_mc_end:
+      \cs_if_exist:cTF {luamplib.tagbox.#1}
+      {
+        \tag_struct_use_num:n {\csname luamplib.tagbox.#1\endcsname}
+        \raise\dp#1\copy#1\hss
+      }
+      {
+        \msg_warning:nnn{luamplib}{figure-text-reuse}{#1}
+        \tag_mc_begin:n{}
+        \chardef\mplibtmpnum=#1\relax
+        \tag_mc_reset_box:N \mplibtmpnum
+        \raise\dp#1\copy#1\hss
+        \tag_mc_end:
+      }
+      \tag_mc_begin:n{artifact}
+    }
+    {
+      \chardef\mplibtmpnum=#1\relax
+      \tag_mc_reset_box:N \mplibtmpnum
+      \raise\dp#1\copy#1\hss
+    }
+  }}
+}
+\cs_new_nopar:Npn \__luamplib_tagging_begin_figure:
+{
+  \tag_if_active:T
+  {
+    \tag_mc_end_push:
+    \tl_if_empty:NT\l__tag_luamplib_alt_tl
+    {
+      \msg_warning:nne{luamplib}{alt-text-missing}{\l__tag_luamplib_alt_dflt_tl}
+      \tl_set:Ne\l__tag_luamplib_alt_tl {\l__tag_luamplib_alt_dflt_tl}
+    }
+    \tag_struct_begin:n
+    {
+      tag=\l__tag_luamplib_struct_tl,
+      alt=\l__tag_luamplib_alt_tl,
+    }
+    \tag_mc_begin:n{}
+  }
+}
+\cs_new_nopar:Npn \__luamplib_tagging_end_figure:
+{
+  \tag_if_active:T
+  {
+    \tag_mc_end:
+    \tag_struct_end:
+    \tag_mc_begin_pop:n{}
+  }
+}
+\cs_new_nopar:Npn \__luamplib_tagging_begin_actualtext:
+{
+  \tag_if_active:T
+  {
+    \tag_mc_end_push:
+    \tag_struct_begin:n
+    {
+      tag=Span,
+      actualtext=\l__tag_luamplib_actual_tl,
+    }
+    \tag_mc_begin:n{}
+  }
+}
+\cs_set_eq:NN \__luamplib_tagging_end_actualtext: \__luamplib_tagging_end_figure:
+\cs_new_nopar:Npn \__luamplib_tagging_begin_artifact:
+{
+  \tag_if_active:T
+  {
+    \tag_mc_end_push:
+    \tag_mc_begin:n{artifact}
+  }
+}
+\cs_new_nopar:Npn \__luamplib_tagging_end_artifact:
+{
+  \tag_if_active:T
+  {
+    \tag_mc_end:
+    \tag_mc_begin_pop:n{}
+  }
+}
+\cs_set_eq:NN \luamplibtaggingbegin \__luamplib_tagging_begin_figure:
+\cs_set_eq:NN \luamplibtaggingend \__luamplib_tagging_end_figure:
+\keys_define:nn{luamplib/tag}
+  {
+    ,alt .code:n =
+      {
+        \bool_set_true:N \l__tag_graphic_BBox_bool
+        \bool_set_false:N \l__tag_luamplib_usetext_bool
+        \tl_set:Ne\l__tag_luamplib_alt_tl{\text_purify:n{#1}}
+      }
+    ,actualtext .code:n =
+      {
+        \bool_set_false:N \l__tag_graphic_BBox_bool
+        \bool_set_false:N \l__tag_luamplib_usetext_bool
+        \tl_set:Ne\l__tag_luamplib_actual_tl{\text_purify:n{#1}}
+        \cs_set_eq:NN \luamplibtaggingbegin \__luamplib_tagging_begin_actualtext:
+        \cs_set_eq:NN \luamplibtaggingend \__luamplib_tagging_end_actualtext:
+        \tag_if_active:T {\noindent}
+      }
+    ,artifact .code:n =
+      {
+        \bool_set_false:N \l__tag_graphic_BBox_bool
+        \bool_set_false:N \l__tag_luamplib_usetext_bool
+        \cs_set_eq:NN \luamplibtaggingbegin \__luamplib_tagging_begin_artifact:
+        \cs_set_eq:NN \luamplibtaggingend \__luamplib_tagging_end_artifact:
+      }
+    ,text .code:n =
+      {
+        \bool_set_false:N \l__tag_graphic_BBox_bool
+        \bool_set_true:N \l__tag_luamplib_usetext_bool
+        \cs_set_eq:NN \luamplibtaggingbegin \__luamplib_tagging_begin_artifact:
+        \cs_set_eq:NN \luamplibtaggingend \__luamplib_tagging_end_artifact:
+        \tag_if_active:T {\noindent}
+      }
+    ,correct-BBox .code:n =
+      {
+        \bool_set_true:N \l__tag_graphic_bboxcorr_bool
+        \seq_set_split:Nnn\l__tag_graphic_bboxcorr_seq{~}{#1~0pt~0pt~0pt~0pt}
+      }
+    ,tag .code:n =
+      {
+        \str_case:nnF {#1}
+          {
+            {artifact}
+            {
+              \bool_set_false:N \l__tag_graphic_BBox_bool
+              \bool_set_false:N \l__tag_luamplib_usetext_bool
+              \cs_set_eq:NN \luamplibtaggingbegin \__luamplib_tagging_begin_artifact:
+              \cs_set_eq:NN \luamplibtaggingend \__luamplib_tagging_end_artifact:
+            }
+            {text}
+            {
+              \bool_set_false:N \l__tag_graphic_BBox_bool
+              \bool_set_true:N \l__tag_luamplib_usetext_bool
+              \cs_set_eq:NN \luamplibtaggingbegin \__luamplib_tagging_begin_artifact:
+              \cs_set_eq:NN \luamplibtaggingend \__luamplib_tagging_end_artifact:
+              \tag_if_active:T {\noindent}
+            }
+            {false}
+            {
+              \SuspendTagging{luamplib.tagfalse}
+            }
+          }
+          {
+            \tl_set:Nn\l__tag_luamplib_struct_tl{#1}
+          }
+      }
+    ,debug .code:n =
+      { \bool_set_true:N \l__tag_graphic_debug_bool }
+    ,instance .code:n =
+      { \tl_gset:Nn \currentmpinstancename {#1} }
+    ,instancename .meta:n = { instance = {#1} }
+    ,unknown .code:n =
+      { \tl_gset:Ne \currentmpinstancename {\l_keys_key_str} }
+  }
+\cs_new_nopar:Npn \luamplibtaggingBBox
+{
+  \let\@picbox\mplibscratchbox \picture at tag@bbox at attribute
+}
+\cs_set_nopar:Npn \mplibstarttoPDF #1 #2 #3 #4
+  {
+    \prependtomplibbox
+    \hbox dir TLT\bgroup
+    \luamplibtaggingbegin % begin tagging
+    \xdef\MPllx{#1}\xdef\MPlly{#2}%
+    \xdef\MPurx{#3}\xdef\MPury{#4}%
+    \xdef\MPwidth{\the\dimexpr#3bp-#1bp\relax}%
+    \xdef\MPheight{\the\dimexpr#4bp-#2bp\relax}%
+    \parskip0pt
+    \leftskip0pt
+    \parindent0pt
+    \everypar{}%
+    \setbox\mplibscratchbox\vbox\bgroup
+    \SuspendTagging{luamplib.mplibtopdf}% stop tag inside figure
+    \noindent
+  }
+\cs_set_nopar:Npn \mplibstoptoPDF
+  {
+    \par
+    \egroup
+    \setbox\mplibscratchbox\hbox
+      {\hskip-\MPllx bp
+       \raise-\MPlly bp
+       \box\mplibscratchbox}%
+    \setbox\mplibscratchbox\vbox to \MPheight
+      {\vfill
+       \hsize\MPwidth
+       \wd\mplibscratchbox0pt
+       \ht\mplibscratchbox0pt
+       \dp\mplibscratchbox0pt
+       \box\mplibscratchbox}%
+    \wd\mplibscratchbox\MPwidth
+    \ht\mplibscratchbox\MPheight
+    \luamplibtaggingBBox % BBox
+    \box\mplibscratchbox
+    \luamplibtaggingend % end tagging
+    \egroup
+  }
+\RenewDocumentCommand\mplibcode{O{}}
+  {
+    \msg_set:nnn {luamplib}{alt-text-missing}
+    {
+      Alternative~text~for~mplibcode~is~missing.\\
+      Using~the~default~value~'##1'~instead.
+    }
+    \tl_gset_eq:NN \currentmpinstancename \c_empty_tl
+    \keys_set:nn{luamplib/tag}{#1}
+    \tl_if_empty:NF \currentmpinstancename
+      { \tl_set:Nn\l__tag_luamplib_alt_dflt_tl {metapost~figure~\currentmpinstancename} }
+    \mplibtmptoks{}\ltxdomplibcode
+  }
+\RenewDocumentCommand\mpfig{s O{}}
+  {
+    \begingroup
+    \IfBooleanTF{#1}
+    {\mplibprempfig *}
+    {
+      \msg_set:nnn {luamplib}{alt-text-missing}
+      {
+        Alternative~text~for~mpfig~is~missing.\\
+        Using~the~default~value~'##1'~instead.
+      }
+      \keys_set:nn{luamplib/tag}{#2}
+      \tl_if_empty:NF \mpfiginstancename
+        { \tl_set:Nn\l__tag_luamplib_alt_dflt_tl {metapost~figure~\mpfiginstancename} }
+      \mplibmainmpfig
+    }
+  }
+\RenewDocumentCommand\usemplibgroup{O{} m}
+  {
+    \begingroup
+    \msg_set:nnn {luamplib}{alt-text-missing}
+    {
+      Alternative~text~for~usemplibgroup~is~missing.\\
+      Using~the~default~value~'##1'~instead.
+    }
+    \keys_set:nn{luamplib/tag}{#1}
+    \tl_set:Nn\l__tag_luamplib_alt_dflt_tl {metapost~figure~#2}
+    \csname luamplib.group.#2\endcsname
+    \endgroup
+  }
+\cs_new_nopar:Npn \mplibalttext #1
+{
+  \tl_set:Ne \l__tag_luamplib_alt_tl {\text_purify:n{#1}}
+}
+\cs_new_nopar:Npn \mplibactualtext #1
+{
+  \tl_set:Ne \l__tag_luamplib_actual_tl {\text_purify:n{#1}}
+}
+\ExplSyntaxOff
+%    \end{macrocode}
+%
 %    That's all folks!
 %
 % \iffalse

Modified: trunk/Master/texmf-dist/tex/luatex/luamplib/luamplib.lua
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luamplib/luamplib.lua	2024-11-12 21:26:18 UTC (rev 72834)
+++ trunk/Master/texmf-dist/tex/luatex/luamplib/luamplib.lua	2024-11-12 21:26:36 UTC (rev 72835)
@@ -11,8 +11,8 @@
 
 luatexbase.provides_module {
   name          = "luamplib",
-  version       = "2.34.5",
-  date          = "2024/08/03",
+  version       = "2.35.0",
+  date          = "2024/11/12",
   description   = "Lua package to typeset Metapost with LuaTeX's MPLib.",
 }
 
@@ -385,7 +385,7 @@
       run_tex_code(format([[\expandafter\newbox\csname luamplib.box.%s\endcsname]], boxid))
       tex_box_id = tex.getcount'allocationnumber'
     end
-    run_tex_code(format("%s\\setbox%i\\hbox{%s}", global, tex_box_id, str))
+    run_tex_code(format("\\luamplibtagtextbegin{%i}%s\\setbox%i\\hbox{%s}\\luamplibtagtextend", tex_box_id, global, tex_box_id, str))
     local box = texgetbox(tex_box_id)
     local wd  = box.width  / factor
     local ht  = box.height / factor
@@ -1460,7 +1460,7 @@
   withprescript "mplibgroupname=" & s
 enddef;
 def usemplibgroup primary s =
-  draw maketext("\usemplibgroup{" & s & "}")
+  draw maketext("\mplibnoforcehmode\csname luamplib.group." & s & "\endcsname")
     shifted runscript("return luamplib.trgroupshifts['" & s & "']")
 enddef;
 ]],
@@ -1476,7 +1476,25 @@
   "luamplib.in_the_fig=false" &ditto& ");";
 ]],
   textextlabel = [[
-primarydef s infont f = rawtextext(s) enddef;
+let luampliboriginalinfont = infont;
+primarydef s infont f =
+  if   (s < char 32)
+    or (s = char 35) % #
+    or (s = char 36) % $
+    or (s = char 37) % %
+    or (s = char 38) % &
+    or (s = char 92) % \
+    or (s = char 94) % ^
+    or (s = char 95) % _
+    or (s = char 123) % {
+    or (s = char 125) % }
+    or (s = char 126) % ~
+    or (s = char 127) :
+    s luampliboriginalinfont f
+  else :
+    rawtextext(s)
+  fi
+enddef;
 def fontsize expr f =
   begingroup
   save size; numeric size;
@@ -2299,10 +2317,17 @@
   local trgroup = pdfetcs.tr_group
   trgroup.shifts[name] = { get_macro'MPllx', get_macro'MPlly' }
   local whd
+  local tagpdf = is_defined'picture at tag@bbox at attribute'
   if pdfmode then
     attr = tableconcat(attr) :gsub(decimals,rmzeros)
     local index = tex.saveboxresource(boxid, attr, res, true, grtype)
-    token.set_macro("luamplib.group."..name, "\\useboxresource "..index, "global")
+    token.set_macro("luamplib.group."..name, tableconcat{
+      "\\prependtomplibbox\\hbox\\bgroup",
+      tagpdf and "\\luamplibtaggingbegin\\setbox\\mplibscratchbox\\hbox\\bgroup" or "",
+      "\\useboxresource ", index,
+      tagpdf and "\\egroup\\luamplibtaggingBBox\\unhbox\\mplibscratchbox\\luamplibtaggingend" or "",
+      "\\egroup",
+    }, "global")
     whd = format("%.3f %.3f 0", wd/factor, (ht+dp)/factor) :gsub(decimals,rmzeros)
   else
     trgroup.cnt = (trgroup.cnt or 0) + 1
@@ -2319,11 +2344,16 @@
       "\\special{pdf:econtent}}",
     }
     token.set_macro("luamplib.group."..name, tableconcat{
-      "\\begingroup\\setbox\\mplibscratchbox\\hbox{\\special{pdf:uxobj ", objname, "}}",
+      "\\prependtomplibbox\\hbox\\bgroup",
+      tagpdf and "\\luamplibtaggingbegin" or "",
+      "\\setbox\\mplibscratchbox\\hbox{\\special{pdf:uxobj ", objname, "}}",
       "\\wd\\mplibscratchbox ", wd, "sp",
       "\\ht\\mplibscratchbox ", ht, "sp",
       "\\dp\\mplibscratchbox ", dp, "sp",
-      "\\box\\mplibscratchbox\\endgroup",
+      tagpdf and "\\luamplibtaggingBBox" or "",
+      "\\box\\mplibscratchbox",
+      tagpdf and "\\luamplibtaggingend" or "",
+      "\\egroup",
     }, "global")
     whd = format("%.3f %.3f %.3f", wd/factor, ht/factor, dp/factor) :gsub(decimals,rmzeros)
   end

Modified: trunk/Master/texmf-dist/tex/luatex/luamplib/luamplib.sty
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luamplib/luamplib.sty	2024-11-12 21:26:18 UTC (rev 72834)
+++ trunk/Master/texmf-dist/tex/luatex/luamplib/luamplib.sty	2024-11-12 21:26:36 UTC (rev 72835)
@@ -11,7 +11,7 @@
 \ifcsname ProvidesPackage\endcsname
   \NeedsTeXFormat{LaTeX2e}
   \ProvidesPackage{luamplib}
-    [2024/08/03 v2.34.5 mplib package for LuaTeX]
+    [2024/11/12 v2.35.0 mplib package for LuaTeX]
 \fi
 \ifdefined\newluafunction\else
   \input ltluatex
@@ -55,7 +55,8 @@
   \catcode`\&=12 \catcode`\$=12 \catcode`\%=12 \catcode`\^^M=12
 }
 \def\mplibputtextbox#1{\vbox to 0pt{\vss\hbox to 0pt{\raise\dp#1\copy#1\hss}}}
-\protected\def\usemplibgroup#1{\csname luamplib.group.#1\endcsname}
+\protected\def\usemplibgroup#1#{\usemplibgroupmain}
+\def\usemplibgroupmain#1{\csname luamplib.group.#1\endcsname}
 \protected\def\mplibgroup#1{%
   \begingroup
   \def\MPllx{0}\def\MPlly{0}%
@@ -127,9 +128,14 @@
   \ifx *\nexttok
     \expandafter\mplibprempfig
   \else
-    \expandafter\mplibmainmpfig
+    \ifx [\nexttok
+      \expandafter\expandafter\expandafter\mplibgobbleoptsmpfig
+    \else
+      \expandafter\expandafter\expandafter\mplibmainmpfig
+    \fi
   \fi
 }
+\def\mplibgobbleoptsmpfig[#1]{\mplibmainmpfig}
 \def\mplibmainmpfig{%
   \begingroup
   \mplibsetupcatcodes
@@ -409,6 +415,339 @@
   \closein0
   \input luamplib.cfg
 \fi
+\def\luamplibtagtextbegin#1{}
+\let\luamplibtagtextend\relax
+\ifcsname SuspendTagging\endcsname\else\endinput\fi
+\ifcsname picture at tag@bbox at attribute\endcsname \else
+  \ExplSyntaxOn
+  \keys_define:nn{luamplib/notag}
+    {
+      ,alt          .code:n = { }
+      ,actualtext   .code:n = { }
+      ,artifact     .code:n = { }
+      ,text         .code:n = { }
+      ,correct-BBox .code:n = { }
+      ,tag          .code:n = { }
+      ,debug        .code:n = { }
+      ,instance     .code:n = { \tl_gset:Nn \currentmpinstancename {#1} }
+      ,instancename .meta:n = { instance = {#1} }
+      ,unknown      .code:n = { \tl_gset:Ne \currentmpinstancename {\l_keys_key_str} }
+    }
+  \RenewDocumentCommand\mplibcode{O{}}
+    {
+      \tl_gset_eq:NN \currentmpinstancename \c_empty_tl
+      \keys_set:nn{luamplib/notag}{#1}
+      \mplibtmptoks{}\ltxdomplibcode
+    }
+  \ExplSyntaxOff
+  \let\mplibalttext \luamplibtagtextbegin
+  \let\mplibactualtext \mplibalttext
+  \endinput\fi
+\let\mplibstarttoPDForiginal\mplibstarttoPDF
+\let\mplibstoptoPDForiginal\mplibstoptoPDF
+\let\mplibputtextboxoriginal\mplibputtextbox
+\ExplSyntaxOn
+\tl_new:N \l__tag_luamplib_alt_tl
+\tl_new:N \l__tag_luamplib_alt_dflt_tl
+\tl_set:Nn\l__tag_luamplib_alt_dflt_tl {metapost~figure}
+\tl_new:N \l__tag_luamplib_actual_tl
+\tl_new:N \l__tag_luamplib_struct_tl
+\tl_set:Nn\l__tag_luamplib_struct_tl {Figure}
+\bool_new:N \l__tag_luamplib_usetext_bool
+\bool_set_false:N \l__tag_luamplib_usetext_bool
+\cs_set_nopar:Npn \luamplibtagtextbegin #1
+{
+  \bool_if:NTF \l__tag_luamplib_usetext_bool
+  {
+    \tag_mc_end_push:
+    \tag_struct_begin:n{tag=NonStruct,stash}
+    \tag_if_active:T {
+      \expandafter\xdef\csname luamplib.tagbox.#1\endcsname{\tag_get:n{struct_num}}
+    }
+    \tag_mc_begin:n{}
+  }
+  {
+    \tag_if_active:TF
+      { \chardef\mplibtmpnum\@ne }
+      { \chardef\mplibtmpnum\z@ }
+    \SuspendTagging{luamplib.textext}
+  }
+}
+\cs_set_nopar:Npn \luamplibtagtextend
+{
+  \bool_if:NTF \l__tag_luamplib_usetext_bool
+  {
+    \tag_mc_end:
+    \tag_struct_end:
+    \tag_mc_begin_pop:n{}
+  }
+  {
+    \ifnum\mplibtmpnum=\@ne
+      \ResumeTagging{luamplib.textext}
+    \fi
+  }
+}
+\msg_new:nnn {luamplib}{figure-text-reuse}
+{
+  textext~box~#1~probably~is~incorrectly~tagged.\\
+  Reusing~a~box~in~text-keyed~figures~is~strongly~discouraged.
+}
+\cs_set_nopar:Npn \mplibputtextbox #1
+{
+  \vbox to 0pt{\vss\hbox to 0pt{%
+    \bool_if:NTF \l__tag_luamplib_usetext_bool
+    {
+      \ResumeTagging{luamplib.puttextbox}
+      \tag_mc_end:
+      \cs_if_exist:cTF {luamplib.tagbox.#1}
+      {
+        \tag_struct_use_num:n {\csname luamplib.tagbox.#1\endcsname}
+        \raise\dp#1\copy#1\hss
+      }
+      {
+        \msg_warning:nnn{luamplib}{figure-text-reuse}{#1}
+        \tag_mc_begin:n{}
+        \chardef\mplibtmpnum=#1\relax
+        \tag_mc_reset_box:N \mplibtmpnum
+        \raise\dp#1\copy#1\hss
+        \tag_mc_end:
+      }
+      \tag_mc_begin:n{artifact}
+    }
+    {
+      \chardef\mplibtmpnum=#1\relax
+      \tag_mc_reset_box:N \mplibtmpnum
+      \raise\dp#1\copy#1\hss
+    }
+  }}
+}
+\cs_new_nopar:Npn \__luamplib_tagging_begin_figure:
+{
+  \tag_if_active:T
+  {
+    \tag_mc_end_push:
+    \tl_if_empty:NT\l__tag_luamplib_alt_tl
+    {
+      \msg_warning:nne{luamplib}{alt-text-missing}{\l__tag_luamplib_alt_dflt_tl}
+      \tl_set:Ne\l__tag_luamplib_alt_tl {\l__tag_luamplib_alt_dflt_tl}
+    }
+    \tag_struct_begin:n
+    {
+      tag=\l__tag_luamplib_struct_tl,
+      alt=\l__tag_luamplib_alt_tl,
+    }
+    \tag_mc_begin:n{}
+  }
+}
+\cs_new_nopar:Npn \__luamplib_tagging_end_figure:
+{
+  \tag_if_active:T
+  {
+    \tag_mc_end:
+    \tag_struct_end:
+    \tag_mc_begin_pop:n{}
+  }
+}
+\cs_new_nopar:Npn \__luamplib_tagging_begin_actualtext:
+{
+  \tag_if_active:T
+  {
+    \tag_mc_end_push:
+    \tag_struct_begin:n
+    {
+      tag=Span,
+      actualtext=\l__tag_luamplib_actual_tl,
+    }
+    \tag_mc_begin:n{}
+  }
+}
+\cs_set_eq:NN \__luamplib_tagging_end_actualtext: \__luamplib_tagging_end_figure:
+\cs_new_nopar:Npn \__luamplib_tagging_begin_artifact:
+{
+  \tag_if_active:T
+  {
+    \tag_mc_end_push:
+    \tag_mc_begin:n{artifact}
+  }
+}
+\cs_new_nopar:Npn \__luamplib_tagging_end_artifact:
+{
+  \tag_if_active:T
+  {
+    \tag_mc_end:
+    \tag_mc_begin_pop:n{}
+  }
+}
+\cs_set_eq:NN \luamplibtaggingbegin \__luamplib_tagging_begin_figure:
+\cs_set_eq:NN \luamplibtaggingend \__luamplib_tagging_end_figure:
+\keys_define:nn{luamplib/tag}
+  {
+    ,alt .code:n =
+      {
+        \bool_set_true:N \l__tag_graphic_BBox_bool
+        \bool_set_false:N \l__tag_luamplib_usetext_bool
+        \tl_set:Ne\l__tag_luamplib_alt_tl{\text_purify:n{#1}}
+      }
+    ,actualtext .code:n =
+      {
+        \bool_set_false:N \l__tag_graphic_BBox_bool
+        \bool_set_false:N \l__tag_luamplib_usetext_bool
+        \tl_set:Ne\l__tag_luamplib_actual_tl{\text_purify:n{#1}}
+        \cs_set_eq:NN \luamplibtaggingbegin \__luamplib_tagging_begin_actualtext:
+        \cs_set_eq:NN \luamplibtaggingend \__luamplib_tagging_end_actualtext:
+        \tag_if_active:T {\noindent}
+      }
+    ,artifact .code:n =
+      {
+        \bool_set_false:N \l__tag_graphic_BBox_bool
+        \bool_set_false:N \l__tag_luamplib_usetext_bool
+        \cs_set_eq:NN \luamplibtaggingbegin \__luamplib_tagging_begin_artifact:
+        \cs_set_eq:NN \luamplibtaggingend \__luamplib_tagging_end_artifact:
+      }
+    ,text .code:n =
+      {
+        \bool_set_false:N \l__tag_graphic_BBox_bool
+        \bool_set_true:N \l__tag_luamplib_usetext_bool
+        \cs_set_eq:NN \luamplibtaggingbegin \__luamplib_tagging_begin_artifact:
+        \cs_set_eq:NN \luamplibtaggingend \__luamplib_tagging_end_artifact:
+        \tag_if_active:T {\noindent}
+      }
+    ,correct-BBox .code:n =
+      {
+        \bool_set_true:N \l__tag_graphic_bboxcorr_bool
+        \seq_set_split:Nnn\l__tag_graphic_bboxcorr_seq{~}{#1~0pt~0pt~0pt~0pt}
+      }
+    ,tag .code:n =
+      {
+        \str_case:nnF {#1}
+          {
+            {artifact}
+            {
+              \bool_set_false:N \l__tag_graphic_BBox_bool
+              \bool_set_false:N \l__tag_luamplib_usetext_bool
+              \cs_set_eq:NN \luamplibtaggingbegin \__luamplib_tagging_begin_artifact:
+              \cs_set_eq:NN \luamplibtaggingend \__luamplib_tagging_end_artifact:
+            }
+            {text}
+            {
+              \bool_set_false:N \l__tag_graphic_BBox_bool
+              \bool_set_true:N \l__tag_luamplib_usetext_bool
+              \cs_set_eq:NN \luamplibtaggingbegin \__luamplib_tagging_begin_artifact:
+              \cs_set_eq:NN \luamplibtaggingend \__luamplib_tagging_end_artifact:
+              \tag_if_active:T {\noindent}
+            }
+            {false}
+            {
+              \SuspendTagging{luamplib.tagfalse}
+            }
+          }
+          {
+            \tl_set:Nn\l__tag_luamplib_struct_tl{#1}
+          }
+      }
+    ,debug .code:n =
+      { \bool_set_true:N \l__tag_graphic_debug_bool }
+    ,instance .code:n =
+      { \tl_gset:Nn \currentmpinstancename {#1} }
+    ,instancename .meta:n = { instance = {#1} }
+    ,unknown .code:n =
+      { \tl_gset:Ne \currentmpinstancename {\l_keys_key_str} }
+  }
+\cs_new_nopar:Npn \luamplibtaggingBBox
+{
+  \let\@picbox\mplibscratchbox \picture at tag@bbox at attribute
+}
+\cs_set_nopar:Npn \mplibstarttoPDF #1 #2 #3 #4
+  {
+    \prependtomplibbox
+    \hbox dir TLT\bgroup
+    \luamplibtaggingbegin % begin tagging
+    \xdef\MPllx{#1}\xdef\MPlly{#2}%
+    \xdef\MPurx{#3}\xdef\MPury{#4}%
+    \xdef\MPwidth{\the\dimexpr#3bp-#1bp\relax}%
+    \xdef\MPheight{\the\dimexpr#4bp-#2bp\relax}%
+    \parskip0pt
+    \leftskip0pt
+    \parindent0pt
+    \everypar{}%
+    \setbox\mplibscratchbox\vbox\bgroup
+    \SuspendTagging{luamplib.mplibtopdf}% stop tag inside figure
+    \noindent
+  }
+\cs_set_nopar:Npn \mplibstoptoPDF
+  {
+    \par
+    \egroup
+    \setbox\mplibscratchbox\hbox
+      {\hskip-\MPllx bp
+       \raise-\MPlly bp
+       \box\mplibscratchbox}%
+    \setbox\mplibscratchbox\vbox to \MPheight
+      {\vfill
+       \hsize\MPwidth
+       \wd\mplibscratchbox0pt
+       \ht\mplibscratchbox0pt
+       \dp\mplibscratchbox0pt
+       \box\mplibscratchbox}%
+    \wd\mplibscratchbox\MPwidth
+    \ht\mplibscratchbox\MPheight
+    \luamplibtaggingBBox % BBox
+    \box\mplibscratchbox
+    \luamplibtaggingend % end tagging
+    \egroup
+  }
+\RenewDocumentCommand\mplibcode{O{}}
+  {
+    \msg_set:nnn {luamplib}{alt-text-missing}
+    {
+      Alternative~text~for~mplibcode~is~missing.\\
+      Using~the~default~value~'##1'~instead.
+    }
+    \tl_gset_eq:NN \currentmpinstancename \c_empty_tl
+    \keys_set:nn{luamplib/tag}{#1}
+    \tl_if_empty:NF \currentmpinstancename
+      { \tl_set:Nn\l__tag_luamplib_alt_dflt_tl {metapost~figure~\currentmpinstancename} }
+    \mplibtmptoks{}\ltxdomplibcode
+  }
+\RenewDocumentCommand\mpfig{s O{}}
+  {
+    \begingroup
+    \IfBooleanTF{#1}
+    {\mplibprempfig *}
+    {
+      \msg_set:nnn {luamplib}{alt-text-missing}
+      {
+        Alternative~text~for~mpfig~is~missing.\\
+        Using~the~default~value~'##1'~instead.
+      }
+      \keys_set:nn{luamplib/tag}{#2}
+      \tl_if_empty:NF \mpfiginstancename
+        { \tl_set:Nn\l__tag_luamplib_alt_dflt_tl {metapost~figure~\mpfiginstancename} }
+      \mplibmainmpfig
+    }
+  }
+\RenewDocumentCommand\usemplibgroup{O{} m}
+  {
+    \begingroup
+    \msg_set:nnn {luamplib}{alt-text-missing}
+    {
+      Alternative~text~for~usemplibgroup~is~missing.\\
+      Using~the~default~value~'##1'~instead.
+    }
+    \keys_set:nn{luamplib/tag}{#1}
+    \tl_set:Nn\l__tag_luamplib_alt_dflt_tl {metapost~figure~#2}
+    \csname luamplib.group.#2\endcsname
+    \endgroup
+  }
+\cs_new_nopar:Npn \mplibalttext #1
+{
+  \tl_set:Ne \l__tag_luamplib_alt_tl {\text_purify:n{#1}}
+}
+\cs_new_nopar:Npn \mplibactualtext #1
+{
+  \tl_set:Ne \l__tag_luamplib_actual_tl {\text_purify:n{#1}}
+}
+\ExplSyntaxOff
 \endinput
 %%
 %% End of file `luamplib.sty'.



More information about the tex-live-commits mailing list.