diff options
author | Norbert Preining <norbert@preining.info> | 2022-10-20 03:04:26 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2022-10-20 03:04:26 +0000 |
commit | 3b961a61ef9fb89adf20a89550d5de0bfe135448 (patch) | |
tree | e36f997e624c704dbb4ed2b5fdbd02835ea3c133 /macros/latex/contrib/qrbill | |
parent | 7b6cdf4c23e6ed232601dabc70f5553a8dee9c9b (diff) |
CTAN sync 202210200304
Diffstat (limited to 'macros/latex/contrib/qrbill')
-rw-r--r-- | macros/latex/contrib/qrbill/README.md | 12 | ||||
-rw-r--r-- | macros/latex/contrib/qrbill/qrbill.dtx | 744 | ||||
-rw-r--r-- | macros/latex/contrib/qrbill/qrbill.ins | 3 | ||||
-rw-r--r-- | macros/latex/contrib/qrbill/qrbill.pdf | bin | 85725 -> 86369 bytes |
4 files changed, 395 insertions, 364 deletions
diff --git a/macros/latex/contrib/qrbill/README.md b/macros/latex/contrib/qrbill/README.md index d04340f782..8079883d18 100644 --- a/macros/latex/contrib/qrbill/README.md +++ b/macros/latex/contrib/qrbill/README.md @@ -4,7 +4,7 @@ Copyright (C) Marei Peischl (peiTeX) <marei@peitex.de>, 2020–2022 This work is part of a collaborative project of Marei Peischl (peiTeX) and Alex Antener (foobar LLC). -qrbill 2022/09/15 v1.05 +qrbill 2022/10/18 v1.06 *************************************************************************** @@ -65,12 +65,16 @@ For further information on l3build and other options please have a look at the c * v1.03 (2021-05-10) - Update to swiss qrbill payments standard v2.2 - Add seb-iban and sep-reference to the example files - * v1.04 (2022/07/02) + * v1.04 (2022-07-02) - add basic support for EPC QR codes - add date parsing mechanism to preset the dates to values of `\today` - * v1.05 (2022/09/15) + * v1.05 (2022-09-15) - add option to convert all data to strings - add mechanism to do custom replacements within the data - fix qrcode encoding to support UTF-8 - add support for speedata's luaqrcode library for qrcode generation http://speedata.github.io/luaqrcode/ - - small layout and documentation fixes
\ No newline at end of file + - small layout and documentation fixes + * v1.06 (2022-10-18) + - additional customization for vrule + - add possibilities to ignore data fields if empty + - allow the usage of commas within the billing info
\ No newline at end of file diff --git a/macros/latex/contrib/qrbill/qrbill.dtx b/macros/latex/contrib/qrbill/qrbill.dtx index aa632a6845..fab4a79821 100644 --- a/macros/latex/contrib/qrbill/qrbill.dtx +++ b/macros/latex/contrib/qrbill/qrbill.dtx @@ -54,7 +54,7 @@ % \fi % \iffalse %<*driver> -\ProvidesFile{qrbill.dtx}[2022/09/15 v1.05 \ create QR-bills based on the Swiss standard] +\ProvidesFile{qrbill.dtx}[2022/10/18 v1.06 \ create QR-bills based on the Swiss standard] \documentclass[english, parskip=half-]{scrartcl} \usepackage{iftex} \ifPDFTeX @@ -86,9 +86,9 @@ \newcommand*\repl[1]{\meta{#1}} \newcommand*\opt[1]{\colorbox{black!20}{\meta{#1}}} \newcommand*\marg[1]{% - {\ttfamily\char`\{}\repl{#1}{\ttfamily\char`\}}} + {\ttfamily\char`\{}\repl{#1}{\ttfamily\char`\}}} \newcommand*\oarg[1]{% - {\ttfamily[}\opt{#1}{\ttfamily]} + {\ttfamily[}\opt{#1}{\ttfamily]} } \newcommand*{\sarg}{\texttt{*}} @@ -174,7 +174,7 @@ % \GetFileInfo{qrbill.dtx} % % \DoNotIndex{\newcommand,\newenvironment} -% \title{qrbill v1.03} +% \title{qrbill \fileversion} % \subtitle{\LaTeX-package to create QR-bills based on the Swiss payments standards} % \author{Marei Peischl \href{mailto:marei@peitex.de}{<marei@peitex.de>}} % \publishers{A collaborative project of pei\TeX{} and foobar LLC} @@ -192,16 +192,16 @@ % \fi % \section{Example of use} % The easies way to use the qrbill package is to create a bill with the standalone documentclass: -% +% % \begin{doccode} % \documentclass{standalone} % \usepackage[ngerman]{babel} -% +% % \usepackage{xcolor} % \usepackage{qrbill} -% +% % \begin{document} -% +% % \QRbill[ % creditor={foobar LLC\\ % Postfach 404\\ @@ -210,7 +210,7 @@ % Account=CH1280808005649899718, % % insert additional data here % ] -% +% % \end{document} % \end{doccode} % @@ -278,6 +278,11 @@ % \item[iconwidth (length) (7mm)] % This option allows custom scaling for custom icons. % +% \item[ignore-if-empty (comma list) (<empty>)] +% Allows to define a list of fields for the qrscheme to be ignored if they have empty values. +% For the swiss QRbill standard this is recommended for the fields \enquote{AV1-Parameters}, \enquote{AV2-Parameters} and \enquote{BillingInfo}. +% \changes{v1.06}{2022/10/18}{Add ignore-if-empty option} +% % \item[qrmode (package/lua) (package)] Selects the mechanism for QRcode generation. % With Version 2.0 the package supports usage of the the luaqrcode library \cite{luaqrcode}. This can be enabled by using the \latexinline{qmode=lua} option. % In that case the luaqrcode libary has to be installed within the \verb+$LUAINPUTS+. @@ -319,7 +324,11 @@ % Similarly the replace-umlauts options is mapping Umlauts to the two character representation. This can be used if UTF-8 is not supported. % Custom replacements can be set up using \latexinline{\QRbillAddCustomReplacement} as described in section \ref{sec:custom-replacement}. % \changes{v1.05}{2022/09/15}{Add replace-tilde/replace-umlauts options} -% +% +% \item[vrule (true/false/symbol) (true)] +% Allows customization of the vertical rule between payment part and receipt. The value \latexinline{vrule=symbol} acts similar to the \latexinline{separator=symbol} option. +% \changes{v1.06}{2022/10/18}{Add vrule=symbol option.} +% % \end{optionlist} % % \section{Data setup} @@ -505,7 +514,7 @@ % \section{Implementation} % \begin{macrocode} \RequirePackage{expl3} -\ProvidesExplPackage{qrbill}{2022/09/15}{1.05}{ +\ProvidesExplPackage{qrbill}{2022/10/18}{1.06}{ Template for QR-bills based on the Swiss Payment Standards } \RequirePackage{iftex} @@ -529,7 +538,7 @@ \keys_define:nn {qrbill} { font .choices:nn = {Frutiger, Arial, Helvetica, Liberation Sans} { - \tl_gset_eq:NN \g__qrbill_font_tl \l_keys_choice_tl + \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}, @@ -545,42 +554,54 @@ 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 - \bool_gset_true:N \g__qrbill_vrule_bool + \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 - \bool_gset_true:N \g__qrbill_vrule_bool + \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 - \bool_gset_true:N \g__qrbill_vrule_bool + \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 - \bool_gset_true:N \g__qrbill_vrule_bool + \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 / none .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 - \bool_gset_false:N \g__qrbill_vrule_bool + \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 + \keys_set:nn {qrbill} {vrule=false} }, - frame .initial:n = true, + vrule .choice:, + vrule / true .code:n = \tl_gset:Nn \g__qrbill_vrule_tl {\rule{\g__qrbill_rule_dim}{\c_qrbill_height_dim}}, + vrule / false .code:n = \tl_gset:Nn \g__qrbill_vrule_tl {\rule{\g__qrbill_rule_dim}{\c_zero_dim}}, + vrule / symbol .code:n = { + \RequirePackage{marvosym} + \tl_gset:Nn \g__qrbill_vrule_tl { + \rotatebox{90}{ + \hbox_to_wd:nn {\c_qrbill_height_dim}{ + \leaders\hbox{\rule{1mm}{\g__qrbill_rule_dim}\hspace{1mm}}\hskip 0pt\@plus1 fill\relax + \llap{\raisebox{-.5\height}[\c_zero_dim][\c_zero_dim]{\LeftScissors}} + \leaders\hbox{\rule{1mm}{\g__qrbill_rule_dim}\hspace{1mm}}\hskip 0pt\@plus4 fill\relax + \hbox{\rule{1mm}{\g__qrbill_rule_dim}} + } + } + } + }, + vrule .initial:n = true, billinginfo .bool_gset:N = \g__grbill_billinginfo_auto_bool, billinginfo .default:n = true, billinginfo .initial:n = true, @@ -592,31 +613,30 @@ iconwidth .initial:n = 7mm, separate .choice:, separate / symbol .code:n = { - \bool_gset_true:N \g__qrbill_separateinfo_bool - \RequirePackage{marvosym} - \cs_set:Nn \qrbill_print_separate_info: { - \par\leaders\vbox_to_ht:nn {1sp} { - \smash{ - \hbox_to_wd:nn {\c_qrbill_width_dim }{ - \leaders\hbox{\rule{1mm}{\g__qrbill_rule_dim}\hspace{1mm}}\hskip 0pt\@plus1 fill\relax - \llap{\raisebox{-.5\height}{\LeftScissors}} - \leaders\hbox{\rule{1mm}{\g__qrbill_rule_dim}\hspace{1mm}}\hskip 0pt\@plus4 fill\relax - } - } - } - \vskip 1sp - \vskip -1sp - } - }, + \bool_gset_true:N \g__qrbill_separateinfo_bool + \RequirePackage{marvosym} + \cs_set:Nn \qrbill_print_separate_info: { + \par\leaders\vbox_to_ht:nn {1sp} { + \smash{ + \hbox_to_wd:nn {\c_qrbill_width_dim }{ + \leaders\hbox{\rule{1mm}{\g__qrbill_rule_dim}\hspace{1mm}}\hskip 0pt\@plus1 fill\relax + \llap{\raisebox{-.5\height}{\LeftScissors}} + \leaders\hbox{\rule{1mm}{\g__qrbill_rule_dim}\hspace{1mm}}\hskip 0pt\@plus4 fill\relax + } + } + } + \vskip 1sp + \vskip -1sp + } + }, separate / text .code:n = { - \bool_gset_true:N \g__qrbill_separateinfo_bool - \cs_set:Nn \qrbill_print_separate_info: { - \centerline{\raisebox{\dimexpr\depth+.3ex\relax}[0pt][0pt]{\footnotesize\qrbillseparatename}} - \par\nointerlineskip - \rule{\c_qrbill_width_dim}{\g__qrbill_rule_dim} - } - } - , + \bool_gset_true:N \g__qrbill_separateinfo_bool + \cs_set:Nn \qrbill_print_separate_info: { + \centerline{\raisebox{\dimexpr\depth+.3ex\relax}[0pt][0pt]{\footnotesize\qrbillseparatename}} + \par\nointerlineskip + \rule{\c_qrbill_width_dim}{\g__qrbill_rule_dim} + } + }, separate / false .code:n = {\bool_gset_false:N \g__qrbill_separateinfo_bool}, separate .initial:n = text, sep-iban .int_gset:N = \g__qrbill_ibansep_int, @@ -636,6 +656,8 @@ replace-umlauts / true .code:n = \prop_gput_from_keyval:Nn \g__qrbill_replacement_prop {ä=ae,Ä=AE,ü=ue,Ü=UE,ö=oe,Ö=OE,ß=ss,ẞ=SS}, replace-umlauts / false .code:n = \clist_map_inline:nn {ä,Ä,ü,Ü,ö,Ö,ß,ẞ} {\prop_gremove:Nn \g__qrbill_replacement_prop {##1}}, data-to-string .bool_gset:N = \g__qrbill_to_string_bool, + ignore-if-empty .clist_gset:N = \g__qrbill_ignore_if_empty_clist, + ignore-if-empty .initial:n = , } \ProcessKeysOptions{qrbill} @@ -797,13 +819,13 @@ \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:} + \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:} } } @@ -813,172 +835,170 @@ \qrbillfont \setlength{\parindent}{\z@} \parbox{\c_qrbill_width_dim }{ - \vbox to \c_qrbill_height_dim { - \bool_if:NTF \g__qrbill_top_frame_bool - { - \bool_if:NTF \g__qrbill_separateinfo_bool - {\qrbill_print_separate_info:} - {\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: - \__qrbill_sep_tl:nV {iban} \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: - \__qrbill_sep_tl:nV {reference} \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} - \parbox[t][7mm][t]{\linewidth}{\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: - \__qrbill_sep_tl:nV {iban} \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: - \__qrbill_sep_tl:nV {reference} \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} - \bool_if:NTF \g__qrbill_vrule_bool - {\rule{\g__qrbill_rule_dim}{\c_qrbill_height_dim}} - {\rule{\g__qrbill_rule_dim}{\c_zero_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}} - } - } + \vbox to \c_qrbill_height_dim { + \bool_if:NTF \g__qrbill_top_frame_bool + { + \bool_if:NTF \g__qrbill_separateinfo_bool + {\qrbill_print_separate_info:} + {\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: + \__qrbill_sep_tl:nV {iban} \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: + \__qrbill_sep_tl:nV {reference} \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} + \parbox[t][7mm][t]{\linewidth}{\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: + \__qrbill_sep_tl:nV {iban} \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: + \__qrbill_sep_tl:nV {reference} \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} + \g__qrbill_vrule_tl + \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 } @@ -1006,10 +1026,10 @@ \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}} + \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}} } } @@ -1026,13 +1046,13 @@ \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}, + #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}}, } } @@ -1045,40 +1065,40 @@ \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}, + #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} - } - } + { + {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} + } + } } \cs_new:Nn \__qrbill_sep_tl:nn { @@ -1124,15 +1144,15 @@ \clist_map_inline:nn {AV1, AV2} { \keys_define:nn {qrbill/data} { - #1 .code:n = { - \tl_if_empty:nF {##1}{ - \exp_args:Nnx \keys_set:nn {qrbill/data} { - #1-Parameters={\qrbill_av_prefix:n {#1}##1} - } - } - \tl_set:cn {l_qrbill_#1_tl} {##1} - }, - #1 .initial:n =, + #1 .code:n = { + \tl_if_empty:nF {##1}{ + \exp_args:Nnx \keys_set:nn {qrbill/data} { + #1-Parameters={\qrbill_av_prefix:n {#1}##1} + } + } + \tl_set:cn {l_qrbill_#1_tl} {##1} + }, + #1 .initial:n =, } } @@ -1149,10 +1169,17 @@ \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} + \clist_if_in:NnTF \g__qrbill_ignore_if_empty_clist {##1} + { + \tl_if_empty:cTF {l_qrbill_data_##1_tl} \use_none:n \use:n + } + \use:n + { + \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 {~ } {\ } @@ -1164,18 +1191,16 @@ \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 =, - } - } + \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 +\prop_new:N \g__qrbill_billing_info_prop \seq_new:N \g__qrbill_billing_info_seq \clist_new:N \g__qrbill_billing_info_static_clist @@ -1185,13 +1210,13 @@ \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 { - \clist_if_in:NnF \g__qrbill_billing_info_static_clist {##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 =, - } + \clist_if_in:NnF \g__qrbill_billing_info_static_clist {##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_if_empty:NF \g__qrbill_billing_info_seq { \prop_map_inline:Nn \g__qrbill_billing_info_prop { @@ -1203,9 +1228,9 @@ } } \seq_sort:Nn \g__qrbill_billing_info_seq { - \int_compare:nNnTF { ##1 } > { ##2 } - { \sort_return_swapped: } - { \sort_return_same: } + \int_compare:nNnTF { ##1 } > { ##2 } + { \sort_return_swapped: } + { \sort_return_same: } } } @@ -1213,17 +1238,17 @@ \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} - } - } - } + \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} + } + } + } } } @@ -1241,9 +1266,9 @@ \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}}} - } + \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:~} @@ -1256,8 +1281,13 @@ % \section{The file swiss.qrbill-cfg.tex as a custom qrbill scheme} %<*swiss.qrbill-cfg.tex> \qrbillsetup{ - creditorprefix =CR-, - debtorprefix =UD-, + creditorprefix=CR-, + debtorprefix=UD-, + ignore-if-empty={ + AV1-Parameters, + AV2-Parameters, + BillingInfo + } } \SetQrScheme{ @@ -1320,12 +1350,12 @@ \ExplSyntaxOff \SetupQrBill{ - QRType=SPC, - Version=0200, - CodingType=1, - Trailer=EPD, - Currency=CHF, - ReferenceType=NON, + QRType=SPC, + Version=0200, + CodingType=1, + Trailer=EPD, + Currency=CHF, + ReferenceType=NON, } \qrbillsetdata*{ @@ -1402,24 +1432,24 @@ \QRbill[ creditor*={foobar LLC\\ - Postfach\\ - 404\\ - 2342\\ - Zurich\\ - CH}, + Postfach\\ + 404\\ + 2342\\ + Zurich\\ + CH}, Account=CH1280808005649899718, vat=123123123,% VAT number with stripped CH and periods debtor*={peiTeX\\ - TeXnikerweg\\ - 78\\ - 23420\\ - Hamburg\\ - DE}, + TeXnikerweg\\ + 78\\ + 23420\\ + Hamburg\\ + DE}, Amount=1337.42, Message=Bestellung vom 27.06.2020, invoicenum=100-4242, % invoicedate=200701,%yymmdd, preset to todays values - vatdetails=0,% 0% VAT + vatdetails=0,% 0% VAT % invoicedate=200701,%yymmdd, preset to todays values AV1=LX;F00BAR;2342, ] @@ -1452,39 +1482,39 @@ width=\paperwidth, height=105mm, ]{qrbill} - + \begin{document} \qrbillsetdata{ creditor*={foobar LLC\\ - Postfach\\ - 404\\ - 2342\\ - Zurich\\ - CH}, + Postfach\\ + 404\\ + 2342\\ + Zurich\\ + CH}, Account=CH1280808005649899718, vat=123123123,% VAT number with stripped CH and periods debtor*={peiTeX\\ - TeXnikerweg\\ - 78\\ - 23420\\ - Hamburg\\ - DE}, + TeXnikerweg\\ + 78\\ + 23420\\ + Hamburg\\ + DE}, Amount=1337.42, Message=Bestellung vom 27.06.2020, invoicenum=100-4242, % invoicedate=200701,%yymmdd, preset to todays values - vatdetails=0,% 0% VAT + vatdetails=0,% 0% VAT % vatdate=200701,%yymmdd, preset to todays values AV1=LX;F00BAR;2342, } \setkomavar{fromaddress}{\insertcreditor} - + \begin{letter}{\insertdebtor} - + \opening{opening} Text @@ -1492,13 +1522,13 @@ Text \closing{closing} % Add qbill on last page -% For more details +% For more details \AddLayersToPageStyle{@everystyle@}{qrbill} - + \end{letter} \end{document} % \end{macrocode} -% +% % \iffalse % \begin{macrocode} %</qrbill-letter-demo.tex> diff --git a/macros/latex/contrib/qrbill/qrbill.ins b/macros/latex/contrib/qrbill/qrbill.ins index a2c98b2ab6..00a8697623 100644 --- a/macros/latex/contrib/qrbill/qrbill.ins +++ b/macros/latex/contrib/qrbill/qrbill.ins @@ -1,8 +1,5 @@ \input l3docstrip -\def\filedate{2022/07/02} -\def\fileversion{1.04} - \preamble Copyright (C) 2020–2022 by Marei Peischl (peiTeX) <marei@peitex.de> diff --git a/macros/latex/contrib/qrbill/qrbill.pdf b/macros/latex/contrib/qrbill/qrbill.pdf Binary files differindex f515cbd69e..fe8ddd638a 100644 --- a/macros/latex/contrib/qrbill/qrbill.pdf +++ b/macros/latex/contrib/qrbill/qrbill.pdf |