texlive[71888] Master/texmf-dist: luamplib (24jul24)

commits+karl at tug.org commits+karl at tug.org
Wed Jul 24 21:48:47 CEST 2024


Revision: 71888
          https://tug.org/svn/texlive?view=revision&revision=71888
Author:   karl
Date:     2024-07-24 21:48:46 +0200 (Wed, 24 Jul 2024)
Log Message:
-----------
luamplib (24jul24)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/luatex/luamplib/NEWS
    trunk/Master/texmf-dist/doc/luatex/luamplib/luamplib.pdf
    trunk/Master/texmf-dist/doc/luatex/luamplib/test-luamplib-latex.tex
    trunk/Master/texmf-dist/doc/luatex/luamplib/test-luamplib-plain.tex
    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-07-24 09:10:15 UTC (rev 71887)
+++ trunk/Master/texmf-dist/doc/luatex/luamplib/NEWS	2024-07-24 19:48:46 UTC (rev 71888)
@@ -1,5 +1,15 @@
                        History of the luamplib package
 
+2024/07/24 2.34.2
+   * With the newly introduced macros, \mplibgroup ... \endmplibgroup, users
+   can define a transparency group or a normal form XObject from TeX side.
+   The LaTeX environment 'mplibgroup' is identical to this pair of macros.
+   See the document for details.
+
+   * document: be more precise about the color effect of a transparency group
+
+   * remove trailing zeros from numeric objects to get smaller PDF
+
 2024/07/19 2.34.1
    * transparency group is available with plain format as well.
    * transparency group once used is reusable in the TeX code or

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

Modified: trunk/Master/texmf-dist/doc/luatex/luamplib/test-luamplib-latex.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/luamplib/test-luamplib-latex.tex	2024-07-24 09:10:15 UTC (rev 71887)
+++ trunk/Master/texmf-dist/doc/luatex/luamplib/test-luamplib-latex.tex	2024-07-24 19:48:46 UTC (rev 71888)
@@ -332,6 +332,11 @@
 \leavevmode
 \mpfig usemplibgroup "test:isolated,knockout" scaled 2/3 rotated 15 ; \endmpfig
 \usemplibgroup{test:isolated,knockout}%
+\begin{mplibgroup}{mytex}[matrix="rotated 15"] \TeX \end{mplibgroup}%
+\hbox to0pt{\hss\vrule width.5pt height5pt depth5pt\hss}%
+\hbox to0pt{\hss\vrule width10pt height.25pt depth.25pt\hss}%
+\usemplibgroup{mytex}%
+\mpfig usemplibgroup "mytex"; draw (left--right) scaled 5; draw (up--down) scaled 5; \endmpfig
 \tracingcommands0
 
 \vskip 2\baselineskip

Modified: trunk/Master/texmf-dist/doc/luatex/luamplib/test-luamplib-plain.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/luamplib/test-luamplib-plain.tex	2024-07-24 09:10:15 UTC (rev 71887)
+++ trunk/Master/texmf-dist/doc/luatex/luamplib/test-luamplib-plain.tex	2024-07-24 19:48:46 UTC (rev 71888)
@@ -307,6 +307,11 @@
   withfaderadius (0,60)
   ;
 \endmpfig
+\mplibgroup{mytex}[matrix="rotated 15"] \TeX \endmplibgroup
+\hbox to0pt{\hss\vrule width.5pt height5pt depth5pt\hss}%
+\hbox to0pt{\hss\vrule width10pt height.25pt depth.25pt\hss}%
+\usemplibgroup{mytex}%
+\mpfig usemplibgroup "mytex"; draw (left--right) scaled 5; draw (up--down) scaled 5; \endmpfig
 \tracingcommands0
 
 \vskip 2\baselineskip

Modified: trunk/Master/texmf-dist/source/luatex/luamplib/luamplib.dtx
===================================================================
--- trunk/Master/texmf-dist/source/luatex/luamplib/luamplib.dtx	2024-07-24 09:10:15 UTC (rev 71887)
+++ trunk/Master/texmf-dist/source/luatex/luamplib/luamplib.dtx	2024-07-24 19:48:46 UTC (rev 71888)
@@ -85,9 +85,9 @@
 %<*driver>
 \NeedsTeXFormat{LaTeX2e}
 \ProvidesFile{luamplib.drv}%
-  [2024/07/19 v2.34.1 Interface for using the mplib library]%
+  [2024/07/24 v2.34.2 Interface for using the mplib library]%
 \documentclass{ltxdoc}
-\usepackage{metalogo,multicol,mdwlist,fancyvrb,xspace}
+\usepackage{metalogo,multicol,xspace}
 \usepackage[x11names]{xcolor}
 %
 \def\primarycolor{DodgerBlue4}  %%-> rgb  16  78 139 | #104e8b
@@ -125,6 +125,9 @@
 \newcommand \file       {\nolinkurl}
 \newcommand \pk         {\textsf}
 
+\newcommand*\metapost {\textsc{metapost}\xspace}
+\newcommand*\mplib {\textsf{mplib}\xspace}
+
 \begin{document}
   \DocInput{luamplib.dtx}%
 \end{document}
@@ -153,28 +156,28 @@
 % \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/07/19 v2.34.1}
+% \date{2024/07/24 v2.34.2}
 %
 % \maketitle
 %
 % \begin{abstract}
-% Package to have metapost code typeset directly in a document with \LuaTeX.
+% Package to have \metapost code typeset directly in a document with \LuaTeX.
 % \end{abstract}
 %
 % \section{Documentation}
 %
-% This package aims at providing a simple way to typeset directly metapost
+% This package aims at providing a simple way to typeset directly \metapost
 % code in a document with \LuaTeX. \LuaTeX\ is built with the Lua
-% \textsf{mplib} library, that runs metapost code. This package is basically a
-% wrapper for the Lua \textsf{mplib} functions and some \TeX\
-% functions to have the output of the \textsf{mplib} functions in the pdf.
+% \mplib library, that runs \metapost code. This package is basically a
+% wrapper for the Lua \mplib functions and some \TeX\
+% functions to have the output of the \mplib functions in the pdf.
 %
-% Using this package is easy: in Plain, type your metapost code between the
+% Using this package is easy: in Plain, type your \metapost code between the
 % macros \cs{mplibcode} and \cs{endmplibcode}, and in \LaTeX\ in the
 % \texttt{mplibcode} environment.
 %
-% The resulting metapost figures are put in a \TeX\ \texttt{hbox} with dimensions
-% adjusted to the metapost code.
+% The resulting \metapost figures are put in a \TeX\ \texttt{hbox} with dimensions
+% adjusted to the \metapost code.
 %
 % The code of luamplib is basically from the |luatex-mplib.lua| and |luatex-mplib.tex| files
 % from \ConTeXt. They have been adapted to \LaTeX\ and Plain by Elie Roux and
@@ -186,7 +189,7 @@
 %   |textext()| is a more versatile macro equivalent to |TEX()| from \textsf{TEX.mp}.
 %   |TEX()| is also allowed and is a synonym of |textext()|.
 %   The argument of
-%   \textsf{mplib}'s primitive |maketext| will also be processed by the same routine.
+%   \mplib's primitive |maketext| will also be processed by the same routine.
 %
 % \item possibility to use |verbatimtex ... etex|, though it's behavior cannot
 %   be the same as the stand-alone \textsf{mpost}.
@@ -193,8 +196,8 @@
 %   Of course you cannot include \cs{documentclass}, \cs{usepackage} etc.
 %   When these \TeX\ commands are found in |verbatimtex ... etex|, the entire code will be
 %   ignored.
-%   The treatment of |verbatimtex| command has changed a lot since v2.20;
-%   see below regarding \cs{mpliblegacybehavior}.
+%   The treatment of |verbatimtex| command has changed a lot since v2.20:
+%   see \hyperlink{mpliblegacybehavior}{below \S\,1.1}.
 %
 % \item in the past,
 %   the package required PDF mode in order to have some output.
@@ -203,22 +206,22 @@
 % \end{itemize}
 %
 % It seems to be convenient to divide the explanations of some more changes and cautions
-% into three parts: \TeX, MetaPost, and Lua interfaces.
+% into three parts: \TeX, \textsc{MetaPost}, and Lua interfaces.
 %
 % \subsection{\TeX}
 %
 % \paragraph{\cs{mplibforcehmode}}
-%   When this macro is declared, every metapost figure box will be
+%   When this macro is declared, every \metapost figure box will be
 %   typeset in horizontal mode, so \cs{centering}, \cs{raggedleft} etc
