marei: update Readme
[kivitendo-erp.git] / templates / print / marei / kiviletter.sty
1 \NeedsTeXFormat{LaTeX2e}
2 \ProvidesPackage{kiviletter}[2020/04/24 Letter Layouts for Kivitendo]
3
4 \newif\if@kivi@infobox
5 \DeclareOption{reffields}{\@kivi@infoboxfalse}
6 \DeclareOption{infobox}{\@kivi@infoboxtrue}
7 \@kivi@infoboxtrue
8
9 \ProcessOptions\relax
10
11
12 \RequirePackage{expl3}
13 \RequirePackage{iftex}
14 \KOMAoptions{fontsize=12pt}
15 % Schriftart, Eingabelayout der Tastatur
16 \ifPDFTeX
17 \RequirePackage[utf8]{inputenc}% Nur notwendig, wenn Basis älter als TL2018
18 \RequirePackage[T1]{fontenc}
19 \RequirePackage{lmodern}
20 \else
21 \RequirePackage{fontspec}
22 \fi
23
24 %\RequirePackage{xltabular}
25 \RequirePackage{tabularx}
26 \RequirePackage{longtable}
27 \RequirePackage{booktabs}
28 \RequirePackage{graphicx}
29
30 \ifPDFTeX
31 \RequirePackage{eurosym}
32 \DeclareUnicodeCharacter{20AC}{\euro}
33 \fi
34
35 \RequirePackage[fromlogo,fromalign=right,
36   firstfoot=false,%Für einheitliche Randeinstellungen
37   refline=nodate,
38         ]{scrletter}
39 \LoadLetterOption{DIN}
40
41 \newkomavar{transaction}
42 \newkomavar[\lieferschein{}~\nr]{delivery}
43 \newkomavar[\angebot{}~\nr]{quote}
44 \newkomavar{orderID}
45 \newkomavar{projectID}
46
47 \usepackage{geometry}
48
49 \ExplSyntaxOn
50 \dim_new:N \g_kivi_margin_dim
51 \dim_gset:Nn \g_kivi_margin_dim {\useplength{toaddrhpos}}
52 \geometry{a4paper,margin=\g_kivi_margin_dim,heightrounded}
53 %Scratch variables
54 \int_new:N \l_kivi_tmp_int
55 \bool_new:N \l_kivi_tmp_bool
56 \bool_new:N  \g_kivi_TableFoot_bool
57 \dim_new:N \g_kivi_orig@textheight_dim
58 \ExplSyntaxOff
59
60 \newsavebox{\shippingAddressBox}
61
62
63 \DeclareNewLayer[
64 foreground,
65 hoffset=\useplength{toaddrhpos},
66 voffset=\dimexpr\useplength{toaddrvpos}+\useplength{toaddrheight}+4\baselineskip,%sep to shippingaddressbox
67 contents={\usebox\shippingAddressBox}
68 ]{kivitendo.shippingaddress}
69
70 \newpairofpagestyles{kivitendo.letter}{}
71
72 \renewcommand*{\letterpagestyle}{kivitendo.letter}
73
74 \DeclareNewPageStyleByLayers{kivitendo.letter.first}{
75         kivitendo.shippingaddress,
76         plain.kivitendo.letter.head.odd,plain.kivitendo.letter.head.even,plain.kivitendo.letter.head.oneside,%
77         plain.kivitendo.letter.foot.odd,plain.kivitendo.letter.foot.even,plain.kivitendo.letter.foot.oneside,%
78 }
79
80 \setkomavar{backaddress}{\firma\ $\cdot$ \strasse\ $\cdot$ \ort}
81
82 \setkomavar{firsthead}{
83         \if@logo
84         \rlap{\usekomavar{fromlogo}}%
85         \fi
86 }
87
88 \@setplength{locwidth}{6cm}
89
90 \ExplSyntaxOn
91 \dim_new:N \l_kivi_tab_desc_leftskip_dim
92
93
94
95 \cs_new:Nn \__kivi_set_colwidth:nn  {
96         \dim_set:cn {l_kivi_tab_#1_dim} {#2}
97 }
98
99
100 \cs_new:Nn \__kivi_initialize_columns: {
101         \clist_map_inline:Nn \g_kivi_pricingtable_col_clist {
102                 \bool_if_exist:cF {l_kivi_col_##1_bool} 
103                 {
104                         \bool_new:c {l_kivi_col_##1_bool}
105                         \dim_new:c {l_kivi_tab_##1_dim}
106                         \keys_define:nn {kivi/PricingTable} {
107                                 ##1 .choice:,
108                                 ##1 / true .code:n = \bool_set_true:c {l_kivi_col_##1_bool},
109                                 ##1 / false .code:n = \bool_set_false:c {l_kivi_col_##1_bool},
110                                 ##1 / unknown .code:n = {
111                                         \bool_set_true:c {l_kivi_col_##1_bool}
112                                         \dim_set:cn {l_kivi_tab_##1_dim} {####1}
113                                 },
114                                 ##1 .default:n = true,
115                                 ##1 .initial:n = true,
116                                 ##1 / header .prop_put:c = {l_kivi_col_##1_prop},
117                                 ##1 / colspec .prop_put:c = {l_kivi_col_##1_prop},
118                         }
119                 }
120         }
121 }
122
123 \clist_new:N \g_kivi_pricingtable_col_clist
124
125 \keys_define:nn {kivi/PricingTable} {
126         columns .code:n = 
127         \clist_gset:Nn \g_kivi_pricingtable_col_clist {#1}
128         \__kivi_initialize_columns:,
129         columns .initial:n = {pos, id, desc, amount, price, pricetotal},
130 }
131
132 % set default values for colwidth
133 \keys_set:nn {kivi/PricingTable} {
134         pos=5ex,
135         id=4em,
136         amount=5em,
137         price=7em,
138         pricetotal=7em,
139 %       desc=auto,
140         pos/header=\position,
141         id/header=\artikelnummer,
142         desc/header=\bezeichnung,
143         amount/header=\menge,
144         price/header=\einzelpreis,
145         pricetotal/header=\gesamtpreis,
146         price / colspec = Price,
147         pricetotal / colspec = Price ,
148 }
149
150 \dim_new:N \g_kivi_tabcolsep_dim
151 \dim_gset:Nn \g_kivi_tabcolsep_dim {.5\tabcolsep}
152
153 \cs_new:Nn \__kivi_calc_desc_column: {
154         \dim_zero:N \l_kivi_tab_desc_leftskip_dim
155         \dim_zero:N \l_kivi_tab_desc_dim
156         \bool_set_false:N \l_tmpa_bool
157         \clist_map_inline:Nn \g_kivi_pricingtable_col_clist {
158                 \tl_if_eq:nnTF {##1} {desc}  {
159                         \dim_set:Nn \l_kivi_tab_desc_dim {
160                                 \textwidth-\l_kivi_tab_desc_leftskip_dim
161                         }
162                         \bool_set_true:N \l_tmpa_bool
163                 
164                 }{
165                         \bool_if:NTF \l_tmpa_bool {
166                                 \bool_if:cT {l_kivi_col_##1_bool} {
167                                         \dim_sub:Nn \l_kivi_tab_desc_dim {
168                                                 \dim_use:c {l_kivi_tab_##1_dim}+2\g_kivi_tabcolsep_dim
169                                         }
170                                 }
171                         }{
172                                 \bool_if:cT {l_kivi_col_##1_bool} {
173                                         \dim_add:Nn \l_kivi_tab_desc_leftskip_dim {
174                                                 \dim_use:c {l_kivi_tab_##1_dim}+2\g_kivi_tabcolsep_dim
175                                         }
176                                 }
177                         }
178                 }
179         }
180 }
181
182 \newcolumntype{P}[1]{>{\raggedleft\arraybackslash}p{#1}<{\__kivi_tab_column_currency:}}
183
184 \RequirePackage{tcolorbox}
185 \tcbuselibrary{breakable, skins}
186
187 \tcb@new@skin{kivi@LT}{base@unbroken,%
188         frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,%
189         skin~first=kivi@LT@first,skin~middle=kivi@LT@middle,skin~last=kivi@LT@last,
190         underlay~first~and~middle={
191                 \node[anchor=north]  at (interior.north)  {\csname box_use:c\endcsname  {g_kivi_LT@head_box}};
192                 \node[anchor=south]  at (interior.south)  {\csname box_use:c\endcsname  {g_kivi_LT@foot_box}};
193         },
194         underlay~unbroken~and~last={
195         \node[anchor=north]  at (interior.north)  {\csname box_use:c\endcsname  {g_kivi_LT@head_box}};
196         \node[anchor=south]  at (interior.south)  {\csname box_use:c\endcsname  {g_kivi_LT@lastfoot_box}};
197         },
198         boxsep=0pt,
199         boxrule=0pt,
200         left=0pt,
201         right=0pt,
202         bottom=\box_ht:N  \g_kivi_LT@foot_box+\box_dp:N  \g_kivi_LT@foot_box + \aboverulesep,
203         top=\box_ht:N  \g_kivi_LT@head_box+\box_dp:N  \g_kivi_LT@head_box +\belowrulesep,
204         parbox=false,
205 }
206
207 \tcb@new@skin{kivi@LT@first}{base@first,%
208         frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,%
209         skin~first=kivi@LT@first,skin~middle=kivi@LT@middle,skin~last=kivi@LT@middle,
210 }
211
212 \tcb@new@skin{kivi@LT@middle}{base@middle,%
213         frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,%
214         skin~first=kivi@LT@middle,skin~middle=kivi@LT@middle,skin~last=kivi@LT@middle,
215 }
216
217 \tcb@new@skin{kivi@LT@last}{base@last,%
218         frame~engine=empty,interior~titled~engine=empty,interior~engine=empty,segmentation~engine=empty,title~engine=empty,%
219         skin~first=kivi@LT@middle,skin~middle=kivi@LT@middle,skin~last=kivi@LT@last,
220 }
221
222 \tcbset{kivi@LT/.style={skin=kivi@LT}}%
223
224
225
226 \seq_new:N \l_kivi_PricingTable_seq
227 \seq_new:N \l_kivi_columns_seq
228 \seq_new:N \g_kivi_extraDescription_seq
229 \newcommand{\FakeTable}[1]{
230         \par
231         \seq_set_split:Nnn \l_kivi_PricingTable_seq {\tabularnewline} {#1}
232         \seq_remove_all:Nn \l_kivi_PricingTable_seq {}
233         \begingroup
234         \setlength{\parskip}{\c_zero_dim}
235         \let\ExtraDescription\__kivi_addExtraDescription:n
236         \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
237         \seq_map_inline:Nn \l_kivi_PricingTable_seq {
238                 \seq_set_split:Nnn  \l_kivi_columns_seq {&} {##1}
239         \seq_gclear:N \g_kivi_extraDescription_seq
240         \exp_args:Nnx \use:n {\tabular[t]}\g_kivi_Pricing_colspec_tl
241                 \seq_pop_left:NN \__l_FakeTable_columns_seq \l_tmpa_tl
242                 \seq_item:Nn \l_kivi_columns_seq {\l_tmpa_tl}
243                 \seq_map_inline:Nn \__l_FakeTable_columns_seq {
244                         &\seq_item:Nn \l_kivi_columns_seq {####1}
245                 }
246         \endtabular
247         \seq_if_empty:NTF \g_kivi_extraDescription_seq
248         {\par}
249         {\par\nopagebreak
250         \begingroup
251         \setlength{\hsize}{\dimexpr\l_kivi_tab_desc_dim+\l_kivi_tab_desc_leftskip_dim}
252         \setlength{\leftskip}{\l_kivi_tab_desc_leftskip_dim}
253         \usekomafont{extraDescription}
254         \seq_use:Nn \g_kivi_extraDescription_seq {\\}
255         \par
256         \endgroup
257         }
258         }
259         \endgroup
260 }
261
262
263 \seq_new:N  \__l_FakeTable_columns_seq
264 \cs_new:Nn \__kivi_setup_FakeTable: {
265         \seq_clear:N \__l_FakeTable_columns_seq
266         \int_zero:N \l_tmpa_int
267         \clist_map_inline:Nn \g_kivi_pricingtable_col_clist {
268                 \int_incr:N \l_tmpa_int
269                 \bool_if:cT {l_kivi_col_##1_bool} {\seq_put_right:Nx \__l_FakeTable_columns_seq {\int_use:N \l_tmpa_int}}
270         }
271 }
272
273 \tl_new:N \g_kivi_Pricing_colspec_tl
274 \tl_gset:Nn \g_kivi_Pricing_colspec_tl {
275         @{}
276         \bool_if:NT \l_kivi_col_pos_bool {p{\l_kivi_tab_pos_dim}}
277         \bool_if:NT \l_kivi_col_id_bool {p{\l_kivi_tab_id_dim}}
278         p{\l_kivi_tab_desc_dim}
279         \bool_if:NT \l_kivi_col_amount_bool {\exp_not:n {>{\raggedleft\arraybackslash}p{\l_kivi_tab_amount_dim}}}
280         \bool_if:NT \l_kivi_col_price_bool {\exp_not:n {>{\raggedleft\arraybackslash}p{\l_kivi_tab_price_dim}<{\__kivi_tab_column_currency:}}}
281         \bool_if:NT \l_kivi_col_pricetotal_bool {\exp_not:n {>{\raggedleft\arraybackslash}p{\l_kivi_tab_pricetotal_dim}<{\__kivi_tab_column_currency:}}}
282         @{}
283 }
284
285 \cs_new:Nn \__kivi_tab_column_currency: {\,\currency}
286 \def\tabcurrency{\__kivi_tab_column_currency:}
287 \cs_set:Nn \__kivi_tab_column_header_currency: {}
288 \cs_set_eq:NN \__kivi_tab_column_body_currency:  \__kivi_tab_column_currency:
289
290 \clist_map_inline:nn {head, foot, firsthead, lastfoot} {%TODO reduce
291         \box_new:c {g_kivi_LT@#1_box}
292 }
293
294 \newkomafont{PricingTableHeader}{\bfseries}
295
296 \cs_new:Nn \__kivi_setup_LT_boxes: {
297         \__kivi_calc_desc_column:
298         \hbox_gset:Nn \g_kivi_LT@head_box {
299                 \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
300                 \exp_args:Nnx \use:n {\tabular[b]}\g_kivi_Pricing_colspec_tl
301                 \__kivi_PricingTabular_header:
302                 \endtabular
303         }
304         \hbox_gset:Nn \g_kivi_LT@foot_box {
305                 \raisebox{\depth}{
306                         \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}r@{}}
307                                 \midrule
308                                 \strut\weiteraufnaechsterseite
309                         \end{tabular*}
310                 }
311         }
312         \hbox_gset:Nn \g_kivi_LT@lastfoot_box {
313                 \raisebox{\dimexpr\depth+\baselineskip}[0pt][0pt]{
314                         \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}r@{}}
315                                 \bottomrule
316                         \end{tabular*}
317                 }
318         }
319 }
320
321
322 %Macht es sinn hier eine Variante zu machen, in der alle Spalten Belegbar sind?
323 \newenvironment{PricingTotal}{
324         \par\nointerlineskip
325         \unskip
326         \tabular[t]{@{}p{\dim_eval:n {\linewidth-\l_kivi_tab_pricetotal_dim-2\tabcolsep}}P{\l_kivi_tab_pricetotal_dim}@{}}
327         \midrule
328 }{
329         \endtabular
330 }
331
332
333 \newcommand*\ExtraDescription{
334         \PackageError{kiviletter}{The~command~\string\ExtraDescription\space~may~be~only~used~inside~the~\string\FakeTable\space~environment.}{See~documentation~for~details}
335 }
336
337
338 \cs_new:Nn \__kivi_addExtraDescription:n {\seq_gput_right:Nn \g_kivi_extraDescription_seq {#1}}
339
340 \newenvironment{PricingTabular}[1][]{
341         \begingroup
342         \dim_set:Nn \parskip {\c_zero_dim}
343         \tl_if_empty:nF {#1} {\keys_set:nn {kivi/PricingTable} {#1}}
344         \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
345         \__kivi_calc_desc_column:
346         \exp_args:Nx \longtable \g_kivi_Pricing_colspec_tl
347         % Tabellenkopf
348         \__kivi_PricingTabular_header:
349         \endhead
350         \midrule
351         \rlap{\makebox[\textwidth][r]{\weiteraufnaechsterseite}}\\
352         \endfoot
353         \bottomrule
354         \endlastfoot
355 }{
356         \endlongtable
357         \endgroup
358 }
359
360 \cs_set:Nn \__kivi_PricingTabular_header: {
361         \toprule
362         \cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_header_currency:
363         \bool_set_false:N \l_tmpa_bool
364         \clist_map_inline:Nn \g_kivi_pricingtable_col_clist     {
365                 \bool_if:cT {l_kivi_col_##1_bool} {
366                         \bool_if:NT \l_tmpa_bool {&}
367                         \bool_set_true:N \l_tmpa_bool
368                         \usekomafont{PricingTableHeader}
369                         \prop_item:cn {l_kivi_col_##1_prop} {header}
370                 }
371         }
372         \cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_body_currency:
373         \\
374         \midrule
375 }
376
377 \RequirePackage{xltabular}
378
379 \keys_define:nn {kivi/SimpleTabular} {
380         colspec .tl_set:N =\l_kivi_SimpleTabular_colspec_tl,
381         colspec .initial:n = {rrX},
382         headline .tl_set:N = \l_kivi_SimpleTabular_headline_tl,
383         headline .initial:n = {\bfseries\position & \bfseries\menge & \bfseries\bezeichnung},
384 }
385
386 \newcommand*{\SetupSimpleTabular}[1]{\keys_set:nn {kivi/SimpleTabular} {#1}}
387 \newcommand*{\SetupPricingTabular}[1]{\keys_set:nn {kivi/PricingTable} {#1}}
388
389 \newenvironment{SimpleTabular}[1][]
390 {
391         \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}}}
392         \setlength{\tabcolsep}{\g_kivi_tabcolsep_dim}
393         \dim_set:Nn \parskip {\c_zero_dim}
394         \tl_put_right:Nn \l_kivi_SimpleTabular_colspec_tl {@{}}
395         \tl_put_left:Nn \l_kivi_SimpleTabular_colspec_tl {@{}}
396         \exp_args:NnV \xltabular{\linewidth}\l_kivi_SimpleTabular_colspec_tl
397                 \toprule
398                 \cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_header_currency:
399                 \l_kivi_SimpleTabular_headline_tl
400                 \\
401                 \noalign{\cs_gset_eq:NN \__kivi_tab_column_currency: \__kivi_tab_column_body_currency:}
402                 \midrule
403         \endhead
404                 \midrule
405                 \rlap{\makebox[\textwidth][r]{\weiteraufnaechsterseite}}\\
406         \endfoot
407                 \bottomrule
408         \endlastfoot
409         \ignorespaces
410 }{
411         \def\@currenvir{tabularx}
412         \endxltabular
413 }
414
415 %PricingTabular* kann automatisch spalten ignorieren
416 % \begin{PricingTabular*}[id=false]
417 % deaktiviert damit die Spalte der Produktnummer
418 % analog ist dies für pos, amount, price, pricetotal möglich.
419 % Die Spalte der Bezeichnung ist nicht deaktivierbar
420 \newenvironment{PricingTabular*}[1][]{
421         \tl_if_empty:nF {#1} {\keys_set:nn {kivi/PricingTable} {#1}}
422         \__kivi_setup_LT_boxes:
423         \__kivi_setup_FakeTable:
424         \dim_set:Nn \parskip {\c_zero_dim}
425         \PricingTabularBox\ignorespaces
426 }{\endPricingTabularBox}
427
428 \newtcolorbox{PricingTabularBox}{breakable,skin=kivi@LT}
429
430
431
432 \if@kivi@infobox
433 \setkomavar{location}{
434         \Ifkomavarempty{transaction}{}{
435         \bfseries
436         \usekomavar{transaction}
437         }
438         \par
439         \medskip
440         \begin{tabularx}{\useplength{locwidth}}{@{}l<{:}>{\raggedleft\arraybackslash}X@{}}
441                 \usekomavar*{date}&\usekomavar{date}\\
442                 \Ifkomavarempty{myref}{}{
443                         \usekomavar*{myref}&\usekomavar{myref}\\
444                 }
445                 \kundennummer&\usekomavar{customer}\\
446                 \Ifkomavarempty{yourref}{}{
447                         \usekomavar*{yourref}&\usekomavar{yourref}\\
448                 }
449                 \Ifkomavarempty{delivery}{}{
450                         \usekomavar*{delivery}&\usekomavar{delivery}\\
451                 }
452                 \Ifkomavarempty{quote}{}{
453                         \usekomavar*{quote}&\usekomavar{quote}\\
454                 }
455                 \Ifkomavarempty{orderID}{}{\auftragsnummer&\usekomavar{orderID}\\}
456                 \Ifkomavarempty{projectID}{}{\projektnummer&\usekomavar{projectID}\\}
457                 \ansprechpartner&\usekomavar{fromname}
458                 \Ifkomavarempty{fromphone}{}{\\\textTelefon&\usekomavar{fromphone}}
459                 \Ifkomavarempty{fromemail}{}{\\\textEmail&\usekomavar{fromemail}}
460         \end{tabularx}
461 }
462 \removereffields
463 \AtBeginLetter{
464         \ifdim\ht\shippingAddressBox>\z@
465         \@addtoplength{refvpos}{\dimexpr\ht\shippingAddressBox+\dp\shippingAddressBox}
466         \@addtoplength{refvpos}{4\baselineskip}%sep between address boxes
467         \fi
468 }
469
470 \fi
471
472 %Fallback for older KOMA-Script-Versions
473 \cs_if_exist:NF \Ifstr {\let\Ifstr\ifstr}
474 \cs_if_exist:NF \Ifkomavarempty {\let\Ifkomavarempty\ifkomavarempty}
475
476 %Definitionen für die insettings.tex
477
478 \newcommand*{\setupIdentpath}[1]{
479         \int_set:Nn \l_kivi_tmp_int {1}
480         \bool_set_true:N \l_kivi_tmp_bool
481         \bool_while_do:Nn \l_kivi_tmp_bool {
482                 \file_if_exist:nTF {firma\int_use:N \l_kivi_tmp_int/ident.tex}
483                 {
484                         \exp_args:Nf \str_if_in:nnTF {#1} {Firma\int_use:N \l_kivi_tmp_int}
485                         {
486                                 \newcommand*{\identpath}{firma\int_use:N \l_kivi_tmpa_int}
487                                 \bool_set_false:N \l_kivi_tmp_bool
488                         }
489                         {\int_incr:N \l_kivi_tmp_int}
490                 }
491                 {
492                         \bool_set_false:N \l_kivi_tmp_bool
493                         \newcommand*{\identpath}{firma}
494                 }
495         }
496 }
497
498 \newcommand*{\setupCurrencyConfig}[2]{
499         \tl_new:N \g_kivi_currency_tl
500         \exp_args:Nf \str_if_in:nnT {#2} {USD} {\tl_gset:Nn \g_kivi_currency_tl {usd}}
501         \exp_args:Nf \str_if_in:nnT {#2} {CHF} {\tl_gset:Nn \g_kivi_currency_tl {chf}}
502         \exp_args:Nf \str_if_in:nnT {#2} {EUR} {\tl_gset:Nn \g_kivi_currency_tl {euro}}
503         \tl_if_empty:NT  \g_kivi_currency_tl {
504                 \tl_gset:Nn \g_kivi_currency_tl {default}
505                 \edef \currency {\tl_to_str:N \lxcurrency}
506         }
507         \input{#1/\g_kivi_currency_tl _account.tex}
508 }
509
510 \ExplSyntaxOff
511
512
513 \renewcommand*{\raggedsignature}{\raggedright}
514
515 \newkomafont{extraDescription}{}
516
517 \endinput