%% %% This is file `l3draw.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% l3draw.dtx (with options: `package') %% l3draw-boxes.dtx (with options: `package') %% l3draw-layers.dtx (with options: `package') %% l3draw-paths.dtx (with options: `package') %% l3draw-points.dtx (with options: `package') %% l3draw-scopes.dtx (with options: `package') %% l3draw-softpath.dtx (with options: `package') %% l3draw-state.dtx (with options: `package') %% l3draw-transforms.dtx (with options: `package') %% %% Copyright (C) 2018,2019 The LaTeX3 Project %% %% It may be distributed and/or modified under the conditions of %% the LaTeX Project Public License (LPPL), either version 1.3c of %% this license or (at your option) any later version. The latest %% version of this license is in the file: %% %% http://www.latex-project.org/lppl.txt %% %% This file is part of the "l3experimental bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% %% File: l3draw.dtx \RequirePackage{expl3} \ProvidesExplPackage{l3draw}{2019-09-28}{} {L3 Experimental core drawing support} \RequirePackage { l3color } %% File: l3draw-boxes.dtx \box_new:N \l__draw_tmp_box \cs_new_protected:Npn \draw_box_use:N #1 { \__draw_box_use:Nnnnn #1 { 0pt } { -\box_dp:N #1 } { \box_wd:N #1 } { \box_ht:N #1 } } \cs_new_protected:Npn \__draw_box_use:Nnnnn #1#2#3#4#5 { \bool_if:NT \l_draw_bb_update_bool { \__draw_point_process:nn { \__draw_path_update_limits:nn } { \draw_point_transform:n { #2 , #3 } } \__draw_point_process:nn { \__draw_path_update_limits:nn } { \draw_point_transform:n { #4 , #3 } } \__draw_point_process:nn { \__draw_path_update_limits:nn } { \draw_point_transform:n { #4 , #5 } } \__draw_point_process:nn { \__draw_path_update_limits:nn } { \draw_point_transform:n { #2 , #5 } } } \group_begin: \hbox_set:Nn \l__draw_tmp_box { \use:x { \__draw_backend_box_use:Nnnnn #1 { \fp_use:N \l__draw_matrix_a_fp } { \fp_use:N \l__draw_matrix_b_fp } { \fp_use:N \l__draw_matrix_c_fp } { \fp_use:N \l__draw_matrix_d_fp } } } \hbox_set:Nn \l__draw_tmp_box { \tex_kern:D \l__draw_xshift_dim \box_move_up:nn { \l__draw_yshift_dim } { \box_use_drop:N \l__draw_tmp_box } } \box_set_ht:Nn \l__draw_tmp_box { 0pt } \box_set_dp:Nn \l__draw_tmp_box { 0pt } \box_set_wd:Nn \l__draw_tmp_box { 0pt } \box_use_drop:N \l__draw_tmp_box \group_end: } \cs_new_protected:Npn \draw_coffin_use:Nnn #1#2#3 { \group_begin: \hbox_set:Nn \l__draw_tmp_box { \coffin_typeset:Nnnnn #1 {#2} {#3} { 0pt } { 0pt } } \__draw_box_use:Nnnnn \l__draw_tmp_box { \box_wd:N \l__draw_tmp_box - \coffin_wd:N #1 } { -\box_dp:N \l__draw_tmp_box } { \box_wd:N \l__draw_tmp_box } { \box_ht:N \l__draw_tmp_box } \group_end: } %% File: l3draw-layers.dtx \cs_new_protected:Npn \draw_layer_new:n #1 { \str_if_eq:nnTF {#1} { main } { \msg_error:nnn { draw } { main-reserved } } { \box_new:c { g__draw_layer_ #1 _box } \box_new:c { l__draw_layer_ #1 _box } } } \tl_new:N \l__draw_layer_tl \tl_set:Nn \l__draw_layer_tl { main } \bool_new:N \l__draw_layer_close_bool \clist_new:N \l_draw_layers_clist \clist_set:Nn \l_draw_layers_clist { main } \clist_new:N \g__draw_layers_clist \cs_new_protected:Npn \draw_layer_begin:n #1 { \group_begin: \box_if_exist:cTF { g__draw_layer_ #1 _box } { \str_if_eq:VnTF \l__draw_layer_tl {#1} { \bool_set_false:N \l__draw_layer_close_bool } { \bool_set_true:N \l__draw_layer_close_bool \tl_set:Nn \l__draw_layer_tl {#1} \box_gset_wd:cn { g__draw_layer_ #1 _box } { 0pt } \hbox_gset:cw { g__draw_layer_ #1 _box } \box_use_drop:c { g__draw_layer_ #1 _box } \group_begin: } \draw_linewidth:n { \l_draw_default_linewidth_dim } } { \str_if_eq:nnTF {#1} { main } { \msg_error:nnn { draw } { unknown-layer } {#1} } { \msg_error:nnn { draw } { main-layer } } } } \cs_new_protected:Npn \draw_layer_end: { \bool_if:NT \l__draw_layer_close_bool { \group_end: \hbox_gset_end: } \group_end: } \cs_new_protected:Npn \__draw_layers_insert: { \clist_map_inline:Nn \l_draw_layers_clist { \str_if_eq:nnTF {##1} { main } { \box_set_wd:Nn \l__draw_layer_main_box { 0pt } \box_use_drop:N \l__draw_layer_main_box } { \__draw_backend_scope_begin: \box_gset_wd:cn { g__draw_layer_ ##1 _box } { 0pt } \box_use_drop:c { g__draw_layer_ ##1 _box } \__draw_backend_scope_end: } } } \cs_new_protected:Npn \__draw_layers_save: { \clist_map_inline:Nn \l_draw_layers_clist { \str_if_eq:nnF {##1} { main } { \box_set_eq:cc { l__draw_layer_ ##1 _box } { g__draw_layer_ ##1 _box } } } } \cs_new_protected:Npn \__draw_layers_restore: { \clist_map_inline:Nn \l_draw_layers_clist { \str_if_eq:nnF {##1} { main } { \box_gset_eq:cc { g__draw_layer_ ##1 _box } { l__draw_layer_ ##1 _box } } } } \msg_new:nnnn { draw } { main-layer } { Material~cannot~be~added~to~'main'~layer. } { The~main~layer~may~only~be~accessed~at~the~top~level. } \msg_new:nnn { draw } { main-reserved } { The~'main'~layer~is~reserved. } \msg_new:nnnn { draw } { unknown-layer } { Layer~'#1'~has~not~been~created. } { You~have~tried~to~use~layer~'#1',~but~it~was~never~set~up. } %% File: l3draw-paths.dtx \tl_new:N \l__draw_path_tmp_tl \fp_new:N \l__draw_path_tmpa_fp \fp_new:N \l__draw_path_tmpb_fp \dim_new:N \g__draw_path_lastx_dim \dim_new:N \g__draw_path_lasty_dim \dim_new:N \g__draw_path_xmax_dim \dim_new:N \g__draw_path_xmin_dim \dim_new:N \g__draw_path_ymax_dim \dim_new:N \g__draw_path_ymin_dim \cs_new_protected:Npn \__draw_path_update_limits:nn #1#2 { \dim_gset:Nn \g__draw_path_xmax_dim { \dim_max:nn \g__draw_path_xmax_dim {#1} } \dim_gset:Nn \g__draw_path_xmin_dim { \dim_min:nn \g__draw_path_xmin_dim {#1} } \dim_gset:Nn \g__draw_path_ymax_dim { \dim_max:nn \g__draw_path_ymax_dim {#2} } \dim_gset:Nn \g__draw_path_ymin_dim { \dim_min:nn \g__draw_path_ymin_dim {#2} } \bool_if:NT \l_draw_bb_update_bool { \dim_gset:Nn \g__draw_xmax_dim { \dim_max:nn \g__draw_xmax_dim {#1} } \dim_gset:Nn \g__draw_xmin_dim { \dim_min:nn \g__draw_xmin_dim {#1} } \dim_gset:Nn \g__draw_ymax_dim { \dim_max:nn \g__draw_ymax_dim {#2} } \dim_gset:Nn \g__draw_ymin_dim { \dim_min:nn \g__draw_ymin_dim {#2} } } } \cs_new_protected:Npn \__draw_path_reset_limits: { \dim_gset:Nn \g__draw_path_xmax_dim { -\c_max_dim } \dim_gset:Nn \g__draw_path_xmin_dim { \c_max_dim } \dim_gset:Nn \g__draw_path_ymax_dim { -\c_max_dim } \dim_gset:Nn \g__draw_path_ymin_dim { \c_max_dim } } \cs_new_protected:Npn \__draw_path_update_last:nn #1#2 { \dim_gset:Nn \g__draw_path_lastx_dim {#1} \dim_gset:Nn \g__draw_path_lasty_dim {#2} } \dim_new:N \l__draw_corner_xarc_dim \dim_new:N \l__draw_corner_yarc_dim \bool_new:N \l__draw_corner_arc_bool \cs_new_protected:Npn \draw_path_corner_arc:nn #1#2 { \dim_set:Nn \l__draw_corner_xarc_dim {#1} \dim_set:Nn \l__draw_corner_yarc_dim {#2} \bool_lazy_and:nnTF { \dim_compare_p:nNn \l__draw_corner_xarc_dim = { 0pt } } { \dim_compare_p:nNn \l__draw_corner_yarc_dim = { 0pt } } { \bool_set_false:N \l__draw_corner_arc_bool } { \bool_set_true:N \l__draw_corner_arc_bool } } \cs_new_protected:Npn \__draw_path_mark_corner: { \bool_if:NT \l__draw_corner_arc_bool { \__draw_softpath_roundpoint:VV \l__draw_corner_xarc_dim \l__draw_corner_yarc_dim } } \cs_new_protected:Npn \draw_path_moveto:n #1 { \__draw_point_process:nn { \__draw_path_moveto:nn } { \draw_point_transform:n {#1} } } \cs_new_protected:Npn \__draw_path_moveto:nn #1#2 { \__draw_path_update_limits:nn {#1} {#2} \__draw_softpath_moveto:nn {#1} {#2} \__draw_path_update_last:nn {#1} {#2} } \cs_new_protected:Npn \draw_path_lineto:n #1 { \__draw_point_process:nn { \__draw_path_lineto:nn } { \draw_point_transform:n {#1} } } \cs_new_protected:Npn \__draw_path_lineto:nn #1#2 { \__draw_path_mark_corner: \__draw_path_update_limits:nn {#1} {#2} \__draw_softpath_lineto:nn {#1} {#2} \__draw_path_update_last:nn {#1} {#2} } \cs_new_protected:Npn \draw_path_curveto:nnn #1#2#3 { \__draw_point_process:nnnn { \__draw_path_mark_corner: \__draw_path_curveto:nnnnnn } { \draw_point_transform:n {#1} } { \draw_point_transform:n {#2} } { \draw_point_transform:n {#3} } } \cs_new_protected:Npn \__draw_path_curveto:nnnnnn #1#2#3#4#5#6 { \__draw_path_update_limits:nn {#1} {#2} \__draw_path_update_limits:nn {#3} {#4} \__draw_path_update_limits:nn {#5} {#6} \__draw_softpath_curveto:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} \__draw_path_update_last:nn {#5} {#6} } \cs_new_protected:Npn \draw_path_close: { \__draw_path_mark_corner: \__draw_softpath_closepath: } \cs_new_protected:Npn \draw_path_canvas_moveto:n #1 { \__draw_point_process:nn { \__draw_path_moveto:nn } {#1} } \cs_new_protected:Npn \draw_path_canvas_lineto:n #1 { \__draw_point_process:nn { \__draw_path_lineto:nn } {#1} } \cs_new_protected:Npn \draw_path_canvas_curveto:nnn #1#2#3 { \__draw_point_process:nnnn { \__draw_path_mark_corner: \__draw_path_curveto:nnnnnn } {#1} {#2} {#3} } \cs_new_protected:Npn \draw_path_curveto:nn #1#2 { \__draw_point_process:nnn { \__draw_path_curveto:nnnn } { \draw_point_transform:n {#1} } { \draw_point_transform:n {#2} } } \cs_new_protected:Npn \__draw_path_curveto:nnnn #1#2#3#4 { \fp_set:Nn \l__draw_path_tmpa_fp { \c__draw_path_curveto_b_fp * #1 } \fp_set:Nn \l__draw_path_tmpb_fp { \c__draw_path_curveto_b_fp * #2 } \use:x { \__draw_path_mark_corner: \__draw_path_curveto:nnnnnn { \fp_to_dim:n { \c__draw_path_curveto_a_fp * \g__draw_path_lastx_dim + \l__draw_path_tmpa_fp } } { \fp_to_dim:n { \c__draw_path_curveto_a_fp * \g__draw_path_lasty_dim + \l__draw_path_tmpb_fp } } { \fp_to_dim:n { \c__draw_path_curveto_a_fp * #3 + \l__draw_path_tmpa_fp } } { \fp_to_dim:n { \c__draw_path_curveto_a_fp * #4 + \l__draw_path_tmpb_fp } } {#3} {#4} } } \fp_const:Nn \c__draw_path_curveto_a_fp { 1 / 3 } \fp_const:Nn \c__draw_path_curveto_b_fp { 2 / 3 } \cs_new_protected:Npn \draw_path_arc:nnn #1#2#3 { \draw_path_arc:nnnn {#1} {#2} {#3} {#3} } \cs_new_protected:Npn \draw_path_arc:nnnn #1#2#3#4 { \use:x { \__draw_path_arc:nnnn { \fp_eval:n {#1} } { \fp_eval:n {#2} } { \fp_to_dim:n {#3} } { \fp_to_dim:n {#4} } } } \cs_new_protected:Npn \__draw_path_arc:nnnn #1#2#3#4 { \fp_compare:nNnTF {#1} > {#2} { \__draw_path_arc:nnNnn {#1} {#2} - {#3} {#4} } { \__draw_path_arc:nnNnn {#1} {#2} + {#3} {#4} } } \cs_new_protected:Npn \__draw_path_arc:nnNnn #1#2#3#4#5 { \fp_set:Nn \l__draw_path_arc_start_fp {#1} \fp_set:Nn \l__draw_path_arc_delta_fp { abs( #1 - #2 ) } \fp_while_do:nNnn { \l__draw_path_arc_delta_fp } > { 90 } { \fp_compare:nNnTF \l__draw_path_arc_delta_fp > { 115 } { \__draw_path_arc_auxi:ffnnNnn { \fp_to_decimal:N \l__draw_path_arc_start_fp } { \fp_eval:n { \l__draw_path_arc_start_fp #3 90 } } { 90 } {#2} #3 {#4} {#5} } { \__draw_path_arc_auxi:ffnnNnn { \fp_to_decimal:N \l__draw_path_arc_start_fp } { \fp_eval:n { \l__draw_path_arc_start_fp #3 60 } } { 60 } {#2} #3 {#4} {#5} } } \__draw_path_mark_corner: \__draw_path_arc_auxi:fnfnNnn { \fp_to_decimal:N \l__draw_path_arc_start_fp } {#2} { \fp_eval:n { abs( \l__draw_path_arc_start_fp - #2 ) } } {#2} #3 {#4} {#5} } \cs_new_protected:Npn \__draw_path_arc_auxi:nnnnNnn #1#2#3#4#5#6#7 { \use:x { \__draw_path_arc_auxii:nnnNnnnn {#1} {#2} {#4} #5 {#6} {#7} { \fp_to_dim:n { \cs_if_exist_use:cF { c__draw_path_arc_ #3 _fp } { 4/3 * tand( 0.25 * #3 ) } * #6 } } { \fp_to_dim:n { \cs_if_exist_use:cF { c__draw_path_arc_ #3 _fp } { 4/3 * tand( 0.25 * #3 ) } * #7 } } } } \cs_generate_variant:Nn \__draw_path_arc_auxi:nnnnNnn { fnf , ff } \cs_new_protected:Npn \__draw_path_arc_auxii:nnnNnnnn #1#2#3#4#5#6#7#8 { \tl_clear:N \l__draw_path_tmp_tl \__draw_point_process:nn { \__draw_path_arc_auxiii:nn } { \__draw_point_transform_noshift:n { \draw_point_polar:nnn {#7} {#8} { #1 #4 90 } } } \__draw_point_process:nnn { \__draw_path_arc_auxiv:nnnn } { \draw_point_transform:n { \draw_point_polar:nnn {#5} {#6} {#1} } } { \draw_point_transform:n { \draw_point_polar:nnn {#5} {#6} {#2} } } \__draw_point_process:nn { \__draw_path_arc_auxv:nn } { \__draw_point_transform_noshift:n { \draw_point_polar:nnn {#7} {#8} { #2 #4 -90 } } } \exp_after:wN \__draw_path_curveto:nnnnnn \l__draw_path_tmp_tl \fp_set:Nn \l__draw_path_arc_delta_fp { abs ( #2 - #3 ) } \fp_set:Nn \l__draw_path_arc_start_fp {#2} } \cs_new_protected:Npn \__draw_path_arc_auxiii:nn #1#2 { \__draw_path_arc_aux_add:nn { \g__draw_path_lastx_dim + #1 } { \g__draw_path_lasty_dim + #2 } } \cs_new_protected:Npn \__draw_path_arc_auxiv:nnnn #1#2#3#4 { \__draw_path_arc_aux_add:nn { \g__draw_path_lastx_dim - #1 + #3 } { \g__draw_path_lasty_dim - #2 + #4 } } \cs_new_protected:Npn \__draw_path_arc_auxv:nn #1#2 { \exp_after:wN \__draw_path_arc_auxvi:nn \l__draw_path_tmp_tl {#1} {#2} } \cs_new_protected:Npn \__draw_path_arc_auxvi:nn #1#2#3#4#5#6 { \tl_set:Nn \l__draw_path_tmp_tl { {#1} {#2} } \__draw_path_arc_aux_add:nn { #5 + #3 } { #6 + #4 } \tl_put_right:Nn \l__draw_path_tmp_tl { {#3} {#4} } } \cs_new_protected:Npn \__draw_path_arc_aux_add:nn #1#2 { \tl_put_right:Nx \l__draw_path_tmp_tl { { \fp_to_dim:n {#1} } { \fp_to_dim:n {#2} } } } \fp_new:N \l__draw_path_arc_delta_fp \fp_new:N \l__draw_path_arc_start_fp \fp_const:cn { c__draw_path_arc_90_fp } { 4/3 * (sqrt(2) - 1) } \fp_const:cn { c__draw_path_arc_60_fp } { 4/3 * tand(15) } \cs_new_protected:Npn \draw_path_arc_axes:nnnn #1#2#3#4 { \draw_transform_triangle:nnn { 0cm , 0cm } {#3} {#4} \draw_path_arc:nnn {#1} {#2} { 1pt } } \cs_new_protected:Npn \draw_path_ellipse:nnn #1#2#3 { \__draw_point_process:nnnn { \__draw_path_ellipse:nnnnnn } { \draw_point_transform:n {#1} } { \__draw_point_transform_noshift:n {#2} } { \__draw_point_transform_noshift:n {#3} } } \cs_new_protected:Npn \__draw_path_ellipse:nnnnnn #1#2#3#4#5#6 { \use:x { \__draw_path_moveto:nn { \fp_to_dim:n { #1 + #3 } } { \fp_to_dim:n { #2 + #4 } } \__draw_path_ellipse_arci:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} \__draw_path_ellipse_arcii:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} \__draw_path_ellipse_arciii:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} \__draw_path_ellipse_arciv:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} } \__draw_softpath_closepath: \__draw_path_moveto:nn {#1} {#2} } \cs_new:Npn \__draw_path_ellipse_arci:nnnnnn #1#2#3#4#5#6 { \__draw_path_curveto:nnnnnn { \fp_to_dim:n { #1 + #3 + #5 * \c__draw_path_ellipse_fp } } { \fp_to_dim:n { #2 + #4 + #6 * \c__draw_path_ellipse_fp } } { \fp_to_dim:n { #1 + #3 * \c__draw_path_ellipse_fp + #5 } } { \fp_to_dim:n { #2 + #4 * \c__draw_path_ellipse_fp + #6 } } { \fp_to_dim:n { #1 + #5 } } { \fp_to_dim:n { #2 + #6 } } } \cs_new:Npn \__draw_path_ellipse_arcii:nnnnnn #1#2#3#4#5#6 { \__draw_path_curveto:nnnnnn { \fp_to_dim:n { #1 - #3 * \c__draw_path_ellipse_fp + #5 } } { \fp_to_dim:n { #2 - #4 * \c__draw_path_ellipse_fp + #6 } } { \fp_to_dim:n { #1 - #3 + #5 * \c__draw_path_ellipse_fp } } { \fp_to_dim:n { #2 - #4 + #6 * \c__draw_path_ellipse_fp } } { \fp_to_dim:n { #1 - #3 } } { \fp_to_dim:n { #2 - #4 } } } \cs_new:Npn \__draw_path_ellipse_arciii:nnnnnn #1#2#3#4#5#6 { \__draw_path_curveto:nnnnnn { \fp_to_dim:n { #1 - #3 - #5 * \c__draw_path_ellipse_fp } } { \fp_to_dim:n { #2 - #4 - #6 * \c__draw_path_ellipse_fp } } { \fp_to_dim:n { #1 - #3 * \c__draw_path_ellipse_fp - #5 } } { \fp_to_dim:n { #2 - #4 * \c__draw_path_ellipse_fp - #6 } } { \fp_to_dim:n { #1 - #5 } } { \fp_to_dim:n { #2 - #6 } } } \cs_new:Npn \__draw_path_ellipse_arciv:nnnnnn #1#2#3#4#5#6 { \__draw_path_curveto:nnnnnn { \fp_to_dim:n { #1 + #3 * \c__draw_path_ellipse_fp - #5 } } { \fp_to_dim:n { #2 + #4 * \c__draw_path_ellipse_fp - #6 } } { \fp_to_dim:n { #1 + #3 - #5 * \c__draw_path_ellipse_fp } } { \fp_to_dim:n { #2 + #4 - #6 * \c__draw_path_ellipse_fp } } { \fp_to_dim:n { #1 + #3 } } { \fp_to_dim:n { #2 + #4 } } } \fp_const:Nn \c__draw_path_ellipse_fp { \fp_use:c { c__draw_path_arc_90_fp } } \cs_new_protected:Npn \draw_path_circle:nn #1#2 { \draw_path_ellipse:nnn {#1} { #2 , 0pt } { 0pt , #2 } } \cs_new_protected:Npn \draw_path_rectangle:nn #1#2 { \__draw_point_process:nnn { \bool_lazy_or:nnTF { \l__draw_corner_arc_bool } { \l__draw_matrix_active_bool } { \__draw_path_rectangle_rounded:nnnn } { \__draw_path_rectangle:nnnn } } { \draw_point_transform:n {#1} } {#2} } \cs_new_protected:Npn \__draw_path_rectangle:nnnn #1#2#3#4 { \__draw_path_update_limits:nn {#1} {#2} \__draw_path_update_limits:nn { #1 + #3 } { #2 + #4 } \__draw_softpath_rectangle:nnnn {#1} {#2} {#3} {#4} \__draw_path_update_last:nn {#1} {#2} } \cs_new_protected:Npn \__draw_path_rectangle_rounded:nnnn #1#2#3#4 { \draw_path_moveto:n { #1 + #3 , #2 + #4 } \draw_path_lineto:n { #1 , #2 + #4 } \draw_path_lineto:n { #1 , #2 } \draw_path_lineto:n { #1 + #3 , #2 } \draw_path_close: \draw_path_moveto:n { #1 , #2 } } \cs_new_protected:Npn \draw_path_rectangle_corners:nn #1#2 { \__draw_point_process:nnn { \__draw_path_rectangle_corners:nnnnn {#1} } {#1} {#2} } \cs_new_protected:Npn \__draw_path_rectangle_corners:nnnnn #1#2#3#4#5 { \draw_path_rectangle:nn {#1} { #4 - #2 , #5 - #3 } } \cs_new_protected:Npn \draw_path_grid:nnnn #1#2#3#4 { \__draw_point_process:nnn { \__draw_path_grid_auxi:ffnnnn { \dim_eval:n { \dim_abs:n {#1} } } { \dim_eval:n { \dim_abs:n {#2} } } } {#3} {#4} } \cs_new_protected:Npn \__draw_path_grid_auxi:nnnnnn #1#2#3#4#5#6 { \dim_compare:nNnTF {#3} > {#5} { \__draw_path_grid_auxii:nnnnnn {#1} {#2} {#5} {#4} {#3} {#6} } { \__draw_path_grid_auxii:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} } } \cs_generate_variant:Nn \__draw_path_grid_auxi:nnnnnn { ff } \cs_new_protected:Npn \__draw_path_grid_auxii:nnnnnn #1#2#3#4#5#6 { \dim_compare:nNnTF {#4} > {#6} { \__draw_path_grid_auxiii:nnnnnn {#1} {#2} {#3} {#6} {#5} {#4} } { \__draw_path_grid_auxiii:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6} } } \cs_new_protected:Npn \__draw_path_grid_auxiii:nnnnnn #1#2#3#4#5#6 { \__draw_path_grid_auxiv:ffnnnnnn { \fp_to_dim:n { #1 * trunc(#3/(#1)) } } { \fp_to_dim:n { #2 * trunc(#4/(#2)) } } {#1} {#2} {#3} {#4} {#5} {#6} } \cs_new_protected:Npn \__draw_path_grid_auxiv:nnnnnnnn #1#2#3#4#5#6#7#8 { \dim_step_inline:nnnn {#1} {#3} {#7} { \draw_path_moveto:n { ##1 , #6 } \draw_path_lineto:n { ##1 , #8 } } \dim_step_inline:nnnn {#2} {#4} {#8} { \draw_path_moveto:n { #5 , ##1 } \draw_path_lineto:n { #7 , ##1 } } } \cs_generate_variant:Nn \__draw_path_grid_auxiv:nnnnnnnn { ff } \bool_new:N \l__draw_path_use_clip_bool \bool_new:N \l__draw_path_use_fill_bool \bool_new:N \l__draw_path_use_stroke_bool \bool_new:N \l__draw_path_use_bb_bool \bool_new:N \l__draw_path_use_clear_bool \cs_new_protected:Npn \draw_path_use:n #1 { \tl_if_blank:nF {#1} { \__draw_path_use:n {#1} } } \cs_new_protected:Npn \draw_path_use_clear:n #1 { \bool_lazy_or:nnTF { \tl_if_blank_p:n {#1} } { \str_if_eq_p:nn {#1} { clear } } { \__draw_softpath_clear: \__draw_path_reset_limits: } { \__draw_path_use:n { #1 , clear } } } \cs_new_protected:Npn \__draw_path_use:n #1 { \bool_set_false:N \l__draw_path_use_clip_bool \bool_set_false:N \l__draw_path_use_fill_bool \bool_set_false:N \l__draw_path_use_stroke_bool \clist_map_inline:nn {#1} { \cs_if_exist:cTF { l__draw_path_use_ ##1 _ bool } { \bool_set_true:c { l__draw_path_use_ ##1 _ bool } } { \cs_if_exist_use:cF { __draw_path_use_action_ ##1 : } { \msg_error:nnn { draw } { invalid-path-action } {##1} } } } \__draw_softpath_round_corners: \bool_lazy_and:nnT { \l_draw_bb_update_bool } { \l__draw_path_use_stroke_bool } { \__draw_path_use_stroke_bb: } \__draw_softpath_use: \bool_if:NT \l__draw_path_use_clip_bool { \__draw_backend_clip: \bool_lazy_or:nnF { \l__draw_path_use_fill_bool } { \l__draw_path_use_stroke_bool } { \__draw_backend_discardpath: } } \bool_lazy_or:nnT { \l__draw_path_use_fill_bool } { \l__draw_path_use_stroke_bool } { \use:c { __draw_backend_ \bool_if:NT \l__draw_path_use_fill_bool { fill } \bool_if:NT \l__draw_path_use_stroke_bool { stroke } : } } \bool_if:NT \l__draw_path_use_clear_bool { \__draw_softpath_clear: } } \cs_new_protected:Npn \__draw_path_use_action_draw: { \bool_set_true:N \l__draw_path_use_stroke_bool } \cs_new_protected:Npn \__draw_path_use_action_fillstroke: { \bool_set_true:N \l__draw_path_use_fill_bool \bool_set_true:N \l__draw_path_use_stroke_bool } \cs_new_protected:Npn \__draw_path_use_stroke_bb: { \__draw_path_use_stroke_bb_aux:NnN x { max } + \__draw_path_use_stroke_bb_aux:NnN y { max } + \__draw_path_use_stroke_bb_aux:NnN x { min } - \__draw_path_use_stroke_bb_aux:NnN y { min } - } \cs_new_protected:Npn \__draw_path_use_stroke_bb_aux:NnN #1#2#3 { \dim_compare:nNnF { \dim_use:c { g__draw_ #1#2 _dim } } = { #3 -\c_max_dim } { \dim_gset:cn { g__draw_ #1#2 _dim } { \use:c { dim_ #2 :nn } { \dim_use:c { g__draw_ #1#2 _dim } } { \dim_use:c { g__draw_path_ #1#2 _dim } #3 0.5 \g__draw_linewidth_dim } } } } \dim_new:N \l__draw_path_lastx_dim \dim_new:N \l__draw_path_lasty_dim \dim_new:N \l__draw_path_xmax_dim \dim_new:N \l__draw_path_xmin_dim \dim_new:N \l__draw_path_ymax_dim \dim_new:N \l__draw_path_ymin_dim \dim_new:N \l__draw_softpath_lastx_dim \dim_new:N \l__draw_softpath_lasty_dim \bool_new:N \l__draw_softpath_corners_bool \cs_new_protected:Npn \draw_path_scope_begin: { \group_begin: \dim_set_eq:NN \l__draw_path_lastx_dim \g__draw_path_lastx_dim \dim_set_eq:NN \l__draw_path_lasty_dim \g__draw_path_lasty_dim \dim_set_eq:NN \l__draw_path_xmax_dim \g__draw_path_xmax_dim \dim_set_eq:NN \l__draw_path_xmin_dim \g__draw_path_xmin_dim \dim_set_eq:NN \l__draw_path_ymax_dim \g__draw_path_ymax_dim \dim_set_eq:NN \l__draw_path_ymin_dim \g__draw_path_ymin_dim \dim_set_eq:NN \l__draw_softpath_lastx_dim \g__draw_softpath_lastx_dim \dim_set_eq:NN \l__draw_softpath_lasty_dim \g__draw_softpath_lasty_dim \__draw_path_reset_limits: \tl_build_get:NN \g__draw_softpath_main_tl \l__draw_softpath_main_tl \bool_set_eq:NN \l__draw_softpath_corners_bool \g__draw_softpath_corners_bool \__draw_softpath_clear: } \cs_new_protected:Npn \draw_path_scope_end: { \__draw_softpath_clear: \bool_gset_eq:NN \g__draw_softpath_corners_bool \l__draw_softpath_corners_bool \__draw_softpath_add:o \l__draw_softpath_main_tl \dim_gset_eq:NN \g__draw_softpath_lastx_dim \l__draw_softpath_lastx_dim \dim_gset_eq:NN \g__draw_softpath_lasty_dim \l__draw_softpath_lasty_dim \dim_gset_eq:NN \g__draw_path_xmax_dim \l__draw_path_xmax_dim \dim_gset_eq:NN \g__draw_path_xmin_dim \l__draw_path_xmin_dim \dim_gset_eq:NN \g__draw_path_ymax_dim \l__draw_path_ymax_dim \dim_gset_eq:NN \g__draw_path_ymin_dim \l__draw_path_ymin_dim \dim_gset_eq:NN \g__draw_path_lastx_dim \l__draw_path_lastx_dim \dim_gset_eq:NN \g__draw_path_lasty_dim \l__draw_path_lasty_dim \group_end: } \msg_new:nnnn { draw } { invalid-path-action } { Invalid~action~'#1'~for~path. } { Paths~can~be~used~with~actions~'draw',~'clip',~'fill'~or~'stroke'. } %% File: l3draw-points.dtx \cs_new:Npn \__draw_point_process:nn #1#2 { \exp_args:Nf \__draw_point_process_auxi:nn { \__draw_point_to_dim:n {#2} } {#1} } \cs_new:Npn \__draw_point_process_auxi:nn #1#2 { \__draw_point_process_auxii:nw {#2} #1 \q_stop } \cs_new:Npn \__draw_point_process_auxii:nw #1 #2 , #3 \q_stop { #1 {#2} {#3} } \cs_new:Npn \__draw_point_process:nnn #1#2#3 { \exp_args:Nff \__draw_point_process_auxiii:nnn { \__draw_point_to_dim:n {#2} } { \__draw_point_to_dim:n {#3} } {#1} } \cs_new:Npn \__draw_point_process_auxiii:nnn #1#2#3 { \__draw_point_process_auxiv:nw {#3} #1 \q_mark #2 \q_stop } \cs_new:Npn \__draw_point_process_auxiv:nw #1 #2 , #3 \q_mark #4 , #5 \q_stop { #1 {#2} {#3} {#4} {#5} } \cs_new:Npn \__draw_point_process:nnnn #1#2#3#4 { \exp_args:Nfff \__draw_point_process_auxv:nnnn { \__draw_point_to_dim:n {#2} } { \__draw_point_to_dim:n {#3} } { \__draw_point_to_dim:n {#4} } {#1} } \cs_new:Npn \__draw_point_process_auxv:nnnn #1#2#3#4 { \__draw_point_process_auxvi:nw {#4} #1 \q_mark #2 \q_mark #3 \q_stop } \cs_new:Npn \__draw_point_process_auxvi:nw #1 #2 , #3 \q_mark #4 , #5 \q_mark #6 , #7 \q_stop { #1 {#2} {#3} {#4} {#5} {#6} {#7} } \cs_new:Npn \__draw_point_process:nnnnn #1#2#3#4#5 { \exp_args:Nffff \__draw_point_process_auxvii:nnnnn { \__draw_point_to_dim:n {#2} } { \__draw_point_to_dim:n {#3} } { \__draw_point_to_dim:n {#4} } { \__draw_point_to_dim:n {#5} } {#1} } \cs_new:Npn \__draw_point_process_auxvii:nnnnn #1#2#3#4#5 { \__draw_point_process_auxviii:nw {#5} #1 \q_mark #2 \q_mark #3 \q_mark #4 \q_stop } \cs_new:Npn \__draw_point_process_auxviii:nw #1 #2 , #3 \q_mark #4 , #5 \q_mark #6 , #7 \q_mark #8 , #9 \q_stop { #1 {#2} {#3} {#4} {#5} {#6} {#7} {#8} {#9} } \cs_new:Npn \__draw_point_to_dim:n #1 { \__draw_point_to_dim_aux:f { \fp_eval:n {#1} } } \cs_new:Npn \__draw_point_to_dim_aux:n #1 { \__draw_point_to_dim_aux:w #1 } \cs_generate_variant:Nn \__draw_point_to_dim_aux:n { f } \cs_new:Npn \__draw_point_to_dim_aux:w ( #1 , ~ #2 ) { #1pt , #2pt } \cs_new:Npn \draw_point_polar:nn #1#2 { \draw_point_polar:nnn {#1} {#1} {#2} } \cs_new:Npn \draw_point_polar:nnn #1#2#3 { \__draw_draw_polar:fnn { \fp_eval:n {#3} } {#1} {#2} } \cs_new:Npn \__draw_draw_polar:nnn #1#2#3 { \__draw_point_to_dim:n { cosd(#1) * (#2) , sind(#1) * (#3) } } \cs_generate_variant:Nn \__draw_draw_polar:nnn { f } \cs_new:Npn \draw_point_unit_vector:n #1 { \__draw_point_process:nn { \__draw_point_unit_vector:nn } {#1} } \cs_new:Npn \__draw_point_unit_vector:nn #1#2 { \exp_args:Nf \__draw_point_unit_vector:nnn { \fp_eval:n { (sqrt(#1 * #1 + #2 * #2)) } } {#1} {#2} } \cs_new:Npn \__draw_point_unit_vector:nnn #1#2#3 { \fp_compare:nNnTF {#1} = \c_zero_fp { 0pt, 1pt } { \__draw_point_to_dim:n { ( #2 , #3 ) / #1 } } } \cs_new:Npn \draw_point_intersect_lines:nnnn #1#2#3#4 { \__draw_point_process:nnnnn { \__draw_point_intersect_lines:nnnnnnnn } {#1} {#2} {#3} {#4} } \cs_new:Npn \__draw_point_intersect_lines:nnnnnnnn #1#2#3#4#5#6#7#8 { \__draw_point_intersect_lines_aux:ffffff { \fp_eval:n { #1 * #4 - #2 * #3 } } { \fp_eval:n { #5 * #8 - #6 * #7 } } { \fp_eval:n { #1 - #3 } } { \fp_eval:n { #5 - #7 } } { \fp_eval:n { #2 - #4 } } { \fp_eval:n { #6 - #8 } } } \cs_new:Npn \__draw_point_intersect_lines_aux:nnnnnn #1#2#3#4#5#6 { \__draw_point_to_dim:n { ( #2 * #3 - #1 * #4 , #2 * #5 - #1 * #6 ) / ( #4 * #5 - #6 * #3 ) } } \cs_generate_variant:Nn \__draw_point_intersect_lines_aux:nnnnnn { ffffff } \cs_new:Npn \draw_point_intersect_circles:nnnnn #1#2#3#4#5 { \__draw_point_process:nnn { \__draw_point_intersect_circles_auxi:nnnnnnn {#2} {#4} {#5} } {#1} {#3} } \cs_new:Npn \__draw_point_intersect_circles_auxi:nnnnnnn #1#2#3#4#5#6#7 { \__draw_point_intersect_circles_auxii:ffnnnnn { \fp_eval:n {#1} } { \fp_eval:n {#2} } {#4} {#5} {#6} {#7} {#3} } \cs_new:Npn \__draw_point_intersect_circles_auxii:nnnnnnn #1#2#3#4#5#6#7 { \__draw_point_intersect_circles_auxiii:ffnnnnn { \fp_eval:n { #5 - #3 } } { \fp_eval:n { #6 - #4 } } {#1} {#2} {#3} {#4} {#7} } \cs_generate_variant:Nn \__draw_point_intersect_circles_auxii:nnnnnnn { ff } \cs_new:Npn \__draw_point_intersect_circles_auxiii:nnnnnnn #1#2#3#4#5#6#7 { \__draw_point_intersect_circles_auxiv:fnnnnnnn { \fp_eval:n { sqrt( #1 * #1 + #2 * #2 ) } } {#1} {#2} {#3} {#4} {#5} {#6} {#7} } \cs_generate_variant:Nn \__draw_point_intersect_circles_auxiii:nnnnnnn { ff } \cs_new:Npn \__draw_point_intersect_circles_auxiv:nnnnnnnn #1#2#3#4#5#6#7#8 { \__draw_point_intersect_circles_auxv:ffnnnnnnn { \fp_eval:n { 1 / #1 } } { \fp_eval:n { #4 * #4 } } {#1} {#2} {#3} {#5} {#6} {#7} {#8} } \cs_generate_variant:Nn \__draw_point_intersect_circles_auxiv:nnnnnnnn { f } \cs_new:Npn \__draw_point_intersect_circles_auxv:nnnnnnnnn #1#2#3#4#5#6#7#8#9 { \__draw_point_intersect_circles_auxvi:fnnnnnnn { \fp_eval:n { 0.5 * #1 * ( #2 + #3 * #3 - #6 * #6 ) } } {#1} {#2} {#4} {#5} {#7} {#8} {#9} } \cs_generate_variant:Nn \__draw_point_intersect_circles_auxv:nnnnnnnnn { ff } \cs_new:Npn \__draw_point_intersect_circles_auxvi:nnnnnnnn #1#2#3#4#5#6#7#8 { \__draw_point_intersect_circles_auxvii:fffnnnn { \fp_eval:n { #1 * #2 } } { \int_if_odd:nTF {#8} { 1 } { -1 } } { \fp_eval:n { sqrt ( #3 - #1 * #1 ) * #2 } } {#4} {#5} {#6} {#7} } \cs_generate_variant:Nn \__draw_point_intersect_circles_auxvi:nnnnnnnn { f } \cs_new:Npn \__draw_point_intersect_circles_auxvii:nnnnnnn #1#2#3#4#5#6#7 { \__draw_point_to_dim:n { #6 + #4 * #1 + #2 * #3 * #5 , #7 + #5 * #1 + -1 * #2 * #3 * #4 } } \cs_generate_variant:Nn \__draw_point_intersect_circles_auxvii:nnnnnnn { fff } \cs_new:Npn \draw_point_interpolate_line:nnn #1#2#3 { \__draw_point_process:nnn { \__draw_point_interpolate_line_aux:fnnnn { \fp_eval:n {#1} } } {#2} {#3} } \cs_new:Npn \__draw_point_interpolate_line_aux:nnnnn #1#2#3#4#5 { \__draw_point_interpolate_line_aux:fnnnnn { \fp_eval:n { 1 - #1 } } {#1} {#2} {#3} {#4} {#5} } \cs_generate_variant:Nn \__draw_point_interpolate_line_aux:nnnnn { f } \cs_new:Npn \__draw_point_interpolate_line_aux:nnnnnn #1#2#3#4#5#6 { \__draw_point_to_dim:n { #2 * #3 + #1 * #5 , #2 * #4 + #1 * #6 } } \cs_generate_variant:Nn \__draw_point_interpolate_line_aux:nnnnnn { f } \cs_new:Npn \draw_point_interpolate_distance:nnn #1#2#3 { \__draw_point_process:nn { \__draw_point_interpolate_distance:nnnn {#1} {#3} } {#2} } \cs_new:Npn \__draw_point_interpolate_distance:nnnn #1#2#3#4 { \__draw_point_process:nn { \__draw_point_interpolate_distance:fnnnn { \fp_eval:n {#1} } {#3} {#4} } { \draw_point_unit_vector:n { ( #2 ) - ( #3 , #4 ) } } } \cs_new:Npn \__draw_point_interpolate_distance:nnnnn #1#2#3#4#5 { \__draw_point_to_dim:n { #2 + #1 * #4 , #3 + #1 * #5 } } \cs_generate_variant:Nn \__draw_point_interpolate_distance:nnnnn { f } \cs_new:Npn \draw_point_interpolate_arcaxes:nnnnnn #1#2#3#4#5#6 { \__draw_point_process:nnnn { \__draw_point_interpolate_arcaxes_auxi:nnnnnnnnn {#1} {#5} {#6} } {#2} {#3} {#4} } \cs_new:Npn \__draw_point_interpolate_arcaxes_auxi:nnnnnnnnn #1#2#3#4#5#6#7#8#9 { \__draw_point_interpolate_arcaxes_auxii:fnnnnnnnn { \fp_eval:n {#1} } {#2} {#3} {#4} {#5} {#6} {#7} {#8} {#9} } \cs_new:Npn \__draw_point_interpolate_arcaxes_auxii:nnnnnnnnn #1#2#3#4#5#6#7#8#9 { \__draw_point_interpolate_arcaxes_auxiii:fnnnnnn { \fp_eval:n { #1 * (#3) + ( 1 - #1 ) * (#2) } } {#4} {#5} {#6} {#7} {#8} {#9} } \cs_generate_variant:Nn \__draw_point_interpolate_arcaxes_auxii:nnnnnnnnn { f } \cs_new:Npn \__draw_point_interpolate_arcaxes_auxiii:nnnnnnn #1#2#3#4#5#6#7 { \__draw_point_interpolate_arcaxes_auxiv:ffnnnnnn { \fp_eval:n { cosd (#1) } } { \fp_eval:n { sind (#1) } } {#2} {#3} {#4} {#5} {#6} {#7} } \cs_generate_variant:Nn \__draw_point_interpolate_arcaxes_auxiii:nnnnnnn { f } \cs_new:Npn \__draw_point_interpolate_arcaxes_auxiv:nnnnnnnn #1#2#3#4#5#6#7#8 { \__draw_point_to_dim:n { #3 + #1 * #5 + #2 * #7 , #4 + #1 * #6 + #2 * #8 } } \cs_generate_variant:Nn \__draw_point_interpolate_arcaxes_auxiv:nnnnnnnn { ff } \cs_new:Npn \draw_point_interpolate_curve:nnnnnn #1#2#3#4#5 { \__draw_point_process:nnnnn { \__draw_point_interpolate_curve_auxi:nnnnnnnnn {#1} } {#2} {#3} {#4} {#5} } \cs_new:Npn \__draw_point_interpolate_curve_auxi:nnnnnnnnn #1#2#3#4#5#6#7#8#9 { \__draw_point_interpolate_curve_auxii:fnnnnnnnn { \fp_eval:n {#1} } {#2} {#3} {#4} {#5} {#6} {#7} {#8} {#9} } \cs_new:Npn \__draw_point_interpolate_curve_auxii:nnnnnnnnn #1#2#3#4#5#6#7#8#9 { \__draw_point_interpolate_curve_auxiii:fnnnnn { \fp_eval:n { 1 - #1 } } {#1} { {#2} {#3} } { {#4} {#5} } { {#6} {#7} } { {#8} {#9} } } \cs_generate_variant:Nn \__draw_point_interpolate_curve_auxii:nnnnnnnnn { f } \cs_new:Npn \__draw_point_interpolate_curve_auxiii:nnnnnn #1#2#3#4#5#6 { \__draw_point_interpolate_curve_auxiv:nnnnnn {#1} {#2} #3 #4 \__draw_point_interpolate_curve_auxiv:nnnnnn {#1} {#2} #4 #5 \__draw_point_interpolate_curve_auxiv:nnnnnn {#1} {#2} #5 #6 \prg_do_nothing: \__draw_point_interpolate_curve_auxvi:n { {#1} {#2} } } \cs_generate_variant:Nn \__draw_point_interpolate_curve_auxiii:nnnnnn { f } \cs_new:Npn \__draw_point_interpolate_curve_auxiv:nnnnnn #1#2#3#4#5#6 { \__draw_point_interpolate_curve_auxv:ffw { \fp_eval:n { #1 * #3 + #2 * #5 } } { \fp_eval:n { #1 * #4 + #2 * #6 } } } \cs_new:Npn \__draw_point_interpolate_curve_auxv:nnw #1#2#3 \prg_do_nothing: #4#5 { #3 \prg_do_nothing: #4 { #5 {#1} {#2} } } \cs_generate_variant:Nn \__draw_point_interpolate_curve_auxv:nnw { ff } \cs_new:Npn \__draw_point_interpolate_curve_auxvi:n #1 { \__draw_point_interpolate_curve_auxvii:nnnnnnnn #1 } \cs_new:Npn \__draw_point_interpolate_curve_auxvii:nnnnnnnn #1#2#3#4#5#6#7#8 { \__draw_point_interpolate_curve_auxviii:ffffnn { \fp_eval:n { #1 * #5 + #2 * #3 } } { \fp_eval:n { #1 * #6 + #2 * #4 } } { \fp_eval:n { #1 * #7 + #2 * #5 } } { \fp_eval:n { #1 * #8 + #2 * #6 } } {#1} {#2} } \cs_new:Npn \__draw_point_interpolate_curve_auxviii:nnnnnn #1#2#3#4#5#6 { \__draw_point_to_dim:n { #5 * #3 + #6 * #1 , #5 * #4 + #6 * #2 } } \cs_generate_variant:Nn \__draw_point_interpolate_curve_auxviii:nnnnnn { ffff } \dim_new:N \l__draw_xvec_x_dim \dim_new:N \l__draw_xvec_y_dim \dim_new:N \l__draw_yvec_x_dim \dim_new:N \l__draw_yvec_y_dim \dim_new:N \l__draw_zvec_x_dim \dim_new:N \l__draw_zvec_y_dim \cs_new_protected:Npn \draw_xvec:n #1 { \__draw_vec:nn { x } {#1} } \cs_new_protected:Npn \draw_yvec:n #1 { \__draw_vec:nn { y } {#1} } \cs_new_protected:Npn \draw_zvec:n #1 { \__draw_vec:nn { z } {#1} } \cs_new_protected:Npn \__draw_vec:nn #1#2 { \__draw_point_process:nn { \__draw_vec:nnn {#1} } {#2} } \cs_new_protected:Npn \__draw_vec:nnn #1#2#3 { \dim_set:cn { l__draw_ #1 vec_x_dim } {#2} \dim_set:cn { l__draw_ #1 vec_y_dim } {#3} } \draw_xvec:n { 1cm , 0cm } \draw_yvec:n { 0cm , 1cm } \draw_zvec:n { -0.385cm , -0.385cm } \cs_new:Npn \draw_point_vec:nn #1#2 { \__draw_point_vec:ff { \fp_eval:n {#1} } { \fp_eval:n {#2} } } \cs_new:Npn \__draw_point_vec:nn #1#2 { \__draw_point_to_dim:n { #1 * \l__draw_xvec_x_dim + #2 * \l__draw_yvec_x_dim , #1 * \l__draw_xvec_y_dim + #2 * \l__draw_yvec_y_dim } } \cs_generate_variant:Nn \__draw_point_vec:nn { ff } \cs_new:Npn \draw_point_vec:nnn #1#2#3 { \__draw_point_vec:fff { \fp_eval:n {#1} } { \fp_eval:n {#2} } { \fp_eval:n {#3} } } \cs_new:Npn \__draw_point_vec:nnn #1#2#3 { \__draw_point_to_dim:n { #1 * \l__draw_xvec_x_dim + #2 * \l__draw_yvec_x_dim + #3 * \l__draw_zvec_x_dim , #1 * \l__draw_xvec_y_dim + #2 * \l__draw_yvec_y_dim + #3 * \l__draw_zvec_y_dim } } \cs_generate_variant:Nn \__draw_point_vec:nnn { fff } \cs_new:Npn \draw_point_vec_polar:nn #1#2 { \draw_point_vec_polar:nnn {#1} {#1} {#2} } \cs_new:Npn \draw_point_vec_polar:nnn #1#2#3 { \__draw_draw_vec_polar:fnn { \fp_eval:n {#3} } {#1} {#2} } \cs_new:Npn \__draw_draw_vec_polar:nnn #1#2#3 { \__draw_point_to_dim:n { cosd(#1) * (#2) * \l__draw_xvec_x_dim , sind(#1) * (#3) * \l__draw_yvec_y_dim } } \cs_generate_variant:Nn \__draw_draw_vec_polar:nnn { f } \cs_new:Npn \draw_point_transform:n #1 { \__draw_point_process:nn { \__draw_point_transform:nn } {#1} } \cs_new:Npn \__draw_point_transform:nn #1#2 { \bool_if:NTF \l__draw_matrix_active_bool { \__draw_point_to_dim:n { ( \l__draw_matrix_a_fp * #1 + \l__draw_matrix_c_fp * #2 + \l__draw_xshift_dim ) , ( \l__draw_matrix_b_fp * #1 + \l__draw_matrix_d_fp * #2 + \l__draw_yshift_dim ) } } { \__draw_point_to_dim:n { (#1, #2) + ( \l__draw_xshift_dim , \l__draw_yshift_dim ) } } } \cs_new:Npn \__draw_point_transform_noshift:n #1 { \__draw_point_process:nn { \__draw_point_transform_noshift:nn } {#1} } \cs_new:Npn \__draw_point_transform_noshift:nn #1#2 { \bool_if:NTF \l__draw_matrix_active_bool { \__draw_point_to_dim:n { ( \l__draw_matrix_a_fp * #1 + \l__draw_matrix_c_fp * #2 ) , ( \l__draw_matrix_b_fp * #1 + \l__draw_matrix_d_fp * #2 ) } } { \__draw_point_to_dim:n { (#1, #2) } } } %% File: l3draw-scopes.dtx \dim_new:N \g__draw_xmax_dim \dim_new:N \g__draw_xmin_dim \dim_new:N \g__draw_ymax_dim \dim_new:N \g__draw_ymin_dim \bool_new:N \l_draw_bb_update_bool \box_new:N \l__draw_main_box \box_new:N \l__draw_layer_main_box \int_new:N \g__draw_id_int \cs_new_protected:Npn \__draw_reset_bb: { \dim_gset:Nn \g__draw_xmax_dim { -\c_max_dim } \dim_gset:Nn \g__draw_xmin_dim { \c_max_dim } \dim_gset:Nn \g__draw_ymax_dim { -\c_max_dim } \dim_gset:Nn \g__draw_ymin_dim { \c_max_dim } } \cs_new_protected:Npn \draw_begin: { \group_begin: \int_gincr:N \g__draw_id_int \hbox_set:Nw \l__draw_main_box \__draw_backend_begin: \__draw_reset_bb: \__draw_path_reset_limits: \bool_set_true:N \l_draw_bb_update_bool \draw_transform_matrix_reset: \draw_transform_shift_reset: \__draw_softpath_clear: \draw_linewidth:n { \l_draw_default_linewidth_dim } \draw_color:n { . } \draw_nonzero_rule: \draw_cap_butt: \draw_join_miter: \draw_miterlimit:n { 10 } \draw_dash_pattern:nn { } { 0cm } \hbox_set:Nw \l__draw_layer_main_box } \cs_new_protected:Npn \draw_end: { \exp_args:NNNV \hbox_set_end: \clist_set:Nn \l_draw_layers_clist \l_draw_layers_clist \__draw_layers_insert: \__draw_backend_end: \hbox_set_end: \dim_compare:nNnT \g__draw_xmin_dim = \c_max_dim { \dim_gzero:N \g__draw_xmax_dim \dim_gzero:N \g__draw_xmin_dim \dim_gzero:N \g__draw_ymax_dim \dim_gzero:N \g__draw_ymin_dim } \hbox_set:Nn \l__draw_main_box { \skip_horizontal:n { -\g__draw_xmin_dim } \box_move_down:nn { \g__draw_ymin_dim } { \box_use_drop:N \l__draw_main_box } } \box_set_ht:Nn \l__draw_main_box { \g__draw_ymax_dim - \g__draw_ymin_dim } \box_set_dp:Nn \l__draw_main_box { 0pt } \box_set_wd:Nn \l__draw_main_box { \g__draw_xmax_dim - \g__draw_xmin_dim } \mode_leave_vertical: \box_use_drop:N \l__draw_main_box \group_end: } \dim_new:N \l__draw_linewidth_dim \tl_new:N \l__draw_fill_color_tl \tl_new:N \l__draw_stroke_color_tl \cs_new_protected:Npn \draw_scope_begin: { \__draw_backend_scope_begin: \group_begin: \dim_set_eq:NN \l__draw_linewidth_dim \g__draw_linewidth_dim \draw_path_scope_begin: } \cs_new_protected:Npn \draw_scope_end: { \draw_path_scope_end: \dim_gset_eq:NN \g__draw_linewidth_dim \l__draw_linewidth_dim \group_end: \__draw_backend_scope_end: } \dim_new:N \l__draw_xmax_dim \dim_new:N \l__draw_xmin_dim \dim_new:N \l__draw_ymax_dim \dim_new:N \l__draw_ymin_dim \cs_new_protected:Npn \__draw_scope_bb_begin: { \group_begin: \dim_set_eq:NN \l__draw_xmax_dim \g__draw_xmax_dim \dim_set_eq:NN \l__draw_xmin_dim \g__draw_xmin_dim \dim_set_eq:NN \l__draw_ymax_dim \g__draw_ymax_dim \dim_set_eq:NN \l__draw_ymin_dim \g__draw_ymin_dim \__draw_reset_bb: } \cs_new_protected:Npn \__draw_scope_bb_end: { \dim_gset_eq:NN \g__draw_xmax_dim \l__draw_xmax_dim \dim_gset_eq:NN \g__draw_xmin_dim \l__draw_xmin_dim \dim_gset_eq:NN \g__draw_ymax_dim \l__draw_ymax_dim \dim_gset_eq:NN \g__draw_ymin_dim \l__draw_ymin_dim \group_end: } \cs_new_protected:Npn \draw_suspend_begin: { \__draw_scope_bb_begin: \draw_path_scope_begin: \draw_transform_matrix_reset: \draw_transform_shift_reset: \__draw_layers_save: } \cs_new_protected:Npn \draw_suspend_end: { \__draw_layers_restore: \draw_path_scope_end: \__draw_scope_bb_end: } %% File: l3draw-softpath.dtx \tl_new:N \g__draw_softpath_main_tl \tl_new:N \l__draw_softpath_internal_tl \bool_new:N \g__draw_softpath_corners_bool \cs_new_protected:Npn \__draw_softpath_add:n { \tl_build_gput_right:Nn \g__draw_softpath_main_tl } \cs_generate_variant:Nn \__draw_softpath_add:n { o, x } \cs_new_protected:Npn \__draw_softpath_use: { \tl_build_get:NN \g__draw_softpath_main_tl \l__draw_softpath_internal_tl \l__draw_softpath_internal_tl } \cs_new_protected:Npn \__draw_softpath_clear: { \tl_build_gclear:N \g__draw_softpath_main_tl \bool_gset_false:N \g__draw_softpath_corners_bool } \dim_new:N \g__draw_softpath_lastx_dim \dim_new:N \g__draw_softpath_lasty_dim \bool_new:N \g__draw_softpath_move_bool \bool_gset_true:N \g__draw_softpath_move_bool \cs_new_protected:Npn \__draw_softpath_closepath: { \__draw_softpath_add:x { \__draw_softpath_close_op:nn { \dim_use:N \g__draw_softpath_lastx_dim } { \dim_use:N \g__draw_softpath_lasty_dim } } } \cs_new_protected:Npn \__draw_softpath_curveto:nnnnnn #1#2#3#4#5#6 { \__draw_softpath_add:n { \__draw_softpath_curveto_opi:nn {#1} {#2} \__draw_softpath_curveto_opii:nn {#3} {#4} \__draw_softpath_curveto_opiii:nn {#5} {#6} } } \cs_new_protected:Npn \__draw_softpath_lineto:nn #1#2 { \__draw_softpath_add:n { \__draw_softpath_lineto_op:nn {#1} {#2} } } \cs_new_protected:Npn \__draw_softpath_moveto:nn #1#2 { \__draw_softpath_add:n { \__draw_softpath_moveto_op:nn {#1} {#2} } \bool_if:NT \g__draw_softpath_move_bool { \dim_gset:Nn \g__draw_softpath_lastx_dim {#1} \dim_gset:Nn \g__draw_softpath_lasty_dim {#2} } } \cs_new_protected:Npn \__draw_softpath_rectangle:nnnn #1#2#3#4 { \__draw_softpath_add:n { \__draw_softpath_rectangle_opi:nn {#1} {#2} \__draw_softpath_rectangle_opii:nn {#3} {#4} } } \cs_new_protected:Npn \__draw_softpath_roundpoint:nn #1#2 { \__draw_softpath_add:n { \__draw_softpath_roundpoint_op:nn {#1} {#2} } \bool_gset_true:N \g__draw_softpath_corners_bool } \cs_generate_variant:Nn \__draw_softpath_roundpoint:nn { VV } \cs_new_protected:Npn \__draw_softpath_close_op:nn #1#2 { \__draw_backend_closepath: } \cs_new_protected:Npn \__draw_softpath_curveto_opi:nn #1#2 { \__draw_softpath_curveto_opi:nnNnnNnn {#1} {#2} } \cs_new_protected:Npn \__draw_softpath_curveto_opi:nnNnnNnn #1#2#3#4#5#6#7#8 { \__draw_backend_curveto:nnnnnn {#1} {#2} {#4} {#5} {#7} {#8} } \cs_new_protected:Npn \__draw_softpath_curveto_opii:nn #1#2 { \__draw_softpath_curveto_opii:nn } \cs_new_protected:Npn \__draw_softpath_curveto_opiii:nn #1#2 { \__draw_softpath_curveto_opiii:nn } \cs_new_protected:Npn \__draw_softpath_lineto_op:nn #1#2 { \__draw_backend_lineto:nn {#1} {#2} } \cs_new_protected:Npn \__draw_softpath_moveto_op:nn #1#2 { \__draw_backend_moveto:nn {#1} {#2} } \cs_new_protected:Npn \__draw_softpath_roundpoint_op:nn #1#2 { } \cs_new_protected:Npn \__draw_softpath_rectangle_opi:nn #1#2 { \__draw_softpath_rectangle_opi:nnNnn {#1} {#2} } \cs_new_protected:Npn \__draw_softpath_rectangle_opi:nnNnn #1#2#3#4#5 { \__draw_backend_rectangle:nnnn {#1} {#2} {#4} {#5} } \cs_new_protected:Npn \__draw_softpath_rectangle_opii:nn #1#2 { } \tl_new:N \l__draw_softpath_main_tl \tl_new:N \l__draw_softpath_part_tl \tl_new:N \l__draw_softpath_curve_end_tl \fp_new:N \l__draw_softpath_lastx_fp \fp_new:N \l__draw_softpath_lasty_fp \dim_new:N \l__draw_softpath_corneri_dim \dim_new:N \l__draw_softpath_cornerii_dim \tl_new:N \l__draw_softpath_first_tl \tl_new:N \l__draw_softpath_move_tl \fp_const:Nn \c__draw_softpath_arc_fp { 4/3 * (sqrt(2) - 1) } \cs_new_protected:Npn \__draw_softpath_round_corners: { \bool_if:NT \g__draw_softpath_corners_bool { \group_begin: \tl_clear:N \l__draw_softpath_main_tl \tl_clear:N \l__draw_softpath_part_tl \fp_zero:N \l__draw_softpath_lastx_fp \fp_zero:N \l__draw_softpath_lasty_fp \tl_clear:N \l__draw_softpath_first_tl \tl_clear:N \l__draw_softpath_move_tl \tl_build_get:NN \g__draw_softpath_main_tl \l__draw_softpath_internal_tl \exp_after:wN \__draw_softpath_round_loop:Nnn \l__draw_softpath_internal_tl \q_recursion_tail ? ? \q_recursion_stop \group_end: } \bool_gset_false:N \g__draw_softpath_corners_bool } \cs_new_protected:Npn \__draw_softpath_round_loop:Nnn #1#2#3 { \quark_if_recursion_tail_stop_do:Nn #1 { \__draw_softpath_round_end: } \token_if_eq_meaning:NNTF #1 \__draw_softpath_roundpoint_op:nn { \__draw_softpath_round_action:nn {#2} {#3} } { \tl_if_empty:NT \l__draw_softpath_first_tl { \tl_set:Nn \l__draw_softpath_first_tl { {#2} {#3} } } \fp_set:Nn \l__draw_softpath_lastx_fp {#2} \fp_set:Nn \l__draw_softpath_lasty_fp {#3} \token_if_eq_meaning:NNTF #1 \__draw_softpath_moveto_op:nn { \tl_put_right:No \l__draw_softpath_main_tl \l__draw_softpath_move_tl \tl_put_right:No \l__draw_softpath_main_tl \l__draw_softpath_part_tl \tl_set:Nn \l__draw_softpath_move_tl { #1 {#2} {#3} } \tl_clear:N \l__draw_softpath_first_tl \tl_clear:N \l__draw_softpath_part_tl } { \tl_put_right:Nn \l__draw_softpath_part_tl { #1 {#2} {#3} } } \__draw_softpath_round_loop:Nnn } } \cs_new_protected:Npn \__draw_softpath_round_action:nn #1#2 { \dim_set:Nn \l__draw_softpath_corneri_dim {#1} \dim_set:Nn \l__draw_softpath_cornerii_dim {#2} \bool_lazy_and:nnTF { \dim_compare_p:nNn \l__draw_softpath_corneri_dim = { 0pt } } { \dim_compare_p:nNn \l__draw_softpath_cornerii_dim = { 0pt } } { \__draw_softpath_round_loop:Nnn } { \__draw_softpath_round_action:Nnn } } \cs_new_protected:Npn \__draw_softpath_round_action:Nnn #1#2#3 { \tl_if_empty:NT \l__draw_softpath_first_tl { \tl_set:Nn \l__draw_softpath_first_tl { {#2} {#3} } } \token_if_eq_meaning:NNTF #1 \__draw_softpath_curveto_opi:nn { \__draw_softpath_round_action_curveto:NnnNnn } { \token_if_eq_meaning:NNTF #1 \__draw_softpath_close_op:nn { \__draw_softpath_round_action_close: } { \token_if_eq_meaning:NNTF #1 \__draw_softpath_lineto_op:nn { \__draw_softpath_round_lookahead:NnnNnn } { \__draw_softpath_round_loop:Nnn } } } #1 {#2} {#3} } \cs_new_protected:Npn \__draw_softpath_round_action_curveto:NnnNnn #1#2#3#4#5#6 { \tl_put_right:Nn \l__draw_softpath_part_tl { #1 {#2} {#3} #4 {#5} {#6} } \fp_set:Nn \l__draw_softpath_lastx_fp {#5} \fp_set:Nn \l__draw_softpath_lasty_fp {#6} \__draw_softpath_round_lookahead:NnnNnn } \cs_new_protected:Npn \__draw_softpath_round_action_close: { \bool_lazy_and:nnTF { ! \tl_if_empty_p:N \l__draw_softpath_first_tl } { ! \tl_if_empty_p:N \l__draw_softpath_move_tl } { \exp_after:wN \__draw_softpath_round_close:nn \l__draw_softpath_first_tl } { \__draw_softpath_round_loop:Nnn } } \cs_new_protected:Npn \__draw_softpath_round_lookahead:NnnNnn #1#2#3#4#5#6 { \bool_lazy_any:nTF { { \token_if_eq_meaning_p:NN #4 \__draw_softpath_lineto_op:nn } { \token_if_eq_meaning_p:NN #4 \__draw_softpath_curveto_opi:nn } { \token_if_eq_meaning_p:NN #4 \__draw_softpath_close_op:nn } } { \__draw_softpath_round_calc:NnnNnn \__draw_softpath_round_loop:Nnn {#5} {#6} } { \token_if_eq_meaning:NNTF #4 \__draw_softpath_roundpoint_op:nn { \__draw_softpath_round_roundpoint:NnnNnnNnn } { \__draw_softpath_round_loop:Nnn } } #1 {#2} {#3} #4 {#5} {#6} } \cs_new_protected:Npn \__draw_softpath_round_roundpoint:NnnNnnNnn #1#2#3#4#5#6#7#8#9 { \__draw_softpath_round_calc:NnnNnn \__draw_softpath_round_loop:Nnn {#8} {#9} #1 {#2} {#3} #4 {#5} {#6} #7 {#8} {#9} } \cs_new_protected:Npn \__draw_softpath_round_calc:NnnNnn #1#2#3#4#5#6 { \tl_set:Nx \l__draw_softpath_curve_end_tl { \draw_point_interpolate_distance:nnn \l__draw_softpath_cornerii_dim { #5 , #6 } { #2 , #3 } } \tl_put_right:Nx \l__draw_softpath_part_tl { \exp_not:N #4 \__draw_softpath_round_calc:fVnnnn { \draw_point_interpolate_distance:nnn \l__draw_softpath_corneri_dim { #5 , #6 } { \l__draw_softpath_lastx_fp , \l__draw_softpath_lasty_fp } } \l__draw_softpath_curve_end_tl {#5} {#6} {#2} {#3} } \fp_set:Nn \l__draw_softpath_lastx_fp {#5} \fp_set:Nn \l__draw_softpath_lasty_fp {#6} #1 } \cs_new:Npn \__draw_softpath_round_calc:nnnnnn #1#2#3#4#5#6 { \__draw_softpath_round_calc:nnnnw {#3} {#4} {#5} {#6} #1 \q_mark #2 \q_stop } \cs_generate_variant:Nn \__draw_softpath_round_calc:nnnnnn { fV } \cs_new:Npn \__draw_softpath_round_calc:nnnnw #1#2#3#4 #5 , #6 \q_mark #7 , #8 \q_stop { {#5} {#6} \exp_not:N \__draw_softpath_curveto_opi:nn { \fp_to_dim:n { #5 + \c__draw_softpath_arc_fp * ( #1 - #5 ) } } { \fp_to_dim:n { #6 + \c__draw_softpath_arc_fp * ( #2 - #6 ) } } \exp_not:N \__draw_softpath_curveto_opii:nn { \fp_to_dim:n { #7 + \c__draw_softpath_arc_fp * ( #1 - #7 ) } } { \fp_to_dim:n { #8 + \c__draw_softpath_arc_fp* ( #2 - #8 ) } } \exp_not:N \__draw_softpath_curveto_opiii:nn {#7} {#8} } \cs_new_protected:Npn \__draw_softpath_round_close:nn #1#2 { \use:x { \__draw_softpath_round_calc:NnnNnn { \tl_set:Nx \exp_not:N \l__draw_softpath_move_tl { \__draw_softpath_moveto_op:nn \exp_not:N \exp_after:wN \exp_not:N \__draw_softpath_round_close:w \exp_not:N \l__draw_softpath_curve_end_tl \exp_not:N \q_stop } \use:x { \exp_not:N \exp_not:N \exp_not:N \use_i:nnnn { \__draw_softpath_round_loop:Nnn \__draw_softpath_close_op:nn \exp_not:N \exp_after:wN \exp_not:N \__draw_softpath_round_close:w \exp_not:N \l__draw_softpath_curve_end_tl \exp_not:N \q_stop } } } {#1} {#2} \__draw_softpath_lineto_op:nn \exp_after:wN \use_none:n \l__draw_softpath_move_tl } } \cs_new:Npn \__draw_softpath_round_close:w #1 , #2 \q_stop { {#1} {#2} } \cs_new_protected:Npn \__draw_softpath_round_end: { \tl_put_right:No \l__draw_softpath_main_tl \l__draw_softpath_move_tl \tl_put_right:No \l__draw_softpath_main_tl \l__draw_softpath_part_tl \tl_build_gclear:N \g__draw_softpath_main_tl \__draw_softpath_add:o \l__draw_softpath_main_tl } %% File: l3draw-state.dtx \dim_new:N \g__draw_linewidth_dim \dim_new:N \l_draw_default_linewidth_dim \dim_set:Nn \l_draw_default_linewidth_dim { 0.4pt } \cs_new_protected:Npn \draw_linewidth:n #1 { \dim_gset:Nn \g__draw_linewidth_dim { \fp_to_dim:n {#1} } \__draw_backend_linewidth:n \g__draw_linewidth_dim } \cs_new_protected:Npn \draw_dash_pattern:nn #1#2 { \group_begin: \seq_set_from_clist:Nn \l__draw_tmp_seq {#1} \seq_set_map:NNn \l__draw_tmp_seq \l__draw_tmp_seq { \fp_to_dim:n {##1} } \use:x { \__draw_backend_dash_pattern:nn { \seq_use:Nn \l__draw_tmp_seq { , } } { \fp_to_dim:n {#2} } } \group_end: } \seq_new:N \l__draw_tmp_seq \cs_new_protected:Npn \draw_miterlimit:n #1 { \__draw_backend_miterlimit:n { \fp_eval:n {#1} } } \cs_new_protected:Npn \draw_cap_butt: { \__draw_backend_cap_butt: } \cs_new_protected:Npn \draw_cap_rectangle: { \__draw_backend_cap_rectangle: } \cs_new_protected:Npn \draw_cap_round: { \__draw_backend_cap_round: } \cs_new_protected:Npn \draw_evenodd_rule: { \__draw_backend_evenodd_rule: } \cs_new_protected:Npn \draw_nonzero_rule: { \__draw_backend_nonzero_rule: } \cs_new_protected:Npn \draw_join_bevel: { \__draw_backend_join_bevel: } \cs_new_protected:Npn \draw_join_miter: { \__draw_backend_join_miter: } \cs_new_protected:Npn \draw_join_round: { \__draw_backend_join_round: } \tl_new:N \l__draw_color_tmp_tl \cs_new_eq:NN \draw_color:n \color_select:n \cs_new_protected:Npn \draw_color_fill:n #1 { \__draw_color:nn { fill } {#1} } \cs_new_protected:Npn \draw_color_stroke:n #1 { \__draw_color:nn { stroke } {#1} } \cs_new_protected:Npn \__draw_color:nn #1#2 { \color_parse:nN {#2} \l__draw_color_tmp_tl \__draw_color_aux:Vn \l__draw_color_tmp_tl {#1} } \cs_new_protected:Npn \__draw_color_aux:nn #1#2 { \__draw_color:nw {#2} #1 \q_stop } \cs_generate_variant:Nn \__draw_color_aux:nn { V } \cs_new_protected:Npn \__draw_color:nw #1#2 ~ #3 \q_stop { \use:c { __draw_color_ #2 :nw } {#1} #3 \q_stop } \cs_new_protected:Npn \__draw_color_cmyk:nw #1#2 ~ #3 ~ #4 ~ #5 \q_stop { \use:c { __draw_backend_color_ #1 _cmyk:nnnn } {#2} {#3} {#4} {#5} } \cs_new_protected:Npn \__draw_color_gray:nw #1#2 \q_stop { \use:c { __draw_backend_color_ #1 _gray:n } {#2} } \cs_new_protected:Npn \__draw_color_rgb:nw #1#2 ~ #3 ~ #4 \q_stop { \use:c { __draw_backend_color_ #1 _rgb:nnn } {#2} {#3} {#4} } \cs_new_protected:Npn \__draw_color_spot:nw #1#2 ~ #3 \q_stop { \use:c { __draw_backend_color_ #1 _spot:nn } {#2} {#3} } %% File: l3draw-transforms.dtx \bool_new:N \l__draw_matrix_active_bool \fp_new:N \l__draw_matrix_a_fp \fp_new:N \l__draw_matrix_b_fp \fp_new:N \l__draw_matrix_c_fp \fp_new:N \l__draw_matrix_d_fp \dim_new:N \l__draw_xshift_dim \dim_new:N \l__draw_yshift_dim \cs_new_protected:Npn \draw_transform_matrix_reset: { \fp_set:Nn \l__draw_matrix_a_fp { 1 } \fp_zero:N \l__draw_matrix_b_fp \fp_zero:N \l__draw_matrix_c_fp \fp_set:Nn \l__draw_matrix_d_fp { 1 } } \cs_new_protected:Npn \draw_transform_shift_reset: { \dim_zero:N \l__draw_xshift_dim \dim_zero:N \l__draw_yshift_dim } \draw_transform_matrix_reset: \draw_transform_shift_reset: \cs_new_protected:Npn \draw_transform_matrix_absolute:nnnn #1#2#3#4 { \fp_set:Nn \l__draw_matrix_a_fp {#1} \fp_set:Nn \l__draw_matrix_b_fp {#2} \fp_set:Nn \l__draw_matrix_c_fp {#3} \fp_set:Nn \l__draw_matrix_d_fp {#4} \bool_lazy_all:nTF { { \fp_compare_p:nNn \l__draw_matrix_a_fp = \c_one_fp } { \fp_compare_p:nNn \l__draw_matrix_b_fp = \c_zero_fp } { \fp_compare_p:nNn \l__draw_matrix_c_fp = \c_zero_fp } { \fp_compare_p:nNn \l__draw_matrix_d_fp = \c_one_fp } } { \bool_set_false:N \l__draw_matrix_active_bool } { \bool_set_true:N \l__draw_matrix_active_bool } } \cs_new_protected:Npn \draw_transform_shift_absolute:n #1 { \__draw_point_process:nn { \__draw_transform_shift_absolute:nn } {#1} } \cs_new_protected:Npn \__draw_transform_shift_absolute:nn #1#2 { \dim_set:Nn \l__draw_xshift_dim {#1} \dim_set:Nn \l__draw_yshift_dim {#2} } \cs_new_protected:Npn \draw_transform_matrix:nnnn #1#2#3#4 { \use:x { \__draw_transform:nnnn { \fp_eval:n {#1} } { \fp_eval:n {#2} } { \fp_eval:n {#3} } { \fp_eval:n {#4} } } } \cs_new_protected:Npn \__draw_transform:nnnn #1#2#3#4 { \use:x { \draw_transform_matrix_absolute:nnnn { #1 * \l__draw_matrix_a_fp + #2 * \l__draw_matrix_c_fp } { #1 * \l__draw_matrix_b_fp + #2 * \l__draw_matrix_d_fp } { #3 * \l__draw_matrix_a_fp + #4 * \l__draw_matrix_c_fp } { #3 * \l__draw_matrix_b_fp + #4 * \l__draw_matrix_d_fp } } } \cs_new_protected:Npn \draw_transform_shift:n #1 { \__draw_point_process:nn { \__draw_transform_shift:nn } {#1} } \cs_new_protected:Npn \__draw_transform_shift:nn #1#2 { \dim_set:Nn \l__draw_xshift_dim { \l__draw_xshift_dim + #1 } \dim_set:Nn \l__draw_yshift_dim { \l__draw_yshift_dim + #2 } } \cs_new_protected:Npn \draw_transform_matrix_invert: { \bool_if:NT \l__draw_matrix_active_bool { \__draw_transform_invert:f { \fp_eval:n { 1 / ( \l__draw_matrix_a_fp * \l__draw_matrix_d_fp - \l__draw_matrix_b_fp * \l__draw_matrix_c_fp ) } } } } \cs_new_protected:Npn \__draw_transform_invert:n #1 { \fp_set:Nn \l__draw_matrix_a_fp { \l__draw_matrix_d_fp * #1 } \fp_set:Nn \l__draw_matrix_b_fp { -\l__draw_matrix_b_fp * #1 } \fp_set:Nn \l__draw_matrix_c_fp { -\l__draw_matrix_c_fp * #1 } \fp_set:Nn \l__draw_matrix_d_fp { \l__draw_matrix_a_fp * #1 } } \cs_generate_variant:Nn \__draw_transform_invert:n { f } \cs_new_protected:Npn \draw_transform_shift_invert: { \dim_set:Nn \l__draw_xshift_dim { -\l__draw_xshift_dim } \dim_set:Nn \l__draw_yshift_dim { -\l__draw_yshift_dim } } \cs_new_protected:Npn \draw_transform_triangle:nnn #1#2#3 { \__draw_point_process:nnn { \__draw_point_process:nn { \__draw_tranform_triangle:nnnnnn } {#1} } {#2} {#3} } \cs_new_protected:Npn \__draw_tranform_triangle:nnnnnn #1#2#3#4#5#6 { \use:x { \draw_transform_matrix_absolute:nnnn { #3 - #1 } { #4 - #2 } { #5 - #1 } { #6 - #2 } \draw_transform_shift_absolute:n { #1 , #2 } } } \cs_new_protected:Npn \draw_transform_scale:n #1 { \draw_transform_matrix:nnnn { #1 } { 0 } { 0 } { #1 } } \cs_new_protected:Npn \draw_transform_xscale:n #1 { \draw_transform_matrix:nnnn { #1 } { 0 } { 0 } { 1 } } \cs_new_protected:Npn \draw_transform_yscale:n #1 { \draw_transform_matrix:nnnn { 1 } { 0 } { 0 } { #1 } } \cs_new_protected:Npn \draw_transform_xshift:n #1 { \draw_transform_shift:n { #1 , 0pt } } \cs_new_protected:Npn \draw_transform_yshift:n #1 { \draw_transform_shift:n { 0pt , #1 } } \cs_new_protected:Npn \draw_transform_xslant:n #1 { \draw_transform_matrix:nnnn { 1 } { 0 } { #1 } { 1 } } \cs_new_protected:Npn \draw_transform_yslant:n #1 { \draw_transform_matrix:nnnn { 1 } { #1 } { 0 } { 1 } } \cs_new_protected:Npn \draw_transform_rotate:n #1 { \__draw_transform_rotate:f { \fp_eval:n {#1} } } \cs_new_protected:Npn \__draw_transform_rotate:n #1 { \__draw_transform_rotate:ff { \fp_eval:n { cosd(#1) } } { \fp_eval:n { sind(#1) } } } \cs_generate_variant:Nn \__draw_transform_rotate:n { f } \cs_new_protected:Npn \__draw_transform_rotate:nn #1#2 { \draw_transform_matrix:nnnn {#1} {#2} { -#2 } { #1 } } \cs_generate_variant:Nn \__draw_transform_rotate:nn { ff } %% %% %% End of file `l3draw.sty'.