-%   will have effects. |\mplibnoforcehmode|, being default, reverts this
-%   setting. (Actually these commands redefine |\prependtomplibbox|; you
+%   will have effects. \cs{mplibnoforcehmode}, being default, reverts this
+%   setting. (Actually these commands redefine \cs{prependtomplibbox}; you
 %   can redefine this command with anything suitable before a box.)
 %
 % \paragraph{\cs{everymplib\{...\}}, \cs{everyendmplib\{...\}}}
 %   \cs{everymplib} and \cs{everyendmplib} redefine
-%   the lua table containing metapost code
+%   the lua table containing \metapost code
 %   which will
-%   be automatically inserted at the beginning and ending of each metapost code chunk.
+%   be automatically inserted at the beginning and ending of each \metapost code chunk.
 %\begin{verbatim}
 %     \everymplib{ beginfig(0); }
 %     \everyendmplib{ endfig; }
@@ -229,23 +232,25 @@
 %\end{verbatim}
 %
 % \paragraph{\cs{mplibsetformat\{plain\char"7C metafun\}}}
-%   There are (basically) two formats for metapost: \emph{plain} and
+%   There are (basically) two formats for \metapost: \emph{plain} and
 %   \emph{metafun}. By default, the \emph{plain} format is used, but you can set
 %   the format to be used by future figures at any time using
-%   |\mplibsetformat{|\emph{<format name>}|}|.
+%   \cs{mplibsetformat\{<format name>\}}.
 %
 %   \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)
 %   are fully supported,
-%   and outlinetext is supported by our own alternative |mpliboutlinetext| (see below \S\,1.2).
+%   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=|\emph{<number>}|"| to the sentence.
+%   just by appending |withprescript| |"tr_transparency=<number>"| to the sentence.
 %   ($0 \le \hbox{\emph{<number>}} \le 1$)
 %
+%   \hypertarget{metafunformat}{}\relax
 %   As for transparency group, the current \emph{metafun} document \S\,8.8 is not correct.
 %   The true syntax is:
 %\begin{verbatim}
@@ -255,7 +260,7 @@
 %   Beware that currently many of the PDF rendering applications, except Adobe Acrobat Reader,
 %   cannot properly render the isolated or knockout effect.
 %   Transparency group is available with \emph{plain} format as well, with extended functionality.
-%   See below \S\,1.2.
+%   See \hyperlink{transparencygroup}{below \S\,1.2}.
 %
 %   One thing worth mentioning about shading is:
 %   when a color expression is given in string type,
@@ -272,19 +277,20 @@
 %
 % \paragraph{\cs{mplibshowlog\{enable\char"7C disable\}}}
 %   Default: |disable|.
-%   When |\mplibshowlog{enable}|\footnote{As for user's setting,
+%   When \cs{mplibshowlog\{enable\}}\footnote{As for user's setting,
 %   |enable|, |true| and |yes| are identical;
 %   |disable|, |false| and |no| are identical.} is declared, log messages returned by
-%   the metapost process will be printed to the |.log| file.
+%   the \metapost process will be printed to the |.log| file.
 %   This is the \TeX{} side interface for |luamplib.showlog|.
 %
 % \paragraph{\cs{mpliblegacybehavior\{enable\char"7C disable\}}}
-%   By default, |\mpliblegacybehavior{enable}|
+%   \hypertarget{mpliblegacybehavior}{}\relax
+%   By default, \cs{mpliblegacybehavior\{enable\}}
 %   is already declared for backward compatibility,
 %   in which case \TeX\ code in
 %   |verbatimtex| |...| |etex| that comes just before |beginfig()|
 %   will be inserted before the
-%   following metapost figure box.  In this way,
+%   following \metapost figure box.  In this way,
 %   each figure box can be freely moved horizontally or vertically.
 %   Also, a box number can be assigned to a figure box, allowing it to be
 %   reused later.
@@ -301,7 +307,7 @@
 %
 %   On the other hand, \TeX\ code in |verbatimtex ... etex|
 %   between |beginfig()| and |endfig| will be inserted
-%   after flushing out the metapost figure.
+%   after flushing out the \metapost figure.
 %   As shown in the example below, |VerbatimTeX()| is a synonym of |verbatimtex| |...| |etex|.
 %\begin{verbatim}
 %     \mplibcode
@@ -315,7 +321,7 @@
 %\end{verbatim}
 %
 %   By contrast,
-%   when |\mpliblegacybehavior{disabled}| is declared, any
+%   when \cs{mpliblegacybehavior\{disabled\}} is declared, any
 %   |verbatimtex| |...| |etex| will be executed, along with |btex| |...| |etex|,
 %   sequentially one by one.
 %   So, some \TeX\ code in |verbatimtex ... etex| will have effects on
@@ -333,7 +339,7 @@
 %
 % \paragraph{\cs{mplibtextextlabel\{enable\char"7C disable\}}}
 %   Default: |disable|.
-%   |\mplibtextextlabel{enable}| enables
+%   \cs{mplibtextextlabel\{enable\}} enables
 %   the labels typeset via |textext| instead of |infont| operator.
 %   So, |label("my text",origin)| thereafter is exactly the same as
 %   |label(textext("my text"),origin)|.
@@ -347,14 +353,14 @@
 %
 % \paragraph{\cs{mplibcodeinherit\{enable\char"7C disable\}}}
 %   Default: |disable|.
-%   |\mplibcodeinherit{enable}| enables the inheritance
-%   of variables, constants, and macros defined by previous metapost code chunks.
-%   On the contrary, |\mplibcodeinherit{disable}| will make
+%   \cs{mplibcodeinherit\{enable\}} enables the inheritance
+%   of variables, constants, and macros defined by previous \metapost code chunks.
+%   On the contrary, \cs{mplibcodeinherit\{disable\}} will make
 %   each code chunk being treated as an independent instance, never
 %   affected by previous code chunks.
 %
-% \paragraph{Separate MetaPost instances}
-%   luamplib v2.22 has added the support for several named metapost instances
+% \paragraph{Separate \metapost instances}
+%   luamplib v2.22 has added the support for several named \metapost instances
 %   in \LaTeX{} |mplibcode| environment.
 %   Plain \TeX\ users also can use this functionality.
 %   The syntax for \LaTeX\ is:
@@ -389,7 +395,7 @@
 %
 % \paragraph{\cs{mplibglobaltextext\{enable\char"7C disable\}}}
 %   Default: |disable|.
-%   Formerly, to inherit |btex| |...| |etex| boxes as well as other metapost macros, variables and constants,
+%   Formerly, to inherit |btex| |...| |etex| boxes as well as other \metapost macros, variables and constants,
 %   it was necessary to declare \cs{mplibglobaltextext\{enable\}} in advance.
 %   But from v2.27, this is implicitly enabled when \cs{mplibcodeinherit}
 %   is enabled.
@@ -410,13 +416,15 @@
 %
 % \paragraph{\cs{mplibverbatim\{enable\char"7C disable\}}}
 %   Default: |disable|.
-%   Users can issue |\mplibverbatim{enable}|, after which
+%   Users can issue \cs{mplibverbatim\{enable\}}, after which
 %   the contents of mplibcode environment will be read verbatim. As a result,
-%   except for |\mpdim| and |\mpcolor| (see below), all other \TeX\ commands outside of the
+%   except for \cs{mpdim} and \cs{mpcolor} (see \hyperlink{mpdim}{below}),
+%   all other \TeX\ commands outside of the
 %   |btex| or |verbatimtex| |...| |etex| are not expanded and will be fed
-%   literally to the \textsf{mplib} library.
+%   literally to the \mplib library.
 %
 % \paragraph{\cs{mpdim\{...\}}}
+%   \hypertarget{mpdim}{}\relax
 %   Besides other \TeX\ commands, \cs{mpdim} is specially allowed
 %   in the mplibcode environment. This feature is inpired by \textsf{gmp} package authored by
 %   Enrico Gregorio. Please refer to the manual of \textsf{gmp} package for details.
@@ -433,7 +441,7 @@
 %   With \cs{mpcolor} command, color names or expressions of
 %   \textsf{color}, \textsf{xcolor} and \textsf{l3color} module/packages can be used in the mplibcode
 %   enviroment (after |withcolor| operator).
-%   See the example above.
+%   See the example \hyperlink{mpdim}{above}.
 %   The optional |[...]| means the option of \textsf{xcolor}'s \cs{color} command.
 %   For spot colors, \textsf{l3color} (in PDF/DVI mode),
 %   \textsf{colorspace}, \textsf{spotcolor}
@@ -443,8 +451,8 @@
 % \paragraph{\cs{mpfig} \ldots\ \cs{endmpfig}}
 %   Besides the |mplibcode| environment (for \LaTeX) and
 %   \cs{mplibcode ...} \cs{endmplibcode} (for Plain),
-%   we also provide unexpandable \TeX\ macros |\mpfig ... \endmpfig| and its starred version
-%   |\mpfig* ... \endmpfig| to save typing toil.
+%   we also provide unexpandable \TeX\ macros \cs{mpfig} |...| \cs{endmpfig} and its starred version
+%   \cs{mpfig*} |...| \cs{endmpfig} to save typing toil.
 %   The former is roughly the same as follows:
 %\begin{verbatim}
 %     \begin{mplibcode}[@mpfig]
@@ -461,9 +469,9 @@
 %     ...
 %     \end{mplibcode}
 %\end{verbatim}
-%   In these macros |\mpliblegacybehavior{disable}|
+%   In these macros \cs{mpliblegacybehavior\{disable\}}
 %   is forcibly declared.
-%   Again, as both share the same instance name, metapost codes are inherited among them.
+%   Again, as both share the same instance name, \metapost codes are inherited among them.
 %   A simple example:
 %\begin{verbatim}
 %     \everymplib[@mpfig]{ drawoptions(withcolor .5[red,white]); }
@@ -473,21 +481,21 @@
 %     \endmpfig
 %\end{verbatim}
 %   The instance name (default: |@mpfig|) can be changed by redefining
-%   \cs{mpfiginstancename}, after which a new mplib instance will start and
-%   code inheritance too will begin anew.  |\let\mpfiginstancename\empty| will
-%   prevent code inheritance if |\mplibcodeinherit{true}| is not declared.
+%   \cs{mpfiginstancename}, after which a new \mplib instance will start and
+%   code inheritance too will begin anew.  \cs{let}\cs{mpfiginstancename}\cs{empty} will
+%   prevent code inheritance if \cs{mplibcodeinherit\{true\}} is not declared.
 %
 % \paragraph{About cache files}
 %   To support |btex ... etex| in external |.mp| files, luamplib
 %   inspects the content of each and every |.mp| file and makes caches
-%   if nececcsary, before returning their paths to \LuaTeX's \textsf{mplib} library.
+%   if nececcsary, before returning their paths to \LuaTeX's \mplib library.
 %   This could waste the compilation time, as most |.mp| files
 %   do not contain |btex ... etex| commands.  So luamplib provides
 %   macros as follows, so that users can give instructions about files
 %   that do not require this functionality.
 %   \begin{itemize}
-%   \item |\mplibmakenocache{<filename>[,<filename>,...]}|
-%   \item |\mplibcancelnocache{<filename>[,<filename>,...]}|
+%   \item \cs{mplibmakenocache\{<filename>[,<filename>,...]\}}
+%   \item \cs{mplibcancelnocache\{<filename>[,<filename>,...]\}}
 %   \end{itemize}
 %   where |<filename>| is a filename excluding |.mp| extension.
 %   Note that |.mp| files under |$TEXMFMAIN/metapost/base| and
@@ -502,9 +510,9 @@
 %   command-line option.
 %
 %   Users can change this behavior by the command
-%   |\mplibcachedir{<directory path>}|, where tilde (|~|) is interpreted
+%   \cs{mplibcachedir\{<directory path>\}}, where tilde (|~|) is interpreted
 %   as the user's home directory (on a windows machine as well).
-%   As backslashes (|\|) should be escaped by users, it would be easier to use
+%   As backslashes (\cs{}) should be escaped by users, it would be easier to use
 %   slashes (|/|) instead.
 %
 % \paragraph{About figure box metric}
@@ -520,18 +528,19 @@
 %   Frequently used settings such as \cs{everymplib}, \cs{mplibforcehmode}
 %   or \cs{mplibcodeinherit} are suitable for going into this file.
 %
-% \subsection{MetaPost}
+% \subsection{\textsc{MetaPost}}
 %
 % \paragraph{\texttt{mplibdimen(...)}, \texttt{mplibcolor(...)}}
-%   These are MetaPost interfaces for the \TeX\ commands \cs{mpdim} and \cs{mpcolor}. For example,
-%   |mplibdimen("\linewidth")| is basically the same as |\mpdim{\linewidth}|, and
-%   |mplibcolor("red!50")| is basically the same as |\mpcolor{red!50}|.
-%   The difference is that these metapost operators can also be used in external |.mp| files,
+%   These are \metapost interfaces for the \TeX\ commands
+%   \hyperlink{mpdim}{\cs{mpdim} \textcolor{black}{and} \cs{mpcolor}}. For example,
+%   |mplibdimen("\linewidth")| is basically the same as \cs{mpdim\{\cs{linewidth}\}}, and
+%   |mplibcolor("red!50")| is basically the same as \cs{mpcolor\{red!50\}}.
+%   The difference is that these \metapost operators can also be used in external |.mp| files,
 %   which cannot have \TeX\ commands outside of the |btex| or |verbatimtex| |...| |etex|.
 %
 % \paragraph{\texttt{mplibtexcolor ...}, \texttt{mplibrgbtexcolor ...}}
-%   |mplibtexcolor|, which accepts a string argument, is a metapost operator that converts a \TeX\ color expression
-%   to a MetaPost color expression, that can be used anywhere color expression is expected
+%   |mplibtexcolor|, which accepts a string argument, is a \metapost operator that converts a \TeX\ color expression
+%   to a \metapost color expression, that can be used anywhere color expression is expected
 %   as well as after the |withcolor| operator.
 %   For instance:
 %\begin{verbatim}
@@ -541,13 +550,14 @@
 %   But the result may vary in its color model (gray/rgb/cmyk)
 %   according to the given \TeX\ color. (Spot colors are forced to
 %   cmyk model, so this operator is not recommended for spot colors.)
-%   Therefore the example shown above would raise a metapost error:
+%   Therefore the example shown above would raise a \metapost error:
 %   |cmykcolor col;| should have been declared.
 %   By contrast, |mplibrgbtexcolor| \emph{<string>} always returns rgb model expressions.
 %
 % \paragraph{\texttt{mplibgraphictext ...}}
-%   |mplibgraphictext| is a metapost operator, the effect of which is similar to that of
-%   \ConTeXt's |graphictext| or our own |mpliboutlinetext| (see below).
+%   |mplibgraphictext| is a \metapost operator, the effect of which is similar to that of
+%   \ConTeXt's |graphictext| or our own |mpliboutlinetext|
+%   (see \hyperlink{mpliboutlinetext}{below}).
 %   However the syntax is somewhat different.
 %\begin{verbatim}
 %     mplibgraphictext "Funny"
@@ -575,9 +585,9 @@
 %   as we cannot embolden type1 fonts in DVI mode.
 %
 %   \paragraph{\texttt{mplibglyph ... of ...}}
-%   From v2.30, we provide a new metapost operator |mplibglyph|, which returns a metapost picture
+%   From v2.30, we provide a new \metapost operator |mplibglyph|, which returns a \metapost picture
 %   containing outline paths of a glyph in opentype, truetype or type1 fonts.
-%   When a type1 font is specified, metapost primitive |glyph| will be called.
+%   When a type1 font is specified, \metapost primitive |glyph| will be called.
 %\begin{verbatim}
 %      mplibglyph 50  of \fontid\font          % slot 50 of current font
 %      mplibglyph "Q" of "TU/TeXGyrePagella(0)/m/n/10"    % font csname
@@ -596,7 +606,7 @@
 %
 %   \paragraph{\texttt{mplibdrawglyph ...}}
 %   The picture returned by |mplibglyph| will be quite similar to the result of |glyph| primitive in its structure.
-%   So, metapost's |draw| command will fill the inner path of the picture with the background color.
+%   So, \metapost's |draw| command will fill the inner path of the picture with the background color.
 %   In contrast, |mplibdrawglyph| \emph{<picture>} command fills the paths according to the nonzero winding
 %   number rule. As a result, for instance, the area surrounded by inner path of ``O''
 %   will remain transparent.
@@ -609,8 +619,9 @@
 %   additionally declare |withpostscript| |"evenodd"| to the last path in the picture.
 %
 % \paragraph{\texttt{mpliboutlinetext (...)}}
-%   From v2.31, a new metapost operator |mpliboutlinetext| is available, which mimicks
-%   metafun's |outlinetext|. So the syntax is the same as metafun's. See the metafun
+%   \hypertarget{mpliboutlinetext}{}\relax
+%   From v2.31, a new \metapost operator |mpliboutlinetext| is available, which mimicks
+%   \emph{metafun}'s |outlinetext|. So the syntax is the same: see the \emph{metafun}
 %   manual \S\,8.7 (|texdoc metafun|). A simple example:
 %\begin{verbatim}
 %     draw mpliboutlinetext.b ("$\sqrt{2+\alpha}$")
@@ -627,11 +638,12 @@
 %   a single cluster might be separated apart.
 %
 % \paragraph{\cs{mppattern\{...\}} \texttt{...} \cs{endmppattern}, \texttt{... withpattern ...}}
+%   \hypertarget{mppattern}{}\relax
 %   \TeX\ macros
-%   |\mppattern{<name>}| \ldots\ |\endmppattern| define a tiling pattern
+%   \cs{mppattern\{<name>\}} |...| \cs{endmppattern} define a tiling pattern
 %   associated with the |<name>|.
-%   MetaPost operator |withpattern|, the syntax being
-%   \emph{<path>} |withpattern| \emph{<string>}, will return a metapost picture which fills
+%   \metapost operator |withpattern|, the syntax being
+%   \emph{<path>} |withpattern| \emph{<string>}, will return a \metapost picture which fills
 %   the given path with a tiling pattern of the |<name>|
 %   by replicating it horizontally and vertically.
 %   An example:
@@ -679,7 +691,7 @@
 %   For the sake of convenience, the width and height values of tiling patterns will be written down
 %   into the log file. (depth is always zero.) Users can refer to them for option setting.
 %
-%   As for |matrix| option, metapost code such as `|rotated 30 slanted .2|' is allowed as well
+%   As for |matrix| option, \metapost code such as `|rotated 30 slanted .2|' is allowed as well
 %   as string or table of four numbers. You can also set |xshift| and |yshift|
 %   values by using `|shifted|' operator. But when |xshift| or |yshift| option is explicitly
 %   given, they have precedence over the effect of `|shifted|' operator.
@@ -690,7 +702,7 @@
 %   is not needed in most cases.
 %
 %   Option |colored=false| (|coloured| is a synonym of |colored|) will generate an uncolored pattern which shall have no color at all.
-%   Uncolored pattern will be painted later by the color of a metapost object.
+%   Uncolored pattern will be painted later by the color of a \metapost object.
 %   An example:
 %\begin{verbatim}
 %      \begin{mppattern}{pattuncolored}
@@ -723,11 +735,11 @@
 %      \end{mplibcode}
 %\end{verbatim}
 %
-% \paragraph{\texttt{... withfademethod ...}, and related macros}
-%   |withfademethod| is a metapost operator which makes the color of an object gradiently transparent.
+% \paragraph{\texttt{... withfademethod ...}}
+%   This is a \metapost operator which makes the color of an object gradiently transparent.
 %   The syntax is \emph{<path>}\texttt{\char"7C}\emph{<picture>} |withfademethod| \emph{<string>},
 %   the latter being either |"linear"| or |"circular"|.
-%   Though it is similar to the |withshademethod| provided by metafun,
+%   Though it is similar to the |withshademethod| from \emph{metafun},
 %   the differences are: (1) the operand of |withfademethod| can be a picture as well as a path;
 %   (2) you cannot make gradient colors, but can only make gradient opacity.
 %
@@ -767,19 +779,23 @@
 %     \endmpfig
 %\end{verbatim}
 %
-% \paragraph{Transparency Group}
-% As said before,
+% \paragraph{\texttt{... asgroup ...}}
+% \hypertarget{transparencygroup}{}\relax
+% As said \hyperlink{metafunformat}{before},
 % transparency group is available with \emph{plain} as well as \emph{metafun} format.
 % The syntax is exactly the same:
 % \emph{<picture>} \char"7C\ \emph{<path>} |asgroup|
 % |""| \char"7C\ |"isolated"| \char"7C\ |"knockout"| \char"7C\ |"isolated,knockout"|,
-% which will return a metapost picture.
+% which will return a \metapost picture.
+% It is called \emph{Transparency Group} because the objects contained in the group are composited
+% to produce a single object, so that outer transparency effect, if any,
+% will be applied to the group as a whole, not to the individual objects cumulatively.
 %
 % The additional feature provided by luamplib is that
 % you can reuse the group as many times as you want
-% in the \TeX{} code or in other MetaPost code chunks,
+% in the \TeX{} code or in other \metapost code chunks,
 % with infinitesimal increase in the size of PDF file.
-% For this functionality we provide \TeX{} and MetaPost macros as follows:
+% For this functionality we provide \TeX{} and \metapost macros as follows:
 % \begin{description}
 %   \let\bfseries\relax
 % \item[|withgroupname| \emph{<string>}] associates a transparency group with the given name.
@@ -786,17 +802,19 @@
 %   When this is not appended to the sentense with |asgroup| operator,
 %   the default group name `|lastmplibgroup|' will be used.
 %
-% \item[\cs{usemplibgroup\{...\}}] is a \TeX\ command to reuse a transparency group of the name
+% \item[\cs{usemplibgroup\{...\}}]
+%   \hypertarget{usemplibgroup}{}\relax
+%   is a \TeX\ command to reuse a transparency group of the name
 %   once used.
 %   Note that the position of the group will be origin-based:
 %   in other words, lower-left corner of the group will be shifted to the origin.
 %
-% \item[|usemplibgroup| \emph{<string>}] is a MetaPost command which will add
+% \item[|usemplibgroup| \emph{<string>}] is a \metapost command which will add
 %   a transparency group of the name to the |currentpicture|.
 %   Contrary to the \TeX\ command just mentioned,
 %   the position of the group is the same as the original transparency group.
 % \end{description}
-% An example showing the difference between the \TeX\ and MetaPost commands:
+% An example showing the difference between the \TeX\ and \metapost commands:
 %\begin{verbatim}
 %   \mpfig
 %     draw image(
@@ -808,9 +826,8 @@
 %   \endmpfig
 %
 %   \noindent
-%   \llap{\vrule width 10pt height .25pt depth .25pt}%
+%   \clap{\vrule width 20pt height .25pt depth .25pt}%
 %   \clap{\vrule width .5pt height 10pt depth 10pt}%
-%   \rlap{\vrule width 10pt height .25pt depth .25pt}%
 %   \usemplibgroup{mygroup}
 %
 %   \mpfig
@@ -819,28 +836,85 @@
 %     draw (up--down) scaled 10;
 %   \endmpfig
 %\end{verbatim}
-% Also note that reused transparency groups are not affected by color commands,
-% transparency/fading commands will have effects though.
 %
+% Also note that normally the reused transparency groups are not affected by outer color commands.
+% However, if you have made the original transparency group using |withoutcolor| command,
+% colors will have effects on the uncolored objects in the group.
+%
+% \paragraph{\cs{mplibgroup\{...\} ...} \cs{endmplibgroup}}
+% These \TeX\ macros are described here in this subsection, as they are
+% deeply related to the |asgroup| operator.
+% Users can define a transparency group or a normal \emph{form XObject}
+% with these macros from \TeX\ side.
+% The syntax is similar to the \cs{mppattern} command (see \hyperlink{mppattern}{above}).
+% An example:
+%\begin{verbatim}
+%   \mplibgroup{mygrx}                  % or \begin{mplibgroup}{mygrx}
+%     [                                 % options: see below
+%       asgroup="",
+%     ]
+%     \mpfig                            % or any other TeX code
+%       draw (left--right) scaled 30 rotated 45 withpen pencircle scaled 10;
+%       draw (left--right) scaled 30 rotated -45 withpen pencircle scaled 10;
+%     \endmpfig
+%   \endmplibgroup                      % or \end{mplibgroup}
+%
+%   \usemplibgroup{mygrx}
+%
+%   \mpfig
+%     usemplibgroup "mygrx" scaled 1.5 withprescript "tr_transparency=0.5";
+%   \endmpfig
+%\end{verbatim}
+% Availabe options, much fewer than those for \cs{mppattern},
+% are listed in Table~\ref{tab:mplibgroupoptions}.
+% \begin{table}
+% \centering
+% \caption{options for \cs{mplibgroup}}\label{tab:mplibgroupoptions}
+% \begin{tabular}{lll}
+% \hline
+%   Key         & Value Type    & Explanation\\
+% \hline
+%   |asgroup|   &\emph{string}  & |""|, |"isolated"|, |"knockout"|, or |"isolated,knockout"|\\
+%   |bbox|      &\emph{table} or \emph{string} & |llx|, |lly|, |urx|, |ury| values\kern1pt*\\
+%   |matrix|    &\emph{table} or \emph{string} & |xx|, |yx|, |xy|, |yy| values\kern1pt*
+%     or MP transform code\\
+%   |resources| &\emph{string}  & PDF resources if needed\\
+% \hline
+%               &               & \small *\,in string type, numbers are separated by spaces\\
+% \end{tabular}
+% \end{table}
+%
+% When |asgroup| option, including empty string, is not given,
+% a normal form XObject will be generated rather than a transparency group.
+% So, the individual objects, not the XObject as a whole, will be affected
+% by outer transparency command.
+%
+% As shown in the example, you can reuse the transparency group or the normal form XObject
+% once defined
+% using the \TeX\ command \cs{usemplibgroup} or
+% the \metapost command |usemplibgroup|.
+% The behavior of these commands is the same as that described \hyperlink{usemplibgroup}{above}.
+%
+%
 % \subsection{Lua}
 %
 % \paragraph{\texttt{runscript ...}}
-%   Using the primitive |runscript| \emph{<string>}, you can run a Lua code chunk from MetaPost side
-%   and get some metapost code returned by Lua if you want.
-%   As the functionality is provided by the \textsf{mplib} library itself,
+%   Using the primitive |runscript| \emph{<string>}, you can run a Lua code chunk from \metapost side
+%   and get some \metapost code returned by Lua if you want.
+%   As the functionality is provided by the \mplib library itself,
 %   luamplib does not have much to say about it.
 %
 %   One thing is worth mentioning, however:
-%   if you return a Lua \emph{table} to the metapost process,
-%   it is automatically converted to a relevant metapost value type
+%   if you return a Lua \emph{table} to the \metapost process,
+%   it is automatically converted to a relevant \metapost value type
 %   such as pair, color, cmykcolor or transform.
 %   So users can save some extra toil of converting a table to a string, though it's not a big deal.
-%   For instance, |runscript "return {1,0,0}"| will give you the metapost color expression |(1,0,0)|
+%   For instance, |runscript "return {1,0,0}"| will give you the \metapost color expression |(1,0,0)|
 %   automatically.
 %
 % \paragraph{Lua table \texttt{luamplib.instances}}
-%   Users can access the Lua table containing mplib instances, |luamplib.instances|,
-%   through which metapost variables are also easily accessible from Lua side,
+%   Users can access the Lua table containing \mplib instances, |luamplib.instances|,
+%   through which \metapost variables are also easily accessible from Lua side,
 %   as documented in Lua\TeX{} manual \S\,11.2.8.4 (|texdoc luatex|).
 %   The following will print |false|, |3.0|, |MetaPost| and
 %   the knots and the cyclicity of the path |unitsquare|, consecutively.
@@ -865,7 +939,7 @@
 %\end{verbatim}
 %
 % \paragraph{Lua function \texttt{luamplib.process\_mplibcode}}
-%   Users can execute a MetaPost code chunk from Lua side by using this function:
+%   Users can execute a \metapost code chunk from Lua side by using this function:
 %\begin{verbatim}
 %     luamplib.process_mplibcode (<string> metapost code, <string> instance name)
 %\end{verbatim}
@@ -907,14 +981,14 @@
 
 luatexbase.provides_module {
   name          = "luamplib",
-  version       = "2.34.1",
-  date          = "2024/07/19",
+  version       = "2.34.2",
+  date          = "2024/07/24",
   description   = "Lua package to typeset Metapost with LuaTeX's MPLib.",
 }
 
 %    \end{macrocode}
 %
-%    Use the |luamplib| namespace, since |mplib| is for the metapost library
+%    Use the |luamplib| namespace, since |mplib| is for the \metapost library
 %    itself. \ConTeXt{} uses |metapost|.
 %    \begin{macrocode}
 luamplib          = luamplib or { }
@@ -950,7 +1024,6 @@
     if kind == "Error" then error() end
   end
 end
-
 local function warn (...) -- beware '%' symbol
   termorlog("term and log", select("#",...) > 1 and format(...) or ...)
 end
@@ -975,18 +1048,14 @@
 local texgettoks  = tex.gettoks
 local texgetbox   = tex.getbox
 local texruntoks  = tex.runtoks
-
 if not texruntoks then
   err("Your LuaTeX version is too old. Please upgrade it to the latest")
 end
-
 local is_defined  = token.is_defined
 local get_macro   = token.get_macro
-
 local mplib = require ('mplib')
 local kpse  = require ('kpse')
 local lfs   = require ('lfs')
-
 local lfsattributes = lfs.attributes
 local lfsisdir      = lfs.isdir
 local lfsmkdir      = lfs.mkdir
@@ -1002,7 +1071,6 @@
 local replacesuffix = file.replacesuffix or function(filename, suffix)
   return (filename:gsub("%.[%a%d]+$","")) .. "." .. suffix
 end
-
 local is_writable = file.is_writable or function(name)
   if lfsisdir(name) then
     name = name .. "/_luam_plib_temp_file_"
@@ -1024,14 +1092,11 @@
 %    \end{macrocode}
 %
 %    |btex ... etex| in input |.mp| files will be replaced in finder.
-%    Because of the limitation of MPLib regarding |make_text|,
+%    Because of the limitation of \mplib regarding |make_text|,
 %    we might have to make cache files modified from input files.
 %    \begin{macrocode}
-local luamplibtime = kpse.find_file("luamplib.lua")
-luamplibtime = luamplibtime and lfsattributes(luamplibtime,"modification")
-
+local luamplibtime = lfsattributes(kpse.find_file"luamplib.lua", "modification")
 local currenttime = os.time()
-
 local outputdir, cachedir
 if lfstouch then
   for i,v in ipairs{'TEXMFVAR','TEXMF_OUTPUT_DIRECTORY','.','TEXMFOUTPUT'} do
@@ -1068,10 +1133,9 @@
     end
   end
 end
-
 %    \end{macrocode}
 %
-%    Some basic MetaPost files not necessary to make cache files.
+%    Some basic \metapost files not necessary to make cache files.
 %    \begin{macrocode}
 local noneedtoreplace = {
   ["boxes.mp"] = true, --  ["format.mp"] = true,
@@ -1090,7 +1154,6 @@
   ["mp-tool.mpiv"] = true, ["mp-cont.mpiv"] = true,
 }
 luamplib.noneedtoreplace = noneedtoreplace
-
 %    \end{macrocode}
 %
 %    |format.mp| is much complicated, so specially treated.
@@ -1112,7 +1175,6 @@
   lfstouch(newfile,currenttime,ofmodify)
   return newfile
 end
-
 %    \end{macrocode}
 %
 %    Replace |btex ... etex| and |verbatimtex ... etex| in input files,
@@ -1122,7 +1184,6 @@
 local name_e = "%f[^%a_]"
 local btex_etex = name_b.."btex"..name_e.."%s*(.-)%s*"..name_b.."etex"..name_e
 local verbatimtex_etex = name_b.."verbatimtex"..name_e.."%s*(.-)%s*"..name_b.."etex"..name_e
-
 local function replaceinputmpfile (name,file)
   local ofmodify = lfsattributes(file,"modification")
   if not ofmodify then return file end
@@ -1135,16 +1196,13 @@
       return nf.size == 0 and file or newfile
     end
   end
-
   if name == "format.mp" then return replaceformatmp(file,newfile,ofmodify) end
-
   local fh = ioopen(file,"r")
   if not fh then return file end
   local data = fh:read("*all"); fh:close()
-
 %    \end{macrocode}
 %    ``|etex|'' must be preceded by a space and followed by a space or semicolon as specified in
-%    \LuaTeX\ manual, which is not the case of standalone MetaPost though.
+%    \LuaTeX\ manual, which is not the case of standalone \metapost though.
 %    \begin{macrocode}
   local count,cnt = 0,0
   data, cnt = data:gsub(btex_etex, "btex %1 etex ") -- space
@@ -1151,7 +1209,6 @@
   count = count + cnt
   data, cnt = data:gsub(verbatimtex_etex, "verbatimtex %1 etex;") -- semicolon
   count = count + cnt
-
   if count == 0 then
     noneedtoreplace[name] = true
     fh = ioopen(newfile,"w");
@@ -1161,7 +1218,6 @@
     end
     return file
   end
-
   fh = ioopen(newfile,"w")
   if not fh then return file end
   fh:write(data); fh:close()
@@ -1171,8 +1227,8 @@
 
 %    \end{macrocode}
 %
-%    As the finder function for MPLib, use the |kpse| library and
-%    make it behave like as if MetaPost was used. And replace it with
+%    As the finder function for \mplib, use the |kpse| library and
+%    make it behave like as if \metapost was used. And replace it with
 %    cache files if needed.
 %    See also \#74, \#97.
 %    \begin{macrocode}
@@ -1184,12 +1240,10 @@
   end
   mpkpse = kpse.new(arg[exe], "mpost")
 end
-
 local special_ftype = {
   pfb = "type1 fonts",
   enc = "enc files",
 }
-
 function luamplib.finder (name, mode, ftype)
   if mode == "w" then
     if name and name ~= "mpout.log" then
@@ -1215,9 +1269,9 @@
 
 %    \end{macrocode}
 %
-%    Create and load MPLib instances.
-%    We do not support ancient version of MPLib any more.
-%    (Don't know which version of MPLib started to support
+%    Create and load \mplib instances.
+%    We do not support ancient version of \mplib any more.
+%    (Don't know which version of \mplib started to support
 %    |make_text| and |run_script|; let the users find it.)
 %    \begin{macrocode}
 local preamble = [[
@@ -1226,17 +1280,15 @@
   let normalfontsize = fontsize;
   input %s ;
 ]]
-
 %    \end{macrocode}
 %
-%    |plain| or |metafun|,
-%    though we cannot support |metafun| format fully.
+%    \emph{plain} or \emph{metafun},
+%    though we cannot support \emph{metafun} format fully.
 %    \begin{macrocode}
 local currentformat = "plain"
 function luamplib.setformat (name)
   currentformat = name
 end
-
 %    \end{macrocode}
 %
 %    v2.9 has introduced the concept of ``code inherit''
@@ -1245,7 +1297,6 @@
 local mplibinstances = {}
 luamplib.instances = mplibinstances
 local has_instancename = false
-
 local function reporterror (result, prevlog)
   if not result then
     err("no result object returned")
@@ -1286,7 +1337,6 @@
     return log
   end
 end
-
 %    \end{macrocode}
 %
 %     |lualibs-os.lua| installs a randomseed. When this file is not loaded,
@@ -1313,7 +1363,7 @@
     extensions  = 1,
   }
 %    \end{macrocode}
-%    Append our own MetaPost preamble to the preamble above.
+%    Append our own \metapost preamble to the preamble above.
 %    \begin{macrocode}
   local preamble = tableconcat{
     format(preamble, replacesuffix(name,"mp")),
@@ -1330,7 +1380,6 @@
   log = reporterror(result)
   return mpx, result, log
 end
-
 %    \end{macrocode}
 %
 %    Here, excute each |mplibcode| data,
@@ -1380,6 +1429,7 @@
 %    |dvipdfmx| is supported, though nobody seems to use it.
 %    \begin{macrocode}
 local pdfmode = tex.outputmode > 0
+
 %    \end{macrocode}
 %
 %    |make_text| and some |run_script| uses \LuaTeX's |tex.runtoks|.
@@ -1386,7 +1436,6 @@
 %    \begin{macrocode}
 local catlatex = luatexbase.registernumber("catcodetable at latex")
 local catat11  = luatexbase.registernumber("catcodetable at atletter")
-
 %    \end{macrocode}
 %
 %    |tex.scantoks| sometimes fail to read catcode properly, especially
@@ -1396,7 +1445,6 @@
 local function run_tex_code (str, cat)
   texruntoks(function() texsprint(cat or catlatex, str) end)
 end
-
 %    \end{macrocode}
 %
 %    Prepare textext box number containers, locals and globals.
@@ -1412,11 +1460,9 @@
 %    For conversion of |sp| to |bp|.
 %    \begin{macrocode}
 local factor = 65536*(7227/7200)
-
 local textext_fmt = 'image(addto currentpicture doublepath unitsquare \z
-xscaled %f yscaled %f shifted (0,-%f) \z
-withprescript "mplibtexboxid=%i:%f:%f")'
-
+  xscaled %f yscaled %f shifted (0,-%f) \z
+  withprescript "mplibtexboxid=%i:%f:%f")'
 local function process_tex_text (str)
   if str then
     local global = (has_instancename or luamplib.globaltextext or luamplib.codeinherit)
@@ -1461,7 +1507,6 @@
     [[\color_select:n%s\endgroup]],
   },
 }
-
 local colfmt = is_defined'color_select:n' and "l3color" or "xcolor"
 if colfmt == "l3color" then
   run_tex_code{
@@ -1475,7 +1520,6 @@
   }
 end
 local ccexplat = luatexbase.registernumber"luamplibcctabexplat"
-
 local function process_color (str)
   if str then
     if not str:find("%b{}") then
@@ -1536,13 +1580,12 @@
 %
 %    For legacy verbatimtex process.
 %    |verbatimtex ... etex| before |beginfig()| is not ignored,
-%    but the \TeX\ code is inserted just before the mplib box. And
-%    \TeX\ code inside |beginfig() ... endfig| is inserted after the mplib box.
+%    but the \TeX\ code is inserted just before the \mplib box. And
+%    \TeX\ code inside |beginfig() ... endfig| is inserted after the \mplib box.
 %    \begin{macrocode}
 local tex_code_pre_mplib = {}
 luamplib.figid = 1
 luamplib.in_the_fig = false
-
 local function process_verbatimtex_prefig (str)
   if str then
     tex_code_pre_mplib[luamplib.figid] = str
@@ -1549,7 +1592,6 @@
   end
   return ""
 end
-
 local function process_verbatimtex_infig (str)
   if str then
     return format('special "postmplibverbtex=%s";', str)
@@ -1568,7 +1610,7 @@
 
 %    \end{macrocode}
 %
-%    For |metafun| format. see issue \#79.
+%    For \emph{metafun} format. see issue \#79.
 %    \begin{macrocode}
 mp = mp or {}
 local mp = mp
@@ -1575,10 +1617,9 @@
 mp.mf_path_reset = mp.mf_path_reset or function() end
 mp.mf_finish_saving_data = mp.mf_finish_saving_data or function() end
 mp.report = mp.report or info
-
 %    \end{macrocode}
 %
-%    metafun 2021-03-09 changes crashes luamplib.
+%    \emph{metafun} 2021-03-09 changes crashes luamplib.
 %    \begin{macrocode}
 catcodes = catcodes or {}
 local catcodes = catcodes
@@ -1612,7 +1653,6 @@
     end
   end
 end
-
 function luamplib.runscript (code)
   local id, str = code:match("(.-){(.*)}")
   if id and str then
@@ -1651,9 +1691,7 @@
             :gsub("%zPerCent%z", "\\%%")
             :gsub("%s+", " ")
 end
-
 luamplib.legacyverbatimtex = true
-
 function luamplib.maketext (str, what)
   if str and str ~= "" then
     str = protecttexcontents(str)
@@ -1681,7 +1719,7 @@
 
 %    \end{macrocode}
 %
-%    luamplib's metapost color operators
+%    luamplib's \metapost color operators
 %    \begin{macrocode}
 local function colorsplit (res)
   local t, tt = { }, res:gsub("[%[%]]",""):explode()
@@ -1816,6 +1854,12 @@
 
 %    \end{macrocode}
 %
+% Remove trailing zeros for smaller PDF
+%    \begin{macrocode}
+local function rmzeros(str) return str:gsub("%.?0+$","") end
+
+%    \end{macrocode}
+%
 %    luamplib's mplibgraphictext operator
 %    \begin{macrocode}
 local running = -1073741824
@@ -1851,7 +1895,7 @@
     fmt = "pdf:content "..fmt
     pl = node.new("whatsit","special")
   end
-  pl.data = fmt:format(line, 0, -dp, wd, ht+dp, "B")
+  pl.data = fmt:format(line, 0, -dp, wd, ht+dp, "B") :gsub("%.%d+", rmzeros)
   local ss = node.new"glue"
   node.setglue(ss, 0, 65536, 65536, 2, 2)
   pl.next = ss
@@ -2134,7 +2178,7 @@
 %    mpliboutlinetext : based on mkiv's font-mps.lua
 %    \begin{macrocode}
 local rulefmt = "mpliboutlinepic[%i]:=image(addto currentpicture contour \z
-unitsquare shifted - center unitsquare;) xscaled %f yscaled %f shifted (%f,%f);"
+  unitsquare shifted - center unitsquare;) xscaled %f yscaled %f shifted (%f,%f);"
 local outline_horz, outline_vert
 function outline_vert (res, box, curr, xshift, yshift)
   local b2u = box.dir == "LTL"
@@ -2375,7 +2419,7 @@
 
 %    \end{macrocode}
 %
-%    Our MetaPost preambles
+%    Our \metapost preambles
 %    \begin{macrocode}
 luamplib.preambles = {
   mplibcode = [[
@@ -2660,7 +2704,6 @@
 %    When \cs{mplibverbatim} is enabled, do not expand |mplibcode| data.
 %    \begin{macrocode}
 luamplib.verbatiminput = false
-
 %    \end{macrocode}
 %
 %    Do not expand |btex ... etex|, |verbatimtex ... etex|, and
@@ -2676,7 +2719,6 @@
     return format("\\unexpanded{%s}",str)
   end
 end
-
 local function unprotect_expansion (str)
   if str then
     return str:gsub("!!!Control!!!", "\\")
@@ -2686,13 +2728,10 @@
               :gsub("!!!RBrace!!!",  "}")
   end
 end
-
 luamplib.everymplib    = setmetatable({ [""] = "" },{ __index = function(t) return t[""] end })
 luamplib.everyendmplib = setmetatable({ [""] = "" },{ __index = function(t) return t[""] end })
-
 function luamplib.process_mplibcode (data, instancename)
   texboxes.localid = 4096
-
 %    \end{macrocode}
 %    This is needed for legacy behavior
 %    \begin{macrocode}
@@ -2699,12 +2738,10 @@
   if luamplib.legacyverbatimtex then
     luamplib.figid, tex_code_pre_mplib = 1, {}
   end
-
   local everymplib    = luamplib.everymplib[instancename]
   local everyendmplib = luamplib.everyendmplib[instancename]
   data = format("\n%s\n%s\n%s\n",everymplib, data, everyendmplib)
   :gsub("\r","\n")
-
 %    \end{macrocode}
 %    These five lines are needed for |mplibverbatim| mode.
 %    \begin{macrocode}
@@ -2744,7 +2781,6 @@
       return format("verbatimtex %s etex", unprotect_expansion(str))
     end)
   end
-
   process(data, instancename)
 end
 
@@ -2782,39 +2818,27 @@
 local function put2output(a,...)
   figcontents[#figcontents+1] = type(a) == "string" and format(a,...) or a
 end
-
 local function pdf_startfigure(n,llx,lly,urx,ury)
   put2output("\\mplibstarttoPDF{%f}{%f}{%f}{%f}",llx,lly,urx,ury)
 end
-
 local function pdf_stopfigure()
   put2output("\\mplibstoptoPDF")
 end
-
 %    \end{macrocode}
 %
 %    |tex.sprint| with catcode regime -2, as sometimes |#| gets doubled
 %    in the argument of pdfliteral.
 %    \begin{macrocode}
-local function pdf_literalcode (fmt,...)
-  put2output{-2, format(fmt,...)}
+local function pdf_literalcode (...)
+  put2output{ -2, format(...) :gsub("%.%d+", rmzeros) }
 end
+local start_pdf_code = pdfmode
+  and function() pdf_literalcode"q" end
+  or  function() put2output"\\special{pdf:bcontent}" end
+local stop_pdf_code = pdfmode
+  and function() pdf_literalcode"Q" end
+  or  function() put2output"\\special{pdf:econtent}" end
 
-local function start_pdf_code()
-  if pdfmode then
-    pdf_literalcode("q")
-  else
-    put2output"\\special{pdf:bcontent}"
-  end
-end
-local function stop_pdf_code()
-  if pdfmode then
-    pdf_literalcode("Q")
-  else
-    put2output"\\special{pdf:econtent}"
-  end
-end
-
 %    \end{macrocode}
 %
 %    Now we process hboxes created from |btex ... etex| or
@@ -2885,7 +2909,6 @@
 pdfetcs.pgfextgs = "pgf at sys@addpdfresource at extgs@plain"
 pdfetcs.pgfpattern = "pgf at sys@addpdfresource at patterns@plain"
 pdfetcs.pgfcolorspace = "pgf at sys@addpdfresource at colorspaces@plain"
-
 local function update_pdfobjs (os, stream)
   local key = os
   if stream then key = key..stream end
@@ -2912,7 +2935,6 @@
   return on,true
 end
 pdfetcs.resfmt = pdfmode and "%s 0 R" or "@mplibpdfobj%s"
-
 if pdfmode then
   pdfetcs.getpageres = pdf.getpageresources or function() return pdf.pageresources end
   local getpageres = pdfetcs.getpageres
@@ -3013,7 +3035,7 @@
     mode = transparancy_modes[tonumber(mode)] or mode
     for i,v in ipairs{ {mode,opaq},{"Normal",1} } do
       mode, opaq = v[1], v[2]
-      os = format("<</BM /%s/ca %.3f/CA %.3f/AIS false>>",mode,opaq,opaq)
+      os = format("<</BM/%s/ca %s/CA %s/AIS false>>",mode,opaq,opaq)
       on, new = update_pdfobjs(os)
       key = add_extgs_resources(on,new)
       if i == 1 then
@@ -3027,10 +3049,10 @@
 
 %    \end{macrocode}
 %
-%    Shading with |metafun| format.
+%    Shading with \emph{metafun} format.
 %    \begin{macrocode}
 local function sh_pdfpageresources(shtype,domain,colorspace,ca,cb,coordinates,steps,fractions)
-  local fun2fmt,os = "<</FunctionType 2/Domain [%s]/C0 [%s]/C1 [%s]/N 1>>"
+  local fun2fmt,os = "<</FunctionType 2/Domain[%s]/C0[%s]/C1[%s]/N 1>>"
   if steps > 1 then
     local list,bounds,encode = { },{ },{ }
     for i=1,steps do
@@ -3044,10 +3066,10 @@
     end
     os = tableconcat {
       "<</FunctionType 3",
-      format("/Bounds [%s]",    tableconcat(bounds,' ')),
-      format("/Encode [%s]",    tableconcat(encode,' ')),
-      format("/Functions [%s]", tableconcat(list,  ' ')),
-      format("/Domain [%s]>>",  domain),
+      format("/Bounds[%s]",    tableconcat(bounds,' ')),
+      format("/Encode[%s]",    tableconcat(encode,' ')),
+      format("/Functions[%s]", tableconcat(list,  ' ')),
+      format("/Domain[%s]>>",  domain),
     }
   else
     os = fun2fmt:format(domain,tableconcat(ca[1],' '),tableconcat(cb[1],' '))
@@ -3057,8 +3079,8 @@
     format("<</ShadingType %i", shtype),
     format("/ColorSpace %s",    colorspace),
     format("/Function %s",      objref),
-    format("/Coords [%s]",      coordinates),
-    "/Extend [true true]/AntiAlias true>>",
+    format("/Coords[%s]",       coordinates :gsub("%.%d+", rmzeros)),
+    "/Extend[true true]/AntiAlias true>>",
   }
   local on, new = update_pdfobjs(os)
   if new then
@@ -3082,7 +3104,6 @@
   end
   return on
 end
-
 local function color_normalize(ca,cb)
   if #cb == 1 then
     if #ca == 4 then
@@ -3094,7 +3115,6 @@
     cb[1], cb[2], cb[3], cb[4] = 1-cb[1], 1-cb[2], 1-cb[3], 0
   end
 end
-
 pdfetcs.clrspcs = setmetatable({ }, { __index = function(t,names)
   run_tex_code({
     [[\color_model_new:nnn]],
@@ -3106,7 +3126,6 @@
   t[names] = colorspace
   return colorspace
 end })
-
 local function do_preobj_SH(object,prescript)
   local shade_no
   local sh_type = prescript and prescript.sh_type
@@ -3291,9 +3310,9 @@
 end
 function luamplib.registerpattern ( boxid, name, opts )
   local box = texgetbox(boxid)
-  local wd = format("%.3f",box.width/factor)
-  local hd = format("%.3f",(box.height+box.depth)/factor)
-  info("w/h/d of '%s': %s %s 0.0", name, wd, hd)
+  local wd = format("%.3f",box.width/factor) :gsub("%.%d+", rmzeros)
+  local hd = format("%.3f",(box.height+box.depth)/factor) :gsub("%.%d+", rmzeros)
+  info("w/h/d of '%s': %s %s 0", name, wd, hd)
   if opts.xstep == 0 then opts.xstep = nil end
   if opts.ystep == 0 then opts.ystep = nil end
   if opts.colored == nil then
@@ -3319,13 +3338,13 @@
     "/TilingType 2",
     format("/XStep %s", opts.xstep or wd),
     format("/YStep %s", opts.ystep or hd),
-    format("/Matrix [%s %s %s]", opts.matrix or "1 0 0 1", opts.xshift or 0, opts.yshift or 0),
+    format("/Matrix[%s %s %s]", opts.matrix or "1 0 0 1", opts.xshift or 0, opts.yshift or 0),
   }
   local optres = opts.resources or ""
   optres = optres .. gather_resources(optres)
   if pdfmode then
     if opts.bbox then
-      attr[#attr+1] = format("/BBox [%s]", opts.bbox)
+      attr[#attr+1] = format("/BBox[%s]", opts.bbox)
     end
     local index = tex.saveboxresource(boxid, tableconcat(attr), optres, true, opts.bbox and 4 or 1)
     patterns[name] = { id = index, colored = opts.colored }
@@ -3461,7 +3480,6 @@
   else
     err("unknown fading method '%s'", fd_type)
   end
-  bbox = format("0 0 %f %f", bbox[3]+dx, bbox[4]+dy)
   fd_type = fd_type == "linear" and 2 or 3
   local opaq = (prescript.mplibfadeopacity or "1:0"):explode":"
   local on, os, new
@@ -3468,16 +3486,17 @@
   on = sh_pdfpageresources(fd_type, "0 1", "/DeviceGray", {{opaq[1]}}, {{opaq[2]}}, coords, 1)
   os = format("<</PatternType 2/Shading %s>>", format(pdfetcs.resfmt, on))
   on = update_pdfobjs(os)
+  bbox = format("0 0 %f %f", bbox[3]+dx, bbox[4]+dy) :gsub("%.%d+", rmzeros)
   local streamtext = format("q /Pattern cs/MPlibFd%s scn %s re f Q", on, bbox)
   os = format("<</Pattern<</MPlibFd%s %s>>>>", on, format(pdfetcs.resfmt, on))
   on = update_pdfobjs(os)
-  local resources = "/Resources " .. format(pdfetcs.resfmt, on)
+  local resources = format(pdfetcs.resfmt, on)
   on = update_pdfobjs"<</S/Transparency/CS/DeviceGray>>"
   local attr = tableconcat{
     "/Subtype/Form",
     format("/BBox[%s]", bbox),
-    format("/Matrix[1 0 0 1 %f %f]", -dx, -dy),
-    resources,
+    format("/Matrix[1 0 0 1 %s]", format("%f %f", -dx,-dy) :gsub("%.%d+", rmzeros)),
+    format("/Resources %s", resources),
     "/Group ", format(pdfetcs.resfmt, on),
   }
   on = update_pdfobjs(attr, streamtext)
@@ -3516,8 +3535,6 @@
     put2output[[\begingroup\setbox\mplibscratchbox\hbox\bgroup]]
   elseif grstate == "stop" then
     local llx,lly,urx,ury = tableunpack(trgroup.bbox)
-    local grattr = format("/Group<</S/Transparency/I %s/K %s>>",trgroup.isolated,trgroup.knockout)
-    local res = gather_resources()
     put2output(tableconcat{
       "\\egroup",
       format("\\wd\\mplibscratchbox %fbp", urx-llx),
@@ -3524,11 +3541,13 @@
       format("\\ht\\mplibscratchbox %fbp", ury-lly),
       "\\dp\\mplibscratchbox 0pt",
     })
+    local grattr = format("/Group<</S/Transparency/I %s/K %s>>",trgroup.isolated,trgroup.knockout)
+    local res = gather_resources()
+    local bbox = format("%f %f %f %f", llx,lly,urx,ury) :gsub("%.%d+", rmzeros)
     if pdfmode then
       put2output(tableconcat{
         "\\saveboxresource type 2 attr{/Type/XObject/Subtype/Form/FormType 1",
-        format("/BBox[%f %f %f %f]", llx,lly,urx,ury),
-        grattr, "} resources{", res, "}\\mplibscratchbox",
+        "/BBox[", bbox, "]", grattr, "} resources{", res, "}\\mplibscratchbox",
         [[\setbox\mplibscratchbox\hbox{\useboxresource\lastsavedboxresourceindex}]],
         [[\wd\mplibscratchbox 0pt\ht\mplibscratchbox 0pt\dp\mplibscratchbox 0pt]],
         [[\box\mplibscratchbox\endgroup]],
@@ -3540,7 +3559,7 @@
       trgroup.cnt = (trgroup.cnt or 0) + 1
       local objname = format("@mplibtrgr%s", trgroup.cnt)
       put2output(tableconcat{
-        "\\special{pdf:bxobj ", objname, " bbox ", format("%f %f %f %f", llx,lly,urx,ury), "}",
+        "\\special{pdf:bxobj ", objname, " bbox ", bbox, "}",
         "\\unhbox\\mplibscratchbox",
         "\\special{pdf:put @resources <<", res, ">>}",
         "\\special{pdf:exobj <<", grattr, ">>}",
@@ -3554,6 +3573,61 @@
   end
   return grstate
 end
+function luamplib.registergroup (boxid, name, opts)
+  local box = texgetbox(boxid)
+  local res = (opts.resources or "") .. gather_resources()
+  local attr = { "/Type/XObject/Subtype/Form/FormType 1" }
+  if type(opts.matrix) == "table" then opts.matrix = tableconcat(opts.matrix," ") end
+  if type(opts.bbox) == "table" then opts.bbox = tableconcat(opts.bbox," ") end
+  if opts.matrix and opts.matrix:find"%a" then
+    local data = format("mplibtransformmatrix(%s);",opts.matrix)
+    process(data,"@mplibtransformmatrix")
+    opts.matrix = tableconcat(luamplib.transformmatrix, ' ')
+  end
+  local grtype = 3
+  if opts.bbox then
+    attr[#attr+1] = format("/BBox[%s]", opts.bbox :gsub("%.%d+", rmzeros))
+    grtype = 2
+  end
+  if opts.matrix then
+    attr[#attr+1] = format("/Matrix[%s]", opts.matrix :gsub("%.%d+", rmzeros))
+    grtype = opts.bbox and 4 or 1
+  end
+  if opts.asgroup then
+    local t = { isolated = false, knockout = false }
+    for _,v in ipairs(opts.asgroup:explode",+") do t[v] = true end
+    attr[#attr+1] = format("/Group<</S/Transparency/I %s/K %s>>", t.isolated, t.knockout)
+  end
+  local trgroup = pdfetcs.tr_group
+  trgroup.shifts[name] = { get_macro'MPllx', get_macro'MPlly' }
+  if pdfmode then
+    local index = tex.saveboxresource(boxid, tableconcat(attr), res, true, grtype)
+    texsprint{
+      "\\expandafter\\gdef\\csname luamplib.group.", name,
+      "\\endcsname{\\useboxresource ", index, "}",
+    }
+  else
+    trgroup.cnt = (trgroup.cnt or 0) + 1
+    local objname = format("@mplibtrgr%s", trgroup.cnt)
+    local wd, ht, dp = node.getwhd(box)
+    texsprint {
+      "\\ifvmode\\nointerlineskip\\fi\\vbox to0pt{\\vss\\hbox to0pt{",
+      "\\special{pdf:bcontent}",
+      "\\special{pdf:bxobj ", objname, " width ", wd, "sp height ", ht, "sp depth ", dp, "sp}",
+      "\\unhbox ", boxid,
+      "\\special{pdf:put @resources <<", res, ">>}",
+      "\\special{pdf:exobj <<", tableconcat(attr), ">>}",
+      "\\special{pdf:econtent}",
+      "\\hss}}",
+      "\\expandafter\\gdef\\csname luamplib.group.", name, "\\endcsname{",
+      "\\begingroup\\setbox\\mplibscratchbox\\hbox{\\special{pdf:uxobj ", objname, "}}",
+      "\\wd\\mplibscratchbox ", wd, "sp",
+      "\\ht\\mplibscratchbox ", ht, "sp",
+      "\\dp\\mplibscratchbox ", dp, "sp",
+      "\\box\\mplibscratchbox\\endgroup}",
+    }
+  end
+end
 
 local function stop_special_effects(fade,opaq,over)
   if fade then -- fading
@@ -3976,7 +4050,7 @@
 \else
   \NeedsTeXFormat{LaTeX2e}
   \ProvidesPackage{luamplib}
-    [2024/07/19 v2.34.1 mplib package for LuaTeX]
+    [2024/07/24 v2.34.2 mplib package for LuaTeX]
   \ifx\newluafunction\@undefined
   \input ltluatex
   \fi
@@ -3998,7 +4072,7 @@
 \fi
 %    \end{macrocode}
 %
-%    Set the format for metapost.
+%    Set the format for \metapost.
 %    \begin{macrocode}
 \def\mplibsetformat#1{\directlua{luamplib.setformat("#1")}}
 %    \end{macrocode}
@@ -4043,6 +4117,34 @@
 %    use Transparency Group
 %    \begin{macrocode}
 \protected\def\usemplibgroup#1{\csname luamplib.group.#1\endcsname}
+\protected\def\mplibgroup#1{%
+  \begingroup
+  \def\MPllx{0}\def\MPlly{0}%
+  \def\mplibgroupname{#1}%
+  \mplibgroupgetnexttok
+}
+\def\mplibgroupgetnexttok{\futurelet\nexttok\mplibgroupbranch}
+\def\mplibgroupskipspace{\afterassignment\mplibgroupgetnexttok\let\nexttok= }
+\def\mplibgroupbranch{%
+  \ifx [\nexttok
+    \expandafter\mplibgroupopts
+  \else
+    \ifx\mplibsptoken\nexttok
+      \expandafter\expandafter\expandafter\mplibgroupskipspace
+    \else
+      \let\mplibgroupoptions\empty
+      \expandafter\expandafter\expandafter\mplibgroupmain
+    \fi
+  \fi
+}
+\def\mplibgroupopts[#1]{\def\mplibgroupoptions{#1}\mplibgroupmain}
+\def\mplibgroupmain{\setbox\mplibscratchbox\hbox\bgroup\ignorespaces}
+\protected\def\endmplibgroup{\egroup
+  \directlua{ luamplib.registergroup(
+    \the\mplibscratchbox, '\mplibgroupname', {\mplibgroupoptions}
+  )}%
+  \endgroup
+}
 %    \end{macrocode}
 %
 %    Patterns
@@ -4083,7 +4185,7 @@
 }
 %    \end{macrocode}
 %
-%    simple way to use mplib:
+%    simple way to use \mplib:
 %    |\mpfig draw fullcircle scaled 10; \endmpfig|
 %    \begin{macrocode}
 \def\mpfiginstancename{@mpfig}
@@ -4295,7 +4397,7 @@
 \def\domplibcolor#1#2{ runscript("luamplibcolor{#1{#2}}") }
 %    \end{macrocode}
 %
-%    MPLib's number system. Now |binary| has gone away.
+%    \mplib's number system. Now |binary| has gone away.
 %    \begin{macrocode}
 \def\mplibnumbersystem#1{\directlua{
   local t = "#1"

Modified: trunk/Master/texmf-dist/tex/luatex/luamplib/luamplib.lua
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luamplib/luamplib.lua	2024-07-24 09:10:15 UTC (rev 71887)
+++ trunk/Master/texmf-dist/tex/luatex/luamplib/luamplib.lua	2024-07-24 19:48:46 UTC (rev 71888)
@@ -11,8 +11,8 @@
 
 luatexbase.provides_module {
   name          = "luamplib",
-  version       = "2.34.1",
-  date          = "2024/07/19",
+  version       = "2.34.2",
+  date          = "2024/07/24",
   description   = "Lua package to typeset Metapost with LuaTeX's MPLib.",
 }
 
@@ -45,7 +45,6 @@
     if kind == "Error" then error() end
   end
 end
-
 local function warn (...) -- beware '%' symbol
   termorlog("term and log", select("#",...) > 1 and format(...) or ...)
 end
@@ -65,18 +64,14 @@
 local texgettoks  = tex.gettoks
 local texgetbox   = tex.getbox
 local texruntoks  = tex.runtoks
-
 if not texruntoks then
   err("Your LuaTeX version is too old. Please upgrade it to the latest")
 end
-
 local is_defined  = token.is_defined
 local get_macro   = token.get_macro
-
 local mplib = require ('mplib')
 local kpse  = require ('kpse')
 local lfs   = require ('lfs')
-
 local lfsattributes = lfs.attributes
 local lfsisdir      = lfs.isdir
 local lfsmkdir      = lfs.mkdir
@@ -87,7 +82,6 @@
 local replacesuffix = file.replacesuffix or function(filename, suffix)
   return (filename:gsub("%.[%a%d]+$","")) .. "." .. suffix
 end
-
 local is_writable = file.is_writable or function(name)
   if lfsisdir(name) then
     name = name .. "/_luam_plib_temp_file_"
@@ -106,11 +100,8 @@
   end
 end
 
-local luamplibtime = kpse.find_file("luamplib.lua")
-luamplibtime = luamplibtime and lfsattributes(luamplibtime,"modification")
-
+local luamplibtime = lfsattributes(kpse.find_file"luamplib.lua", "modification")
 local currenttime = os.time()
-
 local outputdir, cachedir
 if lfstouch then
   for i,v in ipairs{'TEXMFVAR','TEXMF_OUTPUT_DIRECTORY','.','TEXMFOUTPUT'} do
@@ -147,7 +138,6 @@
     end
   end
 end
-
 local noneedtoreplace = {
   ["boxes.mp"] = true, --  ["format.mp"] = true,
   ["graph.mp"] = true, ["marith.mp"] = true, ["mfplain.mp"] = true,
@@ -165,7 +155,6 @@
   ["mp-tool.mpiv"] = true, ["mp-cont.mpiv"] = true,
 }
 luamplib.noneedtoreplace = noneedtoreplace
-
 local function replaceformatmp(file,newfile,ofmodify)
   local fh = ioopen(file,"r")
   if not fh then return file end
@@ -183,12 +172,10 @@
   lfstouch(newfile,currenttime,ofmodify)
   return newfile
 end
-
 local name_b = "%f[%a_]"
 local name_e = "%f[^%a_]"
 local btex_etex = name_b.."btex"..name_e.."%s*(.-)%s*"..name_b.."etex"..name_e
 local verbatimtex_etex = name_b.."verbatimtex"..name_e.."%s*(.-)%s*"..name_b.."etex"..name_e
-
 local function replaceinputmpfile (name,file)
   local ofmodify = lfsattributes(file,"modification")
   if not ofmodify then return file end
@@ -201,19 +188,15 @@
       return nf.size == 0 and file or newfile
     end
   end
-
   if name == "format.mp" then return replaceformatmp(file,newfile,ofmodify) end
-
   local fh = ioopen(file,"r")
   if not fh then return file end
   local data = fh:read("*all"); fh:close()
-
   local count,cnt = 0,0
   data, cnt = data:gsub(btex_etex, "btex %1 etex ") -- space
   count = count + cnt
   data, cnt = data:gsub(verbatimtex_etex, "verbatimtex %1 etex;") -- semicolon
   count = count + cnt
-
   if count == 0 then
     noneedtoreplace[name] = true
     fh = ioopen(newfile,"w");
@@ -223,7 +206,6 @@
     end
     return file
   end
-
   fh = ioopen(newfile,"w")
   if not fh then return file end
   fh:write(data); fh:close()
@@ -239,12 +221,10 @@
   end
   mpkpse = kpse.new(arg[exe], "mpost")
 end
-
 local special_ftype = {
   pfb = "type1 fonts",
   enc = "enc files",
 }
-
 function luamplib.finder (name, mode, ftype)
   if mode == "w" then
     if name and name ~= "mpout.log" then
@@ -274,17 +254,14 @@
   let normalfontsize = fontsize;
   input %s ;
 ]]
-
 local currentformat = "plain"
 function luamplib.setformat (name)
   currentformat = name
 end
-
 luamplib.codeinherit = false
 local mplibinstances = {}
 luamplib.instances = mplibinstances
 local has_instancename = false
-
 local function reporterror (result, prevlog)
   if not result then
     err("no result object returned")
@@ -316,7 +293,6 @@
     return log
   end
 end
-
 if not math.initialseed then math.randomseed(currenttime) end
 local function luamplibload (name)
   local mpx = mplib.new {
@@ -344,7 +320,6 @@
   log = reporterror(result)
   return mpx, result, log
 end
-
 local function process (data, instancename)
   local currfmt
   if instancename and instancename ~= "" then
@@ -385,20 +360,17 @@
 end
 
 local pdfmode = tex.outputmode > 0
+
 local catlatex = luatexbase.registernumber("catcodetable at latex")
 local catat11  = luatexbase.registernumber("catcodetable at atletter")
-
 local function run_tex_code (str, cat)
   texruntoks(function() texsprint(cat or catlatex, str) end)
 end
-
 local texboxes = { globalid = 0, localid = 4096 }
 local factor = 65536*(7227/7200)
-
 local textext_fmt = 'image(addto currentpicture doublepath unitsquare \z
-xscaled %f yscaled %f shifted (0,-%f) \z
-withprescript "mplibtexboxid=%i:%f:%f")'
-
+  xscaled %f yscaled %f shifted (0,-%f) \z
+  withprescript "mplibtexboxid=%i:%f:%f")'
 local function process_tex_text (str)
   if str then
     local global = (has_instancename or luamplib.globaltextext or luamplib.codeinherit)
@@ -436,7 +408,6 @@
     [[\color_select:n%s\endgroup]],
   },
 }
-
 local colfmt = is_defined'color_select:n' and "l3color" or "xcolor"
 if colfmt == "l3color" then
   run_tex_code{
@@ -450,7 +421,6 @@
   }
 end
 local ccexplat = luatexbase.registernumber"luamplibcctabexplat"
-
 local function process_color (str)
   if str then
     if not str:find("%b{}") then
@@ -501,7 +471,6 @@
 local tex_code_pre_mplib = {}
 luamplib.figid = 1
 luamplib.in_the_fig = false
-
 local function process_verbatimtex_prefig (str)
   if str then
     tex_code_pre_mplib[luamplib.figid] = str
@@ -508,7 +477,6 @@
   end
   return ""
 end
-
 local function process_verbatimtex_infig (str)
   if str then
     return format('special "postmplibverbtex=%s";', str)
@@ -530,7 +498,6 @@
 mp.mf_path_reset = mp.mf_path_reset or function() end
 mp.mf_finish_saving_data = mp.mf_finish_saving_data or function() end
 mp.report = mp.report or info
-
 catcodes = catcodes or {}
 local catcodes = catcodes
 catcodes.numbers = catcodes.numbers or {}
@@ -559,7 +526,6 @@
     end
   end
 end
-
 function luamplib.runscript (code)
   local id, str = code:match("(.-){(.*)}")
   if id and str then
@@ -594,9 +560,7 @@
             :gsub("%zPerCent%z", "\\%%")
             :gsub("%s+", " ")
 end
-
 luamplib.legacyverbatimtex = true
-
 function luamplib.maketext (str, what)
   if str and str ~= "" then
     str = protecttexcontents(str)
@@ -673,6 +637,8 @@
   return colorsplit(res)
 end
 
+local function rmzeros(str) return str:gsub("%.?0+$","") end
+
 local running = -1073741824
 local emboldenfonts = { }
 local function getemboldenwidth (curr, fakebold)
@@ -706,7 +672,7 @@
     fmt = "pdf:content "..fmt
     pl = node.new("whatsit","special")
   end
-  pl.data = fmt:format(line, 0, -dp, wd, ht+dp, "B")
+  pl.data = fmt:format(line, 0, -dp, wd, ht+dp, "B") :gsub("%.%d+", rmzeros)
   local ss = node.new"glue"
   node.setglue(ss, 0, 65536, 65536, 2, 2)
   pl.next = ss
@@ -981,7 +947,7 @@
 end
 
 local rulefmt = "mpliboutlinepic[%i]:=image(addto currentpicture contour \z
-unitsquare shifted - center unitsquare;) xscaled %f yscaled %f shifted (%f,%f);"
+  unitsquare shifted - center unitsquare;) xscaled %f yscaled %f shifted (%f,%f);"
 local outline_horz, outline_vert
 function outline_vert (res, box, curr, xshift, yshift)
   local b2u = box.dir == "LTL"
@@ -1499,7 +1465,6 @@
 }
 
 luamplib.verbatiminput = false
-
 local function protect_expansion (str)
   if str then
     str = str:gsub("\\","!!!Control!!!")
@@ -1510,7 +1475,6 @@
     return format("\\unexpanded{%s}",str)
   end
 end
-
 local function unprotect_expansion (str)
   if str then
     return str:gsub("!!!Control!!!", "\\")
@@ -1520,22 +1484,17 @@
               :gsub("!!!RBrace!!!",  "}")
   end
 end
-
 luamplib.everymplib    = setmetatable({ [""] = "" },{ __index = function(t) return t[""] end })
 luamplib.everyendmplib = setmetatable({ [""] = "" },{ __index = function(t) return t[""] end })
-
 function luamplib.process_mplibcode (data, instancename)
   texboxes.localid = 4096
-
   if luamplib.legacyverbatimtex then
     luamplib.figid, tex_code_pre_mplib = 1, {}
   end
-
   local everymplib    = luamplib.everymplib[instancename]
   local everyendmplib = luamplib.everyendmplib[instancename]
   data = format("\n%s\n%s\n%s\n",everymplib, data, everyendmplib)
   :gsub("\r","\n")
-
   if luamplib.verbatiminput then
     data = data:gsub("\\mpcolor%s+(.-%b{})","mplibcolor(\"%1\")")
     :gsub("\\mpdim%s+(%b{})", "mplibdimen(\"%1\")")
@@ -1564,7 +1523,6 @@
       return format("verbatimtex %s etex", unprotect_expansion(str))
     end)
   end
-
   process(data, instancename)
 end
 
@@ -1592,34 +1550,22 @@
 local function put2output(a,...)
   figcontents[#figcontents+1] = type(a) == "string" and format(a,...) or a
 end
-
 local function pdf_startfigure(n,llx,lly,urx,ury)
   put2output("\\mplibstarttoPDF{%f}{%f}{%f}{%f}",llx,lly,urx,ury)
 end
-
 local function pdf_stopfigure()
   put2output("\\mplibstoptoPDF")
 end
-
-local function pdf_literalcode (fmt,...)
-  put2output{-2, format(fmt,...)}
+local function pdf_literalcode (...)
+  put2output{ -2, format(...) :gsub("%.%d+", rmzeros) }
 end
+local start_pdf_code = pdfmode
+  and function() pdf_literalcode"q" end
+  or  function() put2output"\\special{pdf:bcontent}" end
+local stop_pdf_code = pdfmode
+  and function() pdf_literalcode"Q" end
+  or  function() put2output"\\special{pdf:econtent}" end
 
-local function start_pdf_code()
-  if pdfmode then
-    pdf_literalcode("q")
-  else
-    put2output"\\special{pdf:bcontent}"
-  end
-end
-local function stop_pdf_code()
-  if pdfmode then
-    pdf_literalcode("Q")
-  else
-    put2output"\\special{pdf:econtent}"
-  end
-end
-
 local function put_tex_boxes (object,prescript)
   local box = prescript.mplibtexboxid
   local n,tw,th = box[1],tonumber(box[2]),tonumber(box[3])
@@ -1677,7 +1623,6 @@
 pdfetcs.pgfextgs = "pgf at sys@addpdfresource at extgs@plain"
 pdfetcs.pgfpattern = "pgf at sys@addpdfresource at patterns@plain"
 pdfetcs.pgfcolorspace = "pgf at sys@addpdfresource at colorspaces@plain"
-
 local function update_pdfobjs (os, stream)
   local key = os
   if stream then key = key..stream end
@@ -1704,7 +1649,6 @@
   return on,true
 end
 pdfetcs.resfmt = pdfmode and "%s 0 R" or "@mplibpdfobj%s"
-
 if pdfmode then
   pdfetcs.getpageres = pdf.getpageresources or function() return pdf.pageresources end
   local getpageres = pdfetcs.getpageres
@@ -1801,7 +1745,7 @@
     mode = transparancy_modes[tonumber(mode)] or mode
     for i,v in ipairs{ {mode,opaq},{"Normal",1} } do
       mode, opaq = v[1], v[2]
-      os = format("<</BM /%s/ca %.3f/CA %.3f/AIS false>>",mode,opaq,opaq)
+      os = format("<</BM/%s/ca %s/CA %s/AIS false>>",mode,opaq,opaq)
       on, new = update_pdfobjs(os)
       key = add_extgs_resources(on,new)
       if i == 1 then
@@ -1814,7 +1758,7 @@
 end
 
 local function sh_pdfpageresources(shtype,domain,colorspace,ca,cb,coordinates,steps,fractions)
-  local fun2fmt,os = "<</FunctionType 2/Domain [%s]/C0 [%s]/C1 [%s]/N 1>>"
+  local fun2fmt,os = "<</FunctionType 2/Domain[%s]/C0[%s]/C1[%s]/N 1>>"
   if steps > 1 then
     local list,bounds,encode = { },{ },{ }
     for i=1,steps do
@@ -1828,10 +1772,10 @@
     end
     os = tableconcat {
       "<</FunctionType 3",
-      format("/Bounds [%s]",    tableconcat(bounds,' ')),
-      format("/Encode [%s]",    tableconcat(encode,' ')),
-      format("/Functions [%s]", tableconcat(list,  ' ')),
-      format("/Domain [%s]>>",  domain),
+      format("/Bounds[%s]",    tableconcat(bounds,' ')),
+      format("/Encode[%s]",    tableconcat(encode,' ')),
+      format("/Functions[%s]", tableconcat(list,  ' ')),
+      format("/Domain[%s]>>",  domain),
     }
   else
     os = fun2fmt:format(domain,tableconcat(ca[1],' '),tableconcat(cb[1],' '))
@@ -1841,8 +1785,8 @@
     format("<</ShadingType %i", shtype),
     format("/ColorSpace %s",    colorspace),
     format("/Function %s",      objref),
-    format("/Coords [%s]",      coordinates),
-    "/Extend [true true]/AntiAlias true>>",
+    format("/Coords[%s]",       coordinates :gsub("%.%d+", rmzeros)),
+    "/Extend[true true]/AntiAlias true>>",
   }
   local on, new = update_pdfobjs(os)
   if new then
@@ -1866,7 +1810,6 @@
   end
   return on
 end
-
 local function color_normalize(ca,cb)
   if #cb == 1 then
     if #ca == 4 then
@@ -1878,7 +1821,6 @@
     cb[1], cb[2], cb[3], cb[4] = 1-cb[1], 1-cb[2], 1-cb[3], 0
   end
 end
-
 pdfetcs.clrspcs = setmetatable({ }, { __index = function(t,names)
   run_tex_code({
     [[\color_model_new:nnn]],
@@ -1890,7 +1832,6 @@
   t[names] = colorspace
   return colorspace
 end })
-
 local function do_preobj_SH(object,prescript)
   local shade_no
   local sh_type = prescript and prescript.sh_type
@@ -2071,9 +2012,9 @@
 end
 function luamplib.registerpattern ( boxid, name, opts )
   local box = texgetbox(boxid)
-  local wd = format("%.3f",box.width/factor)
-  local hd = format("%.3f",(box.height+box.depth)/factor)
-  info("w/h/d of '%s': %s %s 0.0", name, wd, hd)
+  local wd = format("%.3f",box.width/factor) :gsub("%.%d+", rmzeros)
+  local hd = format("%.3f",(box.height+box.depth)/factor) :gsub("%.%d+", rmzeros)
+  info("w/h/d of '%s': %s %s 0", name, wd, hd)
   if opts.xstep == 0 then opts.xstep = nil end
   if opts.ystep == 0 then opts.ystep = nil end
   if opts.colored == nil then
@@ -2099,13 +2040,13 @@
     "/TilingType 2",
     format("/XStep %s", opts.xstep or wd),
     format("/YStep %s", opts.ystep or hd),
-    format("/Matrix [%s %s %s]", opts.matrix or "1 0 0 1", opts.xshift or 0, opts.yshift or 0),
+    format("/Matrix[%s %s %s]", opts.matrix or "1 0 0 1", opts.xshift or 0, opts.yshift or 0),
   }
   local optres = opts.resources or ""
   optres = optres .. gather_resources(optres)
   if pdfmode then
     if opts.bbox then
-      attr[#attr+1] = format("/BBox [%s]", opts.bbox)
+      attr[#attr+1] = format("/BBox[%s]", opts.bbox)
     end
     local index = tex.saveboxresource(boxid, tableconcat(attr), optres, true, opts.bbox and 4 or 1)
     patterns[name] = { id = index, colored = opts.colored }
@@ -2237,7 +2178,6 @@
   else
     err("unknown fading method '%s'", fd_type)
   end
-  bbox = format("0 0 %f %f", bbox[3]+dx, bbox[4]+dy)
   fd_type = fd_type == "linear" and 2 or 3
   local opaq = (prescript.mplibfadeopacity or "1:0"):explode":"
   local on, os, new
@@ -2244,16 +2184,17 @@
   on = sh_pdfpageresources(fd_type, "0 1", "/DeviceGray", {{opaq[1]}}, {{opaq[2]}}, coords, 1)
   os = format("<</PatternType 2/Shading %s>>", format(pdfetcs.resfmt, on))
   on = update_pdfobjs(os)
+  bbox = format("0 0 %f %f", bbox[3]+dx, bbox[4]+dy) :gsub("%.%d+", rmzeros)
   local streamtext = format("q /Pattern cs/MPlibFd%s scn %s re f Q", on, bbox)
   os = format("<</Pattern<</MPlibFd%s %s>>>>", on, format(pdfetcs.resfmt, on))
   on = update_pdfobjs(os)
-  local resources = "/Resources " .. format(pdfetcs.resfmt, on)
+  local resources = format(pdfetcs.resfmt, on)
   on = update_pdfobjs"<</S/Transparency/CS/DeviceGray>>"
   local attr = tableconcat{
     "/Subtype/Form",
     format("/BBox[%s]", bbox),
-    format("/Matrix[1 0 0 1 %f %f]", -dx, -dy),
-    resources,
+    format("/Matrix[1 0 0 1 %s]", format("%f %f", -dx,-dy) :gsub("%.%d+", rmzeros)),
+    format("/Resources %s", resources),
     "/Group ", format(pdfetcs.resfmt, on),
   }
   on = update_pdfobjs(attr, streamtext)
@@ -2288,8 +2229,6 @@
     put2output[[\begingroup\setbox\mplibscratchbox\hbox\bgroup]]
   elseif grstate == "stop" then
     local llx,lly,urx,ury = tableunpack(trgroup.bbox)
-    local grattr = format("/Group<</S/Transparency/I %s/K %s>>",trgroup.isolated,trgroup.knockout)
-    local res = gather_resources()
     put2output(tableconcat{
       "\\egroup",
       format("\\wd\\mplibscratchbox %fbp", urx-llx),
@@ -2296,11 +2235,13 @@
       format("\\ht\\mplibscratchbox %fbp", ury-lly),
       "\\dp\\mplibscratchbox 0pt",
     })
+    local grattr = format("/Group<</S/Transparency/I %s/K %s>>",trgroup.isolated,trgroup.knockout)
+    local res = gather_resources()
+    local bbox = format("%f %f %f %f", llx,lly,urx,ury) :gsub("%.%d+", rmzeros)
     if pdfmode then
       put2output(tableconcat{
         "\\saveboxresource type 2 attr{/Type/XObject/Subtype/Form/FormType 1",
-        format("/BBox[%f %f %f %f]", llx,lly,urx,ury),
-        grattr, "} resources{", res, "}\\mplibscratchbox",
+        "/BBox[", bbox, "]", grattr, "} resources{", res, "}\\mplibscratchbox",
         [[\setbox\mplibscratchbox\hbox{\useboxresource\lastsavedboxresourceindex}]],
         [[\wd\mplibscratchbox 0pt\ht\mplibscratchbox 0pt\dp\mplibscratchbox 0pt]],
         [[\box\mplibscratchbox\endgroup]],
@@ -2312,7 +2253,7 @@
       trgroup.cnt = (trgroup.cnt or 0) + 1
       local objname = format("@mplibtrgr%s", trgroup.cnt)
       put2output(tableconcat{
-        "\\special{pdf:bxobj ", objname, " bbox ", format("%f %f %f %f", llx,lly,urx,ury), "}",
+        "\\special{pdf:bxobj ", objname, " bbox ", bbox, "}",
         "\\unhbox\\mplibscratchbox",
         "\\special{pdf:put @resources <<", res, ">>}",
         "\\special{pdf:exobj <<", grattr, ">>}",
@@ -2326,6 +2267,61 @@
   end
   return grstate
 end
+function luamplib.registergroup (boxid, name, opts)
+  local box = texgetbox(boxid)
+  local res = (opts.resources or "") .. gather_resources()
+  local attr = { "/Type/XObject/Subtype/Form/FormType 1" }
+  if type(opts.matrix) == "table" then opts.matrix = tableconcat(opts.matrix," ") end
+  if type(opts.bbox) == "table" then opts.bbox = tableconcat(opts.bbox," ") end
+  if opts.matrix and opts.matrix:find"%a" then
+    local data = format("mplibtransformmatrix(%s);",opts.matrix)
+    process(data,"@mplibtransformmatrix")
+    opts.matrix = tableconcat(luamplib.transformmatrix, ' ')
+  end
+  local grtype = 3
+  if opts.bbox then
+    attr[#attr+1] = format("/BBox[%s]", opts.bbox :gsub("%.%d+", rmzeros))
+    grtype = 2
+  end
+  if opts.matrix then
+    attr[#attr+1] = format("/Matrix[%s]", opts.matrix :gsub("%.%d+", rmzeros))
+    grtype = opts.bbox and 4 or 1
+  end
+  if opts.asgroup then
+    local t = { isolated = false, knockout = false }
+    for _,v in ipairs(opts.asgroup:explode",+") do t[v] = true end
+    attr[#attr+1] = format("/Group<</S/Transparency/I %s/K %s>>", t.isolated, t.knockout)
+  end
+  local trgroup = pdfetcs.tr_group
+  trgroup.shifts[name] = { get_macro'MPllx', get_macro'MPlly' }
+  if pdfmode then
+    local index = tex.saveboxresource(boxid, tableconcat(attr), res, true, grtype)
+    texsprint{
+      "\\expandafter\\gdef\\csname luamplib.group.", name,
+      "\\endcsname{\\useboxresource ", index, "}",
+    }
+  else
+    trgroup.cnt = (trgroup.cnt or 0) + 1
+    local objname = format("@mplibtrgr%s", trgroup.cnt)
+    local wd, ht, dp = node.getwhd(box)
+    texsprint {
+      "\\ifvmode\\nointerlineskip\\fi\\vbox to0pt{\\vss\\hbox to0pt{",
+      "\\special{pdf:bcontent}",
+      "\\special{pdf:bxobj ", objname, " width ", wd, "sp height ", ht, "sp depth ", dp, "sp}",
+      "\\unhbox ", boxid,
+      "\\special{pdf:put @resources <<", res, ">>}",
+      "\\special{pdf:exobj <<", tableconcat(attr), ">>}",
+      "\\special{pdf:econtent}",
+      "\\hss}}",
+      "\\expandafter\\gdef\\csname luamplib.group.", name, "\\endcsname{",
+      "\\begingroup\\setbox\\mplibscratchbox\\hbox{\\special{pdf:uxobj ", objname, "}}",
+      "\\wd\\mplibscratchbox ", wd, "sp",
+      "\\ht\\mplibscratchbox ", ht, "sp",
+      "\\dp\\mplibscratchbox ", dp, "sp",
+      "\\box\\mplibscratchbox\\endgroup}",
+    }
+  end
+end
 
 local function stop_special_effects(fade,opaq,over)
   if fade then -- fading

Modified: trunk/Master/texmf-dist/tex/luatex/luamplib/luamplib.sty
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luamplib/luamplib.sty	2024-07-24 09:10:15 UTC (rev 71887)
+++ trunk/Master/texmf-dist/tex/luatex/luamplib/luamplib.sty	2024-07-24 19:48:46 UTC (rev 71888)
@@ -14,7 +14,7 @@
 \else
   \NeedsTeXFormat{LaTeX2e}
   \ProvidesPackage{luamplib}
-    [2024/07/19 v2.34.1 mplib package for LuaTeX]
+    [2024/07/24 v2.34.2 mplib package for LuaTeX]
   \ifx\newluafunction\@undefined
   \input ltluatex
   \fi
@@ -47,6 +47,34 @@
 }
 \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\mplibgroup#1{%
+  \begingroup
+  \def\MPllx{0}\def\MPlly{0}%
+  \def\mplibgroupname{#1}%
+  \mplibgroupgetnexttok
+}
+\def\mplibgroupgetnexttok{\futurelet\nexttok\mplibgroupbranch}
+\def\mplibgroupskipspace{\afterassignment\mplibgroupgetnexttok\let\nexttok= }
+\def\mplibgroupbranch{%
+  \ifx [\nexttok
+    \expandafter\mplibgroupopts
+  \else
+    \ifx\mplibsptoken\nexttok
+      \expandafter\expandafter\expandafter\mplibgroupskipspace
+    \else
+      \let\mplibgroupoptions\empty
+      \expandafter\expandafter\expandafter\mplibgroupmain
+    \fi
+  \fi
+}
+\def\mplibgroupopts[#1]{\def\mplibgroupoptions{#1}\mplibgroupmain}
+\def\mplibgroupmain{\setbox\mplibscratchbox\hbox\bgroup\ignorespaces}
+\protected\def\endmplibgroup{\egroup
+  \directlua{ luamplib.registergroup(
+    \the\mplibscratchbox, '\mplibgroupname', {\mplibgroupoptions}
+  )}%
+  \endgroup
+}
 {\def\:{\global\let\mplibsptoken= } \: }
 \protected\def\mppattern#1{%
   \begingroup



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