texlive[69989] branches/branch2023.final/Master/texmf-dist:
commits+karl at tug.org
commits+karl at tug.org
Mon Feb 19 21:59:59 CET 2024
Revision: 69989
https://tug.org/svn/texlive?view=revision&revision=69989
Author: karl
Date: 2024-02-19 21:59:59 +0100 (Mon, 19 Feb 2024)
Log Message:
-----------
updatemarks (branch) (19feb24)
Modified Paths:
--------------
branches/branch2023.final/Master/texmf-dist/doc/latex/updatemarks/README.md
branches/branch2023.final/Master/texmf-dist/doc/latex/updatemarks/updatemarks.pdf
branches/branch2023.final/Master/texmf-dist/doc/latex/updatemarks/updatemarks.tex
branches/branch2023.final/Master/texmf-dist/tex/latex/updatemarks/updatemarks.sty
Added Paths:
-----------
branches/branch2023.final/Master/texmf-dist/tex/latex/updatemarks/updatemarks-nums.sty
Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/updatemarks/README.md
===================================================================
--- branches/branch2023.final/Master/texmf-dist/doc/latex/updatemarks/README.md 2024-02-19 20:59:42 UTC (rev 69988)
+++ branches/branch2023.final/Master/texmf-dist/doc/latex/updatemarks/README.md 2024-02-19 20:59:59 UTC (rev 69989)
@@ -8,6 +8,6 @@
# Copyright and License
-Copyright 2023 Wenjian Chern
+Copyright 2023, 2024 Wenjian Chern
LICENSE: [LPPL 1.3c](http://www.latex-project.org/lppl.txt)
Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/updatemarks/updatemarks.pdf
===================================================================
(Binary files differ)
Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/updatemarks/updatemarks.tex
===================================================================
--- branches/branch2023.final/Master/texmf-dist/doc/latex/updatemarks/updatemarks.tex 2024-02-19 20:59:42 UTC (rev 69988)
+++ branches/branch2023.final/Master/texmf-dist/doc/latex/updatemarks/updatemarks.tex 2024-02-19 20:59:59 UTC (rev 69989)
@@ -4,7 +4,7 @@
\title{Update marks in box\thanks{Issues: \url{https://github.com/Sophanatprime/updatemarks/issues}}}
\author{WenJian Chern\thanks{Email: longaster at 163.com}}
-\date{\today\qquad v0.2b}
+\date{\today\qquad v0.2e}
\begin{document}
@@ -59,9 +59,9 @@
The point is, updating marks is done inner to outer and level by level,
if any level is not updated, you will lost all marks in inner boxes.
-Furthermore, whether marks are updated or not {\TeX} is only influenced by box level
+Furthermore, whether marks are updated or not is only influenced by box level
instead of group level, so if you try to limit marks in a certain position, you should
-use a box.
+use a box instead of \tn{begingroup} and \tn{endgroup}.
The extracting and updating would not remove these marks, they still be there, you
can find them by your own method as well.
@@ -82,7 +82,8 @@
If \env{multicols} or \env{adjmulticols} or their starred versions are put in a box
--- so called \emph{boxed multicols}, you are able to eanble automatically extracting
-and updating marks into the box (not outer of the box, because it only ).
+and updating marks into the box (not outer of the box, because they are only updated
+one level).
If you need to update marks in this box, you have to do it manually.
Of cause, if the box is \env{minipage} or \env{tcolorbox} or another \env{multicols}
or any other supported environments or commands, then no more things to do.
@@ -96,7 +97,7 @@
wrong marks.
If your {\LaTeX} version is 2022-06-01 or newer,
-you can get more accurate mark values by using \cs{TopMark}, \cs{FirstMark}
+you can get more correct mark values by using \cs{TopMark}, \cs{FirstMark}
and \cs{LastMark} in head and foot, but only the
\texttt{previous-page} region and \texttt{page} region are supported for now.
Still, Multiple contiguous forced break or \tn{clearpage} may cause the wrong marks.
@@ -122,8 +123,6 @@
to be done.
-\enlargethispage{20pt}
-
\begin{function}{\AddToUpdateMarksList,\SetUpdateMarksList,\RemoveFromUpdateMarksList}
\begin{syntax}
\verb|\AddToUpdateMarksList| \marg{number list}
@@ -139,6 +138,7 @@
\begin{verbatim}
\RemoveFromUpdateMarksList { [2e-right], 4, \MarkClass{my-class} }
\end{verbatim}
+You can also use number ranges in \meta{number list}, such as \verb|2 -> 5|.
\end{function}
@@ -205,9 +205,23 @@
If \meta{number list} is presented, the mark classes are these numbers, otherwise
they are the automatical updating list.
+
+\texttt{insertmark} hook would not be used as it's already been used.
\end{function}
+\begin{function}[added=2024-02-19]{\ExtractMarksTo}
+ \begin{syntax}
+ \verb|\ExtractMarks| \marg{box number} \marg{cmd}
+ \verb|\ExtractMarks| \oarg{number list} \marg{box number} \marg{cmd}
+ \verb|\ExtractMarks| * \marg{text} \marg{cmd}
+ \verb|\ExtractMarks| * \oarg{number list} \marg{text} \marg{cmd}
+ \end{syntax}
+It collect all marks to \tn[no-index]{cmd}, you can use \tn[no-index] to reinsert
+these marks.
+\texttt{insertmark} hook would not be used as it's already been used.
+\end{function}
+
\section{Disable patches or write your own patches}
By default, \pkg{updatemarks} use its own patches to support \env{minipage},
@@ -230,15 +244,21 @@
This section describes the interfaces of \LaTeX3.
+\begin{function}[added=2024-02-19]{\updatemarks_parse_classes:Nn}
+ \begin{syntax}
+ \verb|\updatemarks_parse_classes:Nn| \meta{seq var} \marg{number list}
+ \end{syntax}
+Parse number list and save it to \meta{seq var}.
+\end{function}
+
\begin{function}{\updatemarks_extract:nN,\updatemarks_extract_split:N}
\begin{syntax}
- \verb|\updatemarks_extract:nN| \marg{box material} \meta{seq var}
+ \verb|\updatemarks_extract:nN| \marg{material} \meta{seq var}
\verb|\updatemarks_extract_split:N| \meta{seq var}
\end{syntax}
-These two functions have the same functions of
-\cs{ExtractMarks} and \cs{ExtractSplitMarks}.
+Programming interface of \cs{ExtractMarks} and \cs{ExtractSplitMarks}, respectively.
-\meta{box material} is content to build a box.
+\meta{material} is content to build a box.
Such as unpacked box using \cs{hbox_unpack:N} or \cs{vbox_unpack:N} or text.
\meta{seq var} is the number sequence of mark classes which are need to be extracted.
@@ -246,6 +266,26 @@
They only save the marks whose positions are first or last.
\end{function}
+\begin{function}[added=2024-02-19]{\updatemarks_extract:nNN}
+ \begin{syntax}
+ \verb|\updatemarks_extract:nNN| \marg{material} \meta{seq var} \meta{tl var}
+ \end{syntax}
+Programming interface of \cs{ExtractMarksTo}.
+
+\texttt{insertmark} hook would not be used as it's already been used.
+\end{function}
+
+\begin{function}[added=2024-02-19]{\updatemarks_extract_act:nNn}
+ \begin{syntax}
+ \verb|\updatemarks_extract_act:nNn| \marg{material} \meta{seq var} \marg{code}
+ \end{syntax}
+Run \meta{code} for every mark classes in \meta{seq var}, the code can use one
+parameter, which is the current mark class, and two \texttt{tl} variable
+\cs{l_updatemarks_first_tl} and \cs{l_updatemarks_last_tl}, which save
+the first and last marks at specified mark class, respectively. If these two \texttt{tl}
+is not exist, then no marks at the mark class are inserted.
+\end{function}
+
\begin{function}{\updatemarks_update:N}
\begin{syntax}
\verb|\updatemarks_update:N| \meta{seq var}
@@ -256,6 +296,8 @@
reinserted into the current box or the main vertical list.
It only reinserts marks whose positions are first or last.
+
+\texttt{insertmark} hook would not be used as it's already been used.
\end{function}
\begin{function}{\updatemarks_save:Nnn}
@@ -264,18 +306,28 @@
\end{syntax}
Saving marks at \meta{position} of specified mark classes \meta{seq var},
whose values are expanding \meta{value code} \emph{once}.
+
+If \cs{l_updatemarks_nonempty_bool} is set to \texttt{true}, then the expanded value
+will not be saved if it is total empty.
+
The \meta{value code} receives each item in the \meta{seq var}
-as a trailing brace group.
+as a trailing brace group, than expand the whole part of
+\meta{value code} and the trailing group \emph{once}.
\end{function}
-\begin{function}{\updatemarks_save_x:Nnn}
+\begin{function}{\updatemarks_save_e:Nnn}
\begin{syntax}
- \verb|\updatemarks_save_x:Nnn| \meta{seq var} \marg{position} \marg{value code}
+ \verb|\updatemarks_save_e:Nnn| \meta{seq var} \marg{position} \marg{value code}
\end{syntax}
Saving marks at \meta{position} of specified mark classes \meta{seq var},
whose values are fully expanding \meta{value code}.
+
+If \cs{l_updatemarks_nonempty_bool} is set to \texttt{true}, then the expanded value
+will not be saved if it is total empty.
+
The \meta{value code} receives each item in the \meta{seq var}
-as a trailing brace group.
+as a trailing brace group, then \emph{fully expand} the whole part of
+\meta{value code} and the trailing group.
\end{function}
\begin{function}{\updatemarks_alias:Nnn}
@@ -284,6 +336,9 @@
\end{syntax}
Setting marks at \meta{alias position} are equal to \meta{source position}
of specified mark classes \meta{seq var}.
+
+If \cs{l_updatemarks_nonempty_bool} is set to \texttt{true}, then the expanded value
+will not be saved if it is total empty.
\end{function}
\begin{function}{\updatemarks_remove:Nn}
@@ -318,5 +373,16 @@
\cs{NewMarkClass}. If \cs{NewMarkClass} is undefined, then it's empty.
\end{function}
+\begin{function}{\l_updatemarks_nonempty_bool}
+A local \texttt{bool} variable which is used to control if is going to save
+a total empty value.
+\end{function}
+\begin{function}{\l_updatemarks_first_tl,\l_updatemarks_last_tl}
+A local \texttt{tl} variable which are use to save the first and last marks.
+\end{function}
+
+
+\PrintIndex
+
\end{document}
\ No newline at end of file
Added: branches/branch2023.final/Master/texmf-dist/tex/latex/updatemarks/updatemarks-nums.sty
===================================================================
--- branches/branch2023.final/Master/texmf-dist/tex/latex/updatemarks/updatemarks-nums.sty (rev 0)
+++ branches/branch2023.final/Master/texmf-dist/tex/latex/updatemarks/updatemarks-nums.sty 2024-02-19 20:59:59 UTC (rev 69989)
@@ -0,0 +1,161 @@
+% updatemarks-nums.sty
+% Copyright 2024 Wenjian Chern.
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Wenjian Chern.
+%
+% This work consists of the files updatemarks-nums.sty
+%
+\@ifundefined{ProvidesExplPackage}{\RequirePackage{expl3}}
+\ProvidesExplPackage{updatemarks-nums}{2024/02/19}{v0.1}{parse number range}
+
+\tl_new:N \l__parserange_tmpa_tl
+\tl_new:N \l__parserange_tmpb_tl
+\seq_new:N \l__parserange_tmp_seq
+\int_new:N \l__parserange_begin_int
+\int_new:N \l__parserange_end_int
+\int_new:N \l__parserange_max_int
+\int_new:N \l__parserange_min_int
+\bool_new:N \l__parserange_invalid_bool
+\quark_new:N \q__parserange
+\cs_new_protected:Npn \parserange_check:
+ {
+ \cs_set_eq:NN \__parserange_single:n \__parserange_single_check:n
+ \cs_set_eq:NN \__parserange_range: \__parserange_range_check:
+ }
+\cs_new_protected:Npn \parserange_nocheck:
+ {
+ \cs_set_eq:NN \__parserange_single:n \__parserange_single_nocheck:n
+ \cs_set_eq:NN \__parserange_range: \__parserange_range_nocheck:
+ }
+\cs_new_protected:Npn \parserange:nnnN #1#2#3#4
+ {
+ \seq_set_eq:NN #4 \c_empty_seq
+ \int_set:Nn \l__parserange_min_int { \__parserange_to_int:n {#1} }
+ \int_set:Nn \l__parserange_max_int { \__parserange_to_int:n {#2} }
+ \clist_map_inline:nn {#3}
+ {
+ \__parserange_aux:n {##1}
+ \bool_if:NF \l__parserange_invalid_bool
+ { \seq_concat:NNN #4 #4 \l__parserange_tmp_seq }
+ }
+ }
+\cs_generate_variant:Nn \parserange:nnnN { nnvN, nneN }
+\cs_new_protected:Npn \parserange:nnN
+ { \parserange:nnnN { 1 } }
+\cs_generate_variant:Nn \parserange:nnN { nvN, neN }
+\cs_new_protected:Npn \__parserange_aux:n #1
+ {
+ \bool_set_false:N \l__parserange_invalid_bool
+ \seq_clear:N \l__parserange_tmp_seq
+ \__parserange_action:nnn
+ {#1}
+ { \__parserange_single:n {#1} }
+ {
+ \tl_if_empty:NTF \l__parserange_tmpa_tl
+ { \int_set_eq:NN \l__parserange_begin_int \l__parserange_min_int }
+ {
+ \int_set:Nn \l__parserange_begin_int
+ { \exp_args:No \__parserange_to_int:n \l__parserange_tmpa_tl }
+ }
+ \tl_if_empty:NTF \l__parserange_tmpb_tl
+ { \int_set_eq:NN \l__parserange_end_int \l__parserange_max_int }
+ {
+ \int_set:Nn \l__parserange_end_int
+ { \exp_args:No \__parserange_to_int:n \l__parserange_tmpb_tl }
+ }
+ \__parserange_range:
+ }
+ }
+\cs_new_protected:Npn \parserange_use_delimiter:n #1
+ {
+ \tl_if_empty:nTF {#1}
+ {
+ \cs_set:Npn \__parserange_action:nnn ##1
+ { \__parserange_aux:w ##1 \prg_do_nothing: \q_nil \q__parserange }
+ \cs_set:Npn \__parserange_aux:w ##1##2 ##3 \q__parserange
+ {
+ \tl_set:Nx \l__parserange_tmpa_tl { \tl_trim_spaces:n {##1} }
+ \tl_set:Nx \l__parserange_tmpa_tl { \tl_trim_spaces:n {##2} }
+ \quark_if_nil:nTF {##3}
+ }
+ }
+ {
+ \cs_set:Npn \__parserange_action:nnn ##1
+ { \__parserange_aux:w ##1 #1 #1 \q__parserange }
+ \cs_set:Npn \__parserange_aux:w ##1 #1 ##2 #1 ##3 \q__parserange
+ {
+ \tl_set:Nx \l__parserange_tmpa_tl { \tl_trim_spaces:n {##1} }
+ \tl_set:Nx \l__parserange_tmpb_tl { \tl_trim_spaces:n {##2} }
+ \tl_if_blank:nTF {##3}
+ }
+ }
+ }
+\cs_new_protected:Npn \parserange_set_to_int:n
+ { \cs_set:Npn \__parserange_to_int:n ##1 }
+\parserange_set_to_int:n {#1}
+\cs_new_protected:Npn \parserange_use_default_delimiter:
+ {
+ \cs_set:Npn \__parserange_action:nnn ##1
+ { \__parserange_aux:w ##1 -> -> \q__parserange }
+ \cs_set:Npn \__parserange_aux:w ##1 -> ##2 -> ##3 \q__parserange
+ {
+ \tl_set:Nx \l__parserange_tmpa_tl { \tl_trim_spaces:n {##1} }
+ \tl_set:Nx \l__parserange_tmpb_tl { \tl_trim_spaces:n {##2} }
+ \tl_if_blank:nTF {##3} { \use_i:nn } { \use_ii:nn }
+ }
+ }
+\parserange_use_default_delimiter: % \parserange_use_delimiter:n {->}
+\cs_new:Npn \__parserange_single_check:n #1
+ {
+ \bool_lazy_or:nnTF
+ { \int_compare_p:nNn {#1} > \l__parserange_max_int }
+ { \int_compare_p:nNn {#1} < \l__parserange_min_int }
+ { \bool_set_true:N \l__parserange_invalid_bool }
+ {
+ \seq_put_right:Nx \l__parserange_tmp_seq
+ { \int_eval:n { \__parserange_to_int:n {#1} } }
+ }
+ }
+\cs_new:Npn \__parserange_single_nocheck:n #1
+ {
+ \seq_put_right:Nx \l__parserange_tmp_seq
+ { \int_eval:n { \__parserange_to_int:n {#1} } }
+ }
+\cs_new_eq:NN \__parserange_single:n \__parserange_single_check:n
+\cs_new:Npn \__parserange_range_check:
+ {
+ \int_compare:nNnT \l__parserange_begin_int < \l__parserange_min_int
+ { \int_set_eq:NN \l__parserange_begin_int \l__parserange_min_int }
+ \int_compare:nNnT \l__parserange_end_int > \l__parserange_max_int
+ { \int_set_eq:NN \l__parserange_end_int \l__parserange_max_int }
+ \bool_lazy_or:nnTF
+ { \int_compare_p:nNn \l__parserange_begin_int > \l__parserange_max_int }
+ { \int_compare_p:nNn \l__parserange_begin_int > \l__parserange_end_int }
+ { \bool_set_true:N \l__parserange_invalid_bool }
+ {
+ \int_step_inline:nnn
+ { \l__parserange_begin_int } { \l__parserange_end_int }
+ { \seq_put_right:Nn \l__parserange_tmp_seq {##1} }
+ }
+ }
+\cs_new:Npn \__parserange_range_nocheck:
+ {
+ \int_compare:nNnTF \l__parserange_begin_int > \l__parserange_end_int
+ { \bool_set_true:N \l__parserange_invalid_bool }
+ {
+ \int_step_inline:nnn
+ { \l__parserange_begin_int } { \l__parserange_end_int }
+ { \seq_put_right:Nn \l__parserange_tmp_seq {##1} }
+ }
+ }
+\cs_new_eq:NN \__parserange_range: \__parserange_range_check:
Property changes on: branches/branch2023.final/Master/texmf-dist/tex/latex/updatemarks/updatemarks-nums.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: branches/branch2023.final/Master/texmf-dist/tex/latex/updatemarks/updatemarks.sty
===================================================================
--- branches/branch2023.final/Master/texmf-dist/tex/latex/updatemarks/updatemarks.sty 2024-02-19 20:59:42 UTC (rev 69988)
+++ branches/branch2023.final/Master/texmf-dist/tex/latex/updatemarks/updatemarks.sty 2024-02-19 20:59:59 UTC (rev 69989)
@@ -1,12 +1,12 @@
% updatemarks.sty
-% Copyright 2023 Wenjian Chern.
+% Copyright 2023, 2024 Wenjian Chern.
%
% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
+% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or any later version.
% The latest version of this license is in
% http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
+% and version 1.3c or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
@@ -16,10 +16,10 @@
% This work consists of the files updatemarks.sty and updatemarks.tex
%
\NeedsTeXFormat{LaTeX2e}
-\@ifundefined{ProvidesExplPackage}{\RequirePackage{expl3}}{}
\@ifundefined{NewDocumentCommand}{\RequirePackage{xparse}}{}
-\ProvidesExplPackage{updatemarks}{2023/09/03}{0.2b}{extract and update marks from box}
+\ProvidesExplPackage{updatemarks}{2024/02/19}{0.2e}{extract and update marks from box}
\RequirePackage{etoolbox}
+\RequirePackage{updatemarks-nums}
\seq_new:N \g__updatemarks_seq
\box_new:N \l__updatemarks_r_box
@@ -26,17 +26,28 @@
\cs_new_eq:NN \l__updatemarks_s_box \l_tmpa_box % this box is used for locally split
\tex_countdef:D \g_updatemarks_max_int 256 \exp_stop_f:
\tl_new:N \l__updatemarks_tl
+\tl_new:N \g__updatemarks_saved_tl
-
-%% basicly copy from \__mark_update_structure:nn of LaTeX kernel
-\cs_new_protected:Npn \__updatemarks_extract:nnn #1#2#3 % box, map of number, code
+%% basicly copy from \__mark_extract_and_handle_marks:nn of LaTeX kernel
+\cs_new_protected:Npn \__updatemarks_extract:nnn #1#2#3 % material, map of number, code
{
+ \__updatemarks_extract:nn {#1}
+ { \__updatemarks_extract_split:nn {#2} {#3} }
+ }
+\cs_new_protected:Npn \__updatemarks_extract:nn #1#2 % material, code
+ {
\group_begin:
\dim_set_eq:NN \tex_splitmaxdepth:D \c_max_dim
\int_set_eq:NN \tex_vbadness:D \c_max_int
\dim_set_eq:NN \tex_vfuzz:D \c_max_dim
+ \__updatemarks_prepare_and_extract:nn {#2} {#1}
+ \group_end:
+ }
+% old mechanism
+\cs_new_protected:Npn \__updatemarks_prepare_and_extract:nn #1#2 % code, material
+ {
\vbox_set_to_ht:Nnw \l__updatemarks_r_box { -.5 \c_max_dim }
- #1 \tex_unskip:D
+ #2 \tex_unskip:D
\box_set_to_last:N \l__updatemarks_r_box
\int_compare:nNnT { \tex_lastnodetype:D } < { 0 }
{
@@ -53,19 +64,16 @@
\int_compare:nNnTF { \tex_badness:D } > { 0 }
{
\vbox_set_split_to_ht:NNn \l__updatemarks_s_box \l__updatemarks_r_box \c_max_dim
- \__updatemarks_extract_split:nn {#2} {#3}
+ #1
}
- {
- \msg_error:nn { updatemarks } { infinite-shrinkage }
- #2
- {
- \cs_undefine:N \l_updatemarks_first_tl
- \cs_undefine:N \l_updatemarks_last_tl
- #3
- }
- }
- \group_end:
+ { \msg_error:nn { updatemarks } { infinite-shrinkage } }
}
+% new mechanism, copy a LaTeX kernel command
+\cs_if_exist:NT \__mark_prepare_and_extract:nn
+ {
+ \cs_gset_eq:NN \__updatemarks_prepare_and_extract:nn
+ \__mark_prepare_and_extract:nn
+ }
\cs_new_protected:Npn \__updatemarks_extract_split:nn #1#2 % map of number, code
{
#1
@@ -76,7 +84,11 @@
\cs_undefine:N \l_updatemarks_first_tl
\cs_undefine:N \l_updatemarks_last_tl
}
- { \tl_set:No \l_updatemarks_first_tl { \tex_splitfirstmarks:D ##1 } }
+ {
+ \tl_set:No \l_updatemarks_first_tl { \tex_splitfirstmarks:D ##1 }
+ \tl_if_empty:NT \l_updatemarks_first_tl
+ { \cs_undefine:N \l_updatemarks_first_tl }
+ }
#2
}
}
@@ -89,6 +101,32 @@
\tl_gset_eq:cN { g__updatemarks_last-#1_tl } \l_updatemarks_last_tl
}
}
+\cs_new_protected:Npn \__updatemarks_extract_for_reinsertion:nn #1#2 % material, map
+ {
+ \__updatemarks_extract:nn {#1}
+ {
+ #2
+ {
+ \tl_if_empty:oF { \tex_splitbotmarks:D ##1 }
+ {
+ \tl_if_empty:oF { \tex_splitfirstmarks:D ##1 }
+ {
+ \tl_gput_right:Nx \g__updatemarks_saved_tl
+ {
+ \tex_marks:D ##1
+ { \exp_not:N \exp_not:n { \tex_splitfirstmarks:D ##1 } }
+ }
+ }
+ \tl_gput_right:Nx \g__updatemarks_saved_tl
+ {
+ \tex_marks:D ##1
+ { \exp_not:N \exp_not:n { \tex_splitbotmarks:D ##1 } }
+ }
+ }
+ }
+ }
+ }
+
\cs_new_protected:Npn \updatemarks_extract:nN #1#2 % box material, seq
{
\__updatemarks_extract:nnn {#1}
@@ -101,22 +139,77 @@
{ \seq_map_inline:Nn #1 }
{ \__updatemarks_extract_num:n {##1} }
}
+\cs_new_protected:Npn \updatemarks_extract:nNN #1#2#3
+ {
+ \tl_clear:N \g__updatemarks_saved_tl
+ \__updatemarks_extract_for_reinsertion:nn {#1}
+ { \seq_map_inline:Nn #2 }
+ \tl_set_eq:NN #3 \g__updatemarks_saved_tl
+ }
+\cs_new_eq:NN \__updatemarks_extract_act:n ?
+\cs_new_protected:Npn \updatemarks_extract_act:nNn #1#2#3 % material, seq, code
+ {
+ \cs_set_protected:Npn \__updatemarks_extract_act:n ##1 {#3}
+ \__updatemarks_extract:nnn {#1}
+ { \seq_map_inline:Nn #2 }
+ { \__updatemarks_extract_act:n {##1} }
+ }
+\bool_new:N \l_updatemarks_nonempty_bool
+\tl_new:N \l__updatemarks_saved_tl
\cs_new_protected:Npn \updatemarks_save:Nnn #1#2#3 % seq, pos, value
{
- \seq_map_inline:Nn #1
- { \tl_gset:co { g__updatemarks_#2-##1_tl } { #3 {##1} } }
+ \bool_if:NTF \l_updatemarks_nonempty_bool
+ {
+ \seq_map_inline:Nn #1
+ {
+ \tl_set:No \l__updatemarks_saved_tl { #3 {##1} }
+ \tl_if_empty:NF \l__updatemarks_saved_tl
+ { \tl_gset_eq:cN { g__updatemarks_#2-##1_tl } \l__updatemarks_saved_tl }
+ }
+ }
+ {
+ \seq_map_inline:Nn #1
+ {
+ \tl_gset:co { g__updatemarks_#2-##1_tl } { #3 {##1} }
+ }
+ }
}
-\cs_new_protected:Npn \updatemarks_save_x:Nnn #1#2#3 % seq, pos, value
+\cs_new_protected:Npn \updatemarks_save_e:Nnn #1#2#3 % seq, pos, value
{
- \seq_map_inline:Nn #1
- { \tl_gset:cx { g__updatemarks_#2-##1_tl } { #3 {##1} } }
+ \bool_if:NTF \l_updatemarks_nonempty_bool
+ {
+ \seq_map_inline:Nn #1
+ {
+ \tl_set:Nx \l__updatemarks_saved_tl { #3 {##1} }
+ \tl_if_empty:NF \l__updatemarks_saved_tl
+ { \tl_gset_eq:cN { g__updatemarks_#2-##1_tl } \l__updatemarks_saved_tl }
+ }
+ }
+ {
+ \seq_map_inline:Nn #1
+ {
+ \tl_gset:cx { g__updatemarks_#2-##1_tl } { #3 {##1} }
+ }
+ }
}
+\cs_new_eq:NN \updatemarks_save_x:Nnn \updatemarks_save_e:Nnn
\cs_new_protected:Npn \updatemarks_alias:Nnn #1#2#3 % seq, pos1, pos2
{
- \seq_map_inline:Nn #1
- { \tl_gset_eq:cc { g__updatemarks_#2-##1_tl } { g__updatemarks_#3-##1_tl } }
+ \bool_if:NTF \l_updatemarks_nonempty_bool
+ {
+ \seq_map_inline:Nn #1
+ {
+ \tl_set_eq:Nc \l__updatemarks_saved_tl { g__updatemarks_#3-##1_tl }
+ \tl_if_empty:NF \l__updatemarks_saved_tl
+ { \tl_gset_eq:cN { g__updatemarks_#2-##1_tl } \l__updatemarks_saved_tl }
+ }
+ }
+ {
+ \seq_map_inline:Nn #1
+ { \tl_gset_eq:cc { g__updatemarks_#2-##1_tl } { g__updatemarks_#3-##1_tl } }
+ }
}
\cs_new_protected:Npn \updatemarks_remove:Nn #1#2 % seq, pos
{ \seq_map_inline:Nn #1 { \cs_undefine:c { g__updatemarks_#2-##1_tl } } }
@@ -145,32 +238,34 @@
\if at nobreak\ifvmode\nobreak\fi\fi
}
}
-% do not check if it is <= \g_updatemarks_max_int
\cs_new_protected:Npn \__updatemarks_gput:Nn #1#2
{
\group_begin:
\cs_set_eq:NN \MarkClass \__updatemarks_class_num:n
\cs_set_eq:NN \MaxClass \g_updatemarks_max_int
- \clist_map_inline:nn {#2}
- { \seq_gput_right:Nx #1 { \int_eval:n { \__updatemarks_maybe_class:n {##1} } } }
+ \parserange_use_delimiter:n { -> }
+ \parserange_check:
+ \parserange_set_to_int:n { \__updatemarks_maybe_class:n {##1} }
+ \parserange:nnnN { 0 } { \g_updatemarks_max_int } {#2} \g__updatemarks_seq
+ \seq_gset_eq:NN #1 \g__updatemarks_seq
\seq_gremove_duplicates:N #1
\group_end:
}
+\cs_new_protected:Npn \updatemarks_parse_classes:Nn { \__updatemarks_gput:Nn }
-\cs_new:Npn \__updatemarks_class_num:n #1 { \cs:w c__mark_class_ #1 _mark \cs_end: }
+\cs_new:Npn \__updatemarks_class_num:n #1
+ {
+ \cs_if_exist_use:cF { c__mark_class_ #1 _mark }
+ { -1 \msg_expandable_error:nnn { updatemarks } { unknown-class } {#1} }
+ }
\cs_new:Npn \__updatemarks_maybe_class:n #1
{
\tl_if_head_eq_meaning:nNTF {#1} [ % ]
{ \__updatemarks_maybe_class_aux:w #1 } {#1}
}
-\cs_new:Npn \__updatemarks_maybe_class_aux:w [#1]
- {
- \cs_if_exist_use:cF { c__mark_class_ #1 _mark }
- { 0 \msg_expandable_error:nnn { updatemarks } { unknown-class } {#1} }
- }
+\cs_new:Npn \__updatemarks_maybe_class_aux:w [#1] { \__updatemarks_class_num:n {#1} }
-
\seq_new:N \g_updatemarks_seq
\NewDocumentCommand \ExtractMarks { s o +m }
{
@@ -200,6 +295,34 @@
\g__updatemarks_seq
}
}
+\NewDocumentCommand \ExtractMarksTo { s o +m m }
+ {
+ \tl_if_novalue:nTF {#2}
+ {
+ \updatemarks_extract:nNN
+ {
+ \bool_if:nTF {#1} { #3 }
+ {
+ \if_hbox:N #3 \hbox_unpack:N #3 \scan_stop: \fi:
+ \if_vbox:N #3 \vbox_unpack:N #3 \scan_stop: \fi:
+ }
+ }
+ \g_updatemarks_seq #4
+ }
+ {
+ \seq_gclear:N \g__updatemarks_seq
+ \__updatemarks_gput:Nn \g__updatemarks_seq {#2}
+ \updatemarks_extract:nNN
+ {
+ \bool_if:nTF {#1} { #3 }
+ {
+ \if_hbox:N #3 \hbox_unpack:N #3 \scan_stop: \fi:
+ \if_vbox:N #3 \vbox_unpack:N #3 \scan_stop: \fi:
+ }
+ }
+ \g__updatemarks_seq #4
+ }
+ }
\NewDocumentCommand \ExtractSplitMarks { o }
{
\tl_if_novalue:nTF {#1}
@@ -259,11 +382,7 @@
}
}
{
- \AtBeginDocument
- {
- \int_step_inline:nnn { 0 } { \g_updatemarks_max_int }
- { \seq_gput_right:Nn \g_updatemarks_seq {#1} }
- }
+ \AtBeginDocument { \AddAllocatedToUpdateMarksList }
}
\msg_new:nnn { updatemarks } { unknown-class } { Unknown~mark~class~`#1'. }
@@ -316,7 +435,8 @@
\apptocmd \endminipage { \updatemarks at of{minipage} } { } { \ERROR }
}
% tcolorbox
-\providecommand \updatemarks at tcolorbox@patch
+\cs_if_exist:NTF \updatemarks at tcolorbox@patch { \use_none:n }
+ { \tl_const:Nn \updatemarks at tcolorbox@patch }
{
\tcbset{updatemarks/.is~choice,
updatemarks/true/.code=\bool_set_true:N \l__updatemarks_tcolorbox_bool,
@@ -363,7 +483,8 @@
\fi
}
% multicol
-\providecommand \updatemarks at multicol@patch
+\cs_if_exist:NTF \updatemarks at multicol@patch { \use_none:n }
+ { \tl_const:Nn \updatemarks at multicol@patch }
{
%% the patch is used to extract marks
\tl_set:No \set at keptmarks
@@ -402,7 +523,8 @@
% patches of new mark mechanism
\updatemarks at multicolnewmark@patch
}
-\providecommand \updatemarks at adjmulticol@patch
+\cs_if_exist:NTF \updatemarks at adjmulticol@patch { \use_none:n }
+ { \tl_const:Nn \updatemarks at adjmulticol@patch }
{
\patchcmd \adjmc at process@ne at column { \unvbox }
{ \extractmarks at of{multicol}{\unvcopy\mult at box}\unvbox }
@@ -409,7 +531,8 @@
{ } { \ERROR }
\updatemarks at adjmulticolnewmark@patch
}
-\providecommand \updatemarks at paracol@patch
+\cs_if_exist:NTF \updatemarks at paracol@patch { \use_none:n }
+ { \tl_const:Nn \updatemarks at paracol@patch }
{
\updatemarks at paracolnewmark@patch
}
@@ -451,12 +574,8 @@
{
\bool_if:NT \l__updatemarks_multicol_bool
{
- \seq_map_inline:Nn \g_updatemarks_seq
- {
- \tl_set:Nx \l__updatemarks_tl { \updatemarks_value:nn { top } {#1} }
- \tl_if_empty:NT \l__updatemarks_tl
- { \tl_gset:co { g__updatemarks_top-#1_tl } { \tex_topmarks:D #1 } }
- }
+ \bool_set_false:N \l_updatemarks_nonempty_bool
+ \updatemarks_save:Nnn \g_updatemarks_seq { top } { \tex_topmarks:D \use:n }
}
}
\tl_const:Nn \updatemarks at multicol@middlepage
More information about the tex-live-commits
mailing list.