add new stackrel-compatible-auto-inserting-padding-environment

This commit is contained in:
2020-05-20 00:23:58 +02:00
parent 04bdda2272
commit e4c6c9e0fa
4 changed files with 79 additions and 15 deletions
+64
View File
@@ -24,6 +24,7 @@
\RequirePackage[hidelinks, unicode]{hyperref} %[unicode, hidelinks]{hyperref}
\RequirePackage{bookmark}
\RequirePackage{wasysym}
\RequirePackage{environ}
\usetikzlibrary{quotes, angles}
@@ -153,3 +154,66 @@
% people seem to prefer varepsilon over epsilon
\renewcommand{\epsilon}{\varepsilon}
\ExplSyntaxOn
% S-tackrelcompatible ALIGN environment
% some might also call it the S-uper ALIGN environment
% uses regular expressions to calculate the widest stackrel
% to put additional padding on both sides of relation symbols
\NewEnviron{salign}
{
\begin{align*}
\lec_insert_padding:V \BODY
.\end{align*}
}
% some helper variables
\tl_new:N \l__lec_text_tl
\seq_new:N \l_lec_stackrels_seq
\int_new:N \l_stackrel_count_int
\int_new:N \l_idx_int
\box_new:N \l_tmp_box
\dim_new:N \l_tmp_dim_a
\dim_new:N \l_tmp_dim_b
\dim_new:N \l_tmp_dim_needed
% function to insert padding according to widest stackrel
\cs_new_protected:Nn \lec_insert_padding:n
{
\tl_set:Nn \l__lec_text_tl { #1 }
% get all stackrels in this align environment
\regex_extract_all:nnN { \c{stackrel}{(.*?)}{(.*?)} } { #1 } \l_lec_stackrels_seq
% get number of stackrels
\int_set:Nn \l_stackrel_count_int { \seq_count:N \l_lec_stackrels_seq }
\int_set:Nn \l_idx_int { 1 }
\dim_set:Nn \l_tmp_dim_needed { 0pt }
% iterate over stackrels
\int_while_do:nn { \l_idx_int <= \l_stackrel_count_int }
{
% calculate width of text
\hbox_set:Nn \l_tmp_box {$\seq_item:Nn \l_lec_stackrels_seq { \l_idx_int + 1 }$}
\dim_set:Nn \l_tmp_dim_a {\box_wd:N \l_tmp_box}
% calculate width of relation symbol
\hbox_set:Nn \l_tmp_box {$\seq_item:Nn \l_lec_stackrels_seq { \l_idx_int + 2 }$}
\dim_set:Nn \l_tmp_dim_b {\box_wd:N \l_tmp_box}
% check if 0.5*(a-b) > minimum padding, if yes updated minimum padding
\dim_compare:nNnTF
{ 1pt * \dim_ratio:nn { \l_tmp_dim_a - \l_tmp_dim_b } { 2pt } } > { \l_tmp_dim_needed }
{ \dim_set:Nn \l_tmp_dim_needed { 1pt * \dim_ratio:nn { \l_tmp_dim_a - \l_tmp_dim_b } { 2pt } } }
{ }
\quad
% increment list index by three, as every stackrel produces three list entries
\int_incr:N \l_idx_int
\int_incr:N \l_idx_int
\int_incr:N \l_idx_int
}
% replace all relations with align characters (&) and add the needed padding
\regex_replace_all:nnN
{ (&=|&\c{le}|&\c{ge}|&\c{stackrel}{.*?}{.*?}|&\c{neq}) }
{ \c{kern} \u{l_tmp_dim_needed} \1 \c{kern} \u{l_tmp_dim_needed} }
\l__lec_text_tl
\l__lec_text_tl
}
\cs_generate_variant:Nn \lec_insert_padding:n { V }
\ExplSyntaxOff