marei: add lmodern to allow vector fonts with older debian installations
[kivitendo-erp.git] / templates / print / marei / kiviletter.sty
1 \NeedsTeXFormat{LaTeX2e}
2 \ProvidesPackage{kiviletter}[2020/04/24 Letter Layouts for Kivitendo]
3
4
5 \newif\if@kivi@infobox
6 \DeclareOption{reffields}{\@kivi@infoboxfalse}
7 \DeclareOption{infobox}{\@kivi@infoboxtrue}
8 \@kivi@infoboxtrue
9
10 \ProcessOptions\relax
11
12
13 \RequirePackage{expl3}
14 \RequirePackage{iftex}
15 \KOMAoptions{fontsize=12pt}
16 % Schriftart, Eingabelayout der Tastatur
17 \ifPDFTeX
18 \RequirePackage[utf8]{inputenc}% Nur notwendig, wenn Basis älter als TL2018
19 \RequirePackage[T1]{fontenc}
20 \RequirePackage{lmodern}
21 \else
22 \RequirePackage{fontspec}
23 \fi
24
25 %\RequirePackage{xltabular}
26 \RequirePackage{tabularx}
27 \RequirePackage{longtable}
28 \RequirePackage{booktabs}
29 \PassOptionsToPackage{table}{xcolor}
30
31 \RequirePackage{xcolor}
32 \RequirePackage{graphicx}
33
34 \ifPDFTeX
35 \RequirePackage{eurosym}
36 \DeclareUnicodeCharacter{20AC}{\euro}
37 \fi
38
39 \RequirePackage[fromlogo,fromalign=right,
40   firstfoot=false,%Für einheitliche Randeinstellungen
41   refline=nodate,
42         ]{scrletter}
43 \LoadLetterOption{DIN}
44
45 \newkomavar{transaction}
46 \newkomavar[\lieferschein{}~\nr]{delivery}
47 \newkomavar[\angebot{}~\nr]{quote}
48 \newkomavar{orderID}
49 \newkomavar{projectID}
50
51 \usepackage{geometry}
52
53 \ExplSyntaxOn
54 \dim_new:N \g_kivi_margin_dim
55 \dim_gset:Nn \g_kivi_margin_dim {\useplength{toaddrhpos}}
56 \geometry{a4paper,margin=\g_kivi_margin_dim,heightrounded}
57 \savegeometry{kivi.letter@default}
58 %Scratch variables
59 \int_new:N \l_kivi_tmp_int
60 \bool_new:N \l_kivi_tmp_bool
61 \bool_new:N  \g_kivi_TableFoot_bool
62 \dim_new:N \g_kivi_orig@textheight_dim
63 \int_new:N \g_PricingTabular_firstpage_int
64 \ExplSyntaxOff
65
66 \newsavebox{\shippingAddressBox}
67
68
69 \DeclareNewLayer[
70 foreground,
71 hoffset=\useplength{toaddrhpos},
72 voffset=\dimexpr\useplength{toaddrvpos}+\useplength{toaddrheight}+4\baselineskip,
73 contents={\usebox\shippingAddressBox}
74 ]{kivitendo.shippingaddress}
75
76
77 \ExplSyntaxOn
78 \DeclareNewLayer[
79 foreground,
80 mode=picture,
81 hoffset=\g_kivi_margin_dim,
82 voffset=\g_kivi_margin_dim,
83 align=tl,
84 height=\box_ht:N \g_kivi_LT@head_box,
85 contents={\box_use:N \g_kivi_LT@head_box},
86 ]{kivitendo.TableHead}
87
88
89 \DeclareNewLayer[
90 foreground,
91 textarea,
92 mode=picture,
93 voffset=\dim_eval:n {\paperheight-\g_kivi_margin_dim},
94 height=\box_ht:N \g_kivi_LT@foot_box,
95 contents=\bool_if:NT \g_kivi_TableFoot_bool {\box_use:N \g_kivi_LT@foot_box},
96 align=bl,
97 ]{kivitendo.TableFoot}
98
99 \AtBeginLetter{\dim_gset:Nn \g_kivi_orig@textheight_dim {\textheight}}
100 \ExplSyntaxOff
101
102 \newpairofpagestyles{kivitendo.letter}{}
103 \renewcommand*{\letterpagestyle}{kivitendo.letter}
104
105 \DeclareNewPageStyleByLayers{kivitendo.letter.PricingTable}{
106         kivitendo.TableHead,
107         kivitendo.TableFoot
108         kivitendo.letter.head.odd,kivitendo.letter.head.even,kivitendo.letter.head.oneside,%
109         kivitendo.letter.foot.odd,kivitendo.letter.foot.even,kivitendo.letter.foot.oneside,%
110 }
111 \DeclareNewPageStyleByLayers{kivitendo.letter.first}{
112         kivitendo.shippingaddress,
113         kivitendo.TableFoot,
114         kivitendo.letter.head.odd,kivitendo.letter.head.even,kivitendo.letter.head.oneside,%
115         kivitendo.letter.foot.odd,kivitendo.letter.foot.even,kivitendo.letter.foot.oneside,%
116 }
117
118 \setkomavar{backaddress}{\firma\ $\cdot$ \strasse\ $\cdot$ \ort}
119
120 \setkomavar{firsthead}{
121         \if@logo
122         \rlap{\usekomavar{fromlogo}}%
123         \fi
124 }
125
126 \@setplength{locwidth}{6cm}
127
128 \ExplSyntaxOn
129 \dim_new:N \g_kivi_tab_pos_dim
130 \dim_gset:Nn \g_kivi_tab_pos_dim {3.5ex}
131 \dim_new:N \g_kivi_tab_id_dim
132 \dim_gset:Nn \g_kivi_tab_id_dim {4em}
133 \dim_new:N \g_kivi_tab_num_dim
134 \dim_gset:Nn \g_kivi_tab_num_dim {5em}
135 \dim_new:N \g_kivi_tab_price_dim
136 \dim_gset:Nn \g_kivi_tab_price_dim {7em}
137 \dim_new:N \g_kivi_tab_desc_dim
138
139 \dim_new:N \g_kivi_tabcolsep_dim
140 \dim_gset:Nn \g_kivi_tabcolsep_dim {.5\tabcolsep}
141 \newcommand*{\CalcTabCols}{
142         \dim_gset:Nn \g_kivi_tab_desc_dim {\textwidth-\g_kivi_tab_pos_dim -\g_kivi_tab_id_dim-\g_kivi_tab_num_dim - 2\g_kivi_tab_price_dim - 10\g_kivi_tabcolsep_dim}
143 }
144
145 \newcolumntype{P}{>{\raggedleft\arraybackslash}p{\g_kivi_tab_price_dim}<{\,\currency}}
146
147 %\if@kivi@faketable
148 \RequirePackage{tcolorbox}
149 \tcbuselibrary{breakable, skins}
150 \seq_new:N \l_kivi_PricingTable_seq
151 \seq_new:N \g_kivi_extraDescription_seq
152 \newcommand{\FakeTable}[1]{
153         \par
154         \CalcTabCols
155         \seq_set_split:Nnn \l_kivi_PricingTable_seq {\tabularnewline} {#1}
156         \begingroup
157         \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
158         \seq_map_inline:Nn \l_kivi_PricingTable_seq {
159         \seq_gclear:N \g_kivi_extraDescription_seq
160         \exp_args:NnV \use:n {\tabular[t]}\g_kivi_Pricing_colspec_tl
161         ##1
162         \endtabular
163         \seq_if_empty:NTF \g_kivi_extraDescription_seq
164         {\par\nointerlineskip}
165         {\par\nointerlineskip
166         \begin{tcolorbox}[
167                 empty,
168                 left=\dim_eval:n {\g_kivi_tab_pos_dim+ \g_kivi_tab_id_dim +4\g_kivi_tabcolsep_dim},
169                 right=\dim_eval:n {\g_kivi_tab_num_dim+ 2\g_kivi_tab_price_dim +6\g_kivi_tabcolsep_dim},top=0pt,bottom=0pt,
170                 boxsep=0pt,
171                 breakable,
172                 lines~before~break=1,
173         ]
174         \seq_use:Nn \g_kivi_extraDescription_seq {\\}
175         \end{tcolorbox}
176         \nointerlineskip
177         }
178         }
179         \endgroup
180 }
181
182
183 \tl_new:N \g_kivi_Pricing_colspec_tl
184 \tl_gset:Nn \g_kivi_Pricing_colspec_tl {@{}p{\g_kivi_tab_pos_dim}p{\g_kivi_tab_id_dim}p{\g_kivi_tab_desc_dim}>{\raggedleft\arraybackslash}p{\g_kivi_tab_num_dim}*2{P}@{}}
185
186
187 \clist_map_inline:nn {head, foot, firsthead, lastfoot} {%TODO reduce
188         \box_new:c {g_kivi_LT@#1_box}
189 }
190
191 \AtBeginDocument{
192         \csname kivi_setup_LT_boxes:\endcsname
193         \geometry{a4paper,
194                 hmargin=\g_kivi_margin_dim,
195                 top=\dim_eval:n {\g_kivi_margin_dim + \box_ht:N \g_kivi_LT@head_box},
196                 bottom=\dim_eval:n {\g_kivi_margin_dim + \box_ht:N \g_kivi_LT@foot_box},
197                 heightrounded}
198         \savegeometry{kivi.letter@table}
199         \loadgeometry{kivi.letter@default}
200 }
201
202 \cs_new:Nn \kivi_setup_LT_boxes: {
203         \CalcTabCols
204         \hbox_gset:Nn \g_kivi_LT@head_box {
205         \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
206         \exp_args:NnV \use:n {\tabular[b]}\g_kivi_Pricing_colspec_tl
207         \toprule
208         \bfseries\position & \bfseries\artikelnummer & \bfseries\bezeichnung & \bfseries\menge &\multicolumn{1}{P}{\bfseries\einzelpreis}&\multicolumn{1}{P@{}}{\bfseries\gesamtpreis}\\
209         \midrule
210         \endtabular
211         }
212         \hbox_gset:Nn \g_kivi_LT@foot_box {
213         \raisebox{\depth}{
214         \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}r@{}}
215         \midrule
216         \strut\weiteraufnaechsterseite
217         \end{tabular*}
218         }
219         }
220 }
221
222
223 %Macht es sinn hier eine Variante zu machen, in der alle Spalten Belegbar sind?
224 \newenvironment{PricingTotal}{
225         \tabular[t]{@{}p{\dim_eval:n {\linewidth-\g_kivi_tab_price_dim-2\tabcolsep}}P@{}}
226         \midrule
227 }{
228         \bottomrule\endtabular
229 }
230
231 \newcommand{\ExtraDescription}[1]{\seq_gput_right:Nn \g_kivi_extraDescription_seq {#1}}
232 %\else
233 \newenvironment{PricingTabular}[1][]{
234         \begingroup
235         \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
236         \CalcTabCols
237         \exp_args:NV \longtable \g_kivi_Pricing_colspec_tl
238         % Tabellenkopf
239         \toprule
240         \bfseries\position & \bfseries\artikelnummer & \bfseries\bezeichnung & \bfseries\menge &\multicolumn{1}{P}{\bfseries\einzelpreis}&\multicolumn{1}{P@{}}{\bfseries\gesamtpreis}\\
241         \midrule
242         \endhead
243         \midrule
244         \multicolumn{6}{@{}r@{}}{\weiteraufnaechsterseite}\\
245         \endfoot
246 }{
247         \endlongtable
248         \endgroup
249 }
250
251 \RequirePackage{xltabular}
252
253
254 \newenvironment{SimpleTabular}[1][\bfseries\position & \bfseries\menge & \bfseries\bezeichnung]
255 {
256         \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
257         \xltabular{\linewidth}{@{}rrX@{}}
258         \toprule
259         #1\\
260         \midrule\\\endhead
261         \midrule
262         \multicolumn{3}{@{}>{\raggedright}p{\linewidth}@{}}{\weiteraufnaechsterseite}\\
263         \endfoot
264         \bottomrule
265         \endlastfoot
266         \ignorespaces
267 }{
268         \def\@currenvir{tabularx}
269         \endxltabular
270 }
271
272
273 \usepackage{afterpage}
274
275 \cs_new:cpn {PricingTabular*}{
276         \bool_gset_true:N \g_kivi_inTable_bool
277         \endgroup
278         \@nameuse{Gm@restore@@kivi.letter@table}%
279         \Gm@changelayout
280         \begingroup
281         \def \@currenvir {PricingTabular*}\edef \@currenvline {\on@line }
282         \int_gset:Nn \g_PricingTabular_firstpage_int {\c@page}
283         \addtolength{\vsize}{-\box_ht:N \g_kivi_LT@foot_box}
284         \pagegoal\vsize
285         \widowpenalty0
286         \clubpenalty0
287         \bool_gset_true:N \g_kivi_TableFoot_bool
288         \pagestyle{kivitendo.letter.PricingTable}
289         \leavevmode\box_use:N \g_kivi_LT@head_box
290         \par\nointerlineskip\ignorespaces
291 }
292
293 \cs_new:cpn {endPricingTabular*} {
294         \int_compare:nNnF \g_PricingTabular_firstpage_int = \c@page {\thispagestyle{kivitendo.letter.PricingTable}}
295         \bool_gset_false:N \g_kivi_TableFoot_bool
296         \@nameuse{Gm@restore@@kivi.letter@default}
297         \Gm@changelayout
298         \bool_gset_true:N \g_kivi_restore_geometry_bool
299         \afterpage{
300                 \kivi_conditional_restore_geometry:
301         }
302 }
303
304 \cs_new:Nn \kivi_conditional_restore_geometry: {
305         \bool_if:NT \g_kivi_restore_geometry_bool
306         {
307         \@nameuse{Gm@restore@@kivi.letter@default}
308         \Gm@changelayout
309         }
310         \bool_gset_false:N \g_kivi_restore_geometry_bool
311 }
312
313
314
315 \if@kivi@infobox
316 \setkomavar{location}{
317         \ifkomavarempty{transaction}{}{
318         \bfseries
319         \usekomavar{transaction}
320         }
321         \par
322         \medskip
323         \begin{tabularx}{\useplength{locwidth}}{@{}l<{:}>{\raggedleft\arraybackslash}X@{}}
324                 \usekomavar*{date}&\usekomavar{date}\\
325                 \ifkomavarempty{myref}{}{
326                         \usekomavar*{myref}&\usekomavar{myref}\\
327                 }
328                 \kundennummer&\usekomavar{customer}\\
329                 \ifkomavarempty{yourref}{}{
330                         \usekomavar*{yourref}&\usekomavar{yourref}\\
331                 }
332                 \ifkomavarempty{delivery}{}{
333                         \usekomavar*{delivery}&\usekomavar{delivery}\\
334                 }
335                 \ifkomavarempty{quote}{}{
336                         \usekomavar*{quote}&\usekomavar{quote}\\
337                 }
338                 \ifkomavarempty{orderID}{}{\auftragsnummer&\usekomavar{orderID}\\}
339                 \ifkomavarempty{projectID}{}{\projektnummer&\usekomavar{projectID}\\}
340                 \ansprechpartner&\usekomavar{fromname}
341                 \ifkomavarempty{fromphone}{}{\\\textTelefon&\usekomavar{fromphone}}
342                 \ifkomavarempty{fromemail}{}{\\\textEmail&\usekomavar{fromemail}}
343         \end{tabularx}
344 }
345 \removereffields
346 \AtBeginLetter{
347         \ifdim\ht\shippingAddressBox>\z@
348         \addtoplength{refvpos}{\ht\shippingAddressBox}
349         \addtoplength{refvpos}{4\baselineskip}
350         \fi
351 }
352 \ExplSyntaxOff
353 \fi
354
355
356
357 \renewcommand*{\raggedsignature}{\raggedright}
358
359 \endinput