[latex3-commits] [git/LaTeX3-latex3-latex3] master: Only decompose CTM for (x)dvipdfmx (97d40b5)
Joseph Wright
joseph.wright at morningstar2.co.uk
Sun Mar 4 21:43:45 CET 2018
Repository : https://github.com/latex3/latex3
On branch : master
Link : https://github.com/latex3/latex3/commit/97d40b55a9ca6c70a4ac82947197d4a7db3f1e84
>---------------------------------------------------------------
commit 97d40b55a9ca6c70a4ac82947197d4a7db3f1e84
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date: Sun Mar 4 20:40:51 2018 +0000
Only decompose CTM for (x)dvipdfmx
The approach doesn't really offer anything for dvips:
rotation/scaling there is still raw PostScript.
>---------------------------------------------------------------
97d40b55a9ca6c70a4ac82947197d4a7db3f1e84
l3kernel/l3drivers.dtx | 253 ++++++++++++++-----------------
l3kernel/testfiles/m3expl001.luatex.tlg | 4 -
l3kernel/testfiles/m3expl001.ptex.tlg | 2 +-
l3kernel/testfiles/m3expl001.tlg | 4 -
l3kernel/testfiles/m3expl001.uptex.tlg | 2 +-
l3kernel/testfiles/m3expl001.xetex.tlg | 2 +-
l3kernel/testfiles/m3expl003.luatex.tlg | 4 -
l3kernel/testfiles/m3expl003.ptex.tlg | 2 +-
l3kernel/testfiles/m3expl003.tlg | 4 -
l3kernel/testfiles/m3expl003.uptex.tlg | 2 +-
l3kernel/testfiles/m3expl003.xetex.tlg | 2 +-
11 files changed, 117 insertions(+), 164 deletions(-)
diff --git a/l3kernel/l3drivers.dtx b/l3kernel/l3drivers.dtx
index dd3ae88..9a6d7a5 100644
--- a/l3kernel/l3drivers.dtx
+++ b/l3kernel/l3drivers.dtx
@@ -1162,43 +1162,16 @@
% \end{macro}
%
% \begin{macro}{\driver_draw_cm:nnnn}
-% \begin{macro}{\@@_draw_cm:nnnn}
% In \texttt{dvips}, keeping the transformations in line with the engine
-% requires that we use rotations and scalings. This is done by decomposing
-% the matrix: see the comments for \cs{@@_draw_cm_decompose:nnnnN} (which
-% is also needed by \texttt{(x)dvipdfmx}).
+% is unfortunately not possible for scaling and rotations: even if we
+% decompose the matrix into those operations, there is still no driver
+% tracking (\emph{cf.}~\texttt{(x)dvipdfmx}). Thus we take the shortest
+% path available and simply dump the matrix as given.
% \begin{macrocode}
\cs_new_protected:Npn \driver_draw_cm:nnnn #1#2#3#4
- {
- \@@_draw_cm_decompose:nnnnN {#1} {#2} {#3} {#4}
- \@@_draw_cm:nnnn
- }
-\cs_new_protected:Npn \@@_draw_cm:nnnn #1#2#3#4
- {
- \@@_draw_literal:n
- {
- \fp_compare:nNnTF {#1} = \c_zero_fp
- { 0 }
- { \fp_eval:n { round ( -#1, 5 ) } } ~
- rotate
- }
- \@@_draw_literal:n
- {
- \fp_eval:n { round ( #2 , 5 ) } ~
- \fp_eval:n { round ( #3 , 5 ) } ~
- scale
- }
- \@@_draw_literal:n
- {
- \fp_compare:nNnTF {#4} = \c_zero_fp
- { 0 }
- { \fp_eval:n { round ( -#4 , 5 ) } } ~
- rotate
- }
- }
+ { \@@_draw_literal:n { [#1 ~ #2 ~ #3 ~ #4 ~ 0 ~ 0 ] ~ concat } }
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% \begin{macro}{\driver_draw_box_use:Nnnnn}
% Inside a picture |@beginspecial|/|@endspecial| are active, which is
@@ -2071,9 +2044,9 @@
% \begin{macro}{\@@_draw_cm:nnnn}
% Another split here between \texttt{pdfmode} and \texttt{(x)dvipdfmx}.
% In the former, we have a direct method to maintain alignment: the driver
-% can use a matrix itself. For \texttt{(x)dvipdfmx}, as for \texttt{dvips},
-% we need to decompose the matrix into rotations and a scaling, then use
-% that.
+% can use a matrix itself. For \texttt{(x)dvipdfmx} we can to decompose the
+% matrix into rotations and a scaling, then use those operations as they
+% are handled by the driver..
% \begin{macrocode}
\cs_new_protected:Npn \driver_draw_cm:nnnn #1#2#3#4
{
@@ -2114,6 +2087,109 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\@@_draw_cm_decompose:nnnnN}
+% \begin{macro}
+% {
+% \@@_draw_cm_decompose_auxi:nnnnN,
+% \@@_draw_cm_decompose_auxii:nnnnN,
+% \@@_draw_cm_decompose_auxiii:nnnnN,
+% }
+% Internally, transformations for drawing are tracked as a matrix. Not all
+% engines provide a way of dealing with this: if we use a raw matrix, the
+% engine looses track of positions (for example for hyperlinks), and this is
+% not desirable. They do, however, allow us to track rotations and scalings.
+% Luckily, we can decompose any (two-dimensional) matrix into two rotations
+% and a single scaling:
+% \[
+% \begin{bmatrix}
+% A & B \\ C & D
+% \end{bmatrix}
+% =
+% \begin{bmatrix}
+% \cos\beta & \sin\beta \\ -\sin\beta & \cos\beta
+% \end{bmatrix}
+% \begin{bmatrix}
+% w_{1} & 0 \\ 0 & w_{2}
+% \end{bmatrix}
+% \begin{bmatrix}
+% \cos\gamma & \sin\gamma \\ -\sin\gamma & \cos\gamma
+% \end{bmatrix}
+% \]
+% The parent matrix can be converted to
+% \[
+% \begin{bmatrix}
+% A & B \\ C & D
+% \end{bmatrix}
+% =
+% \begin{bmatrix}
+% E & H \\-H & E
+% \end{bmatrix}
+% +
+% \begin{bmatrix}
+% F & G \\ G & -F
+% \end{bmatrix}
+% \]
+% From these, we can find that
+% \begin{align*}
+% \frac{w_{1} + w_{2}}{2} &= \sqrt{E^{2} + H^{2}} \\
+% \frac{w_{1} - w_{2}}{2} &= \sqrt{F^{2} + G^{2}} \\
+% \gamma - \beta &= \tan^{-1}(G/F) \\
+% \gamma + \beta &= \tan^{-1}(H/E)
+% \end{align*}
+% at which point we just have to do various pieces of re-arrangement to
+% get all of the values. (See J.~Blinn, \emph{IEEE Comput.\ Graph.\ Appl.},
+% 1996, \textbf{16}, 82--88.) There is one wrinkle: the PostScript (and PDF)
+% way of specifying a transformation matrix exchanges where one would
+% normally expect $B$ and $C$ to be.
+% \begin{macrocode}
+%<*dvipdfmx|xdvipdfmx>
+\cs_new_protected:Npn \@@_draw_cm_decompose:nnnnN #1#2#3#4#5
+ {
+ \use:x
+ {
+ \@@_draw_cm_decompose_auxi:nnnnN
+ { \fp_eval:n { (#1 + #4) / 2 } }
+ { \fp_eval:n { (#1 - #4) / 2 } }
+ { \fp_eval:n { (#3 + #2) / 2 } }
+ { \fp_eval:n { (#3 - #2) / 2 } }
+ }
+ #5
+ }
+\cs_new_protected:Npn \@@_draw_cm_decompose_auxi:nnnnN #1#2#3#4#5
+ {
+ \use:x
+ {
+ \@@_draw_cm_decompose_auxii:nnnnN
+ { \fp_eval:n { 2 * sqrt ( #1 * #1 + #4 * #4 ) } }
+ { \fp_eval:n { 2 * sqrt ( #2 * #2 + #3 * #3 ) } }
+ { \fp_eval:n { atand ( #3 , #2 ) } }
+ { \fp_eval:n { atand ( #4 , #1 ) } }
+ }
+ #5
+ }
+\cs_new_protected:Npn \@@_draw_cm_decompose_auxii:nnnnN #1#2#3#4#5
+ {
+ \use:x
+ {
+ \@@_draw_cm_decompose_auxiii:nnnnN
+ { \fp_eval:n { ( #4 - #3 ) / 2 } }
+ { \fp_eval:n { ( #1 + #2 ) / 2 } }
+ { \fp_eval:n { ( #1 - #2 ) / 2 } }
+ { \fp_eval:n { ( #4 + #3 ) / 2 } }
+ }
+ #5
+ }
+\cs_new_protected:Npn \@@_draw_cm_decompose_auxiii:nnnnN #1#2#3#4#5
+ {
+ \fp_compare:nNnTF { abs( #2 ) } > { abs ( #3 ) }
+ { #5 {#1} {#2} {#3} {#4} }
+ { #5 {#1} {#3} {#2} {#4} }
+ }
+%</dvipdfmx|xdvipdfmx>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\driver_draw_box_use:Nnnnn}
% Inserting a \TeX{} box transformed to the requested position and using
% the current matrix is done using a mixture of \TeX{} and low-level
@@ -2757,113 +2833,6 @@
%</dvisvgm>
% \end{macrocode}
%
-% \subsection{Support code for drawing}
-%
-% A small number of functions are needed by different parts of the drawing code
-% in a way that doesn't follow the general split. This material is collected up
-% here.
-%
-% \begin{macro}{\@@_draw_cm_decompose:nnnnN}
-% \begin{macro}
-% {
-% \@@_draw_cm_decompose_auxi:nnnnN,
-% \@@_draw_cm_decompose_auxii:nnnnN,
-% \@@_draw_cm_decompose_auxiii:nnnnN,
-% }
-% Internally, transformations for drawing are tracked as a matrix. Not all
-% engines provide a way of dealing with this: if we use a raw matrix, the
-% engine looses track of positions (for example for hyperlinks), and this is
-% not desirable. They do, however, allow us to track rotations and scalings.
-% Luckily, we can decompose any (two-dimensional) matrix into two rotations
-% and a single scaling:
-% \[
-% \begin{bmatrix}
-% A & B \\ C & D
-% \end{bmatrix}
-% =
-% \begin{bmatrix}
-% \cos\beta & \sin\beta \\ -\sin\beta & \cos\beta
-% \end{bmatrix}
-% \begin{bmatrix}
-% w_{1} & 0 \\ 0 & w_{2}
-% \end{bmatrix}
-% \begin{bmatrix}
-% \cos\gamma & \sin\gamma \\ -\sin\gamma & \cos\gamma
-% \end{bmatrix}
-% \]
-% The parent matrix can be converted to
-% \[
-% \begin{bmatrix}
-% A & B \\ C & D
-% \end{bmatrix}
-% =
-% \begin{bmatrix}
-% E & H \\-H & E
-% \end{bmatrix}
-% +
-% \begin{bmatrix}
-% F & G \\ G & -F
-% \end{bmatrix}
-% \]
-% From these, we can find that
-% \begin{align*}
-% \frac{w_{1} + w_{2}}{2} &= \sqrt{E^{2} + H^{2}} \\
-% \frac{w_{1} - w_{2}}{2} &= \sqrt{F^{2} + G^{2}} \\
-% \gamma - \beta &= \tan^{-1}(G/F) \\
-% \gamma + \beta &= \tan^{-1}(H/E)
-% \end{align*}
-% at which point we just have to do various pieces of re-arrangement to
-% get all of the values. (See J.~Blinn, \emph{IEEE Comput.\ Graph.\ Appl.},
-% 1996, \textbf{16}, 82--88.) There is one wrinkle: the PostScript (and PDF)
-% way of specifying a transformation matrix exchanges where one would
-% normally expect $B$ and $C$ to be.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_cm_decompose:nnnnN #1#2#3#4#5
- {
- \use:x
- {
- \@@_draw_cm_decompose_auxi:nnnnN
- { \fp_eval:n { (#1 + #4) / 2 } }
- { \fp_eval:n { (#1 - #4) / 2 } }
- { \fp_eval:n { (#3 + #2) / 2 } }
- { \fp_eval:n { (#3 - #2) / 2 } }
- }
- #5
- }
-\cs_new_protected:Npn \@@_draw_cm_decompose_auxi:nnnnN #1#2#3#4#5
- {
- \use:x
- {
- \@@_draw_cm_decompose_auxii:nnnnN
- { \fp_eval:n { 2 * sqrt ( #1 * #1 + #4 * #4 ) } }
- { \fp_eval:n { 2 * sqrt ( #2 * #2 + #3 * #3 ) } }
- { \fp_eval:n { atand ( #3 , #2 ) } }
- { \fp_eval:n { atand ( #4 , #1 ) } }
- }
- #5
- }
-\cs_new_protected:Npn \@@_draw_cm_decompose_auxii:nnnnN #1#2#3#4#5
- {
- \use:x
- {
- \@@_draw_cm_decompose_auxiii:nnnnN
- { \fp_eval:n { ( #4 - #3 ) / 2 } }
- { \fp_eval:n { ( #1 + #2 ) / 2 } }
- { \fp_eval:n { ( #1 - #2 ) / 2 } }
- { \fp_eval:n { ( #4 + #3 ) / 2 } }
- }
- #5
- }
-\cs_new_protected:Npn \@@_draw_cm_decompose_auxiii:nnnnN #1#2#3#4#5
- {
- \fp_compare:nNnTF { abs( #2 ) } > { abs ( #3 ) }
- { #5 {#1} {#2} {#3} {#4} }
- { #5 {#1} {#3} {#2} {#4} }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \begin{macrocode}
%</initex|package>
% \end{macrocode}
diff --git a/l3kernel/testfiles/m3expl001.luatex.tlg b/l3kernel/testfiles/m3expl001.luatex.tlg
index 343cba0..3a653d0 100644
--- a/l3kernel/testfiles/m3expl001.luatex.tlg
+++ b/l3kernel/testfiles/m3expl001.luatex.tlg
@@ -5977,10 +5977,6 @@ Defining \driver_draw_color_stroke_rgb:nnn on line ..
Defining \__driver_color_fill_select:n on line ...
Defining \driver_draw_cm:nnnn on line ...
Defining \driver_draw_box_use:Nnnnn on line ...
-Defining \__driver_draw_cm_decompose:nnnnN on line ...
-Defining \__driver_draw_cm_decompose_auxi:nnnnN on line ...
-Defining \__driver_draw_cm_decompose_auxii:nnnnN on line ...
-Defining \__driver_draw_cm_decompose_auxiii:nnnnN on line ...
)
Defining \__expl_status_pop:w on line ...
Defining \l__expl_status_stack_tl on line ...
diff --git a/l3kernel/testfiles/m3expl001.ptex.tlg b/l3kernel/testfiles/m3expl001.ptex.tlg
index cd7c2ef..2d95bdb 100644
--- a/l3kernel/testfiles/m3expl001.ptex.tlg
+++ b/l3kernel/testfiles/m3expl001.ptex.tlg
@@ -5968,11 +5968,11 @@ Defining \driver_draw_color_stroke_rgb:nnn on line ..
Defining \__driver_color_fill_select:n on line ...
Defining \driver_draw_cm:nnnn on line ...
Defining \__driver_draw_cm:nnnn on line ...
-Defining \driver_draw_box_use:Nnnnn on line ...
Defining \__driver_draw_cm_decompose:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxi:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxii:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxiii:nnnnN on line ...
+Defining \driver_draw_box_use:Nnnnn on line ...
)
Defining \__expl_status_pop:w on line ...
Defining \l__expl_status_stack_tl on line ...
diff --git a/l3kernel/testfiles/m3expl001.tlg b/l3kernel/testfiles/m3expl001.tlg
index 2891870..5aae4a6 100644
--- a/l3kernel/testfiles/m3expl001.tlg
+++ b/l3kernel/testfiles/m3expl001.tlg
@@ -6169,10 +6169,6 @@ Defining \driver_draw_color_stroke_rgb:nnn on line ..
Defining \__driver_color_fill_select:n on line ...
Defining \driver_draw_cm:nnnn on line ...
Defining \driver_draw_box_use:Nnnnn on line ...
-Defining \__driver_draw_cm_decompose:nnnnN on line ...
-Defining \__driver_draw_cm_decompose_auxi:nnnnN on line ...
-Defining \__driver_draw_cm_decompose_auxii:nnnnN on line ...
-Defining \__driver_draw_cm_decompose_auxiii:nnnnN on line ...
)
Defining \__expl_status_pop:w on line ...
Defining \l__expl_status_stack_tl on line ...
diff --git a/l3kernel/testfiles/m3expl001.uptex.tlg b/l3kernel/testfiles/m3expl001.uptex.tlg
index 551a7be..bb53bff 100644
--- a/l3kernel/testfiles/m3expl001.uptex.tlg
+++ b/l3kernel/testfiles/m3expl001.uptex.tlg
@@ -6167,11 +6167,11 @@ Defining \driver_draw_color_stroke_rgb:nnn on line ..
Defining \__driver_color_fill_select:n on line ...
Defining \driver_draw_cm:nnnn on line ...
Defining \__driver_draw_cm:nnnn on line ...
-Defining \driver_draw_box_use:Nnnnn on line ...
Defining \__driver_draw_cm_decompose:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxi:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxii:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxiii:nnnnN on line ...
+Defining \driver_draw_box_use:Nnnnn on line ...
)
Defining \__expl_status_pop:w on line ...
Defining \l__expl_status_stack_tl on line ...
diff --git a/l3kernel/testfiles/m3expl001.xetex.tlg b/l3kernel/testfiles/m3expl001.xetex.tlg
index e31798d..355841e 100644
--- a/l3kernel/testfiles/m3expl001.xetex.tlg
+++ b/l3kernel/testfiles/m3expl001.xetex.tlg
@@ -5959,11 +5959,11 @@ Defining \driver_draw_color_stroke_rgb:nnn on line ..
Defining \__driver_color_fill_select:n on line ...
Defining \driver_draw_cm:nnnn on line ...
Defining \__driver_draw_cm:nnnn on line ...
-Defining \driver_draw_box_use:Nnnnn on line ...
Defining \__driver_draw_cm_decompose:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxi:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxii:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxiii:nnnnN on line ...
+Defining \driver_draw_box_use:Nnnnn on line ...
)
Defining \__expl_status_pop:w on line ...
Defining \l__expl_status_stack_tl on line ...
diff --git a/l3kernel/testfiles/m3expl003.luatex.tlg b/l3kernel/testfiles/m3expl003.luatex.tlg
index 343cba0..3a653d0 100644
--- a/l3kernel/testfiles/m3expl003.luatex.tlg
+++ b/l3kernel/testfiles/m3expl003.luatex.tlg
@@ -5977,10 +5977,6 @@ Defining \driver_draw_color_stroke_rgb:nnn on line ..
Defining \__driver_color_fill_select:n on line ...
Defining \driver_draw_cm:nnnn on line ...
Defining \driver_draw_box_use:Nnnnn on line ...
-Defining \__driver_draw_cm_decompose:nnnnN on line ...
-Defining \__driver_draw_cm_decompose_auxi:nnnnN on line ...
-Defining \__driver_draw_cm_decompose_auxii:nnnnN on line ...
-Defining \__driver_draw_cm_decompose_auxiii:nnnnN on line ...
)
Defining \__expl_status_pop:w on line ...
Defining \l__expl_status_stack_tl on line ...
diff --git a/l3kernel/testfiles/m3expl003.ptex.tlg b/l3kernel/testfiles/m3expl003.ptex.tlg
index cd7c2ef..2d95bdb 100644
--- a/l3kernel/testfiles/m3expl003.ptex.tlg
+++ b/l3kernel/testfiles/m3expl003.ptex.tlg
@@ -5968,11 +5968,11 @@ Defining \driver_draw_color_stroke_rgb:nnn on line ..
Defining \__driver_color_fill_select:n on line ...
Defining \driver_draw_cm:nnnn on line ...
Defining \__driver_draw_cm:nnnn on line ...
-Defining \driver_draw_box_use:Nnnnn on line ...
Defining \__driver_draw_cm_decompose:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxi:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxii:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxiii:nnnnN on line ...
+Defining \driver_draw_box_use:Nnnnn on line ...
)
Defining \__expl_status_pop:w on line ...
Defining \l__expl_status_stack_tl on line ...
diff --git a/l3kernel/testfiles/m3expl003.tlg b/l3kernel/testfiles/m3expl003.tlg
index 2891870..5aae4a6 100644
--- a/l3kernel/testfiles/m3expl003.tlg
+++ b/l3kernel/testfiles/m3expl003.tlg
@@ -6169,10 +6169,6 @@ Defining \driver_draw_color_stroke_rgb:nnn on line ..
Defining \__driver_color_fill_select:n on line ...
Defining \driver_draw_cm:nnnn on line ...
Defining \driver_draw_box_use:Nnnnn on line ...
-Defining \__driver_draw_cm_decompose:nnnnN on line ...
-Defining \__driver_draw_cm_decompose_auxi:nnnnN on line ...
-Defining \__driver_draw_cm_decompose_auxii:nnnnN on line ...
-Defining \__driver_draw_cm_decompose_auxiii:nnnnN on line ...
)
Defining \__expl_status_pop:w on line ...
Defining \l__expl_status_stack_tl on line ...
diff --git a/l3kernel/testfiles/m3expl003.uptex.tlg b/l3kernel/testfiles/m3expl003.uptex.tlg
index 551a7be..bb53bff 100644
--- a/l3kernel/testfiles/m3expl003.uptex.tlg
+++ b/l3kernel/testfiles/m3expl003.uptex.tlg
@@ -6167,11 +6167,11 @@ Defining \driver_draw_color_stroke_rgb:nnn on line ..
Defining \__driver_color_fill_select:n on line ...
Defining \driver_draw_cm:nnnn on line ...
Defining \__driver_draw_cm:nnnn on line ...
-Defining \driver_draw_box_use:Nnnnn on line ...
Defining \__driver_draw_cm_decompose:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxi:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxii:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxiii:nnnnN on line ...
+Defining \driver_draw_box_use:Nnnnn on line ...
)
Defining \__expl_status_pop:w on line ...
Defining \l__expl_status_stack_tl on line ...
diff --git a/l3kernel/testfiles/m3expl003.xetex.tlg b/l3kernel/testfiles/m3expl003.xetex.tlg
index e31798d..355841e 100644
--- a/l3kernel/testfiles/m3expl003.xetex.tlg
+++ b/l3kernel/testfiles/m3expl003.xetex.tlg
@@ -5959,11 +5959,11 @@ Defining \driver_draw_color_stroke_rgb:nnn on line ..
Defining \__driver_color_fill_select:n on line ...
Defining \driver_draw_cm:nnnn on line ...
Defining \__driver_draw_cm:nnnn on line ...
-Defining \driver_draw_box_use:Nnnnn on line ...
Defining \__driver_draw_cm_decompose:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxi:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxii:nnnnN on line ...
Defining \__driver_draw_cm_decompose_auxiii:nnnnN on line ...
+Defining \driver_draw_box_use:Nnnnn on line ...
)
Defining \__expl_status_pop:w on line ...
Defining \l__expl_status_stack_tl on line ...
More information about the latex3-commits
mailing list