[latex3-commits] [git/LaTeX3-latex3-latex2e] develop: Gh836 (#837) (878a4715)
GitHub
noreply at github.com
Thu Jun 2 21:01:30 CEST 2022
Repository : https://github.com/latex3/latex2e
On branch : develop
Link : https://github.com/latex3/latex2e/commit/878a4715df024fc3425d2bfd5d3d138b9395c178
>---------------------------------------------------------------
commit 878a4715df024fc3425d2bfd5d3d138b9395c178
Author: Frank Mittelbach <frank.mittelbach at latex-project.org>
Date: Thu Jun 2 21:01:30 2022 +0200
Gh836 (#837)
* test file showing the problem
* fix for #836
* __mark -> @@ and other minor fixes
Co-authored-by: PhelypeOleinik <phelype.oleinik at latex-project.org>
>---------------------------------------------------------------
878a4715df024fc3425d2bfd5d3d138b9395c178
base/changes.txt | 6 +++
base/ltmarks.dtx | 69 ++++++++++++++++++++----
base/testfiles-ltmarks/github-0836.lvt | 41 +++++++++++++++
base/testfiles-ltmarks/github-0836.tlg | 95 ++++++++++++++++++++++++++++++++++
base/testfiles-ltmarks/xmarks-001.tlg | 2 +-
base/update-ltmarks-test.sh | 4 +-
6 files changed, 204 insertions(+), 13 deletions(-)
diff --git a/base/changes.txt b/base/changes.txt
index e267d0f7..6a4a6735 100644
--- a/base/changes.txt
+++ b/base/changes.txt
@@ -11,6 +11,12 @@ are not part of the distribution.
* ltfinal.dtx: add \NoCaseChange (previously available in the
textcase package)
+2022-06-01 Frank Mittelbach <Frank.Mittelbach at latex-project.org>
+
+ * ltmarks.dtx (subsection{Updating mark structures}):
+ Be more careful when unpackage a \vbox for mark detection, it might
+ contain infinite shrink glue (gh/836)
+
2022-05-27 David Carlisle <David.Carlisle at latex-project.org>
* ltfiles.dtx, ltoutenc.dtx:
diff --git a/base/ltmarks.dtx b/base/ltmarks.dtx
index e8971c9d..3dc4b493 100644
--- a/base/ltmarks.dtx
+++ b/base/ltmarks.dtx
@@ -14,8 +14,8 @@
%%% From File: ltmarks.dtx
%
% \begin{macrocode}
-\def\ltmarksversion{v1.0c}
-\def\ltmarksdate{2022/05/06}
+\def\ltmarksversion{v1.0d}
+\def\ltmarksdate{2022/06/01}
% \end{macrocode}
%<*driver>
\documentclass{l3doc}
@@ -826,18 +826,25 @@
\dim_set_eq:NN \tex_vfuzz:D \c_max_dim
% \end{macrocode}
% There is a further complication: if the region contains infinite
-% shrinking glue then a \cs{vsplit} operation will balk with a
+% shrinking glue then a \tn{vsplit} operation will balk with a
% low-level error. Now pages or columns, which are our main concern here, can't
% have such infinite shrinkage if they are cut straight from the
-% galley, however the use of \cs{enlargethispage} actually does add
+% galley, however the use of \tn{enlargethispage} actually does add
% some at the very bottom (and also wraps the whole page into a box
% by itself, so if we leave it this way then a) we get this error
% and b) we don't see any marks because they are hidden one level
% down).
%
+% Another possible issue are packages or user code that place stray
+% \tn{vbox}es directly into the main galley (an example is
+% \pkg{marginnote} that attaches its marginals in this way). If such
+% boxes end up as the last item on the page we should not unpack
+% them.
+%
% We therefore do an \tn{unskip} to get rid of that glue if present and
-% also check if we have then a \cs{vbox} as the last item and if so
-% unpack that too. All this is temporary, just for getting the
+% also check if we have then a \tn{vbox} as the last item and if so
+% unpack that too, but only under certain conditions, see
+% below. All this is temporary, just for getting the
% marks out, so it doesn't affect the final page production.
%
% In fact, we go one step further and set the box to a large
@@ -856,16 +863,50 @@
#2
\tex_unskip:D
\box_set_to_last:N \l_@@_box
- \box_if_vertical:NT \l_@@_box
- { \vbox_unpack:N \l_@@_box }
+% \end{macrocode}
+% After having removed the last box from the current list (if there
+% was one)
+% we check if the list is now empty. If not, the the last box is
+% definitely not the one from \tn{enlargethispage} and so we can
+% and should leave it alone. Otherwise we check if this last box is
+% a \tn{vbox}.
+% \changes{v1.0d}{2022/06/01}{Extend the logic for detecting the marks
+% in the box (gh/836)}
+% \begin{macrocode}
+ \int_compare:nNnT \tex_lastnodetype:D < 0
+ {
+ \box_if_vertical:NT \l_@@_box
+ {
+% \end{macrocode}
+% If it is we do a further test and reset the \cs{l_@@_box}
+% to check if it contains infinitely shrinkable glue.
+% \begin{macrocode}
+ \vbox_set_to_ht:Nnn \l_@@_box { -.5\c_max_dim }
+ {
+ \vbox_unpack:N \l_@@_box
+ \tex_kern:D \c_zero_dim % ensure that box
+ % is not empty
+ }
+% \end{macrocode}
+% If not, then we unpack it, if yes we still ignore it for the process of
+% mark extraction. We do not generate an error though, because in all
+% likelihood this is an ordinary box like a marginal that does
+% contain something like \tn{vss}.
+% \begin{macrocode}
+ \int_compare:nNnT \tex_badness:D > 0
+ { \vbox_unpack:N \l_@@_box }
+ }
+ }
% \end{macrocode}
% If it wasn't a vbox, it was either an hbox or there was no box.
% Given that we are only interested in the marks we don't need put
-% it back in that case. However, we have to make sure that the box
+% it back in that case. However, we have to make sure that the
+% outer box under construction
% is not totally empty (which it might have been from the start, or
% now), because \TeX{} does not report a badness for empty boxes
-% which means out test would incorrectly conclude that we have
-% infinite shrinking glue. A simple \tn{kern} is enough to avoid this.
+% and that means our test would incorrectly conclude that we have
+% infinite shrinking glue. A simple \tn{kern} is enough to avoid
+% this (the same was already done above).
% \begin{macrocode}
\tex_kern:D \c_zero_dim
}
@@ -1165,6 +1206,12 @@
%
% \subsection{Messages}
%
+% Mark errors are LaTeX kernel errors:
+% \changes{v1.0d}{2022/06/01}{Marks are kernel errors}
+% \begin{macrocode}
+\prop_gput:Nnn \g_msg_module_type_prop { mark } { LaTeX }
+% \end{macrocode}
+%
% \begin{macrocode}
\msg_new:nnnn { mark } { class-already-defined }
{ Mark~class~'#1'~already~defined }
diff --git a/base/testfiles-ltmarks/github-0836.lvt b/base/testfiles-ltmarks/github-0836.lvt
new file mode 100644
index 00000000..489d71fc
--- /dev/null
+++ b/base/testfiles-ltmarks/github-0836.lvt
@@ -0,0 +1,41 @@
+%
+% from Ulrike
+%
+
+
+
+\documentclass{book}
+
+\newbox\mybox
+
+\makeatletter
+\AddToHook{cmd/@opcol/before}{{\showoutput\showbox\@outputbox}}
+\makeatother
+
+\input{regression-test}
+
+\begin{document}
+
+\START
+
+% mimic marginnote ...
+
+x
+
+\vspace{44\baselineskip}
+
+\setbox\mybox\vbox to \ht\strutbox{blub\vss}%
+\box\mybox\vskip-\baselineskip
+blub \\zzz
+\newpage
+
+% trival case:
+
+\vbox to 1cm{xxx\vss}
+\break
+
+\OMIT
+\end{document}
+
+
+
diff --git a/base/testfiles-ltmarks/github-0836.tlg b/base/testfiles-ltmarks/github-0836.tlg
new file mode 100644
index 00000000..3c32c577
--- /dev/null
+++ b/base/testfiles-ltmarks/github-0836.tlg
@@ -0,0 +1,95 @@
+This is a generated file for the l3build validation system.
+Don't change this file in any respect.
+> \box...=
+\vbox(550.0+0.0)x345.0
+.\write-{}
+.\glue(\topskip) 5.69446
+.\hbox(4.30554+0.0)x345.0, glue set 324.7222fil
+..\hbox(0.0+0.0)x15.0
+..\OT1/cmr/m/n/10 x
+..\penalty 10000
+..\glue(\parfillskip) 0.0 plus 1.0fil
+..\glue(\rightskip) 0.0
+.\glue 528.0
+.\glue 0.0
+.\glue(\baselineskip) 3.60004
+.\vbox(8.39996+0.0)x345.0, glue set 1.45552fil
+..\hbox(6.94444+0.0)x345.0, glue set 310.5555fil
+...\hbox(0.0+0.0)x15.0
+...\OT1/cmr/m/n/10 b
+...\OT1/cmr/m/n/10 l
+...\OT1/cmr/m/n/10 u
+...\OT1/cmr/m/n/10 b
+...\penalty 10000
+...\glue(\parfillskip) 0.0 plus 1.0fil
+...\glue(\rightskip) 0.0
+..\glue 0.0 plus 1.0fil minus 1.0fil
+.\glue 0.0
+! OK.
+\__hook_toplevel cmd/@opcol/before ...\@outputbox
+ }
+l. ...\newpage
+[1
+]
+> \box...=
+\vbox(550.0+0.0)x345.0, glue set 528.0fil
+.\glue(\topskip) 3.05556
+.\hbox(6.94444+0.0)x345.0, glue set 310.5555fil
+..\hbox(0.0+0.0)x15.0
+..\OT1/cmr/m/n/10 b
+..\OT1/cmr/m/n/10 l
+..\OT1/cmr/m/n/10 u
+..\OT1/cmr/m/n/10 b
+..\penalty 10000
+..\glue 0.0 plus 1.0fil
+..\penalty -10000
+..\glue(\rightskip) 0.0
+.\penalty 300
+.\glue(\baselineskip) 7.69446
+.\hbox(4.30554+0.0)x345.0, glue set 331.66667fil
+..\OT1/cmr/m/n/10 z
+..\OT1/cmr/m/n/10 z
+..\OT1/cmr/m/n/10 z
+..\penalty 10000
+..\glue(\parfillskip) 0.0 plus 1.0fil
+..\glue(\rightskip) 0.0
+.\glue 0.0 plus 1.0fil
+.\glue 0.0
+! OK.
+\__hook_toplevel cmd/@opcol/before ...\@outputbox
+ }
+l. ...\newpage
+[2]
+Underfull \vbox (badness 10000) has occurred while \output is active
+\vbox(550.0+0.0)x345.0
+.\glue(\topskip) 0.0
+.\vbox(28.45274+0.0)x345.0, glue set 24.1472fil
+..\hbox(4.30554+0.0)x345.0, glue set 314.1666fil
+...\hbox(0.0+0.0)x15.0
+...\OT1/cmr/m/n/10 x
+...\OT1/cmr/m/n/10 x
+...\OT1/cmr/m/n/10 x
+...\penalty 10000
+...\glue(\parfillskip) 0.0 plus 1.0fil
+...\glue(\rightskip) 0.0
+..\glue 0.0 plus 1.0fil minus 1.0fil
+.\glue 0.0
+> \box...=
+\vbox(550.0+0.0)x345.0
+.\glue(\topskip) 0.0
+.\vbox(28.45274+0.0)x345.0, glue set 24.1472fil
+..\hbox(4.30554+0.0)x345.0, glue set 314.1666fil
+...\hbox(0.0+0.0)x15.0
+...\OT1/cmr/m/n/10 x
+...\OT1/cmr/m/n/10 x
+...\OT1/cmr/m/n/10 x
+...\penalty 10000
+...\glue(\parfillskip) 0.0 plus 1.0fil
+...\glue(\rightskip) 0.0
+..\glue 0.0 plus 1.0fil minus 1.0fil
+.\glue 0.0
+! OK.
+\__hook_toplevel cmd/@opcol/before ...\@outputbox
+ }
+l. ...\break
+[3]
diff --git a/base/testfiles-ltmarks/xmarks-001.tlg b/base/testfiles-ltmarks/xmarks-001.tlg
index 2d05ef67..e780b2fd 100644
--- a/base/testfiles-ltmarks/xmarks-001.tlg
+++ b/base/testfiles-ltmarks/xmarks-001.tlg
@@ -146,7 +146,7 @@ Marks: baz in OR (oneside):
column (first):||first baz|first baz|
column (second):||first baz|first baz|
[3]
-! Package mark Error: Unknown mark class 'unknown'.
+! LaTeX mark Error: Unknown mark class 'unknown'.
For immediate help type H <return>.
...
l. ...
diff --git a/base/update-ltmarks-test.sh b/base/update-ltmarks-test.sh
index 12374df2..e16e4b57 100644
--- a/base/update-ltmarks-test.sh
+++ b/base/update-ltmarks-test.sh
@@ -7,7 +7,9 @@ l3build save -cconfig-ltmarks \
xmarks-005 \
xmarks-006 \
xmarks-007 \
- xmarks-008
+ xmarks-008 \
+ github-0836
+
exit
More information about the latex3-commits
mailing list.