X-Git-Url: http://wagnertech.de/git?p=kivitendo-erp.git;a=blobdiff_plain;f=templates%2Fprint%2Fmarei%2Fkiviletter.sty;fp=templates%2Fprint%2Fmarei%2Fkiviletter.sty;h=79b33a81880c80c5fba60bdaccbada3251b28380;hp=90ccaff513416da07cb54da11d9532c44dbf6a85;hb=b293ff8ad52fc76ba0c44783e3982418114d6b08;hpb=d4925a8b60f04674885e30d9316dc0263f8b9a84 diff --git a/templates/print/marei/kiviletter.sty b/templates/print/marei/kiviletter.sty index 90ccaff51..79b33a818 100644 --- a/templates/print/marei/kiviletter.sty +++ b/templates/print/marei/kiviletter.sty @@ -1,48 +1,57 @@ \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{kiviletter}[2020/04/24 Letter Layouts for Kivitendo] +\ProvidesPackage{kiviletter}[2022/04/23 Letter Layouts for Kivitendo] -\newif\if@kivi@infobox -\newif\if@kivi@footer -\DeclareOption{reffields}{\@kivi@infoboxfalse} -\DeclareOption{infobox}{\@kivi@infoboxtrue} -\DeclareOption{nofooter}{\@kivi@footerfalse} -\DeclareOption{footer}{\@kivi@footertrue} -\@kivi@infoboxtrue -\@kivi@footertrue +\RequirePackage{l3keys2e} -\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{scrletter}} +%Optionen vor den eigenen Paketoptionen hinzufügen, damit spätere diese ggf. überschreiben +\PassOptionsToPackage{ + fromlogo, + fromalign=right, + firstfoot=false,%Für einheitliche Randeinstellungen + refline=nodate, +}{scrletter} -\ProcessOptions\relax +\ExplSyntaxOn +\newif\if@kivi@infobox +\newif\if@kivi@footer +\keys_define:nn {kiviletter} { + infobox .choices:nn = {true,false} {\use:c {@kivi@infobox\l_keys_choice_tl}}, + infobox .default:n = true, + infobox .initial:n = true, + reffields .meta:n = {infobox=false}, + footer .choices:nn = {true,false} {\use:c {@kivi@footer\l_keys_choice_tl}}, + footer .default:n = true, + footer .initial:n = true, + nofooter .meta:n = {footer=false}, + unknown .code:n = \PassOptionsToPackage{\l_keys_key_str=#1}{scrletter}, +} +\ExplSyntaxOff +\ProcessKeysOptions{kiviletter} -\RequirePackage{expl3} \RequirePackage{xparse} \RequirePackage{iftex} -\KOMAoptions{fontsize=12pt} + % Schriftart, Eingabelayout der Tastatur \ifPDFTeX - \RequirePackage[utf8]{inputenc}% Nur notwendig, wenn Basis älter als TL2018 - \RequirePackage[T1]{fontenc} - \RequirePackage{lmodern} + \RequirePackage[utf8]{inputenc}% Nur notwendig, wenn Basis älter als TL2018 + \RequirePackage[T1]{fontenc} + \RequirePackage{lmodern} - \RequirePackage{eurosym} - \DeclareUnicodeCharacter{20AC}{\euro} + \RequirePackage{eurosym} + \DeclareUnicodeCharacter{20AC}{\euro} \else - \RequirePackage{fontspec} + \RequirePackage{fontspec} \fi \RequirePackage{xltabular} \RequirePackage{booktabs} \RequirePackage{graphicx} - - -\RequirePackage[fromlogo,fromalign=right, - firstfoot=false,%Für einheitliche Randeinstellungen - refline=nodate, - ]{scrletter} +\RequirePackage{scrletter} \LoadLetterOption{DIN} +\newkomavar{taxpoint} \newkomavar{transaction} \newkomavar[\lieferschein{}~\nr]{delivery} \newkomavar[\angebot{}~\nr]{quote} @@ -71,10 +80,10 @@ \DeclareNewLayer[ -foreground, -hoffset=\useplength{toaddrhpos}, -voffset=\dimexpr\useplength{toaddrvpos}+\useplength{toaddrheight}+4\baselineskip,%sep to shippingaddressbox -contents={\usebox\shippingAddressBox} + foreground, + hoffset=\useplength{toaddrhpos}, + voffset=\dimexpr\useplength{toaddrvpos}+\useplength{toaddrheight}+4\baselineskip,%sep to shippingaddressbox + contents={\usebox\shippingAddressBox} ]{kivitendo.shippingaddress} \newpairofpagestyles{kivitendo.letter}{} @@ -82,17 +91,17 @@ contents={\usebox\shippingAddressBox} \renewcommand*{\letterpagestyle}{kivitendo.letter} \DeclareNewPageStyleByLayers{kivitendo.letter.first}{ - kivitendo.shippingaddress, - plain.kivitendo.letter.head.odd,plain.kivitendo.letter.head.even,plain.kivitendo.letter.head.oneside,% - plain.kivitendo.letter.foot.odd,plain.kivitendo.letter.foot.even,plain.kivitendo.letter.foot.oneside,% + kivitendo.shippingaddress, + plain.kivitendo.letter.head.odd,plain.kivitendo.letter.head.even,plain.kivitendo.letter.head.oneside,% + plain.kivitendo.letter.foot.odd,plain.kivitendo.letter.foot.even,plain.kivitendo.letter.foot.oneside,% } \setkomavar{backaddress}{\firma\ $\cdot$ \strasse\ $\cdot$ \ort} \setkomavar{firsthead}{ - \if@logo - \rlap{\usekomavar{fromlogo}}% - \fi + \if@logo + \rlap{\usekomavar{fromlogo}}% + \fi } \@setplength{locwidth}{6cm} @@ -103,101 +112,107 @@ contents={\usebox\shippingAddressBox} \cs_new:Nn \__kivi_set_colwidth:nn { - \dim_set:cn {l_kivi_tab_#1_dim} {#2} + \dim_set:cn {l_kivi_tab_#1_dim} {#2} } \cs_new:Nn \__kivi_initialize_columns: { - \clist_map_inline:Nn \g_kivi_pricingtable_col_clist { - \bool_if_exist:cF {l_kivi_col_##1_bool} - { - \bool_new:c {l_kivi_col_##1_bool} - \dim_new:c {l_kivi_tab_##1_dim} - \keys_define:nn {kivi/PricingTable} { - ##1 .choice:, - ##1 / true .code:n = \bool_set_true:c {l_kivi_col_##1_bool}, - ##1 / false .code:n = \bool_set_false:c {l_kivi_col_##1_bool}, - ##1 / unknown .code:n = { - \bool_set_true:c {l_kivi_col_##1_bool} - \dim_set:cn {l_kivi_tab_##1_dim} {####1} - }, - ##1 .default:n = true, - ##1 .initial:n = true, - ##1 / header .prop_put:c = {l_kivi_col_##1_prop}, - ##1 / colspec .prop_put:c = {l_kivi_col_##1_prop}, - } - } - } + \clist_map_inline:Nn \g_kivi_pricingtable_col_clist { + \bool_if_exist:cF {l_kivi_col_##1_bool} + { + \bool_new:c {l_kivi_col_##1_bool} + \dim_new:c {l_kivi_tab_##1_dim} + \keys_define:nn {kivi/PricingTable} { + ##1 .choice:, + ##1 / true .code:n = \bool_set_true:c {l_kivi_col_##1_bool}, + ##1 / false .code:n = \bool_set_false:c {l_kivi_col_##1_bool}, + ##1 / unknown .code:n = { + \bool_set_true:c {l_kivi_col_##1_bool} + \dim_set:cn {l_kivi_tab_##1_dim} {####1} + }, + ##1 .default:n = true, + ##1 .initial:n = true, + ##1 / header .prop_put:c = {l_kivi_col_##1_prop}, + ##1 / colspec .prop_put:c = {l_kivi_col_##1_prop}, + } + } + } } \clist_new:N \g_kivi_pricingtable_col_clist \keys_define:nn {kivi/PricingTable} { - columns .code:n = - \clist_gset:Nn \g_kivi_pricingtable_col_clist {#1} - \__kivi_initialize_columns:, - columns .initial:n = {pos, id, desc, amount, price, pricetotal}, + columns .code:n = + \clist_gset:Nn \g_kivi_pricingtable_col_clist {#1} + \__kivi_initialize_columns:, + columns .initial:n = {pos, id, desc, amount, price, pricetotal}, + unknown .code:n = \keys_set:no {kivi/Tabular} {\l_keys_key_str=#1} } % set default values for colwidth \keys_set:nn {kivi/PricingTable} { - pos=5ex, - id=4em, - amount=5em, - price=7em, - pricetotal=7em, -% desc=auto, - pos/header=\position, - id/header=\artikelnummer, - desc/header=\bezeichnung, - amount/header=\menge, - price/header=\einzelpreis, - pricetotal/header=\gesamtpreis, - price / colspec = Price, - pricetotal / colspec = Price , + pos=5ex, + id=4em, + amount=5em, + price=7em, + pricetotal=7em, + % desc=auto, + pos/header=\position, + id/header=\artikelnummer, + desc/header=\bezeichnung, + amount/header=\menge, + price/header=\einzelpreis, + pricetotal/header=\gesamtpreis, + price / colspec = Price, + pricetotal / colspec = Price , } \dim_new:N \g_kivi_tabcolsep_dim \dim_gset:Nn \g_kivi_tabcolsep_dim {.5\tabcolsep} +\setlength\tabcolsep{.5\tabcolsep} \prg_new_conditional:Nnn \kivi_if_Price_col:n {T} { - \prop_get:cnN {l_kivi_col_#1_prop} {colspec} \l_tmpa_tl - \exp_args:NV \tl_if_eq:nnTF \l_tmpa_tl {Price} - {\prg_return_true:} - {\prg_return_false:} + \prop_get:cnN {l_kivi_col_#1_prop} {colspec} \l_tmpa_tl + \exp_args:NV \tl_if_eq:nnTF \l_tmpa_tl {Price} + {\prg_return_true:} + {\prg_return_false:} } \cs_new:Nn \__kivi_calc_desc_column: { - \dim_zero:N \l_kivi_tab_desc_leftskip_dim - \dim_zero:N \l_kivi_tab_desc_dim - \bool_set_false:N \l_tmpa_bool - \tl_gclear:N \g_kivi_Pricing_colspec_tl - \clist_map_inline:Nn \g_kivi_pricingtable_col_clist { - \tl_if_eq:nnTF {##1} {desc} { - \dim_set:Nn \l_kivi_tab_desc_dim { - \textwidth-\l_kivi_tab_desc_leftskip_dim - } - \bool_set_true:N \l_tmpa_bool - \tl_gput_right:Nn \g_kivi_Pricing_colspec_tl {p{\l_kivi_tab_desc_dim}} - }{ - \bool_if:cT {l_kivi_col_##1_bool} { - \bool_if:NTF \l_tmpa_bool { - \dim_sub:Nn \l_kivi_tab_desc_dim { - \dim_use:c {l_kivi_tab_##1_dim}+2\g_kivi_tabcolsep_dim - } - }{ - \dim_add:Nn \l_kivi_tab_desc_leftskip_dim { - \dim_use:c {l_kivi_tab_##1_dim}+2\g_kivi_tabcolsep_dim - } - } - \tl_gput_right:Nn \g_kivi_Pricing_colspec_tl {K{\dim_use:c {l_kivi_tab_##1_dim}}} - \kivi_if_Price_col:nT {##1} {\tl_gput_right:Nn \g_kivi_Pricing_colspec_tl {<{\__kivi_tab_column_currency:}}} - } - } - } - \tl_gput_left:Nn \g_kivi_Pricing_colspec_tl {@{}} - \tl_gput_right:Nn \g_kivi_Pricing_colspec_tl {@{}} + \bool_if:NTF \g__kivi_Tabular_rowcolor_bool + {\dim_set:Nn \l_kivi_tab_desc_leftskip_dim {2\g_kivi_tabcolsep_dim}} + {\dim_zero:N \l_kivi_tab_desc_leftskip_dim} + \dim_zero:N \l_kivi_tab_desc_dim + \bool_set_false:N \l_tmpa_bool + \tl_gclear:N \g_kivi_Pricing_colspec_tl + \clist_map_inline:Nn \g_kivi_pricingtable_col_clist { + \tl_if_eq:nnTF {##1} {desc} { + \dim_set:Nn \l_kivi_tab_desc_dim { + \textwidth-\l_kivi_tab_desc_leftskip_dim + } + \bool_set_true:N \l_tmpa_bool + \tl_gput_right:Nn \g_kivi_Pricing_colspec_tl {p{\l_kivi_tab_desc_dim}} + }{ + \bool_if:cT {l_kivi_col_##1_bool} { + \bool_if:NTF \l_tmpa_bool { + \dim_sub:Nn \l_kivi_tab_desc_dim { + \dim_use:c {l_kivi_tab_##1_dim}+2\g_kivi_tabcolsep_dim + } + }{ + \dim_add:Nn \l_kivi_tab_desc_leftskip_dim { + \dim_use:c {l_kivi_tab_##1_dim}+2\g_kivi_tabcolsep_dim + } + } + \tl_gput_right:Nn \g_kivi_Pricing_colspec_tl {K{\dim_use:c {l_kivi_tab_##1_dim}}} + \kivi_if_Price_col:nT {##1} {\tl_gput_right:Nn \g_kivi_Pricing_colspec_tl {<{\__kivi_tab_column_currency:}}} + } + } + } + \bool_if:NF \g__kivi_Tabular_rowcolor_bool { + \tl_gput_left:Nn \g_kivi_Pricing_colspec_tl {@{}} + \tl_gput_right:Nn \g_kivi_Pricing_colspec_tl {@{}} + } } \newcolumntype{K}[1]{>{\raggedleft\arraybackslash}p{#1}} @@ -207,101 +222,145 @@ contents={\usebox\shippingAddressBox} \tcbuselibrary{breakable, skins} \tcb@new@skin{kivi@LT}{base@unbroken,% - frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,% - skin~first=kivi@LT@first,skin~middle=kivi@LT@middle,skin~last=kivi@LT@last, - underlay~first~and~middle={ - \node[anchor=north] at (interior.north) {\csname box_use:c\endcsname {g_kivi_LT@head_box}}; - \node[anchor=south] at (interior.south) {\csname box_use:c\endcsname {g_kivi_LT@foot_box}}; - }, - underlay~unbroken~and~last={ - \node[anchor=north] at (interior.north) {\csname box_use:c\endcsname {g_kivi_LT@head_box}}; - \node[anchor=south] at (interior.south) {\csname box_use:c\endcsname {g_kivi_LT@lastfoot_box}}; - }, - boxsep=0pt, - boxrule=0pt, - left=0pt, - right=0pt, - bottom=\box_ht:N \g_kivi_LT@foot_box+\box_dp:N \g_kivi_LT@foot_box + \aboverulesep, - top=\box_ht:N \g_kivi_LT@head_box+\box_dp:N \g_kivi_LT@head_box +\belowrulesep, - parbox=false, + frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,% + skin~first=kivi@LT@first,skin~middle=kivi@LT@middle,skin~last=kivi@LT@last, + underlay~first~and~middle={ + \node[anchor=north] at (interior.north) {\csname box_use:c\endcsname {g_kivi_LT@head_box}}; + \node[anchor=south] at (interior.south) {\csname box_use:c\endcsname {g_kivi_LT@foot_box}}; +}, + underlay~unbroken~and~last={ + \node[anchor=north] at (interior.north) {\csname box_use:c\endcsname {g_kivi_LT@head_box}}; + \node[anchor=south] at (interior.south) {\csname box_use:c\endcsname {g_kivi_LT@lastfoot_box}}; + }, + boxsep=0pt, + boxrule=0pt, + left=0pt, + right=0pt, + bottom=\box_ht:N \g_kivi_LT@foot_box+\box_dp:N \g_kivi_LT@foot_box + \aboverulesep, + top=\box_ht:N \g_kivi_LT@head_box+\box_dp:N \g_kivi_LT@head_box +\belowrulesep, + parbox=false, } \tcb@new@skin{kivi@LT@first}{base@first,% - frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,% - skin~first=kivi@LT@first,skin~middle=kivi@LT@middle,skin~last=kivi@LT@middle, + frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,% + skin~first=kivi@LT@first,skin~middle=kivi@LT@middle,skin~last=kivi@LT@middle, } \tcb@new@skin{kivi@LT@middle}{base@middle,% - frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,% - skin~first=kivi@LT@middle,skin~middle=kivi@LT@middle,skin~last=kivi@LT@middle, + frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,% + skin~first=kivi@LT@middle,skin~middle=kivi@LT@middle,skin~last=kivi@LT@middle, } \tcb@new@skin{kivi@LT@last}{base@last,% - frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,% - skin~first=kivi@LT@middle,skin~middle=kivi@LT@middle,skin~last=kivi@LT@last, + frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,% + skin~first=kivi@LT@middle,skin~middle=kivi@LT@middle,skin~last=kivi@LT@last, } \tcbset{kivi@LT/.style={skin=kivi@LT}}% - - \seq_new:N \l_kivi_PricingTable_seq \seq_new:N \l_kivi_columns_seq \seq_new:N \g_kivi_extraDescription_seq + +\int_new:N \g__kivi_PricingTable_rowcolor_int +\dim_new:N \l__kivi_fboxsep_dim +\dim_set:Nn \l__kivi_fboxsep_dim {\g_kivi_tabcolsep_dim} + +%colorbox variant to only add vertical spacing +%based on colorbox definition from xcolor.sty +%% ---------------------------------------------------------------- +%% Copyright (C) 2003-2016 by Dr. Uwe Kern +%% ---------------------------------------------------------------- +%% This variant of colorbox adds a space of \l__kivi_fboxsep_dim along the vertical axes but no horizontal space +\def\kivi@tabcolorbox#1#{\protect\kivi@tabcolor@box{#1}} + +\def\kivi@tabcolor@box#1#2{ + \tl_if_empty:oTF {#2} + \kivi@nocolor@b@x + \kivi@color@b@x + \relax{\color#1{#2}} +} +\long\def\kivi@color@b@x#1#2#3% +{\leavevmode + \setbox\z@\hbox{{\set@color#3}}% + \dimen@\ht\z@\advance\dimen@\l__kivi_fboxsep_dim\ht\z@\dimen@ + \dimen@\dp\z@\advance\dimen@\l__kivi_fboxsep_dim\dp\z@\dimen@ + {#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@}}} + +\long\def\kivi@nocolor@b@x#1#2#3% +{\leavevmode + \setbox\z@\hbox{#3}% + \dimen@\ht\z@\advance\dimen@\l__kivi_fboxsep_dim\ht\z@\dimen@ + \dimen@\dp\z@\advance\dimen@\l__kivi_fboxsep_dim\dp\z@\dimen@ + {\box\z@}} + +%%% + + \newcommand{\FakeTable}[1]{ - \par - \seq_set_split:Nnn \l_kivi_PricingTable_seq {\tabularnewline} {#1} - \seq_remove_all:Nn \l_kivi_PricingTable_seq {} - \begingroup - \setlength{\parskip}{\c_zero_dim} - \let\ExtraDescription\__kivi_addExtraDescription:n - \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim} - \seq_map_inline:Nn \l_kivi_PricingTable_seq { - \seq_set_split:Nnn \l_kivi_columns_seq {&} {##1} - \seq_gclear:N \g_kivi_extraDescription_seq - \exp_args:Nnx \use:n {\tabular[t]}\g_kivi_Pricing_colspec_tl - \seq_pop_left:NN \__l_FakeTable_columns_seq \l_tmpa_tl - \seq_item:Nn \l_kivi_columns_seq {\l_tmpa_tl} - \seq_map_inline:Nn \__l_FakeTable_columns_seq { - &\seq_item:Nn \l_kivi_columns_seq {####1} - } - \endtabular - \seq_if_empty:NTF \g_kivi_extraDescription_seq - {\par} - {\par\nopagebreak - \begingroup - \setlength{\hsize}{\dimexpr\l_kivi_tab_desc_dim+\l_kivi_tab_desc_leftskip_dim} - \setlength{\leftskip}{\l_kivi_tab_desc_leftskip_dim} - \usekomafont{extraDescription} - \seq_use:Nn \g_kivi_extraDescription_seq {\\} - \par - \endgroup - } - } - \endgroup + \par + \seq_set_split:Nnn \l_kivi_PricingTable_seq {\tabularnewline} {#1} + \seq_remove_all:Nn \l_kivi_PricingTable_seq {} + \begingroup + \setlength{\parskip}{\c_zero_dim} + \let\ExtraDescription\__kivi_addExtraDescription:n + \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim} + \seq_map_inline:Nn \l_kivi_PricingTable_seq { + \if_mode_horizontal: \par \fi + \bool_if:NT \g__kivi_Tabular_rowcolor_bool { + \int_gincr:N \g__kivi_PricingTable_rowcolor_int + \int_if_odd:nTF {\g__kivi_PricingTable_rowcolor_int} + {\nointerlineskip\kivi@tabcolorbox{\g__kivi_Tabular_rowcolor_odd_tl}} + {\nointerlineskip\kivi@tabcolorbox{\g__kivi_Tabular_rowcolor_even_tl}} + } + {\parbox{\linewidth}{ + \seq_set_split:Nnn \l_kivi_columns_seq {&} {##1} + \seq_gclear:N \g_kivi_extraDescription_seq + \exp_args:Nnx \use:n {\tabular[t]}\g_kivi_Pricing_colspec_tl + \seq_pop_left:NN \__l_FakeTable_columns_seq \l_tmpa_tl + \seq_item:Nn \l_kivi_columns_seq {\l_tmpa_tl} + \seq_map_inline:Nn \__l_FakeTable_columns_seq { + &\seq_item:Nn \l_kivi_columns_seq {####1} + } + \endtabular + \seq_if_empty:NTF \g_kivi_extraDescription_seq + {\par} + {\par\nopagebreak + \begingroup + \setlength{\leftskip}{\dim_eval:n {\bool_if:NT \g__kivi_Tabular_rowcolor_bool {-\tabcolsep} +\l_kivi_tab_desc_leftskip_dim}} + \setlength{\hsize}{\dim_eval:n {\l_kivi_tab_desc_dim+\leftskip}} + \usekomafont{extraDescription} + \seq_use:Nn \g_kivi_extraDescription_seq {\\} + \par + \endgroup + } + }} + } + \endgroup\par + \l__kivi_Tabular_rowsep_tl } \seq_new:N \__l_FakeTable_columns_seq \cs_new:Nn \__kivi_setup_FakeTable: { - \seq_clear:N \__l_FakeTable_columns_seq - \int_zero:N \l_tmpa_int - \clist_map_inline:Nn \g_kivi_pricingtable_col_clist { - \int_incr:N \l_tmpa_int - \bool_if:cT {l_kivi_col_##1_bool} {\seq_put_right:Nx \__l_FakeTable_columns_seq {\int_use:N \l_tmpa_int}} - } + \seq_clear:N \__l_FakeTable_columns_seq + \int_zero:N \l_tmpa_int + \clist_map_inline:Nn \g_kivi_pricingtable_col_clist { + \int_incr:N \l_tmpa_int + \bool_if:cT {l_kivi_col_##1_bool} {\seq_put_right:Nx \__l_FakeTable_columns_seq {\int_use:N \l_tmpa_int}} + } } \tl_new:N \g_kivi_Pricing_colspec_tl \tl_gset:Nn \g_kivi_Pricing_colspec_tl { - @{} - \bool_if:NT \l_kivi_col_pos_bool {p{\l_kivi_tab_pos_dim}} - \bool_if:NT \l_kivi_col_id_bool {p{\l_kivi_tab_id_dim}} - p{\l_kivi_tab_desc_dim} - \bool_if:NT \l_kivi_col_amount_bool {\exp_not:n {>{\raggedleft\arraybackslash}p{\l_kivi_tab_amount_dim}}} - \bool_if:NT \l_kivi_col_price_bool {\exp_not:n {>{\raggedleft\arraybackslash}p{\l_kivi_tab_price_dim}<{\__kivi_tab_column_currency:}}} - \bool_if:NT \l_kivi_col_pricetotal_bool {\exp_not:n {>{\raggedleft\arraybackslash}p{\l_kivi_tab_pricetotal_dim}<{\__kivi_tab_column_currency:}}} - @{} + \bool_if:NF \g__kivi_Tabular_rowcolor_bool {@{}} + \bool_if:NT \l_kivi_col_pos_bool {p{\l_kivi_tab_pos_dim}} + \bool_if:NT \l_kivi_col_id_bool {p{\l_kivi_tab_id_dim}} + p{\l_kivi_tab_desc_dim} + \bool_if:NT \l_kivi_col_amount_bool {\exp_not:n {>{\raggedleft\arraybackslash}p{\l_kivi_tab_amount_dim}}} + \bool_if:NT \l_kivi_col_price_bool {\exp_not:n {>{\raggedleft\arraybackslash}p{\l_kivi_tab_price_dim}<{\__kivi_tab_column_currency:}}} + \bool_if:NT \l_kivi_col_pricetotal_bool {\exp_not:n {>{\raggedleft\arraybackslash}p{\l_kivi_tab_pricetotal_dim}<{\__kivi_tab_column_currency:}}} + \bool_if:NF \g__kivi_Tabular_rowcolor_bool {@{}} } \cs_new_protected:Nn \__kivi_tab_column_currency: {\,\currency} @@ -310,98 +369,132 @@ contents={\usebox\shippingAddressBox} \cs_set_eq:NN \__kivi_tab_column_body_currency: \__kivi_tab_column_currency: \clist_map_inline:nn {head, foot, firsthead, lastfoot} {%TODO reduce - \box_new:c {g_kivi_LT@#1_box} + \box_new:c {g_kivi_LT@#1_box} } \newkomafont{PricingTableHeader}{\bfseries} \cs_new:Nn \__kivi_setup_LT_boxes: { - \__kivi_calc_desc_column: - \hbox_gset:Nn \g_kivi_LT@head_box { - \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim} - \exp_args:Nnx \use:n {\tabular[b]}\g_kivi_Pricing_colspec_tl - \__kivi_PricingTabular_header: - \endtabular - } - \hbox_gset:Nn \g_kivi_LT@foot_box { - \raisebox{\depth}{ - \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}r@{}} - \midrule - \strut\weiteraufnaechsterseite - \end{tabular*} - } - } - \hbox_gset:Nn \g_kivi_LT@lastfoot_box { - \raisebox{\dimexpr\depth+\baselineskip}[0pt][0pt]{ - \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}r@{}} - \bottomrule - \end{tabular*} - } - } + \__kivi_calc_desc_column: + \hbox_gset:Nn \g_kivi_LT@head_box { + \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim} + \bool_if:NT \g__kivi_Tabular_rowcolor_bool {\kivi@tabcolorbox{\g__kivi_Tabular_rowcolor_header_tl}}% + { + \exp_args:Nnx \use:n {\tabular[b]}\g_kivi_Pricing_colspec_tl + \__kivi_PricingTabular_header: + \endtabular + } + } + \hbox_gset:Nn \g_kivi_LT@foot_box { + \begin{tabular*}{\textwidth}[t]{@{\extracolsep{\fill}}r@{\bool_if:NT \g__kivi_Tabular_rowcolor_bool {\hskip\tabcolsep}}} + \bool_if:NTF \g__kivi_Tabular_rowcolor_bool + {\hline\noalign{\vskip1pt}} + \midrule + \strut\weiteraufnaechsterseite + \end{tabular*} + } + \hbox_gset:Nn \g_kivi_LT@lastfoot_box { + \raisebox{\dimexpr\depth+\baselineskip}[0pt][0pt]{ + \begin{tabular*}{\textwidth}{@{\bool_if:NT \g__kivi_Tabular_rowcolor_bool {\hskip\tabcolsep}\extracolsep{\fill}}r@{\bool_if:NT \g__kivi_Tabular_rowcolor_bool {\hskip\tabcolsep}}} + \bool_if:NF \g__kivi_Tabular_rowcolor_bool \bottomrule + \end{tabular*} + } + } } %Macht es sinn hier eine Variante zu machen, in der alle Spalten Belegbar sind? -\newenvironment{PricingTotal}{ - \par\nointerlineskip - \unskip - \tabular[t]{@{}p{\dim_eval:n {\linewidth-\l_kivi_tab_pricetotal_dim-2\tabcolsep}}P{\l_kivi_tab_pricetotal_dim}@{}} - \midrule +\NewDocumentEnvironment{PricingTotal}{+b}{ + \par\nointerlineskip }{ - \endtabular + \bool_if:NT \g__kivi_Tabular_rowcolor_bool {\nointerlineskip\kivi@tabcolorbox{\g__kivi_Tabular_rowcolor_PricingTotal_tl}} + { + \tabular[t]{ + @{\bool_if:NT \g__kivi_Tabular_rowcolor_bool {\hskip\tabcolsep}} + p{\dim_eval:n {\linewidth-\l_kivi_tab_pricetotal_dim-\bool_if:NTF \g__kivi_Tabular_rowcolor_bool {4}{2}\tabcolsep}}P{\l_kivi_tab_pricetotal_dim}@{\bool_if:NT \g__kivi_Tabular_rowcolor_bool {\hskip\tabcolsep}} + } + \l__kivi_Tabular_PricingTotal_topsep_tl + #1 + \endtabular + } } +\tl_new:N \l__kivi_Tabular_PricingTotal_topsep_tl +%TODO +\tl_set:Nn \l__kivi_Tabular_PricingTotal_topsep_tl {\bool_if:NF \g__kivi_Tabular_rowcolor_bool \midrule} \newcommand*\ExtraDescription{ - \PackageError{kiviletter}{The~command~\string\ExtraDescription\space~may~be~only~used~inside~the~\string\FakeTable\space~environment.}{See~documentation~for~details} + \PackageError{kiviletter}{The~command~\string\ExtraDescription\space~may~be~only~used~inside~the~\string\FakeTable\space~environment.}{See~documentation~for~details} } \cs_new:Nn \__kivi_addExtraDescription:n {\seq_gput_right:Nn \g_kivi_extraDescription_seq {#1}} \newenvironment{PricingTabular}[1][]{ - \begingroup - \dim_set:Nn \parskip {\c_zero_dim} - \tl_if_empty:nF {#1} {\keys_set:nn {kivi/PricingTable} {#1}} - \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim} - \__kivi_calc_desc_column: - \exp_args:Nx \longtable \g_kivi_Pricing_colspec_tl - % Tabellenkopf - \__kivi_PricingTabular_header: - \endhead - \midrule - \rlap{\makebox[\textwidth][r]{\weiteraufnaechsterseite}}\\ - \endfoot - \bottomrule - \endlastfoot + \begingroup + \dim_set:Nn \parskip {\c_zero_dim} + \tl_if_empty:nF {#1} {\keys_set:nn {kivi/PricingTable} {#1}} + \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim} + \__kivi_calc_desc_column: + \exp_args:Nx \longtable \g_kivi_Pricing_colspec_tl + % Tabellenkopf + \__kivi_PricingTabular_header: + \endhead + \midrule + \rlap{\makebox[\textwidth][r]{\weiteraufnaechsterseite}}\\ + \endfoot + \bool_if:NF \g__kivi_Tabular_rowcolor_bool \bottomrule + \endlastfoot }{ - \endlongtable - \endgroup + \endlongtable + \endgroup } \cs_set:Nn \__kivi_PricingTabular_header: { - \toprule - \cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_header_currency: - \bool_set_false:N \l_tmpa_bool - \clist_map_inline:Nn \g_kivi_pricingtable_col_clist { - \bool_if:cT {l_kivi_col_##1_bool} { - \bool_if:NT \l_tmpa_bool {&} - \bool_set_true:N \l_tmpa_bool - \usekomafont{PricingTableHeader} - \prop_item:cn {l_kivi_col_##1_prop} {header} - } - } - \cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_body_currency: - \\ - \midrule + \bool_if:NTF \g__kivi_Tabular_rowcolor_bool {\noalign{\skip_vertical:n {\dp\strutbox}}}\toprule + \cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_header_currency: + \bool_set_false:N \l_tmpa_bool + \clist_map_inline:Nn \g_kivi_pricingtable_col_clist { + \bool_if:cT {l_kivi_col_##1_bool} { + \bool_if:NT \l_tmpa_bool {&} + \bool_set_true:N \l_tmpa_bool + \usekomafont{PricingTableHeader} + \prop_item:cn {l_kivi_col_##1_prop} {header} + } + } + \cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_body_currency: + \\ + \bool_if:NF \g__kivi_Tabular_rowcolor_bool \midrule } +\newkomafont{tablehead}{\bfseries} \keys_define:nn {kivi/SimpleTabular} { - colspec .tl_set:N =\l_kivi_SimpleTabular_colspec_tl, - colspec .initial:n = {rrX}, - headline .tl_set:N = \l_kivi_SimpleTabular_headline_tl, - headline .initial:n = {\bfseries\position & \bfseries\menge & \bfseries\bezeichnung}, + colspec .tl_set:N =\l_kivi_SimpleTabular_colspec_tl, + colspec .initial:n = {rrX}, + headline .tl_set:N = \l_kivi_SimpleTabular_headline_tl, + headline .initial:n = {\usekomafont{tablehead}\position & \usekomafont{tablehead}\menge & \usekomafont{tablehead}\bezeichnung}, +} + +\keys_define:nn {kivi/Tabular} { + color-rows .bool_gset:N = \g__kivi_Tabular_rowcolor_bool , + color-rows .initial:n = false, + color-rows .default:n = true, + rowcolor-odd .tl_gset:N = \g__kivi_Tabular_rowcolor_odd_tl, + rowcolor-odd .initial:n = black!10, + rowcolor-even .tl_gset:N = \g__kivi_Tabular_rowcolor_even_tl, + rowcolor-even .initial:n =, + rowcolor-header .tl_gset:N = \g__kivi_Tabular_rowcolor_header_tl, + rowcolor-header .initial:n = black!35, + rowcolor-total .tl_gset:N = \g__kivi_Tabular_rowcolor_PricingTotal_tl, + rowcolor-total .initial:n = black!35, + rowsep .tl_set:N =\l__kivi_Tabular_rowsep_tl, + rowsep .initial:n = , + hrule .meta:n = { + rowsep={ + \vskip\aboverulesep + \leavevmode\hrule\@height\lightrulewidth + \vskip\belowrulesep}}, } \newcommand*{\SetupSimpleTabular}[1]{\keys_set:nn {kivi/SimpleTabular} {#1}} @@ -409,28 +502,30 @@ contents={\usebox\shippingAddressBox} \newenvironment{SimpleTabular}[1][] { - \tl_if_in:nnTF {#1} {=} {\keys_set:nn {kivi/SimpleTabular} {#1}} {\tl_if_empty:nF {#1} {\tl_set:Nn \l_kivi_SimpleTabular_headline_tl {#1}}} - \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim} - \dim_set:Nn \parskip {\c_zero_dim} - \tl_put_right:Nn \l_kivi_SimpleTabular_colspec_tl {@{}} - \tl_put_left:Nn \l_kivi_SimpleTabular_colspec_tl {@{}} - \exp_args:NnV \xltabular{\linewidth}\l_kivi_SimpleTabular_colspec_tl - \toprule - \cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_header_currency: - \l_kivi_SimpleTabular_headline_tl - \\ - \noalign{\cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_body_currency:} - \midrule - \endhead - \midrule - \rlap{\makebox[\textwidth][r]{\weiteraufnaechsterseite}}\\ - \endfoot - \bottomrule - \endlastfoot - \ignorespaces + \tl_if_in:nnTF {#1} {=} {\keys_set:nn {kivi/SimpleTabular} {#1}} {\tl_if_empty:nF {#1} {\tl_set:Nn \l_kivi_SimpleTabular_headline_tl {#1}}} + \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim} + \dim_set:Nn \parskip {\c_zero_dim} + \bool_if:NF \g__kivi_Tabular_rowcolor_bool { + \tl_put_right:Nn \l_kivi_SimpleTabular_colspec_tl {@{}} + \tl_put_left:Nn \l_kivi_SimpleTabular_colspec_tl {@{}} + } + \exp_args:NnV \xltabular{\linewidth}\l_kivi_SimpleTabular_colspec_tl + \toprule + \cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_header_currency: + \l_kivi_SimpleTabular_headline_tl + \\ + \noalign{\cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_body_currency:} + \midrule + \endhead + \midrule + \rlap{\makebox[\textwidth][r]{\weiteraufnaechsterseite}}\\ + \endfoot + \bool_if:NF \g__kivi_Tabular_rowcolor_bool \bottomrule + \endlastfoot + \ignorespaces }{ - \def\@currenvir{tabularx} - \endxltabular + \def\@currenvir{tabularx} + \endxltabular } %PricingTabular* kann automatisch spalten ignorieren @@ -439,78 +534,85 @@ contents={\usebox\shippingAddressBox} % analog ist dies für pos, amount, price, pricetotal möglich. % Die Spalte der Bezeichnung ist nicht deaktivierbar \newenvironment{PricingTabular*}[1][]{ - \tl_if_empty:nF {#1} {\keys_set:nn {kivi/PricingTable} {#1}} - \__kivi_setup_LT_boxes: - \__kivi_setup_FakeTable: - \dim_set:Nn \parskip {\c_zero_dim} - \PricingTabularBox\ignorespaces -}{\endPricingTabularBox} + \int_gzero:N \g__kivi_PricingTable_rowcolor_int + \tl_if_empty:nF {#1} {\keys_set:nn {kivi/PricingTable} {#1}} + \__kivi_setup_LT_boxes: + \__kivi_setup_FakeTable: + \dim_set:Nn \parskip {\c_zero_dim} + \PricingTabularBox\ignorespaces +}{\endPricingTabularBox + %compensate footer spacing + \skip_vertical:n {-\box_ht:N \g_kivi_LT@foot_box-\box_dp:N \g_kivi_LT@foot_box} +} \newtcolorbox{PricingTabularBox}{breakable,skin=kivi@LT} \if@kivi@infobox - \def\locationsep{:} - - \NewDocumentCommand{\locationentry}{som}{ - \Ifkomavarempty{#3}{}{ - \IfBooleanTF {#1} { - \strut - \IfNoValueTF {#2} - {\usekomavar*{#3}} - {#2} - \locationsep - \hfill\strut\space - \hbox_set:Nn \l_tmpa_box {\usekomavar{#3}} - \dim_compare:nTF {\box_wd:N \l_tmpa_box>\linewidth} - {\newline\hspace*{\fill}\llap} - {\hspace*{\fill}} - {\box_use:N \l_tmpa_box\strut} - }{ - \@hangfrom{\strut - \IfNoValueTF {#2} - {\usekomavar*{#3}} - {#2}\locationsep~ - }{ - \parbox[t]{\dimexpr\linewidth-\hangindent}{ - \raggedleft - \usekomavar{#3}\strut - } - } - } - } - \par - } - - -\setkomavar{location}{ - \Ifkomavarempty{transaction}{}{ - \bfseries - \usekomavar{transaction} - } - \par - \medskip - \parbox{\useplength{locwidth}}{ - \locationentry{date} - \locationentry{myref} - \locationentry{customer} - \locationentry{yourref} - \locationentry{delivery} - \locationentry{quote} - \locationentry{orderID} - \locationentry{projectID} - \locationentry[\ansprechpartner]{fromname} - \locationentry{fromphone} - \locationentry*{fromemail} - } -} -\removereffields -\AtBeginLetter{ - \ifdim\ht\shippingAddressBox>\z@ - \@addtoplength{refvpos}{\dimexpr\ht\shippingAddressBox+\dp\shippingAddressBox} - \@addtoplength{refvpos}{4\baselineskip}%sep between address boxes - \fi -} + \def\locationsep{:} + + \NewDocumentCommand{\locationentry}{som}{ + \Ifkomavarempty{#3}{}{ + \IfBooleanTF {#1} { + \strut + \IfNoValueTF {#2} + {\usekomavar*{#3}} + {#2} + \locationsep + \hfill\strut\space + \hbox_set:Nn \l_tmpa_box {\usekomavar{#3}} + \dim_compare:nTF {\box_wd:N \l_tmpa_box>\linewidth} + {\newline\hspace*{\fill}\llap} + {\hspace*{\fill}} + {\box_use:N \l_tmpa_box\strut} + }{ + \@hangfrom{\strut + \IfNoValueTF {#2} + {\usekomavar*{#3}} + {#2}\locationsep~ + }{ + \parbox[t]{\dimexpr\linewidth-\hangindent}{ + \raggedleft + \usekomavar{#3}\strut + } + } + } + } + \par + } + + \newkomafont{transaction}{\bfseries} + + \setkomavar{location}{ + \Ifkomavarempty{transaction}{}{{ + \usekomafont{transaction} + \usekomavar{transaction} + } + } + \par + \medskip + \parbox{\useplength{locwidth}}{ + \locationentry{date} + \locationentry{myref} + \locationentry{customer} + \locationentry{yourref} + \locationentry{delivery} + \locationentry{quote} + \locationentry{orderID} + \locationentry{projectID} + \locationentry{taxpoint} + \locationentry[\ansprechpartner]{fromname} + \locationentry{fromphone} + \locationentry*{fromemail} + } + } + \removereffields + \AtBeginLetter{ + \ifdim\ht\shippingAddressBox>\z@ + \@addtoplength{refvpos}{\dimexpr\ht\shippingAddressBox+\dp\shippingAddressBox} + \@addtoplength{refvpos}{4\baselineskip}%sep between address boxes + \fi + } \fi @@ -521,42 +623,56 @@ contents={\usebox\shippingAddressBox} %Definitionen für die insettings.tex \newcommand*{\setupIdentpath}[1]{ - \int_set:Nn \l_kivi_tmp_int {1} - \bool_set_true:N \l_kivi_tmp_bool - \bool_while_do:Nn \l_kivi_tmp_bool { - \file_if_exist:nTF {firma\int_use:N \l_kivi_tmp_int/ident.tex} - { - \exp_args:Nf \str_if_in:nnTF {#1} {Firma\int_use:N \l_kivi_tmp_int} - { - \newcommand*{\identpath}{firma\int_use:N \l_kivi_tmpa_int} - \bool_set_false:N \l_kivi_tmp_bool - } - {\int_incr:N \l_kivi_tmp_int} - } - { - \bool_set_false:N \l_kivi_tmp_bool - \newcommand*{\identpath}{firma} - } - } + \int_set:Nn \l_kivi_tmp_int {1} + \bool_set_true:N \l_kivi_tmp_bool + \bool_while_do:Nn \l_kivi_tmp_bool { + \file_if_exist:nTF {firma\int_use:N \l_kivi_tmp_int/ident.tex} + { + \exp_args:Nf \str_if_in:nnTF {#1} {Firma\int_use:N \l_kivi_tmp_int} + { + \newcommand*{\identpath}{firma\int_use:N \l_kivi_tmpa_int} + \bool_set_false:N \l_kivi_tmp_bool + } + {\int_incr:N \l_kivi_tmp_int} + } + { + \bool_set_false:N \l_kivi_tmp_bool + \newcommand*{\identpath}{firma} + } + } } -\newcommand*{\setupCurrencyConfig}[2]{ - \tl_new:N \g_kivi_currency_tl - \exp_args:Nf \str_if_in:nnT {#2} {USD} {\tl_gset:Nn \g_kivi_currency_tl {usd}} - \exp_args:Nf \str_if_in:nnT {#2} {CHF} {\tl_gset:Nn \g_kivi_currency_tl {chf}} - \exp_args:Nf \str_if_in:nnT {#2} {EUR} {\tl_gset:Nn \g_kivi_currency_tl {euro}} - \tl_if_empty:NT \g_kivi_currency_tl { - \tl_gset:Nn \g_kivi_currency_tl {default} - \edef \currency {\tl_to_str:N \lxcurrency} - } - \input{#1/\g_kivi_currency_tl _account.tex} +\newcommand*{\setupCurrencyConfig}[3][euro]{ + \tl_new:N \g_kivi_currency_tl + \exp_args:Nf \str_if_in:nnT {#3} {USD} {\tl_gset:Nn \g_kivi_currency_tl {usd}} + \exp_args:Nf \str_if_in:nnT {#3} {CHF} {\tl_gset:Nn \g_kivi_currency_tl {chf}} + \exp_args:Nf \str_if_in:nnT {#3} {EUR} {\tl_gset:Nn \g_kivi_currency_tl {euro}} + \tl_if_empty:NT \g_kivi_currency_tl { + \tl_if_empty:oTF {#3} { + \tl_gset:Nn \g_kivi_currency_tl {#1} + } { + \tl_gset:Nn \g_kivi_currency_tl {#3} + } + } + \input{#2/\g_kivi_currency_tl _account.tex} + \let\setupCurrencyConfig\_kivi_currency_already_configured:w } +\newcommand*{\_kivi_currency_already_configured:w}[3][euro]{ + \msg_error:nnx {kiviletter} {currency-already-configured} {\g_kivi_currency_tl} +} + +\msg_new:nnn {kiviletter} {currency-already-configured} { + The~currency~configuration~is~a~global~setting~for~each~document.\\ + It's~already~set~to~#1,~please~remove~the~second~call~of~\string\setupCurrencyConfig. +} \ExplSyntaxOff \renewcommand*{\raggedsignature}{\raggedright} \newkomafont{extraDescription}{} +\newkomafont{subtotal}{} +\newkomafont{total}{} \endinput