summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/qrbill
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2022-10-20 03:04:26 +0000
committerNorbert Preining <norbert@preining.info>2022-10-20 03:04:26 +0000
commit3b961a61ef9fb89adf20a89550d5de0bfe135448 (patch)
treee36f997e624c704dbb4ed2b5fdbd02835ea3c133 /macros/latex/contrib/qrbill
parent7b6cdf4c23e6ed232601dabc70f5553a8dee9c9b (diff)
CTAN sync 202210200304
Diffstat (limited to 'macros/latex/contrib/qrbill')
-rw-r--r--macros/latex/contrib/qrbill/README.md12
-rw-r--r--macros/latex/contrib/qrbill/qrbill.dtx744
-rw-r--r--macros/latex/contrib/qrbill/qrbill.ins3
-rw-r--r--macros/latex/contrib/qrbill/qrbill.pdfbin85725 -> 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
index f515cbd69e..fe8ddd638a 100644
--- a/macros/latex/contrib/qrbill/qrbill.pdf
+++ b/macros/latex/contrib/qrbill/qrbill.pdf
Binary files differ