%%%==============================================================================
%% Copyright 2025-present by Alceu Frigeri
%%
%% This work may be distributed and/or modified under the conditions of
%%
%% * The [LaTeX Project Public License](http://www.latex-project.org/lppl.txt) ,
%%   version 1.3c (or later) , and/or
%% * The [GNU Affero General Public License](https://www.gnu.org/licenses/agpl-3.0.html) ,
%%   version 3 (or later)
%%
%% This work has the LPPL maintenance status *maintained*.
%%
%% The Current Maintainer of this work is Alceu Frigeri
%%
%% This is version {1.0a} {2025/03/10}
%%
%% The list of files that compose this work can be found in the README.md file at
%% https://ctan.org/pkg/tikzcalendarnotes
%%
%%%==============================================================================
\NeedsTeXFormat{LaTeX2e}[2022/06/01]

\ProvidesExplPackage
    {tikzcalendarnotes}
    {2025/03/10}
    {1.0a}
    {tikzcalendarnotes - calendar marks and notes}

%%%%%%%
%%%
%%% Just an attempt of having my packages info in a regular way
%%% Idea being: { <pck-name> / pkg info } for each and all.
%%%
%%%%%%%
\keys_define:nn { tikzcalendarnotes / pkg info}
  {
     name        .code:n = {tikzcalendarnotes} ,
     prefix      .code:n = {tikzcalendarnotes} ,
     date        .code:n = {2025/03/10} ,
     version     .code:n = {1.0a} ,
     description .code:n = {tikzcalendarnotes - calendar marks and notes}
  }
\cs_if_exist:NF \PkgInfo 
  {
    \NewDocumentCommand \PkgInfo {mm} { \keys_set:nn {#1 / pkg info}{#2} } 
    \NewDocumentCommand \PkgDescription {m} 
      { \noindent Package~ \textbf{\PkgInfo{#1}{name}}~Version:~\PkgInfo{#1}{version}~ -~ \PkgInfo{#1}{date}\par \emph{\PkgInfo{#1}{description}}~\par } 
  }  
%%%%%%%
%%% End of cut-n-paste
%%%%%%%

%\RequirePackage{etoolbox}



%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%
%%
%%
%%
%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%

\cs_generate_variant:Nn \msg_error:nnnn {neee ,nVne}


\msg_new:nnnn {tikzcalendarnotes} {dataset already defined}
  {
    (ID:#1)~Dataset~ '#2'~already~defined!
  }
  {
    You~tried~to~create~an~already~defined~Dataset:~'#2'.
    ~Error~Code~ ID:<#1>.
  }

\msg_new:nnnn {tikzcalendarnotes} {invalid dataset}
  {
    (ID:#1)~Invalid~Dataset:~ '#2'
  }
  {
    You~tried~to~use~an~invalid~Dataset:~'#2'.
    ~Error~Code~ ID:<#1>.
  }


\msg_new:nnnn {tikzcalendarnotes} {date not set}
  {
    (ID:#1)~missing~date~key:~ '#2'
  }
  {
    You~should~set~a~date~before:~'#2'.
    ~Error~Code~ ID:<#1>.
  }

\msg_new:nnnn {tikzcalendarnotes} {range not set}
  {
    (ID:#1)~missing~from/to~keys:~ '#2'
  }
  {
    You~should~set~from/to~keys~before:~'#2'.
    ~Error~Code~ ID:<#1>.
  }





%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%
%%
%%
%%
%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%

\tl_new:N \l__tikzcalendarnotes_msg_submodule_tl

\seq_new:N  \l__tikzcalendarnotes_dataset_seq
\tl_new:N   \l__tikzcalendarnotes_active_dataset_tl

\bool_new:N \l__tikzcalendarnotes_date_set_flag_bool
\bool_new:N \l__tikzcalendarnotes_hldates_set_flag_bool
\bool_new:N \l__tikzcalendarnotes_from_set_flag_bool
\bool_new:N \l__tikzcalendarnotes_to_set_flag_bool
\bool_new:N \l__tikzcalendarnotes_date_case_bool
\bool_new:N \l__tikzcalendarnotes_hldates_case_bool
\bool_new:N \l__tikzcalendarnotes_range_case_bool
\bool_new:N \l__tikzcalendarnotes_cntweek_case_bool 
\bool_new:N \l__tikzcalendarnotes_nocntweek_case_bool 

\bool_new:N \l__tikzcalendarnotes_keep_counters_pgfkey_bool

\bool_new:N \l__tikzcalendarnotes_year_policy_set_bool
\bool_new:N \l__tikzcalendarnotes_year_label_set_bool

\tl_new:N \l__tikzcalendarnotes_dayspacing_Xshift_key_tl
\tl_new:N \l__tikzcalendarnotes_weekspacing_Yshift_key_tl
\tl_new:N \l__tikzcalendarnotes_inter_month_space_key_tl %matrix column spacing


\tl_new:N \l__tikzcalendarnotes_hl_color_key_tl


\int_new:N \l__tikzcalendarnotes_year_int
\int_new:N \l__tikzcalendarnotes_month_int
\int_new:N \l__tikzcalendarnotes_cnta_int
\int_new:N \l__tikzcalendarnotes_cntb_int

\tl_new:N \l__tikzcalendarnotes_tmpa_tl

\tl_new:N \l__tikzcalendarnotes_begin_iso_tl


\tl_new:N \l__tikzcalendarnotes_dateremark_tmp_tl
\tl_new:N \l__tikzcalendarnotes_dateref_tmp_tl
\tl_new:N \l__tikzcalendarnotes_from_key_tl
\tl_new:N \l__tikzcalendarnotes_to_key_tl
\tl_new:N \l__tikzcalendarnotes_cnt_ifdate_temp_tl
\tl_new:N \l__tikzcalendarnotes_cnt_pgfcalifdate_temp_tl

\bool_new:N \g__tikzcalendarnotes_firstdraw_bool

\tl_new:N \l__tikzcalendarnotes_TXshift_tmp_tl
\tl_new:N \l__tikzcalendarnotes_TYshift_tmp_tl


\tl_new:N \l__tikzcalendarnotes_TXshift_scaled_tl
\tl_new:N \l__tikzcalendarnotes_TYshift_scaled_tl


\tl_new:N \l__tikzcalendarnotes_radius_tmp_tl
\tl_new:N \l__tikzcalendarnotes_radius_scaled_tl
\tl_new:N \l__tikzcalendarnotes_radius_adj_pgfkey_tl
\tl_new:N \l__tikzcalendarnotes_ref_fontsize_tl


\tl_new:N  \l__tikzcalendarnotes_weeklist_starts_on_tl
\tl_new:N  \l__tikzcalendarnotes_weeklist_ends_on_tl
\int_new:N \l__tikzcalendarnotes_weeklist_delta_int
\int_new:N \l__tikzcalendarnotes_weeklist_starts_on_int




\tl_new:N \l__tikzcalendarnotes_day_A_tl
\tl_new:N \l__tikzcalendarnotes_day_B_tl
\tl_new:N \l__tikzcalendarnotes_day_C_tl
\tl_new:N \l__tikzcalendarnotes_day_D_tl
\tl_new:N \l__tikzcalendarnotes_day_E_tl
\tl_new:N \l__tikzcalendarnotes_day_F_tl
\tl_new:N \l__tikzcalendarnotes_day_G_tl

\tl_new:N \l__tikzcalendarnotes_day_A_style_tl
\tl_new:N \l__tikzcalendarnotes_day_B_style_tl
\tl_new:N \l__tikzcalendarnotes_day_C_style_tl
\tl_new:N \l__tikzcalendarnotes_day_D_style_tl
\tl_new:N \l__tikzcalendarnotes_day_E_style_tl
\tl_new:N \l__tikzcalendarnotes_day_F_style_tl
\tl_new:N \l__tikzcalendarnotes_day_G_style_tl


%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%
%%
%%
%%
%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%



%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%
%%
%%
%%
%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%

\cs_generate_variant:Nn \dim_to_decimal:n {e}

\keys_define:nn {tikzcalendarnotes }
  {
    year .usage:n = general ,
    year .tl_set:N = \l__tikzcalendarnotes_year_key_tl ,
    year .default:n = {\year} ,
    
    starting~ at .usage:n = general ,
    starting~ at .tl_set:N = \l__tikzcalendarnotes_starting_at_key_tl ,
    starting~ at .default:n = {1} ,

    number~ of~ months .usage:n = general ,
    number~ of~ months .tl_set:N = \l__tikzcalendarnotes_nmonths_key_tl ,
    number~ of~ months .default:n = {12} ,

    per~ line .usage:n = general ,
    per~ line .tl_set:N = \l__tikzcalendarnotes_perline_key_tl ,
    per~ line .default:n  = {3} ,

    with~ notes .usage:n = general ,
    with~ notes .code:n =  
      {
        \tl_set:Nn \l__tikzcalendarnotes_dayspacing_Xshift_key_tl 
          {25}  % was 14ex
        \tl_set:Nn \l__tikzcalendarnotes_weekspacing_Yshift_key_tl 
          {36}      
        \bool_set_false:N \l__tikzcalendarnotes_compact_key_bool 
          %{\c_false_bool}  
        \tl_set:Nn \l__tikzcalendarnotes_inter_month_space_key_tl 
          {20}  % was 14ex
      } ,
    with~ notes .value_forbidden:n = true ,

    without~ notes .usage:n = general ,
    without~ notes .code:n =  
      {
        \tl_set:Nn \l__tikzcalendarnotes_dayspacing_Xshift_key_tl 
          {15}
        \tl_set:Nn \l__tikzcalendarnotes_weekspacing_Yshift_key_tl 
          {17}
        \bool_set_true:N \l__tikzcalendarnotes_compact_key_bool 
          %{\c_true_bool}  
        \tl_set:Nn \l__tikzcalendarnotes_inter_month_space_key_tl 
          {5} %was 7ex
      } ,
    without~ notes .value_forbidden:n = true ,
    
    compact .usage:n = general ,
    compact .meta:n = { without~ notes } ,
    compact .value_forbidden:n = true ,

    day~ spacing .usage:n = general ,
    day~ spacing .tl_set:N = \l__tikzcalendarnotes_dayspacing_Xshift_key_tl ,
    day~ spacing .value_required:n = true ,

    week~ spacing .usage:n = general ,
    week~ spacing .tl_set:N = \l__tikzcalendarnotes_weekspacing_Yshift_key_tl ,
    week~ spacing .value_required:n = true ,

    month~ spacing .usage:n = general ,
    month~ spacing .tl_set:N = \l__tikzcalendarnotes_inter_month_space_key_tl ,
    month~ spacing .value_required:n = true ,

    data~ set .usage:n = general ,
    data~ set .tl_set:N = \l__tikzcalendarnotes_dataset_key_tl ,
    data~ set .default:n  = {default} ,
    
    name .usage:n = general ,
    name .tl_set:N = \l__tikzcalendarnotes_cal_name_key_tl ,
    name .default:n  = {cal} ,
    
    defaults .usage:n = general ,
    defaults .meta:n = 
      {
        year , starting~ at , number~ of~ months , per~ line , compact , data~ set , 
        name ,
      } ,
    defaults .value_forbidden:n = true , 
  }



\keys_define:nn {tikzcalendarnotes / base set }
  {
    north~ east .usage:n = general ,
    north~ east  .code:n = 
      {
        \__tikzcalendarnotes_keycode:nnn {keys~10}{north~east}
          {
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {remark posref} {north~ east}       
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {remark anchor} {south~ west}       
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {TX shift} {-\l__tikzcalendarnotes_TXshift_scaled_tl}    
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {TY shift} {-\l__tikzcalendarnotes_TYshift_scaled_tl}    
            \prop_put:cne
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {date ref} {\l__tikzcalendarnotes_to_key_tl}       
          }
      } ,
    north~ east  .value_forbidden:n = true ,
    
    north~ west .usage:n = general ,
    north~ west  .code:n = 
      {
        \__tikzcalendarnotes_keycode:nnn {keys~09}{north~west}
          {
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {remark posref} {north~ west}       
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {remark anchor} {south~ east}       
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {TX shift} {\l__tikzcalendarnotes_TXshift_scaled_tl}    
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {TY shift} {-\l__tikzcalendarnotes_TYshift_scaled_tl}    
            \prop_put:cne
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {date ref} {\l__tikzcalendarnotes_from_key_tl}       
          }
      } ,
    north~ west  .value_forbidden:n = true ,

    south~ east .usage:n = general ,
    south~ east  .code:n = 
      {
        \__tikzcalendarnotes_keycode:nnn {keys~08}{south~east}
          {
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {remark posref} {south~ east}       
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {remark anchor} {north~ west}       
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {TX shift} {-\l__tikzcalendarnotes_TXshift_scaled_tl}    
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {TY shift} {\l__tikzcalendarnotes_TYshift_scaled_tl}    
            \prop_put:cne
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {date ref} {\l__tikzcalendarnotes_to_key_tl}       
          }
      } ,
    south~ east  .value_forbidden:n = true ,

    south~ west .usage:n = general ,
    south~ west  .code:n = 
      {
        \__tikzcalendarnotes_keycode:nnn {keys~07}{south~west}
          {
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {remark posref} {south~ west}       
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {remark anchor} {north~ east}       
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {TX shift} {\l__tikzcalendarnotes_TXshift_scaled_tl}    
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {TY shift} {\l__tikzcalendarnotes_TYshift_scaled_tl}    
            \prop_put:cne
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {date ref} {\l__tikzcalendarnotes_from_key_tl}       
          }
      } ,
    south~ west  .value_forbidden:n = true ,

    remark .usage:n = general ,
    remark .code:n = 
      {
        \__tikzcalendarnotes_keycode:nnnn {keys~06}{remark=#1}
          {remark}{#1}
      } ,
    remark .value_required:n = true ,
    
    notes .usage:n = general ,
    notes .code:n = 
      {
        \__tikzcalendarnotes_keycode:nnnn {keys~05}{notes=#1}
          {notes}{#1}
      } ,
    notes .value_required:n = true ,
      
    round .usage:n = general ,
    round .code:n =
      {
        \__tikzcalendarnotes_keycode:nnnn {keys~04}{round}
          {round}{round}
      } ,
    round .value_forbidden:n = true ,

    square .usage:n = general ,
    square .code:n =
      {
        \__tikzcalendarnotes_keycode:nnnn {keys~03}{square}
          {square}{square}
      } ,
    square .value_forbidden:n = true ,
    
    color .usage:n = general ,
    color .code:n =
      {
        \__tikzcalendarnotes_keycode:nnnn {keys~02}{color=#1}
          {day color}{#1}
      } ,
    color .value_required:n = true ,
    
    remark~ style .usage:n = general ,
    remark~ style .code:n =
      {
        \__tikzcalendarnotes_keycode:nnnn {keys~01}{remark~ style=#1}
          {remark style}{#1}
      } ,
    remark~ style .value_required:n = true ,
    
    note~ style .usage:n = general ,
    note~ style .code:n =
      {
        \__tikzcalendarnotes_keycode:nnnn {keys~11}{note~ style=#1}
          {note style}{#1}
      } ,
    note~ style .value_required:n = true ,   

    mark~ style .usage:n = general ,
    mark~ style .code:n =
      {
        \__tikzcalendarnotes_keycode:nnnn {keys~00}{mark~ style=#1}
          {draw style}{#1}
      } ,
    mark~ style .value_required:n = true ,
      
  }

\keys_define:nn {} 
  {
    tikzcalendarnotes / date set .inherit:n = 
      { tikzcalendarnotes / base set } 
  } 

\keys_define:nn {tikzcalendarnotes / date set }
  {
    date .usage:n = general ,
    date .code:n = 
      { 
        \bool_set_true:N \l__tikzcalendarnotes_date_set_flag_bool 
          %{\c_true_bool}
        \__tikzcalendarnotes_try_insert_date:nn 
          {#1}
          {} 
      } ,
    date .value_required:n = true ,
  }

\keys_define:nn {tikzcalendarnotes / hl dates set }
  {
    dates .usage:n = general ,
    dates .code:n = 
      {         
        \bool_set_true:N \l__tikzcalendarnotes_hldates_set_flag_bool 
          %{\c_true_bool}
        \bool_set_true:N \l__tikzcalendarnotes_date_set_flag_bool 
          %{\c_true_bool}  % for now. CHANGE IT
          
        \clist_set:Nn \l_tmpa_clist 
          {#1}

        \clist_map_inline:Nn \l_tmpa_clist
          {
            \__tikzcalendarnotes_try_insert_date:nV 
              {##1}
              \l__tikzcalendarnotes_hl_color_key_tl
          }
      } ,
    dates .value_required:n = true ,

    color .usage:n = general ,
    color .tl_set:N = \l__tikzcalendarnotes_hl_color_key_tl ,
    color .value_required:n = true , 
  }



\keys_define:nn {} 
  {
    tikzcalendarnotes / range set .inherit:n = 
      { tikzcalendarnotes / base set } 
  }

\keys_define:nn {tikzcalendarnotes / range set }
  {
    from .usage:n = general ,
    from .code:n =
      {
        \tl_set:Nn \l__tikzcalendarnotes_from_key_tl 
          {#1}
        \bool_set_true:N \l__tikzcalendarnotes_from_set_flag_bool 
          %{\c_true_bool}
      } ,
    from  .value_required:n = true ,
    
    to .usage:n = general ,
    to .code:n =
      {
        \tl_set:Nn \l__tikzcalendarnotes_to_key_tl 
          {#1}
        \bool_set_true:N \l__tikzcalendarnotes_to_set_flag_bool 
          %{\c_true_bool}
      } ,
    to .value_required:n = true ,
  }

\keys_define:nn {tikzcalendarnotes / no cnt week set }
  {
    from .usage:n = general ,
    from .code:n =
      {
        \tl_set:Nn \l__tikzcalendarnotes_from_key_tl 
          {#1}
        \bool_set_true:N \l__tikzcalendarnotes_from_set_flag_bool 
          %{\c_true_bool}
      } ,
    from  .value_required:n = true ,
    
    to .usage:n = general ,
    to .code:n =
      {
        \tl_set:Nn \l__tikzcalendarnotes_to_key_tl 
          {#1}
        \bool_set_true:N \l__tikzcalendarnotes_to_set_flag_bool 
          %{\c_true_bool}
      } ,
    to .value_required:n = true ,
  }    

\keys_define:nn {tikzcalendarnotes / cnt week set }
  {
    from .usage:n = general ,
    from .code:n =
      {
        \tl_set:Nn \l__tikzcalendarnotes_from_key_tl 
          {#1}
        \bool_set_true:N \l__tikzcalendarnotes_from_set_flag_bool 
          %{\c_true_bool}
      } ,
    from  .value_required:n = true ,
    
    to .usage:n = general ,
    to .code:n =
      {
        \tl_set:Nn \l__tikzcalendarnotes_to_key_tl 
          {#1}
        \bool_set_true:N \l__tikzcalendarnotes_to_set_flag_bool 
          %{\c_true_bool}
      } ,
    to .value_required:n = true ,
    
    up .usage:n = general ,
    up  .code:n = 
      {
        \__tikzcalendarnotes_keycode:nnn {keys~11}{up}
          {
            \__tikzcalendarnotes_try_insert_cntweek:ee 
              {\l__tikzcalendarnotes_from_key_tl}
              {\l__tikzcalendarnotes_to_key_tl}
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {cnt posref} {north~ west}       
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {cnt anchor} {south~ east}       
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {TX shift} {\l__tikzcalendarnotes_TXshift_scaled_tl}    
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {TY shift} {-\l__tikzcalendarnotes_TYshift_scaled_tl}    
          }
      } ,
      up .value_forbidden:n = true ,
    
    down .usage:n = general ,
    down  .code:n = 
      {
        \__tikzcalendarnotes_keycode:nnn {keys~12}{down}
          {
            \__tikzcalendarnotes_try_insert_cntweek:ee 
              {\l__tikzcalendarnotes_from_key_tl}
              {\l__tikzcalendarnotes_to_key_tl}
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {cnt posref} {south~ west}       
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {cnt anchor} {north~ east}       
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {TX shift} {\l__tikzcalendarnotes_TXshift_scaled_tl}    
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {TY shift} {\l__tikzcalendarnotes_TYshift_scaled_tl}    
          }
      } ,
      down .value_forbidden:n = true ,

    center .usage:n = general ,
    center  .code:n = 
      {
        \__tikzcalendarnotes_keycode:nnn {keys~13}{center}
          {
            \__tikzcalendarnotes_try_insert_cntweek:ee 
              {\l__tikzcalendarnotes_from_key_tl}
              {\l__tikzcalendarnotes_to_key_tl}
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {cnt posref} {west}       
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {cnt anchor} {east}       
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {TX shift} {\l__tikzcalendarnotes_TXshift_scaled_tl}    
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {TY shift} {0 pt}    
          }
      } ,
      center .value_forbidden:n = true ,
      
    color .usage:n = general ,
    color  .code:n = 
      {
        \__tikzcalendarnotes_keycode:nnn {keys~13}{color=#1}
          {
            \__tikzcalendarnotes_try_insert_cntweek:ee 
              {\l__tikzcalendarnotes_from_key_tl}
              {\l__tikzcalendarnotes_to_key_tl}
            \prop_put:cnn 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
              {color} {color=#1}       
          }
      } ,
    color .value_required:n = true ,
    
    starting~ at .usage:n = general ,
    starting~ at .code:n = 
      {
        \__tikzcalendarnotes_keycode:nnn {keys~14}{starting~ at=#1}
          {
            \__tikzcalendarnotes_try_insert_cntweek:ee 
              {\l__tikzcalendarnotes_from_key_tl}
              {\l__tikzcalendarnotes_to_key_tl}
            \int_gset:cn {g__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_from_key_tl : \l__tikzcalendarnotes_to_key_tl _cnt _int}
              {#1 - 1}
          }
      } ,
    starting~ at .value_required:n = true ,
  }


%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%
%%
%%
%%
%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%


\cs_new_protected:Npn \__tikzcalendarnotes_keycode:nnnn #1#2#3#4
  {
    \bool_if:nTF 
      {\l__tikzcalendarnotes_date_set_flag_bool || \l__tikzcalendarnotes_from_set_flag_bool && \l__tikzcalendarnotes_to_set_flag_bool}
      {
        \bool_if:NT \l__tikzcalendarnotes_range_case_bool
          {
            \__tikzcalendarnotes_try_insert_range:ee {\l__tikzcalendarnotes_from_key_tl}{\l__tikzcalendarnotes_to_key_tl}
          }
        \prop_put:cnn {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
          {#3} {#4}
      }
      {
        \msg_error:nVne {tikzcalendarnotes}{\l__tikzcalendarnotes_msg_submodule_tl}{#1}{#2}
      }  
  }

\cs_new_protected:Npn \__tikzcalendarnotes_keycode:nnn #1#2#3
  {
    \bool_if:nTF 
      {\l__tikzcalendarnotes_date_set_flag_bool || \l__tikzcalendarnotes_from_set_flag_bool && \l__tikzcalendarnotes_to_set_flag_bool}
      {
        \bool_if:NT \l__tikzcalendarnotes_range_case_bool
          {
            \__tikzcalendarnotes_try_insert_range:ee {\l__tikzcalendarnotes_from_key_tl}{\l__tikzcalendarnotes_to_key_tl}
          }
        #3
      }
      {
        \msg_error:nVne {tikzcalendarnotes}{\l__tikzcalendarnotes_msg_submodule_tl}{#1}{#2}
      }  
  }

\cs_generate_variant:Nn \tl_set:Nn {Ne}
\cs_generate_variant:Nn \tl_gset:Nn {Ne}


\makeatletter 
\cs_new_protected:Npn \__tikzcalendarnotes_set_dim_constants: 
  {
    \tl_set:Ne \l__tikzcalendarnotes_ref_fontsize_tl {\f@size}
       
    \tl_set:Ne \l__tikzcalendarnotes_TXshift_scaled_tl 
      { 
        \fp_eval:n {0.6 * \l__tikzcalendarnotes_ref_fontsize_tl + 2pt} pt
      }
    \tl_set:Ne \l__tikzcalendarnotes_TYshift_scaled_tl 
      { 
        \fp_eval:n {0.35 * \l__tikzcalendarnotes_ref_fontsize_tl + 0.5pt} pt
      }
    
    \tl_set:Ne \l__tikzcalendarnotes_radius_scaled_tl 
      { 
        \fp_eval:n {(5.75pt * \l__tikzcalendarnotes_ref_fontsize_tl) / 10pt } pt
      }
  }
\makeatother




\cs_new_protected:Npn \__tikzcalendarnotes_reset_defaults:
  {
    \bool_set_false:N \l__tikzcalendarnotes_date_set_flag_bool 
    \bool_set_false:N \l__tikzcalendarnotes_hldates_set_flag_bool 
    \bool_set_false:N \l__tikzcalendarnotes_from_set_flag_bool 
    \bool_set_false:N \l__tikzcalendarnotes_to_set_flag_bool 
    \bool_set_false:N \l__tikzcalendarnotes_date_case_bool 
    \bool_set_false:N \l__tikzcalendarnotes_hldates_case_bool 
    \bool_set_false:N \l__tikzcalendarnotes_range_case_bool 
    \bool_set_false:N \l__tikzcalendarnotes_cntweek_case_bool  
    \bool_set_false:N \l__tikzcalendarnotes_nocntweek_case_bool  
      
    \tl_set:Nn \l__tikzcalendarnotes_hl_color_key_tl 
      {lightgray}  
  }



%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%
%%
%%
%%
%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%

\cs_new_protected:Npn \__tikzcalendarnotes_markdraw:nnn #1#2#3
  {
    \draw [#1] 
      (#3.center) 
        ++(-#2 , -#2) 
        rectangle
    		++(2*#2 , 2*#2) ;
  }

\cs_generate_variant:Nn \__tikzcalendarnotes_markdraw:nnn {eee}

\cs_new_protected:Npn \__tikzcalendarnotes_markdraw_range:nnnn #1#2#3#4
  {
    \draw [#1] 
      (#3.center) 
        ++(-#2 , #2) coordinate(A)
        (#4.center)
        ++( #2 , -#2) 
        rectangle (A) ;
  }

\cs_generate_variant:Nn \__tikzcalendarnotes_markdraw_range:nnnn {eeee}


%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%
%%
%%
%%
%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%


\cs_new_protected:Npn \__tikzcalendarnotes_new_dataset:n #1
  {
    \seq_if_exist:cTF {l__tikzcalendarnotes_ #1 _dataset_seq}
      {
        \msg_warning:nnne 
          {tikzcalendarnotes}{dataset already defined}
          {new~01}{#1}
      }
      { 
        \seq_new:c {l__tikzcalendarnotes_ #1 _dataset_seq}
        \seq_new:c {l__tikzcalendarnotes_ #1 _range_seq}
        \seq_put_right:Nn \l__tikzcalendarnotes_dataset_seq {#1}
        \seq_new:c {l__tikzcalendarnotes_ #1 _cnt week_seq}
        \seq_new:c {l__tikzcalendarnotes_ #1 _no cntweek_seq}
        \bool_new:c {l__tikzcalendarnotes_ #1 _cnt flag_bool} %for the 1st of every month
        \tl_new:c {l__tikzcalendarnotes_ #1 _cnt hack_tl} %for the 1st of every month
      }
  }  

\cs_new_protected:Npn \__tikzcalendarnotes_select_dataset:n #1
  {
    \seq_if_exist:cTF {l__tikzcalendarnotes_ #1 _dataset_seq}
    { 
      \tl_set:Nn \l__tikzcalendarnotes_active_dataset_tl {#1}
    }
    {  
      \msg_error:nnne 
        {tikzcalendarnotes}{invalid dataset}
        {select~01}{#1}
    }
  }

\__tikzcalendarnotes_new_dataset:n {default} 
\__tikzcalendarnotes_select_dataset:n {default} 


%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%
%%
%%
%%
%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%



\cs_new_protected:Npn \__tikzcalendarnotes_try_insert_date:nn #1#2
  {
    \prop_if_exist:cF {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 _prop}
      {
        \prop_new:c {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 _prop}
        \seq_put_right:cn 
          { l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _dataset_seq }
          { #1 }    
%defaults      
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 _prop} 
          {remark posref} {north~ east}       
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 _prop} 
          {remark anchor} {south~ west}      
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 _prop} 
          {TX shift} {-\l__tikzcalendarnotes_TXshift_scaled_tl}    
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 _prop} 
          {TY shift} {-\l__tikzcalendarnotes_TYshift_scaled_tl}    
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 _prop} 
          {date ref} {#1}       
      }
    \tl_set:Nn \l__tikzcalendarnotes_date_tl {#1}

    \tl_if_blank:nF {#2}
      {
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ \l__tikzcalendarnotes_date_tl _prop} 
          {day color} {#2}  
      }
      
  }

\cs_generate_variant:Nn \__tikzcalendarnotes_try_insert_date:nn {nV}

\cs_new_protected:Npn \__tikzcalendarnotes_try_insert_range:nn #1#2
  {
    \prop_if_exist:cF {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _range _prop}
      {
        \prop_new:c {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _range _prop}
        \seq_put_right:cn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _range_seq}
          {#1 : #2 _range}        
        \tl_set:Nn \l__tikzcalendarnotes_date_tl 
          {#1 : #2 _range}
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _  #1 : #2 _range _prop} 
          {from} {#1}  
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _  #1 : #2 _range _prop} 
          {to} {#2}  
    
    %defaults      
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _range _prop} 
          {remark posref} {north~ east}       
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _range _prop} 
          {remark anchor} {south~ west}      
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _range _prop} 
          {TX shift} {-\l__tikzcalendarnotes_TXshift_scaled_tl}    
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _range _prop} 
          {TY shift} {-\l__tikzcalendarnotes_TYshift_scaled_tl}    
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _range _prop} 
          {date ref} {#2}       
      }

  }

\cs_generate_variant:Nn \__tikzcalendarnotes_try_insert_range:nn {ee}



\cs_new_protected:Npn \__tikzcalendarnotes_try_insert_no_cntweek:nn #1#2
  {
    \prop_if_exist:cF {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _ncnt _prop}
      {
        \prop_new:c {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _ncnt _prop}
        \seq_put_right:cn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _nocntweek_seq}
          {#1 : #2 _ncnt }   
               
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _ncnt _prop} 
          {from} {#1}  
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _ncnt _prop} 
          {to} {#2}  
      }
    \tl_set:Nn \l__tikzcalendarnotes_date_tl 
      {#1 : #2 _ncnt }
  }

\cs_generate_variant:Nn \__tikzcalendarnotes_try_insert_no_cntweek:nn {ee}



\cs_new_protected:Npn \__tikzcalendarnotes_try_insert_cntweek:nn #1#2
  {
    \prop_if_exist:cF {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _cnt _prop}
      {
        \prop_new:c {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _cnt _prop}
        \seq_put_right:cn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _cntweek_seq}
          {#1 : #2 _cnt}        
        % the counter is global because months are typed in consecutive scopes, and not in a single go...
        \int_new:c {g__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _cnt _int}

        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _cnt _prop} 
          {from} {#1}  
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ #1 : #2 _cnt _prop} 
          {to} {#2}  
    % defaults: center
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _  #1 : #2 _cnt _prop} 
          {cnt posref} {west}       
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _  #1 : #2 _cnt _prop} 
          {cnt anchor} {east}       
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _  #1 : #2 _cnt _prop} 
          {TX shift} {\l__tikzcalendarnotes_TXshift_scaled_tl}    
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _  #1 : #2 _cnt _prop} 
          {TY shift} {0pt}          
        \prop_put:cnn 
          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _  #1 : #2 _cnt _prop} 
          {color} {}          
      }
    \tl_set:Nn \l__tikzcalendarnotes_date_tl 
      {#1 : #2 _cnt}
  }

\cs_generate_variant:Nn \__tikzcalendarnotes_try_insert_cntweek:nn {ee}



%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%
%%
%%
%%
%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%


\cs_new_protected:Npn \__tikzcalendarnotes_month_matrix:nnnn #1#2#3#4  %year ,first ,n months ,per line
  {
    \int_set:Nn \l__tikzcalendarnotes_year_int {#1}
    \int_set:Nn \l__tikzcalendarnotes_month_int {#2}
    \int_set:Nn \l__tikzcalendarnotes_cnta_int {0}
    \int_set:Nn \l__tikzcalendarnotes_cntb_int {0}
    \tl_set:Nn \l__tikzcalendarnotes_tmpa_tl {}
    
   
    \int_while_do:nNnn {\l__tikzcalendarnotes_cnta_int} < {#3}
      {
        \tl_put_right:Ne \l__tikzcalendarnotes_tmpa_tl 
          {
            \exp_not:N \calendar[
                        day~ xshift=\l__tikzcalendarnotes_dayspacing_Xshift_key_tl pt,
                        day~ yshift=\l__tikzcalendarnotes_weekspacing_Yshift_key_tl pt,
                        name=\l__tikzcalendarnotes_cal_name_key_tl ,
                        dates=\int_use:N\l__tikzcalendarnotes_year_int - \int_use:N\l__tikzcalendarnotes_month_int -01 
                               ~ to ~ 
                              \int_use:N\l__tikzcalendarnotes_year_int - \int_use:N\l__tikzcalendarnotes_month_int -last
                        ] ;
          }
        \int_incr:N \l__tikzcalendarnotes_cnta_int
        \int_compare:nNnTF {\l__tikzcalendarnotes_cnta_int} = {#3}
          {
            \tl_put_right:Nn \l__tikzcalendarnotes_tmpa_tl { \\ }
          }
          {
            \int_incr:N \l__tikzcalendarnotes_cntb_int
            \int_compare:nNnTF {\l__tikzcalendarnotes_cntb_int} < {#4} 
              {
                \tl_put_right:Nn \l__tikzcalendarnotes_tmpa_tl { ~ \pgfmatrixnextcell ~ }
              }
              {
                \tl_put_right:Nn \l__tikzcalendarnotes_tmpa_tl { \\ }
                \int_set:Nn \l__tikzcalendarnotes_cntb_int {0}
              }
            \int_incr:N \l__tikzcalendarnotes_month_int
            \int_compare:nNnTF {\l__tikzcalendarnotes_month_int} < {13}
              {}
              {
                \int_set:Nn \l__tikzcalendarnotes_month_int {1}
                \int_incr:N \l__tikzcalendarnotes_year_int
              }
          }
      }

    \l__tikzcalendarnotes_tmpa_tl
  }
  

\makeatletter
\cs_new_eq:NN \__tikzcalendarnotes_tikz_xshift \tikz@lib@cal@xshift
\makeatother


\cs_new_protected:Npn \__tikzcalendarnotes_ifdate_case_counting_tl_set:Nnnnnnn #1#2#3#4#5#6#7
  {
    \bool_if:NF \l__tikzcalendarnotes_keep_counters_pgfkey_bool
      { \int_gzero:c {#3} }
      
    \tl_put_right:Nn #1 
      {
        \ifdate{#2}
          {
            \int_gincr:c {#3}
            \draw (\pgfcalendarsuggestedname.#4) 
              ++(#6)
              node[#5](){ \int_use:c {#3} } ;
            \tl_gput_right:cn {#7}
              {
                \draw (\pgfcalendarsuggestedname.#4 |-  \l__tikzcalendarnotes_cal_name_key_tl - \pgfcalendarifdateyear - \pgfcalendarifdatemonth - 01.#4) 
                  ++(#6)
                  node[#5](){ \int_use:c{#3} } ;                  
              }
          }
          {}                
      }
  }

\cs_generate_variant:Nn \__tikzcalendarnotes_ifdate_case_counting_tl_set:Nnnnnnn {Neeeeee}





\cs_new_protected:Npn \__tikzcalendarnotes_pgfcalifdate_case_counting_tl_set:Nnnnnnn #1#2#3#4#5#6#7
  {
      
    \tl_put_right:Nn #1 
      {
        \pgfcalendarifdate{##1}{#2}
          {
            \int_compare:nNnT {\int_use:c{#3}} = {0}
              { \int_gincr:c {#3} }             
            \tl_gput_right:cn {#7}
              {
                \draw (\pgfcalendarsuggestedname.#4 |-  \l__tikzcalendarnotes_cal_name_key_tl - \pgfcalendarifdateyear - \pgfcalendarifdatemonth - 01.#4) 
                  ++(#6)
                  node[#5](){ \int_use:c{#3} } ;                  
              }
          }
          {}                
      }
  }

\cs_generate_variant:Nn \__tikzcalendarnotes_pgfcalifdate_case_counting_tl_set:Nnnnnnn {Neeeeee}


\cs_generate_variant:Nn \use:n {V}

\cs_new_protected:Npn \__tikzcalendarnotes_ifdate_case_no_tl_set:Nnn #1#2#3
  {
    \tl_set:Nn #1 
      {
        \ifdate{#3}
          {}
          { #2 }                
      }
  }

\cs_generate_variant:Nn \__tikzcalendarnotes_ifdate_case_no_tl_set:Nnn {NVe}




\cs_new_protected:Npn \__tikzcalendarnotes_pgfcalifdate_case_no_tl_set:Nnn #1#2#3
  {
    \tl_set:Nn #1 
      {
        \pgfcalendarifdate{##1}{#3}
          {}
          { #2 }                
      }
  }

\cs_generate_variant:Nn \__tikzcalendarnotes_pgfcalifdate_case_no_tl_set:Nnn {NVe}


\cs_new_protected:Npn \__tikzcalendarnotes_shift_adjust_tl_set:Nn #1#2
  {
    \fp_compare:nNnTF {#1} < {0}
      {
        \tl_set:Ne #1 
          {
            \fp_eval:n {#1 + (#2)} pt
          }
      }
      {
        \tl_set:Ne #1 
          {
            \fp_eval:n {#1 - (#2)} pt
          }
      }
  }

\cs_generate_variant:Nn   \__tikzcalendarnotes_shift_adjust_tl_set:Nn {NV , Ne}

\cs_new_protected:Npn \__tikzcalendarnotes_append_pgfcalifdate_test:n #1
  {
    \pgfkeys
      {
        tikz ,
        @calnotes@cnt@if@/.append~ code = {#1} ,
      }
  }
\cs_generate_variant:Nn \__tikzcalendarnotes_append_pgfcalifdate_test:n {V}


\cs_new_protected:Npn \__tikzcalendarnotes_set_ifdate_before_day:nn #1#2
  {
    \pgfkeys
      {
        tikz,
        @calnotes@cnt@if@/.code = {} ,
        execute~ before~ day~ scope = 
          {
            \ifdate{equals = #1}
              {
                \int_set:Nn \l_tmpa_int {\pgfcalendarcurrentweekday + #2}
                \pgfkeys{tikz,@calnotes@cnt@if@ = {#1+ -\int_use:N \l_tmpa_int}}
              }
              {}
          }
      }
  }
\cs_generate_variant:Nn \__tikzcalendarnotes_set_ifdate_before_day:nn {ee}




% #1  \l__tikzcalendarnotes_cnt_ifdate_temp_tl
% #2 l__tikzcalendarnotes_ ##1 _cnt flag_bool
% #3 l__tikzcalendarnotes_ ##1 _cnt hack_tl

\cs_new_protected:Npn \__tikzcalendarnotes_append_tikz_ifdate_after_day:nnn #1#2#3
  {
    \pgfkeys
      {tikz ,
        execute~ after~ day~ scope=
          {  
            \ifdate{\l__tikzcalendarnotes_weeklist_starts_on_tl} 
              { 
                \bool_if:cT {#2}
                  {
                    \tl_use:c {#3}
                    \bool_set_false:c {#2}
                  }
                \tl_gclear:c {#3}
                #1 
              }
              {
                \ifdate{day~ of~ month = 1}
                  {
                    \bool_set_true:c {#2}
                  }
                  {} 
              }
          }
      }
  }

\cs_generate_variant:Nn \__tikzcalendarnotes_append_tikz_ifdate_after_day:nnn {Vnn}




\cs_new_protected:Npn \__tikzcalendarnotes_append_every_calendar_if:nn #1#2
  {
    \pgfkeys
      {
        tikz ,
        every~ calendar/.append~ style=
          {
            if = { (#1) [#2] }
          }
      }
  
  }
\cs_generate_variant:Nn \__tikzcalendarnotes_append_every_calendar_if:nn {ee}




\cs_new_protected:Npn \__tikzcalendarnotes_set_ifdates:n #1
  {
    \__tikzcalendarnotes_set_ifdate_before_day:ee 
      {\l__tikzcalendarnotes_begin_iso_tl} 
      {\int_use:N \l__tikzcalendarnotes_weeklist_delta_int}


    \clist_set:Nn \l_tmpa_clist {#1}
    \clist_map_inline:Nn \l_tmpa_clist
      {
        \tl_clear:N \l__tikzcalendarnotes_cnt_ifdate_temp_tl
        \tl_clear:N \l__tikzcalendarnotes_cnt_pgfcalifdate_temp_tl
        \__tikzcalendarnotes_select_dataset:n {##1}
        \tl_clear:c {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _cnt hack_tl}
        \seq_map_inline:cn { l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _dataset_seq}
          {
            \prop_get:cnNT 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
              {day color} \l__tikzcalendarnotes_daycolor_tmp_tl
              {
                \__tikzcalendarnotes_append_every_calendar_if:ee
                  {equals=####1}
                  {color=\l__tikzcalendarnotes_daycolor_tmp_tl}
              }
          }

        \seq_map_inline:cn { l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _range_seq}
          {
            \prop_get:cnNT 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
              {day color} \l__tikzcalendarnotes_daycolor_tmp_tl
              {
                \prop_get:cnN 
                  {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                  {from} \l__tikzcalendarnotes_from_tmp_tl
                \prop_get:cnN 
                  {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                  {to} \l__tikzcalendarnotes_to_tmp_tl
                
                \__tikzcalendarnotes_append_every_calendar_if:ee
                  {between=\l__tikzcalendarnotes_from_tmp_tl and \l__tikzcalendarnotes_to_tmp_tl}
                  {color=\l__tikzcalendarnotes_daycolor_tmp_tl}  
              }
          }
          
        \seq_map_inline:cn { l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ cnt week_seq}
          {
            \prop_get:cnN 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
              {from} \l__tikzcalendarnotes_from_tmp_tl
            \prop_get:cnN 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
              {to} \l__tikzcalendarnotes_to_tmp_tl
            \prop_get:cnN  
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
              {cnt posref} \l__tikzcalendarnotes_cntposref_tmp_tl
            \prop_get:cnN 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
              {cnt anchor} \l__tikzcalendarnotes_cntanchor_tmp_tl
            \prop_get:cnN 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
              {color} \l__tikzcalendarnotes_color_tmp_tl
            \prop_get:cnN 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
              {TX shift} \l__tikzcalendarnotes_TXshift_tmp_tl
              
            \__tikzcalendarnotes_shift_adjust_tl_set:NV
              \l__tikzcalendarnotes_TXshift_tmp_tl
              \l__tikzcalendarnotes_remark_Xshift_adj_pgfkey_tl
              
            \prop_get:cnN 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
              {TY shift} \l__tikzcalendarnotes_TYshift_tmp_tl
              
            \fp_compare:nNnF {\l__tikzcalendarnotes_TYshift_tmp_tl} = {0}
              {
                \__tikzcalendarnotes_shift_adjust_tl_set:NV
                  \l__tikzcalendarnotes_TYshift_tmp_tl
                  \l__tikzcalendarnotes_remark_Yshift_adj_pgfkey_tl
              }
              
            \__tikzcalendarnotes_ifdate_case_counting_tl_set:Neeeeee 
              \l__tikzcalendarnotes_cnt_ifdate_temp_tl 
              {between = \l__tikzcalendarnotes_from_tmp_tl+-6 and \l__tikzcalendarnotes_to_tmp_tl}
              {g__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _int}
              {\l__tikzcalendarnotes_cntposref_tmp_tl}
              {anchor=\l__tikzcalendarnotes_cntanchor_tmp_tl , every~ counter , \l__tikzcalendarnotes_color_tmp_tl}
              {0.7*\l__tikzcalendarnotes_TXshift_tmp_tl , 1.5*\l__tikzcalendarnotes_TYshift_tmp_tl}
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _cnt hack_tl}
 
            \__tikzcalendarnotes_pgfcalifdate_case_counting_tl_set:Neeeeee 
              \l__tikzcalendarnotes_cnt_pgfcalifdate_temp_tl 
              {between = \l__tikzcalendarnotes_from_tmp_tl+-6 and \l__tikzcalendarnotes_to_tmp_tl}
              {g__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _int}
              {\l__tikzcalendarnotes_cntposref_tmp_tl}
              {anchor=\l__tikzcalendarnotes_cntanchor_tmp_tl , every~ counter , \l__tikzcalendarnotes_color_tmp_tl}
              {0.7*\l__tikzcalendarnotes_TXshift_tmp_tl , 1.5*\l__tikzcalendarnotes_TYshift_tmp_tl}
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _cnt hack_tl}

          } % end of cntweek for this <dataset>
          
        \seq_map_inline:cn { l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ no cnt week_seq}
          {
            \prop_get:cnN 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
              {from} \l__tikzcalendarnotes_from_tmp_tl
            \prop_get:cnN 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
              {to} \l__tikzcalendarnotes_to_tmp_tl
              
            \__tikzcalendarnotes_ifdate_case_no_tl_set:NVe 
              \l__tikzcalendarnotes_cnt_ifdate_temp_tl 
              \l__tikzcalendarnotes_cnt_ifdate_temp_tl
              {between = \l__tikzcalendarnotes_from_tmp_tl+-6 and \l__tikzcalendarnotes_to_tmp_tl}

            \__tikzcalendarnotes_pgfcalifdate_case_no_tl_set:NVe 
              \l__tikzcalendarnotes_cnt_pgfcalifdate_temp_tl 
              \l__tikzcalendarnotes_cnt_pgfcalifdate_temp_tl
              {between = \l__tikzcalendarnotes_from_tmp_tl+-6 and \l__tikzcalendarnotes_to_tmp_tl}

          } % end of no cntweek for this dataset

          \tl_if_empty:NF \l__tikzcalendarnotes_cnt_ifdate_temp_tl
            {
              \__tikzcalendarnotes_append_tikz_ifdate_after_day:Vnn
                \l__tikzcalendarnotes_cnt_ifdate_temp_tl
                {l__tikzcalendarnotes_ ##1 _cnt flag_bool}
                {l__tikzcalendarnotes_ ##1 _cnt hack_tl}
                
              \__tikzcalendarnotes_append_pgfcalifdate_test:V 
                \l__tikzcalendarnotes_cnt_pgfcalifdate_temp_tl 
            }

      } % end of clist <datasets>
      
          
  }

\cs_generate_variant:Nn \__tikzcalendarnotes_set_ifdates:n {e}


%% from https://tex.stackexchange.com/questions/37709/how-can-i-know-if-a-node-is-already-defined/37713#37713
%% yickes
%% non portable, error prone if the underlining pgf scheme changes... :/
%%
\makeatletter
\cs_new_protected:Npn \__tikzcalendarnotes_setflag_ifdatenode_exist:Nn #1#2
  {
    \cs_if_exist:cTF {pgf@sh@ns@ \l__tikzcalendarnotes_cal_name_key_tl - #2}
      {
        \tl_if_eq:cNTF {pgf@sh@pi@ \l__tikzcalendarnotes_cal_name_key_tl - #2} \pgfpictureid
          { \bool_set_true:N #1  }
          { \bool_set_false:N #1  }
      }
      { \bool_set_false:N #1 }
  }
\makeatother

\cs_generate_variant:Nn \__tikzcalendarnotes_setflag_ifdatenode_exist:Nn {NV}


\cs_new_protected:Npn \__tizecalendarnotes_notes_typeset:nn #1#2 
  {
    \vcoffin_set:Nnn \l_tmpa_coffin
      {\fp_eval:n{#1 - 0.75em}pt} {#2}
    \coffin_typeset:Nnnnn \l_tmpa_coffin
      {l}{t}
      {0pt}{0pt}
  }

\cs_new_protected:Npn \__tikzcalendarnotes_draw_notes:n #1
  {
    \tl_set:Ne \l__tikzcalendarnotes_radius_tmp_tl 
      { 
        \fp_eval:n {\l__tikzcalendarnotes_radius_scaled_tl + \l__tikzcalendarnotes_radius_adj_pgfkey_tl} pt
      }      
      
    \clist_set:Nn \l_tmpa_clist {#1}
    \clist_map_inline:Nn \l_tmpa_clist
      {
        \__tikzcalendarnotes_select_dataset:n {##1}
        \seq_map_inline:cn { l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _dataset_seq}
          {
            \__tikzcalendarnotes_setflag_ifdatenode_exist:Nn \l_tmpa_bool {####1}
            \bool_if:NT \l_tmpa_bool
              { 
                \prop_get:cnNF 
                  {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                  {draw style} \l__tikzcalendarnotes_drawstyle_tmp_tl
                  {
                    \tl_set:Nn \l__tikzcalendarnotes_drawstyle_tmp_tl {}
                  }
                  
                \prop_get:cnNT 
                  {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                  {round} \l_tmpa_tl
                  {
                    \__tikzcalendarnotes_markdraw:eee 
                      {
                        every~ mark , 
                        rounded~ corners=\l__tikzcalendarnotes_radius_tmp_tl , 
                        \l__tikzcalendarnotes_drawstyle_tmp_tl
                      }
                      {\l__tikzcalendarnotes_radius_tmp_tl}
                      {\l__tikzcalendarnotes_cal_name_key_tl - ####1}
                  }
                  
                \prop_get:cnNT 
                  {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                  {square} \l_tmpa_tl
                  {
                    \__tikzcalendarnotes_markdraw:eee 
                      {
                        every~ mark , 
                        \l__tikzcalendarnotes_drawstyle_tmp_tl
                      }
                      {\l__tikzcalendarnotes_radius_tmp_tl}
                      {\l__tikzcalendarnotes_cal_name_key_tl - ####1}
                  }
              
                \prop_get:cnNT 
                  {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                  {remark} \l__tikzcalendarnotes_dateremark_tmp_tl
                  {
                    \prop_get:cnNF 
                      {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                      {remark style} \l__tikzcalendarnotes_remarkstyle_tmp_tl
                      {
                        \tl_set:Nn \l__tikzcalendarnotes_remarkstyle_tmp_tl {}
                      }
                    \prop_get:cnN  %TF \prop_get:cnNTF 
                      {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                      {remark posref} \l__tikzcalendarnotes_remarkposref_tmp_tl
                    \prop_get:cnN 
                      {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                      {remark anchor} \l__tikzcalendarnotes_remarkanchor_tmp_tl
                    \prop_get:cnN 
                      {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                      {TX shift} \l__tikzcalendarnotes_TXshift_tmp_tl
                    \__tikzcalendarnotes_shift_adjust_tl_set:NV
                      \l__tikzcalendarnotes_TXshift_tmp_tl
                      \l__tikzcalendarnotes_remark_Xshift_adj_pgfkey_tl
                    
                    \prop_get:cnN 
                      {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                      {TY shift} \l__tikzcalendarnotes_TYshift_tmp_tl
                    \__tikzcalendarnotes_shift_adjust_tl_set:NV
                      \l__tikzcalendarnotes_TYshift_tmp_tl
                      \l__tikzcalendarnotes_remark_Yshift_adj_pgfkey_tl
    
                    \use:e
                      {
                        \exp_not:N\draw
                          (\l__tikzcalendarnotes_cal_name_key_tl - ####1 . \l__tikzcalendarnotes_remarkposref_tmp_tl) 
                          ++(\l__tikzcalendarnotes_TXshift_tmp_tl , \l__tikzcalendarnotes_TYshift_tmp_tl) 
                          node
                            [anchor=\l__tikzcalendarnotes_remarkanchor_tmp_tl , every~ remark , \l__tikzcalendarnotes_remarkstyle_tmp_tl]
                            (\l__tikzcalendarnotes_cal_name_key_tl - ####1 - remark)
                            { \l__tikzcalendarnotes_dateremark_tmp_tl } ;
                      }
                  }
                  
                \bool_if:NF \l__tikzcalendarnotes_compact_key_bool
                  {
                    \prop_get:cnNT 
                      {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                      {notes} \l__tikzcalendarnotes_notes_tmp_tl
                      {
                        \prop_get:cnNF 
                          {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                          {note style} \l__tikzcalendarnotes_notestyle_tmp_tl
                          {
                            \tl_set:Nn \l__tikzcalendarnotes_notestyle_tmp_tl {}
                          }
                          
                        \tl_set:Nn \l__tikzcalendarnotes_TYshift_tmp_tl 
                          {\l__tikzcalendarnotes_TYshift_scaled_tl}
                          
                        \__tikzcalendarnotes_shift_adjust_tl_set:NV
                          \l__tikzcalendarnotes_TYshift_tmp_tl
                          \l__tikzcalendarnotes_remark_Yshift_adj_pgfkey_tl

                        \use:e
                          {
                            \exp_not:N\draw
                              (\l__tikzcalendarnotes_cal_name_key_tl - ####1 . south~ west) 
                              ++(0pt,\l__tikzcalendarnotes_TYshift_tmp_tl)
                              node
                                [anchor=north~ west , every~ note , \l__tikzcalendarnotes_notestyle_tmp_tl]
                                (\l__tikzcalendarnotes_cal_name_key_tl - ####1 - note)
                                {
                                  \exp_not:N\__tizecalendarnotes_notes_typeset:nn
                                    {
                                       \l__tikzcalendarnotes_dayspacing_Xshift_key_tl 
                                    }
                                    {\exp_not:N\noindent \l__tikzcalendarnotes_notes_tmp_tl }
    
                                } ;
                          }
                      }          
                  }
              }
          }



        \seq_map_inline:cn { l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _range_seq}
          {
            \prop_get:cnN 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
              {from} \l__tikzcalendarnotes_from_tmp_tl
              
            \prop_get:cnN 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
              {to} \l__tikzcalendarnotes_to_tmp_tl 
                         
            \prop_get:cnNF 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
              {draw style} \l__tikzcalendarnotes_drawstyle_tmp_tl
              {
                \tl_set:Nn \l__tikzcalendarnotes_drawstyle_tmp_tl {}
              }
              
            \__tikzcalendarnotes_setflag_ifdatenode_exist:NV 
              \l_tmpa_bool 
              {\l__tikzcalendarnotes_from_tmp_tl}
              
            \__tikzcalendarnotes_setflag_ifdatenode_exist:NV 
              \l_tmpb_bool 
              {\l__tikzcalendarnotes_to_tmp_tl}

            \bool_lazy_and:nnT {\l_tmpa_bool} {\l_tmpb_bool}
              {
                \prop_get:cnNT 
                  {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                  {round} \l_tmpa_tl
                  {
                    \__tikzcalendarnotes_markdraw_range:eeee 
                      {
                        every~ mark , 
                        rounded~ corners=\l__tikzcalendarnotes_radius_tmp_tl , 
                        \l__tikzcalendarnotes_drawstyle_tmp_tl
                      }
                      {\l__tikzcalendarnotes_radius_tmp_tl}
                      {\l__tikzcalendarnotes_cal_name_key_tl - \l__tikzcalendarnotes_from_tmp_tl}
                      {\l__tikzcalendarnotes_cal_name_key_tl - \l__tikzcalendarnotes_to_tmp_tl}
                  }
                  
                \prop_get:cnNT 
                  {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                  {square} \l_tmpa_tl
                  {
                    \__tikzcalendarnotes_markdraw_range:eeee 
                      {
                        every~ mark , 
                        \l__tikzcalendarnotes_drawstyle_tmp_tl
                      }
                      {\l__tikzcalendarnotes_radius_tmp_tl}
                      {\l__tikzcalendarnotes_cal_name_key_tl - \l__tikzcalendarnotes_from_tmp_tl}
                      {\l__tikzcalendarnotes_cal_name_key_tl - \l__tikzcalendarnotes_to_tmp_tl}
                }
              }
%%%           

            \prop_get:cnN 
              {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
              {date ref} \l__tikzcalendarnotes_dateref_tmp_tl

            \__tikzcalendarnotes_setflag_ifdatenode_exist:NV 
              \l_tmpa_bool 
              { \l__tikzcalendarnotes_dateref_tmp_tl }

            \bool_if:NT \l_tmpa_bool 
            {
              \prop_get:cnNT 
                {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                {remark} \l__tikzcalendarnotes_dateremark_tmp_tl
                {
                  \prop_get:cnNF 
                    {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                    {remark style} \l__tikzcalendarnotes_remarkstyle_tmp_tl
                    {
                      \tl_set:Nn \l__tikzcalendarnotes_remarkstyle_tmp_tl 
                        {}
                    }
                    
                  \prop_get:cnN   
                    {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                    {remark posref} \l__tikzcalendarnotes_remarkposref_tmp_tl
                    
                  \prop_get:cnN 
                    {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                    {remark anchor} \l__tikzcalendarnotes_remarkanchor_tmp_tl
                    
                  \prop_get:cnN 
                    {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                    {TX shift} \l__tikzcalendarnotes_TXshift_tmp_tl
                    
                  \__tikzcalendarnotes_shift_adjust_tl_set:NV
                    \l__tikzcalendarnotes_TXshift_tmp_tl
                    \l__tikzcalendarnotes_remark_Xshift_adj_pgfkey_tl
                    
                  \prop_get:cnN 
                    {l__tikzcalendarnotes_ \l__tikzcalendarnotes_active_dataset_tl _ ####1 _prop}
                    {TY shift} \l__tikzcalendarnotes_TYshift_tmp_tl
                    
                  \__tikzcalendarnotes_shift_adjust_tl_set:NV
                    \l__tikzcalendarnotes_TYshift_tmp_tl 
                    \l__tikzcalendarnotes_remark_Yshift_adj_pgfkey_tl
  
                  \use:e
                    {
                      \exp_not:N\draw
                        (\l__tikzcalendarnotes_cal_name_key_tl -  \l__tikzcalendarnotes_dateref_tmp_tl . \l__tikzcalendarnotes_remarkposref_tmp_tl) 
                        ++(\l__tikzcalendarnotes_TXshift_tmp_tl ,\l__tikzcalendarnotes_TYshift_tmp_tl) 
                        node
                          [anchor=\l__tikzcalendarnotes_remarkanchor_tmp_tl , every~ remark , \l__tikzcalendarnotes_remarkstyle_tmp_tl]
                          (\l__tikzcalendarnotes_cal_name_key_tl - \l__tikzcalendarnotes_dateref_tmp_tl - remark)
                          { \l__tikzcalendarnotes_dateremark_tmp_tl } ;
                    }
                }
              }
%%%              
          }
      }      
  }
  
\cs_generate_variant:Nn \__tikzcalendarnotes_draw_notes:n {e}


%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%
%%
%%  End user's commands
%%
%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%


\NewDocumentCommand{\defnewdataset}{m}
  {
    \__tikzcalendarnotes_new_dataset:n {#1}
  }  


\NewDocumentCommand{\setdates}{O{default}m}
  {
    \__tikzcalendarnotes_reset_defaults:
    
    \bool_set_true:N \l__tikzcalendarnotes_date_case_bool 
    \tl_set:Nn \l__tikzcalendarnotes_msg_submodule_tl 
      {date not set}

    \__tikzcalendarnotes_select_dataset:n {#1}
    \keys_set:nn 
      {tikzcalendarnotes / date set}
      {#2}   
  }

\NewDocumentCommand{\sethighlightdates}{O{default}m}
  {
    \__tikzcalendarnotes_reset_defaults:
    
    \bool_set_true:N \l__tikzcalendarnotes_hldates_case_bool 
      %{\c_true_bool}  

    \__tikzcalendarnotes_select_dataset:n {#1}
    \keys_set:nn 
      {tikzcalendarnotes / hl dates set}
      {#2}   
  }


\NewDocumentCommand{\setranges}{O{default}m}
  {
    \__tikzcalendarnotes_reset_defaults:
    
    \bool_set_true:N \l__tikzcalendarnotes_range_case_bool 
    \tl_set:Nn \l__tikzcalendarnotes_msg_submodule_tl 
      {range not set}

    \__tikzcalendarnotes_select_dataset:n {#1}
    \keys_set:nn 
      {tikzcalendarnotes / range set}
      {#2}   
  }



\NewDocumentCommand{\setcountingweeks}{O{default}m}
  {
    \__tikzcalendarnotes_reset_defaults:

    \bool_set_true:N \l__tikzcalendarnotes_cntweek_case_bool 
    \tl_set:Nn \l__tikzcalendarnotes_msg_submodule_tl 
      {range not set}

    \__tikzcalendarnotes_select_dataset:n {#1}
    \keys_set:nn 
      {tikzcalendarnotes / cnt week set}
      {#2}   

   \bool_if:nT 
    {\l__tikzcalendarnotes_from_set_flag_bool && \l__tikzcalendarnotes_to_set_flag_bool}
    {
      \__tikzcalendarnotes_try_insert_cntweek:ee {\l__tikzcalendarnotes_from_key_tl}{\l__tikzcalendarnotes_to_key_tl}  
    }   
  }

\NewDocumentCommand{\suppresscounting}{O{default}m}
  {
     \__tikzcalendarnotes_reset_defaults:
    \bool_set_true:N \l__tikzcalendarnotes_nocntweek_case_bool 
      %{\c_true_bool}  
    \tl_set:Nn \l__tikzcalendarnotes_msg_submodule_tl 
      {range not set}

    \__tikzcalendarnotes_select_dataset:n {#1}
    \keys_set:nn 
      {tikzcalendarnotes / no cnt week set}
      {#2}   

   \bool_if:nT 
    {\l__tikzcalendarnotes_from_set_flag_bool && \l__tikzcalendarnotes_to_set_flag_bool}
    {
      \__tikzcalendarnotes_try_insert_no_cntweek:ee {\l__tikzcalendarnotes_from_key_tl}{\l__tikzcalendarnotes_to_key_tl}  
    }
  }


\cs_new_protected:Npn \__tikzcalendarnotes_prepare_style:nn #1#2
  {

    \pgfkeys{tikz , #1}

    \__tikzcalendarnotes_set_dim_constants:
    
    \keys_set:nn
      {tikzcalendarnotes}
      {defaults , #2}
      
    \tl_set:Ne \l__tikzcalendarnotes_begin_iso_tl 
      {
        \l__tikzcalendarnotes_year_key_tl -
        \l__tikzcalendarnotes_starting_at_key_tl - 01
      }
      
  }


\NewDocumentCommand{\calendarnotesprepare}{O{}m}
  {
    \__tikzcalendarnotes_prepare_style:nn 
      {#1}{#2}
  }

\NewDocumentCommand{\calendarnotessetifs}{}
  {
    \__tikzcalendarnotes_set_ifdates:e 
      {\l__tikzcalendarnotes_dataset_key_tl}
  }

\NewDocumentCommand{\calendarnotesdraw}{}
  {
    \__tikzcalendarnotes_draw_notes:e 
      {\l__tikzcalendarnotes_dataset_key_tl}
  }
  
\NewDocumentCommand{\calendarnotesmatrix}{}
  {
    \matrix[column~ sep=\l__tikzcalendarnotes_inter_month_space_key_tl pt, 
            row~ sep=0.7*\l__tikzcalendarnotes_inter_month_space_key_tl pt] 
      {
        \__tikzcalendarnotes_month_matrix:nnnn
          {\l__tikzcalendarnotes_year_key_tl}
          {\l__tikzcalendarnotes_starting_at_key_tl}
          {\l__tikzcalendarnotes_nmonths_key_tl}
          {\l__tikzcalendarnotes_perline_key_tl} 
      } ;
  }  
  
\NewDocumentCommand{\calendarnotes}{O{}m}
  {
    \__tikzcalendarnotes_prepare_style:nn {#1}{#2}
    
    \__tikzcalendarnotes_set_ifdates:e 
      {\l__tikzcalendarnotes_dataset_key_tl}

    \matrix[column~ sep=\l__tikzcalendarnotes_inter_month_space_key_tl pt, 
            row~ sep=0.7*\l__tikzcalendarnotes_inter_month_space_key_tl pt] 
      {
        \__tikzcalendarnotes_month_matrix:nnnn
          {\l__tikzcalendarnotes_year_key_tl}
          {\l__tikzcalendarnotes_starting_at_key_tl}
          {\l__tikzcalendarnotes_nmonths_key_tl}
          {\l__tikzcalendarnotes_perline_key_tl} 
      } ;
      
    \__tikzcalendarnotes_draw_notes:e 
      {\l__tikzcalendarnotes_dataset_key_tl}

  }


%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%
%%
%%
%%
%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%



\cs_new_protected:Npn \__tikzcalendarnotes_test_jan_first: 
  {
    \int_compare:nNnT {\pgfcalendarifdateday} = {1}
      {
        \int_compare:nNnT {\pgfcalendarifdatemonth} = {1}
          { \pgfcalendarmatchestrue }
      }
  }


\cs_new_protected:Npn \__tikzcalendarnotes_test_year_start: 
  {
    \bool_if:NTF \g__tikzcalendarnotes_firstdraw_bool
      { 
        \bool_gset_false:N \g__tikzcalendarnotes_firstdraw_bool 
        \pgfcalendarmatchestrue 
      }
      { \__tikzcalendarnotes_test_jan_first: }
  }


\cs_new_protected:Npn \__tikzcalendarnotes_test_week_start_or_first:n #1
  {
    \bool_lazy_or:nnTF 
      {
        \int_compare_p:nNn {\pgfcalendarifdateweekday} = {#1}
      } 
      {
        \int_compare_p:nNn {\pgfcalendarifdateday} = {1}
      }
      { \pgfcalendarmatchestrue }
      {}
  }


\cs_generate_variant:Nn \str_range:nnn {enn}

\cs_new_protected:Npn \__tikzcalendarnotes_set_day_acro:NNn #1#2#3
  {
    \int_set:Nn \l_tmpa_int {#3}
    \int_sub:Nn \l_tmpa_int {\l__tikzcalendarnotes_weeklist_delta_int}
    \int_compare:nNnT {\l_tmpa_int} < {0}
      {
        \int_add:Nn \l_tmpa_int {7}
      }   
    \tl_set:Ne #1 {\str_range:enn {\pgfcalendarweekdayname{\int_use:N \l_tmpa_int}}{1}{2}}
    \int_compare:nNnTF {\l_tmpa_int} > {4}
      {
        \int_compare:nNnTF {\l_tmpa_int} = {5}
          {
            \tl_set:Nn #2 {@calnotes@saturday~ fmt}
          }
          {
            \tl_set:Nn #2 {@calnotes@sunday~ fmt}
          }
      }
      {
        \tl_set:Nn #2 {}
      }
  }


\cs_new_protected:Npn \__tikzcalendarnotes_weeklist_set:nnnn #1#2#3#4
  {
    \int_set:Nn \l__tikzcalendarnotes_weeklist_delta_int {#1}
    \tl_set:Nn \l__tikzcalendarnotes_weeklist_starts_on_tl {#2}
    \tl_set:Nn \l__tikzcalendarnotes_weeklist_ends_on_tl {#3}
    \int_set:Nn \l__tikzcalendarnotes_weeklist_starts_on_int {#4}
    
    \__tikzcalendarnotes_set_day_acro:NNn \l__tikzcalendarnotes_day_A_tl \l__tikzcalendarnotes_day_A_style_tl {0}
    \__tikzcalendarnotes_set_day_acro:NNn \l__tikzcalendarnotes_day_B_tl \l__tikzcalendarnotes_day_B_style_tl {1}
    \__tikzcalendarnotes_set_day_acro:NNn \l__tikzcalendarnotes_day_C_tl \l__tikzcalendarnotes_day_C_style_tl {2}
    \__tikzcalendarnotes_set_day_acro:NNn \l__tikzcalendarnotes_day_D_tl \l__tikzcalendarnotes_day_D_style_tl {3}
    \__tikzcalendarnotes_set_day_acro:NNn \l__tikzcalendarnotes_day_E_tl \l__tikzcalendarnotes_day_E_style_tl {4}
    \__tikzcalendarnotes_set_day_acro:NNn \l__tikzcalendarnotes_day_F_tl \l__tikzcalendarnotes_day_F_style_tl {5}
    \__tikzcalendarnotes_set_day_acro:NNn \l__tikzcalendarnotes_day_G_tl \l__tikzcalendarnotes_day_G_style_tl {6}

  }

%
% make at letter needed due the many pfg variables/constants at use.
%
\makeatletter


\cs_new_protected:Npn \__tikzcalendarnotes_drawyear:
  {
    \pgftransformxshift{-\tikz@lib@cal@xshift}
    \tikzyearcode  % \tikzyearcode is defined by default
    \pgftransformxshift{\tikz@lib@cal@xshift}
  }

\cs_new_protected:Npn \__tikzcalendarnotes_day_xshift:
  {
    \int_set:Nn \l_tmpa_int {\pgfcalendarcurrentweekday + \l__tikzcalendarnotes_weeklist_delta_int}
    \int_compare:nNnT {\l_tmpa_int} > {6}
      { \int_sub:Nn \l_tmpa_int {7} }
    \pgftransformxshift{ \int_use:N\l_tmpa_int * \tikz@lib@cal@xshift }
  }


\cs_new_protected:Npn \__tikzcalendarnodes_daynames_draw:
  {
    \begin{scope}
    \node[every~ day,every~ day~ name,\l__tikzcalendarnotes_day_A_style_tl]{\l__tikzcalendarnotes_day_A_tl};
    \pgftransformxshift{ \tikz@lib@cal@xshift }
    \node[every~ day,every~ day~ name,\l__tikzcalendarnotes_day_B_style_tl]{\l__tikzcalendarnotes_day_B_tl};
    \pgftransformxshift{ \tikz@lib@cal@xshift }
    \node[every~ day,every~ day~ name,\l__tikzcalendarnotes_day_C_style_tl]{\l__tikzcalendarnotes_day_C_tl};
    \pgftransformxshift{ \tikz@lib@cal@xshift }
    \node[every~ day,every~ day~ name,\l__tikzcalendarnotes_day_D_style_tl]{\l__tikzcalendarnotes_day_D_tl};
    \pgftransformxshift{ \tikz@lib@cal@xshift }
    \node[every~ day,every~ day~ name,\l__tikzcalendarnotes_day_E_style_tl]{\l__tikzcalendarnotes_day_E_tl};
    \pgftransformxshift{ \tikz@lib@cal@xshift }
    \node[every~ day,every~ day~ name,\l__tikzcalendarnotes_day_F_style_tl]{\l__tikzcalendarnotes_day_F_tl};
    \pgftransformxshift{ \tikz@lib@cal@xshift }
    \node[every~ day,every~ day~ name,\l__tikzcalendarnotes_day_G_style_tl]{\l__tikzcalendarnotes_day_G_tl};
    \end{scope}
    \pgftransformyshift{ -0.85*\tikz@lib@cal@yshift}
  }


\pgfkeys{tikz , 
	calendar~ notes/.style =
    {
  		remember~ picture , 
  		every~ calendar/.style =
        { week~ starts~ on~ x } ,
      month~ text = {\%mt} ,
      every~ month/.style =
        {
          font = \bfseries\itshape ,
        } ,
      day~ text = 
        { \%d0 } ,
  	} , 
  }
  
\pgfkeys{tikz , 
    % 'execute before day scope' is cumulative. 'new style' needed to fully change calendar's behaviour
  day~ names~ on~ top/.style =
    {
     	week~ starts~ on~ x/.append~ style =
        {
          execute~ before~ day~ scope =
            {
              \ifdate{ day~ of~ month = 1 }
                { \__tikzcalendarnodes_daynames_draw: }
                {}
            } ,
        } ,
    } ,
  every~ day~ name/.style =
    {
      font = {\scriptsize\itshape}
    } ,
  }
  
\pgfkeys{tikz , 
	week~ starts~ on~ x/.style =
    {
      execute~ before~ day~ scope =
        {
    			\ifdate{ day~ of~ month = 1 }
            { % On first of month , except when first date in calendar.
      				\ifdate{ equals = \pgfcalendarbeginiso }
                {}
                { \pgftransformyshift{ -\tikz@lib@cal@month@yshift } }
    			  }
            {}
        } , 
        % glancing from the source code.
      tikz@lib@cal@width = 7 , 
      %
      execute~ at~ begin~ day~ scope =
        { \__tikzcalendarnotes_day_xshift: } , 
      execute~ after~ day~ scope =
        {      % shift to the next line , if end of weeklist
          \ifdate{ \l__tikzcalendarnotes_weeklist_ends_on_tl }
            { \pgftransformyshift{ -\tikz@lib@cal@yshift } }
            {}
        } , 
    } , 
    %
    %
  week~ starts~ monday/.code =
    {
      \__tikzcalendarnotes_weeklist_set:nnnn{0}{Monday}{Sunday}{0}
    } ,
  week~ starts~ sunday/.code =
    {
      \__tikzcalendarnotes_weeklist_set:nnnn{1}{Sunday}{Saturday}{6}
    } ,
  week~ starts~ sunday ,
    %
  }
  
\pgfkeys{tikz , 
  @calnotes@sunday~ fmt/.style = 
    {} ,
    %
  every~ sunday/.style = 
    {
      every~ calendar/.append~ style =
        {
          if = {(Sunday)~ [#1]}
        } ,
      @calnotes@sunday~ fmt/.append~ style = {#1} ,
    } ,
    %
  @calnotes@saturday~ fmt/.style =
    {} ,
    %
  every~ weekend/.style = 
    {
      every~ calendar/.append~ style =
        {
          if = {(weekend)~ [#1]}
        } ,
      @calnotes@saturday~ fmt/.append~ style = {#1} ,
      @calnotes@sunday~ fmt/.append~ style = {#1} ,
    } ,
  }
  
  

\pgfkeys{tikz , 
    % hidden style for drawing the year , 
    % it draws it for January and "first month drawn" (which depends on a _bool variable)
	/pgf/calendar/@calnotes@start~ @of~ @year/.code =
    { \__tikzcalendarnotes_test_year_start: } , 
    %
   
  @calnotes@set~ firstdraw~ flag~ @true/.code =
    {
      \bool_gset_true:N \g__tikzcalendarnotes_firstdraw_bool 
          %{\c_true_bool}
    } ,
    
  @calnotes@set~ firstdraw~ flag~ @false/.code =
    {
      \bool_gset_false:N \g__tikzcalendarnotes_firstdraw_bool 
          %{\c_false_bool}
    } ,
    
  @calnotes@set~ year~ policy~ true@/.code =
    {
      \bool_set_true:N \l__tikzcalendarnotes_year_policy_set_bool
    } ,
    
  @calnotes@set~ year~ policy~ if~ not~ set@/.code =
    {
      \bool_if:NF \l__tikzcalendarnotes_year_policy_set_bool
        {
          \bool_set_true:N \l__tikzcalendarnotes_year_policy_set_bool
          \pgfkeys{tikz,year~ label~ by~ january~ and~ start}
        }
    } ,
    
  @calnotes@set~ year~ label~ true@/.code =
    {
      \bool_set_true:N \l__tikzcalendarnotes_year_label_set_bool
    } ,
    
  @calnotes@set~ year~ label~ if~ not~ set@/.code =
    {
      \bool_if:NF \l__tikzcalendarnotes_year_label_set_bool
        {
          \bool_set_true:N \l__tikzcalendarnotes_year_label_set_bool
          \pgfkeys{tikz,year~ label~ left}
        }
    } ,
    
  year~ label~ by~ january~ and~ start/.style = 
    {
      @calnotes@set~ firstdraw~ flag~ @true ,
      @calnotes@set~ year~ policy~ true@ ,
      @calnotes@set~ year~ label~ if~ not~ set@ ,
      execute~ before~ day~ scope =
        {
          \ifdate{@calnotes@start~ @of~ @year}
            { \__tikzcalendarnotes_drawyear: }
            {}
        } , 
    } ,
    
  year~ label~ by~ january~ only/.style =
    {
      @calnotes@set~ firstdraw~ flag~ @false ,
      @calnotes@set~ year~ policy~ true@ ,
      @calnotes@set~ year~ label~ if~ not~ set@ ,
      execute~ before~ day~ scope =
        {
          \ifdate{@calnotes@start~ @of~ @year}
            { \__tikzcalendarnotes_drawyear: }
            {}
        } , 
    } ,
    
    % Style forcing an year label.
	year~ label~ every~ month/.style=
    {
      @calnotes@set~ year~ policy~ true@ ,
      @calnotes@set~ year~ label~ if~ not~ set@ ,
  		execute~ before~ day~ scope =
        {
  			  \ifdate{day~ of~ month = 1}
            { \__tikzcalendarnotes_drawyear: }
            {}
        }
    } , 
  
	year~ label~ left/.style =
    {
      @calnotes@set~ year~ label~ true@ ,
      @calnotes@set~ year~ policy~ if~ not~ set@ ,
      every~ year/.append~ style =
        { 
          anchor = north~ east ,
        } , 
  	} , 
  
	year~ label~ left~ vertical/.style =
    {
      @calnotes@set~ year~ label~ true@ ,
      @calnotes@set~ year~ policy~ if~ not~ set@ ,
      every~ year/.append~ style =
        { 
          anchor = south ,
          rotate = 90 ,
        } , 
  	} , 
    
	year~ label~ left~ corner/.style =
    {
      @calnotes@set~ year~ label~ true@ ,
      @calnotes@set~ year~ policy~ if~ not~ set@ ,
      every~ year/.append~ style =
        { 
          anchor = south ,
          rotate = 45 ,
        } , 
  	} , 
  
  every~ year/.style = 
    { font = \Large\sffamily\bfseries, green!50!black } ,
  }
  
\pgfkeys{tikz , 
  every~ mark/.style =
    { thin , gray } ,
  every~ remark/.style =
    { 
      font = 
        \fontsize{3.5}{4.2}
        \selectfont 
    } ,    
  every~ counter/.style =
    {
      every~ remark
    } ,
  keep~ counters/.code =
    {
      \bool_set_true:N \l__tikzcalendarnotes_keep_counters_pgfkey_bool
    } ,
  @calnotes@note@fontsize/.code = 
    {
      \tl_set:Nn \l__tikzcalendarnotes_notes_fontsize_pgfkey_tl {#1}
    } ,
  every~ note/.style =
    { 
      font = 
        \fontsize{4.5}{4.95}
        \selectfont 
    } ,    
  @calnotes@note@fontsize = 4.5 ,
  remarks~ font size/.style =
    {
      every~ remark/.append~ style =
        {
          font = 
            \fontsize{#1}{\fp_eval:n {1.1*#1}}
            \selectfont 
        }
    } ,
  remarks~ font size/.value~ required ,
  %
  notes~ font size/.style =
    {
      @calnotes@note@fontsize = {#1} ,
      every~ note/.append~ style =
        {
          font = 
            \fontsize{#1}{\fp_eval:n {1.1*#1}}
            \selectfont 
        }
    } ,
  notes~ font size/.value~ required ,
  %
  }
  
\pgfkeys{tikz , 
  Xshift~ adjust/.code =
    {
      \tl_set:Nn \l__tikzcalendarnotes_remark_Xshift_adj_pgfkey_tl {#1 pt}
    } ,
  Xshift~ adjust/.value~ required ,
  %
  Yshift~ adjust/.code =
    {
      \tl_set:Nn \l__tikzcalendarnotes_remark_Yshift_adj_pgfkey_tl {#1 pt}
    } ,
  Yshift~ adjust/.value~ required ,
  %
  radius~ adjust/.code =
    {
      \tl_set:Nn \l__tikzcalendarnotes_radius_adj_pgfkey_tl {#1 pt}
    } ,
  radius~ adjust/.value~ required ,
  %
  radius~ adjust = 0,
  Xshift~ adjust = 0,
  Yshift~ adjust = 0,
 }