summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/qrbill
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2020-06-28 21:39:28 +0000
committerKarl Berry <karl@freefriends.org>2020-06-28 21:39:28 +0000
commitea455e4bbad0f05db1db8a7c9021774da2efeb22 (patch)
tree08ec37f82779c100f1e5d7cb137c5998008408ec /Master/texmf-dist/tex/latex/qrbill
parent6339e51588b3e9162d1a12206a96ae5dde5364ab (diff)
qrbill (28jun20)
git-svn-id: svn://tug.org/texlive/trunk@55694 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/qrbill')
-rw-r--r--Master/texmf-dist/tex/latex/qrbill/qrbill.sty532
1 files changed, 532 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/qrbill/qrbill.sty b/Master/texmf-dist/tex/latex/qrbill/qrbill.sty
new file mode 100644
index 00000000000..d3a665b250f
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/qrbill/qrbill.sty
@@ -0,0 +1,532 @@
+%%
+%% This is file `qrbill.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% qrbill.dtx (with options: `qrbill.sty,package')
+%%
+%% Copyright (C) 2020 by Marei Peischl (peiTeX) <marei@peitex.de>
+%%
+%% This work is a collaboration of
+%% Marei Peischl (peiTeX) and Alex Antener (foobar LLC).
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3 or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is
+%% Marei Peischl <qrbill@peitex.de>.
+%%
+%% This work consists of the files
+%% qrbill.dtx and qrbill.ins, qrbill-vocab.csv
+%% and the derived files
+%% qrbill.sty, swiss.qrbill-cfg.tex, qrbill-letter-demo.tex,
+%% qrbill-standalone-demo.tex .
+%%
+%% The development repository can be found at
+%% https://github.com/peitex/qrbill
+%% Please use the issue tracker for feedback!
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\RequirePackage{expl3}
+\ProvidesExplPackage{qrbill}{2020/06/28}{1.0}{
+ Template for QR-bills based on the Swiss Payment Standards
+}
+\RequirePackage{iftex}
+\RequirePackage{l3keys2e}
+
+\tl_new:N \g__qrbill_font_tl
+\bool_new:N \g__qrbill_top_frame_bool
+\bool_new:N \g__qrbill_bottom_frame_bool
+\bool_new:N \g__qrbill_left_frame_bool
+\bool_new:N \g__qrbill_right_frame_bool
+
+\keys_define:nn {qrbill} {
+ font .choices:nn = {Frutiger, Arial, Helvetica, Liberation Sans} {
+ \bool_gset_true:N \g__qrbill_fontsetup_bool
+ \tl_gset_eq:NN \g__qrbill_font_tl \l_keys_choice_tl
+ },
+ font .initial:n = Liberation Sans,
+ font / custom .code:n = {\tl_gclear:N \g__qrbill_font_tl},
+ qrscheme .tl_gset:N = \g__qrbill_qrscheme_tl,
+ qrscheme .initial:n = swiss,
+ creditorprefix .tl_gset:N = \g__qrbill_creditorprefix_tl,
+ creditorprefix .initial:n = CR-,
+ debtorprefix .tl_gset:N = \g__qrbill_debtorprefix_tl,
+ debtorprefix .initial:n = UD-,
+ qrmode .choice:,
+ qrmode / package .code:n = \bool_gset_false:N \g__qrbill_luamode_bool,
+ qrmode / lua .code:n = \bool_gset_true:N \g__qrbill_luamode_bool,
+ qrmode .initial:n = package,
+ frame .choice:,
+ frame / false .code:n = {
+ \bool_gset_false:N \__g__qrbill_top_frame_bool
+ \bool_gset_false:N \g__qrbill_bottom_frame_bool
+ \bool_gset_false:N \g__qrbill_left_frame_bool
+ \bool_gset_false:N \g__qrbill_right_frame_bool
+ },
+ frame / true .code:n = {
+ \bool_gset_true:N \g__qrbill_top_frame_bool
+ \bool_gset_true:N \g__qrbill_bottom_frame_bool
+ \bool_gset_true:N \g__qrbill_left_frame_bool
+ \bool_gset_true:N \g__qrbill_right_frame_bool
+ },
+ frame / top .code:n = {
+ \bool_gset_true:N \g__qrbill_top_frame_bool
+ \bool_gset_false:N \g__qrbill_bottom_frame_bool
+ \bool_gset_false:N \g__qrbill_left_frame_bool
+ \bool_gset_false:N \g__qrbill_right_frame_bool
+ },
+ frame / bottom .code:n = {
+ \bool_gset_false:N \g__qrbill_top_frame_bool
+ \bool_gset_true:N \g__qrbill_bottom_frame_bool
+ \bool_gset_false:N \g__qrbill_left_frame_bool
+ \bool_gset_false:N \g__qrbill_right_frame_bool
+ },
+ frame .initial:n = true,
+ billinginfo .bool_gset:N = \g__grbill_billinginfo_auto_bool,
+ billinginfo .default:n = true,
+ billinginfo .initial:n = true,
+ icon .choice:,
+ icon / swiss-cross .meta:n = {icon=qrbill_swiss-cross.pdf},
+ icon / unknown .code:n = \tl_gset:Nn \g_qrbill_icon_tl {#1},
+ icon .initial:n =,
+ iconwidth .dim_gset:N = \g_qrbill_iconwidth_dim,
+ iconwidth .initial:n = 7mm,
+}
+
+\ProcessKeysOptions{qrbill}
+
+\newcommand*{\qrbillsetup}[1]{\keys_set:nn {qrbill}{#1}}
+\newcommand*{\qrbillsetdata}[1]{\keys_set:nn {qrbill/data}{#1}}
+
+\tl_if_empty:NTF \g__qrbill_font_tl {
+ \def\qrbillfont{\normalfont}
+}{
+ \RequirePackage{fontspec}
+ \newfontfamily{\qrbillfont}{\g__qrbill_font_tl}
+}
+
+\dim_new:N \g_qrbill_QRcode_dim
+\dim_gset:Nn \g_qrbill_QRcode_dim {46mm}
+\bool_if:NF \g__qrbill_luamode_bool {
+ \usepackage{qrcode}
+ \cs_new:Nn \qrbill_parse_QRcode:n {
+ \raisebox{\depth}{\qrcode[height= \g_qrbill_QRcode_dim]{#1}}
+ }
+ \cs_generate_variant:Nn \qrbill_parse_QRcode:n {V}
+}
+
+\RequirePackage{scrbase}
+\RequirePackage{graphicx}
+\RequirePackage{numprint}
+\npthousandsep{\,}
+\npdecimalsign{.}
+
+\dim_new:N \g__qrbill_rule_dim
+\dim_gset:Nn \g__qrbill_rule_dim {.5pt}
+\dim_const:Nn \c_qrbill_sep_dim {5mm}
+\dim_const:Nn \c_qrbill_width_dim {210mm}
+\dim_const:Nn \c_qrbill_height_dim {105mm}
+
+\cs_new:Nn \qrbill_title_font: {\fontsize{11bp}{11bp}\selectfont\bfseries}
+
+\cs_new:Nn \qrbill_headingR_font: {\fontsize{6bp}{9bp}\selectfont\bfseries}
+\cs_new:Nn \qrbill_valueR_font: {\fontsize{8bp}{9bp}\selectfont}
+\cs_new:Nn \qrbill_amountR_font: {\fontsize{8bp}{11bp}\selectfont}
+\cs_new:Nn \qrbill_acceptance_font: {\fontsize{6bp}{8bp}\selectfont\bfseries}
+
+\cs_new:Nn \qrbill_headingP_font: {\fontsize{8bp}{11bp}\selectfont\bfseries}
+\cs_new:Nn \qrbill_valueP_font: {\fontsize{10bp}{11bp}\selectfont}
+\cs_new:Nn \qrbill_amountP_font: {\fontsize{10bp}{13bp}\selectfont}
+
+\cs_new:Nn \qrbill_infoheading_font: {\fontsize{7bp}{8bp}\selectfont\bfseries}
+\cs_new:Nn \qrbill_info_font: {\fontsize{7bp}{8bp}\selectfont}
+
+\dim_new:N \g_qrbill_placeholder_rule_dim
+\dim_gset:Nn \g_qrbill_placeholder_rule_dim {.75pt}
+\dim_new:N \g_qrbill_placeholder_corner_dim
+\dim_gset:Nn \g_qrbill_placeholder_corner_dim {3mm}
+\cs_new:Nn \__qrbill_placeholder_hmark: {
+ \rule{\g_qrbill_placeholder_corner_dim}{\g_qrbill_placeholder_rule_dim}
+}
+\cs_new:Nn \__qrbill_placeholder_vmark: {
+ \rule{\g_qrbill_placeholder_rule_dim}{\g_qrbill_placeholder_corner_dim}
+}
+
+\cs_new:Nn \__qrbill_placeholder:nn {
+ \vbox_to_ht:nn {#2} {
+ \hbox_to_wd:nn {#1} {\__qrbill_placeholder_hmark: \hfill \__qrbill_placeholder_hmark:}
+ \nointerlineskip
+ \hbox_to_wd:nn {#1} {\__qrbill_placeholder_vmark: \hfill \__qrbill_placeholder_vmark:}
+ \vfill
+ \hbox_to_wd:nn {#1} {\__qrbill_placeholder_vmark: \hfill \__qrbill_placeholder_vmark:}
+ \nointerlineskip
+ \hbox_to_wd:nn {#1} {\__qrbill_placeholder_hmark: \hfill \__qrbill_placeholder_hmark:}
+ }
+}
+
+\cs_new:Nn \qrbill_bill_create: {
+ \begingroup
+ \qrbill_parse_BillingInfo:
+ \qrbillfont
+ \setlength{\parindent}{\z@}
+ \parbox{\c_qrbill_width_dim }{
+ \vbox to \c_qrbill_height_dim {
+ \bool_if:NTF \g__qrbill_top_frame_bool
+ {\rule{\c_qrbill_width_dim}{\g__qrbill_rule_dim}}
+ {\rule{\c_zero_dim}{\g__qrbill_rule_dim}}
+ \par\nointerlineskip
+ \skip_vertical:n {\c_qrbill_sep_dim-\g__qrbill_rule_dim}
+ \skip_horizontal:n {\c_qrbill_sep_dim-\g__qrbill_rule_dim}
+ \begin{minipage}[c][95mm][t]{52mm}
+ \vbox_to_ht:nn {7mm} {\qrbill_title_font:\qrbillreceiptname}
+ \par\nointerlineskip
+ \vbox_to_ht:nn {56mm}{
+ {\qrbill_headingR_font:\qrbillaccountname\par}
+ {
+ \qrbill_valueR_font:\tl_use:c {l_qrbill_data_Account_tl}\par
+ \qrbill_insert_address:N \g__qrbill_creditorprefix_tl
+ \par\vskip\baselineskip
+ }
+ \tl_if_empty:NF \l_qrbill_data_Reference_tl {
+ {\qrbill_headingR_font:\qrbillreferencename\par}
+ {
+ \qrbill_valueR_font:\tl_use:c {l_qrbill_data_Reference_tl}
+ \par\vskip\baselineskip
+ }
+ }
+ \tl_if_empty:cTF {l_qrbill_data_\g__qrbill_debtorprefix_tl Name_tl}
+ {
+ {\qrbill_headingR_font:\qrbilldebtoraddrname\par}
+ \__qrbill_placeholder:nn {52mm} {20mm}
+ }{
+ {\qrbill_headingR_font:\qrbilldebtorname\par}
+ {
+ \qrbill_valueR_font:
+ \qrbill_insert_address:N \g__qrbill_debtorprefix_tl
+ \par
+ }
+ }
+ }
+ \par\nointerlineskip
+ \vbox_to_ht:nn {14mm}{
+ \qrbill_headingR_font:
+ \begin{tabular}[t]{@{}ll@{}}
+ \qrbillcurrencyname&\qrbill_headingR_font:\qrbillamountname\\
+ \qrbill_amountR_font:\l_qrbill_data_Currency_tl
+ &\qrbill_amountR_font:
+ \tl_if_empty:NF \l_qrbill_data_Amount_tl
+ {\numprint{\l_qrbill_data_Amount_tl}}
+ \end{tabular}
+ \tl_if_empty:NTF \l_qrbill_data_Amount_tl {
+ \hfill
+ \raisebox{\dimexpr-\height+\ht\strutbox}[\z@]{\llap{
+ \__qrbill_placeholder:nn {30mm} {10mm}
+ }}
+ }
+ \vfill
+ }
+ \par\nointerlineskip
+ \vbox_to_ht:nn {18mm} {
+ \makebox[\linewidth][r]{\qrbill_headingR_font:\qrbillacceptantname}\par
+ }
+ \end{minipage}%
+ \skip_horizontal:n {2\c_qrbill_sep_dim}
+ \begin{minipage}[c][95mm][t]{138mm}
+ \begin{minipage}[c][85mm][t]{51mm}
+ {\qrbill_title_font:\qrbillpaymentpartname}
+ \par\nointerlineskip
+ \skip_vertical:n {\c_qrbill_sep_dim}
+ \qrcode_setup_QRcode:
+ \leavevmode\qrbill_parse_QRcode:V \l_qrbill_data_str
+ \tl_if_empty:NF \g_qrbill_icon_tl {
+ \llap{\hbox_to_wd:nn {\g_qrbill_QRcode_dim} {
+ \hfill
+ \raisebox{\dimexpr-.5\height+.5\g_qrbill_QRcode_dim}[0pt][0pt]{
+ \includegraphics[width=\g_qrbill_iconwidth_dim]{\g_qrbill_icon_tl}
+ }
+ \hfill
+ }}
+ }
+ \skip_vertical:n {\c_qrbill_sep_dim}
+ \vbox_to_ht:nn {22mm}{
+ \begin{tabular}[b]{@{}ll@{}}
+ \qrbill_headingP_font:\qrbillcurrencyname&\qrbill_headingP_font:
+ \qrbillamountname\\
+ \qrbill_amountP_font:\tl_use:c {l_qrbill_data_Currency_tl}&
+ \tl_if_empty:NF \l_qrbill_data_Amount_tl {
+ \qrbill_amountP_font:\numprint{\l_qrbill_data_Amount_tl}
+ }
+ \end{tabular}
+ \tl_if_empty:NTF \l_qrbill_data_Amount_tl {
+ \hfill
+ \raisebox{\dimexpr-\height+\ht\strutbox}[\z@]{
+ \llap{\__qrbill_placeholder:nn {40mm} {15mm}
+ }}
+ }
+ }
+ \end{minipage}
+ \begin{minipage}[c][85mm][t]{87mm}
+ \par\nointerlineskip
+ {\qrbill_headingP_font:\qrbillaccountname\par}
+ {
+ \qrbill_valueP_font:\tl_use:c {l_qrbill_data_Account_tl}\par
+ \qrbill_insert_address:N \g__qrbill_creditorprefix_tl
+ \par\vskip\baselineskip
+ }
+ \tl_if_empty:NF \l_qrbill_data_Reference_tl {
+ {\qrbill_headingP_font:\qrbillreferencename\par}
+ {\qrbill_valueP_font:\tl_use:c {l_qrbill_data_Reference_tl}
+ \par\vskip\baselineskip}
+ }
+ \exp_args:Nf \tl_if_empty:nF {
+ \l_qrbill_data_BillingInfo_tl
+ \l_qrbill_data_Message_tl
+ }{
+ {\qrbill_headingP_font:\qrbilladdinfoname\par}
+ {
+ \qrbill_valueP_font:
+ \l_qrbill_data_Message_tl\par
+ \tl_replace_all:Nnn \l_qrbill_data_BillingInfo_tl {/} {\discretionary{}{}{}/}
+ \l_qrbill_data_BillingInfo_tl
+ \par\vskip\baselineskip
+ }
+ }
+ \tl_if_empty:cTF {l_qrbill_data_\g__qrbill_debtorprefix_tl Name_tl} {
+ {\qrbill_headingP_font:\qrbilldebtoraddrname\par}
+ \__qrbill_placeholder:nn {65mm} {25mm}
+ }{
+ {\qrbill_headingP_font:\qrbilldebtorname\par}
+ {
+ \qrbill_valueP_font:
+ \qrbill_insert_address:N \g__qrbill_debtorprefix_tl
+ \par
+ }
+ }
+ \end{minipage}\par\nointerlineskip
+ \begin{minipage}[b][10mm][t]{\linewidth}
+ \strut
+ \qrbill_insert_AV_parameters:NNn
+ \qrbill_infoheading_font:
+ \qrbill_info_font:
+ {AV1,AV2}
+ \end{minipage}
+ \end{minipage}
+ \par\nointerlineskip\skip_vertical:n {\c_qrbill_sep_dim}
+ \smash{
+ \bool_if:NT \g__qrbill_bottom_frame_bool
+ {\rlap{\rule{\c_qrbill_width_dim}{\g__qrbill_rule_dim}}}
+ \bool_if:NTF \g__qrbill_left_frame_bool
+ {\rule{\g__qrbill_rule_dim}{\c_qrbill_height_dim}}
+ {\rule{\g__qrbill_rule_dim}{\c_zero_dim}}
+ \hspace{\dimexpr62mm-1.5\g__qrbill_rule_dim}
+ \rule{\g__qrbill_rule_dim}{\c_qrbill_height_dim}
+ \hspace{\dimexpr148mm-1.5\g__qrbill_rule_dim}
+ \bool_if:NTF \g__qrbill_right_frame_bool
+ {\rule{\g__qrbill_rule_dim}{\c_qrbill_height_dim}}
+ {\rule{\g__qrbill_rule_dim}{\c_zero_dim}}
+ }
+ }
+ }
+ \endgroup
+}
+
+\newcommand{\QRbill}[1][]{
+ \begingroup
+ \tl_if_empty:nF {#1} {\keys_set:nn {qrbill/data} {#1}}
+ \qrbill_bill_create:
+ \endgroup
+}
+
+\ior_new:N \qrbill_ior
+\clist_new:N \l_qrbill_tmpa_clist
+\ior_open:Nn \qrbill_ior {qrbill-vocab.csv}
+
+\ior_get:NN \qrbill_ior \l_tmpa_tl
+\clist_set:Nx \l_qrbill_tmpa_clist {\l_tmpa_tl}
+\int_set:Nn \l_tmpa_int {\clist_count:N \l_qrbill_tmpa_clist}
+
+\ior_str_map_inline:Nn \qrbill_ior {
+ \int_step_inline:nnn {2} {\l_tmpa_int } {
+ \exp_args:Nnx \use:n {\exp_args:NNx \exp_args:Nnc \defcaptionname
+ {\clist_item:Nn \l_qrbill_tmpa_clist {##1}}
+ {qrbill\clist_item:nn {#1} {1}name}}
+ {\clist_item:nn {#1} {##1}}
+ }
+}
+
+\ior_close:N \qrbill_ior
+
+\seq_new:N \l_qrbill_tmp_seq
+
+\cs_new:Nn \qrbill_set_address_combined:nn {
+ \seq_set_split:Nnn \l_qrbill_tmp_seq {\\} {#2}
+ \exp_args:Nnx \keys_set:nn {qrbill/data} {
+ #1AddressType=K,
+ #1Name=\seq_item:Nn \l_qrbill_tmp_seq {1},
+ #1Address1=\seq_item:Nn \l_qrbill_tmp_seq {2},
+ #1Address2=\seq_item:Nn \l_qrbill_tmp_seq {3},
+ #1PostalCode=,
+ #1City=,
+ #1Country=\seq_item:Nn \l_qrbill_tmp_seq {4},
+ }
+}
+
+\cs_new:Nn \qrbill_set_address_structured:nn {
+ \seq_set_split:Nnn \l_qrbill_tmp_seq {\\} {#2}
+ \exp_args:Nnx \keys_set:nn {qrbill/data} {
+ #1AddressType=S,
+ #1Name=\seq_item:Nn \l_qrbill_tmp_seq {1},
+ #1Address1=\seq_item:Nn \l_qrbill_tmp_seq {2},
+ #1Address2=\seq_item:Nn \l_qrbill_tmp_seq {3},
+ #1PostalCode=\seq_item:Nn \l_qrbill_tmp_seq {4},
+ #1City=\seq_item:Nn \l_qrbill_tmp_seq {5},
+ #1Country=\seq_item:Nn \l_qrbill_tmp_seq {6},
+ }
+}
+
+\cs_new:Nn \qrbill_insert_address:N {
+ \tl_use:c {l_qrbill_data_#1Name_tl}\ifhmode\\\fi
+ \str_case_e:nnF {\use:c {l_qrbill_data_#1AddressType_tl}}
+ {
+ {K} {
+ \tl_use:c {l_qrbill_data_#1Address1_tl}
+ \tl_if_empty:cF {l_qrbill_data_#1Address2_tl} {
+ \ifhmode\\\fi
+ \tl_if_empty:cF {l_qrbill_data_#1Country_tl}
+ {\tl_use:c {l_qrbill_data_#1Country_tl}-}
+ \tl_use:c {l_qrbill_data_#1Address2_tl}
+ }
+ }
+ }{
+ \tl_use:c {l_qrbill_data_#1Address1_tl}~
+ \tl_use:c {l_qrbill_data_#1Address2_tl}
+ \tl_if_empty:cF {l_qrbill_data_#1City_tl} {
+ \ifhmode\\\fi
+ \tl_if_empty:cF {l_qrbill_data_#1Country_tl}
+ {\tl_use:c {l_qrbill_data_#1Country_tl}-}
+ \tl_use:c {l_qrbill_data_#1PostalCode_tl}~
+ \tl_use:c {l_qrbill_data_#1City_tl}
+ }
+ }
+}
+
+\newcommand*{\insertdebtor}{\null\qrbill_insert_address:N \g__qrbill_debtorprefix_tl}
+\newcommand*{\insertcreditor}{\null\qrbill_insert_address:N \g__qrbill_creditorprefix_tl}
+\newcommand*{\insertcurrency}{\l_qrbill_data_Currency_tl}
+
+\keys_define:nn {qrbill/data} {
+ creditor .code:n = \qrbill_set_address_combined:nn {\g__qrbill_creditorprefix_tl}{#1},
+ creditor* .code:n = \qrbill_set_address_structured:nn {\g__qrbill_creditorprefix_tl} {#1},
+ debtor .code:n = \qrbill_set_address_combined:nn {\g__qrbill_debtorprefix_tl}{#1},
+ debtor* .code:n = \qrbill_set_address_structured:nn {\g__qrbill_debtorprefix_tl} {#1},
+ account .tl_set:N = \l_qrbill_iban_tl,
+}
+
+\clist_map_inline:nn {AV1, AV2} {
+ \keys_define:nn {qrbill/data} {
+ #1 .code:n = {
+ \tl_if_empty:nF {##1}{
+ \keys_set:nx {qrbill/data} {
+ #1-Parameters={\qrbill_av_prefix:n {#1}##1}
+ }
+ }
+ \tl_set:cn {l_qrbill_#1_tl} {##1}
+ },
+ #1 .initial:n =,
+ }
+}
+
+\newcommand*{\SetupQrBill}[1]{
+ \keys_set:nn {qrbill/data} {#1}
+}
+
+\str_new:N \l_qrbill_data_str
+\cs_new:Nn \qrcode_setup_QRcode: {
+ \str_clear:N \l_qrbill_data_str
+ \bool_set_false:N \l_tmpa_bool
+ \seq_map_inline:Nn \g__qrbill_qrscheme_seq {
+ \bool_if:NTF \l_tmpa_bool
+ {\str_put_right:Nn\l_qrbill_data_str {^^J}}
+ {\bool_set_true:N \l_tmpa_bool}
+ \exp_args:NNv \str_put_right:Nn \l_qrbill_data_str {l_qrbill_data_##1_tl}
+ }
+ %necessary to preserve spaces!
+ \str_replace_all:Nnn \l_qrbill_data_str {~ } {\ }
+ \tl_set_rescan:Nno \l_qrbill_data_str {\ExplSyntaxOff} {\l_qrbill_data_str}
+}
+
+\seq_new:N \g__qrbill_qrscheme_seq
+\newcommand*\SetQrScheme[1]{
+ \seq_gset_from_clist:Nn \g__qrbill_qrscheme_seq {#1}
+ \seq_map_inline:Nn \g__qrbill_qrscheme_seq {
+ \keys_define:nn {qrbill/data} {
+ ##1 .tl_set:c = l_qrbill_data_##1_tl,
+ ##1 .initial:n =,
+ }
+ }
+}
+
+\prop_new:N \g__qrbill_billing_info_prop
+\seq_new:N \g__qrbill_billing_info_seq
+\newcommand*{\SetBillingInfoScheme}[1]{
+ \prop_gset_from_keyval:Nn \g__qrbill_billing_info_prop {#1}
+ \seq_gclear:N \g__qrbill_billing_info_seq
+ \prop_map_inline:Nn \g__qrbill_billing_info_prop {
+ \exp_args:Nx \clist_if_in:nnF {\tl_to_str:n {prefix , postfix}} {##1} {
+ \seq_push:Nn \g__qrbill_billing_info_seq {##1}
+ }
+ \keys_define:nn {qrbill/data} {
+ ##2 .tl_set:c = l_qrbill_##2_tl,
+ ##2 .initial:n =,
+ }
+ }
+ \seq_sort:Nn \g__qrbill_billing_info_seq {
+ \int_compare:nNnTF { ##1 } > { ##2 }
+ { \sort_return_swapped: }
+ { \sort_return_same: }
+ }
+}
+
+\tl_new:N \l_qrbill_data_BillingInfo_tl
+
+\cs_new:Nn \qrbill_parse_BillingInfo: {
+ \bool_if:NT \g__grbill_billinginfo_auto_bool {
+ \str_put_right:Nx \l_qrbill_data_BillingInfo_tl {
+ \prop_item:Nn \g__qrbill_billing_info_prop {prefix}
+ }
+ \seq_map_inline:Nn \g__qrbill_billing_info_seq {
+ \prop_get:NnN \g__qrbill_billing_info_prop {##1} \l_tmpa_tl
+ \tl_if_empty:cF {l_qrbill_\l_tmpa_tl _tl} {
+ \str_put_right:Nx \l_qrbill_data_BillingInfo_tl {
+ /##1/\tl_use:c {l_qrbill_\l_tmpa_tl _tl}
+ }
+ }
+ }
+ }
+}
+
+\cs_new:Nn \qrbill_insert_AV_parameters:NNn {
+ \clist_map_inline:nn {#3} {
+ \tl_if_empty:cF {l_qrbill_##1_tl}
+ {{#1\qrbill_av_prefix:n {##1}}{#2 \tl_use:c {l_qrbill_##1_tl}}}
+ }
+}
+
+\cs_new:Nn \qrbill_av_prefix:n {Name~#1:~}
+
+\input{\g__qrbill_qrscheme_tl.qrbill-cfg}
+
+\endinput
+%%
+%% End of file `qrbill.sty'.