% \iffalse meta-comment % % RWTH-CI -- Corporate Design for RWTH Aachen % ---------------------------------------------------------------------------- % % Copyright (C) 2025 by Marei Peischl and Lukas C. Bossert % % ============================================================================ % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3c % 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.3c or later is part of all distributions of LaTeX % version 2008/05/04 or later. % % This work has the LPPL maintenance status `maintained'. % % The Current Maintainer of this work is % Marei Peischl rwth-ci@peitex.de % % The development repository can be found at % https://git.rwth-aachen.de/rwth-latex % Please use the issue tracker for feedback! % % ============================================================================ % % \fi % \iffalse %<*driver> \ProvidesFile{rwth-letter.dtx} [2025-12-18 v1.0 Letters for RWTH-CI, Corporate Design of RWTH Aachen] % %<@@=ptxcd> %<*identification> %<*package> \NeedsTeXFormat{LaTeX2e}[2022-10-01] \ProvidesExplPackage{rwth-letter}{2025-12-18}{1.0}{Letters for RWTH-CI, Corporate Design of RWTH Aachen} % % %<*driver> \providecommand*{\PtxcdDocDTXfiles}{rwth-letter.dtx} \providecommand*{\PtxcdDocTitle}{\pkg{rwth-letter}~--~\LaTeX{}~Letter~setup~for~RWTH-CI} \input{rwth-ci.dtx} % %<*initialization> % \fi % \begin{documentation} % \section{Letters – \pkg{rwth-letter.sty}} % The letter package is based on \pkg{scrletter} and supports all elements described in the KOMA-Script documentation. % The corresponding demo file is called \file{DEMO-RWTHLetter.tex} and there also is a lco file to show a global configuration for address data. % % \subsection{Package specific options} % \end{documentation} % \begin{implementation} % \begin{variable}{\g_@@_wide_letter_bool} % \begin{macrocode} \bool_new:N \g_@@_wide_letter_bool % \end{macrocode} % \end{variable} % \begin{macrocode} \keys_define:nn {ptxcd/letter} { % \end{macrocode} % \end{implementation} % \begin{documentation} % \DescribeKeyOption*{letterheadfile=\meta{file name/path}}{} % There are logo files including the blue separation line for letters. % These have to be scaled differently. % This option allows to select those by passing it to the global \option{logofile} option and will adjust the scaling accordingly. % The demo logo repository provides the file \file{rwth_briefkopf_cmyk.pdf} which could be enabled using the following setting: % \begin{examplecode} % \usepackage[ % letterheadfile=rwth_briefkopf % ]{rwth-letter} % \end{examplecode} % \end{documentation} % \begin{implementation} % \changes{v1.0}{2025-12-18}{Add support for letterheadfile} % \begin{optionenv}{logo-is-letterhead,letterheadfile} % \begin{macrocode} logo-is-letterhead .bool_gset:N = \g_@@_logo_is_letterhead_bool, letterheadfile .code:n = \keys_set:nn {ptxcd/letter} {logofile=#1,logo-is-letterhead=true}, % \end{macrocode} % \end{optionenv} % \end{implementation} % \begin{documentation} % \DescribeKeyOption{letterhooks=\meta{boolean}}{false} % Add support for different document configuration which does not match the RWTH-CI settings outside of letters. % \end{documentation} % \begin{implementation} % \begin{optionenv}{letterhooks} % \begin{macrocode} letterhooks .bool_gset:N = \g_@@_letterhooks_bool, letterhooks .initial:n = false, letterhooks .default:n = true, letterhooks .usage:n = load, % \end{macrocode} % \end{optionenv} % \end{implementation} % \begin{documentation} % \DescribeKeyOption{grayscale=\meta{boolean}}{false} % Can be used to create the non-colored letter layout. % This will use \pkg{xcolor}'s gray color model and convert all colores within the letter. % If \option{letterhooks} is not enabled this would affect the whole document. % \end{documentation} % \begin{implementation} % \begin{optionenv}{grayscale} % \begin{macrocode} grayscale .bool_gset:N = \g_@@_grayscale_bool, grayscale .initial:n = false, grayscale .default:n = true, grayscale .usage:n = load, % \end{macrocode} % \end{optionenv} % \end{implementation} % \begin{documentation} % \DescribeKeyOption{payment-data=\meta{boolean}}{false} % \end{documentation} % \begin{implementation} % \begin{optionenv}{payment-data} % \begin{macrocode} payment-data .bool_gset:N = \g_@@_payment_data_bool, payment-data .initial:n = false, payment-data .default:n = true, payment-data .usage:n = load, % \end{macrocode} % \end{optionenv} % \end{implementation} % \begin{documentation} % \DescribeKeyOption{textwidth=narrow/wide}{narrow} % Switch between the two available letter layouts. % % \end{documentation} % \begin{implementation} % \begin{optionenv}{textwidth} % \begin{macrocode} textwidth .choice:, textwidth / narrow .code:n = \bool_gset_false:N \g_@@_wide_letter_bool, textwidth / wide .code:n = \bool_gset_true:N \g_@@_wide_letter_bool, textwidth .initial:n = narrow, textwidth .usage:n = load, % \end{macrocode} % \end{optionenv} % \iffalse % %<*processoptions> % \fi % \begin{macrocode} %} \ProcessKeyOptions[ptxcd/letter] % \end{macrocode} % \iffalse % %<*body> % \fi % \begin{macrocode} \bool_if:NF \g_@@_wide_letter_bool {\PassOptionsToPackage{firstfoot=false}{scrletter}} \PassOptionsToPackage{addrfield=topaligned,pagenumber=botright,refline=nodate,numericaldate=true}{scrletter} \RequirePackage{scrletter} % \end{macrocode} % Load the RWTH-colorscheme % \begin{macrocode} \PassOptionsToPackage{cmyk}{rwth-colors} \RequirePackage{rwth-colors} % \end{macrocode} % Load the RWTH font configuration. % This is not changing the documents main font, as this is not document class. % \begin{macrocode} \PassOptionsToPackage{fontdefaults=false}{rwth-fonts} \RequirePackage{rwth-fonts} \bool_if:NTF \g_@@_letterhooks_bool { \AtBeginLetter }{ \AtBeginDocument }{% \let\sfdefault\rwth@sffamily \renewcommand*{\familydefault}{\sfdefault}% \normalfont \makeatletter \input{rwth-lettersize11bp.clo}% \makeatother \bool_if:NT \g_@@_grayscale_bool {\selectcolormodel{gray}} \bool_if:NT \g_@@_raggedright_bool {\raggedright} } % \end{macrocode} % \end{implementation} % \begin{documentation} % % \subsection{Additional KOMA variables defined for RWTH-CI} % The letter template requires some additional variables: % \begin{description} % \item[frominstitution] institute/department/group % \item[frominstitution-short] Abbreviated version of frominstitution to be used in the backaddress % \item[frominstitution-id] identifier to be placed right of the backaddress % \item[fromfunction] position or job title of the sender % \item[fromoffice] building and room number % \item[fromvat] VAT ID % \item[fromtax] Tax ID % \end{description} % The RWTH Letter layout also allows to add a second sender. % Therefore this bundle provides also the KOMA variables |fromname2| and |fromfunction2|. % Using more than 2 persons is not allowed. % % The same applies for |frombank| here |frombank2| and |frombank3| have been added. % \end{documentation} % \begin{implementation} % \begin{macrocode} \newkomavar{frominstitution} \newkomavar{frominstitution-short} \newkomavar{frominstitution-id} \newkomavar{fromfunction} \newkomavar{fromname2} \newkomavar{fromfunction2} \newkomavar{fromoffice} \newkomavar{fromvat} \newkomavar{fromtax} \newkomavar{frombank2} \newkomavar{frombank3} % \end{macrocode} % Letter Layout definitions: % \begin{macrocode} \RequirePackage{geometry} \geometry{left=2cm,top=3.6cm,bottom=1.3cm} \bool_if:NTF \g_@@_wide_letter_bool { \geometry{right=7.5mm} }{ \geometry{right=6cm} } % \end{macrocode} % TODO: ensure all logo files have the same dimensions. % The 4mm offset is the 8mm offset mentioned in the guideline - the overlab of the secondary logo file. % \begin{macrocode} \setplength{firstheadvpos}{4mm}% 8m zum RWTH logo \setplength{firstheadhpos}{20mm} \setplength{firstheadwidth}{187.5mm}% inkl 5mm logo offset \bool_if:NTF \g_@@_wide_letter_bool { \setplength{locwidth}{60mm} } { \setplength{locwidth}{44mm} } \setplength{lochpos}{7.5mm} \setplength{locvpos}{36mm} \setplength{locheight}{248mm} \setplength{toaddrindent}{0pt} \setplength{toaddrhpos}{2cm} \setplength{toaddrwidth}{85mm} \setplength{toaddrheight}{45mm} \setplength{refvpos}{96mm} \setplength{toaddrhpos}{20mm} \setplength{tfoldmarkvpos}{105mm} \setplength{bfoldmarkvpos}{210mm} \bool_if:NT \g_@@_wide_letter_bool { \setplength{firstfootvpos}{262mm} \setplength{firstfoothpos}{20mm} \setplength{firstfootwidth}{\textwidth} \setkomavar{firstfoot}{ \bool_if:NT \g_@@_payment_data_bool { \parbox[t][22mm]{\useplength{firstfootwidth}}{ \usekomafont{paymentdata} \parbox{45mm}{ \setlength{\parskip}{\z@} \raggedright \clist_map_inline:nn {fromvat,fromtax} { \Ifkomavarempty{##1}{}{% \Ifkomavarempty*{##1}{}{\usekomavar*{##1}\par} \ignorespaces\usekomavar{##1} \par\addvspace{\baselineskip} } } } \clist_map_inline:nn {frombank,frombank2,frombank3} { \hskip1mm \parbox{44mm}{ \setlength{\parskip}{\z@} \raggedright \Ifkomavarempty{##1}{}{% \Ifkomavarempty*{##1}{}{\usekomavar*{##1}:\space} \ignorespaces\usekomavar{##1} \par } } } \hfill } } } } \RequirePackage{graphicx} %^^A Logo-Datei hat 5mm hmargin und 4mm mm vmargin \setkomavar{firsthead}{\hskip 0pt plus 1 fill \_@@_insert_logo:n { \bool_if:NTF \g_@@_logo_is_letterhead_bool {80mm} {32mm} } } \newcommand{\ptxcd@location}{ % \end{macrocode} % If the payment_data is not displayed, the location field does not need a fixed height. % \begin{macrocode} \bool_if:NTF \g_@@_payment_data_bool {\use:nn} {\use_i:nn} {\parbox}{[t][\useplength{locheight}]} {\useplength{locwidth}}{ \usekomafont{fromaddress} \raggedright \setlength{\parskip}{\z@} \setlength{\parindent}{\z@} \Ifkomavarempty{fromname}{}{ {\usekomafont{fromname}% \ignorespaces\usekomavar{fromname}\par } \bool_if:NTF \g_@@_wide_letter_bool {\par}{ \Ifkomavarempty{fromfunction}{}{\ignorespaces\usekomavar{fromfunction}} \par\addvspace{\baselineskip} } } \Ifkomavarempty{fromname2}{}{ {\usekomafont{fromname2}% \ignorespaces\usekomavar{fromname2}\par } \bool_if:NTF \g_@@_wide_letter_bool {\par}{ \Ifkomavarempty{fromfunction2}{}{\ignorespaces\usekomavar{fromfunction2}} \par\addvspace{\baselineskip} } } \bool_if:NTF \g_@@_wide_letter_bool { \clist_set:Nn \l_tmpa_clist {fromaddress} } { \clist_set:Nn \l_tmpa_clist {fromaddress,fromoffice} } \clist_map_inline:Nn \l_tmpa_clist { \Ifkomavarempty{##1}{}{ \ignorespaces\usekomavar{##1} \par\addvspace{\baselineskip} } } \clist_map_inline:nn {fromphone,fromfax,frommobilephone} { \Ifkomavarempty{##1}{}{ \leavevmode \makebox[.22\linewidth][l]{\usekomavar*{##1}}\hspace{1em} \parbox[t]{\dimexpr.78\linewidth-1em}{ \raggedright \strut\ignorespaces\usekomavar{##1}\strut\par } \par } } \par\addvspace{\baselineskip} \Ifkomavarempty{fromemail}{}{ \ignorespaces\usekomavar{fromemail} \par\addvspace{\baselineskip} } \bool_if:NF \g_@@_wide_letter_bool { \Ifkomavarempty{fromurl}{}{ \ignorespaces\usekomavar{fromurl} \par\addvspace{\baselineskip} } } \let\do@set@reffield\ptxcd@set@reffield \@set@reffields% \par \Ifkomavarempty{date}{}{% \begingroup \Ifkomavarempty*{date}{}{\usekomavar*{date}:\space} \usekomafont{letterdate}\ignorespaces\usekomavar{date} \endgroup } \par \bool_if:NF \g_@@_wide_letter_bool { \bool_if:NT \g_@@_payment_data_bool { \vfill \usekomafont{paymentdata} \clist_map_inline:nn {fromvat,fromtax,frombank,frombank2,frombank3} { \Ifkomavarempty{##1}{}{% \Ifkomavarempty*{##1}{}{\usekomavar*{##1}:\space} \ignorespaces\usekomavar{##1} \par\addvspace{\baselineskip} } } } } } } \newcommand*{\ptxcd@set@reffield}[1]{% \Ifkomavarempty{#1}{}{% \bool_if:NT \g_@@_wide_letter_bool {\par\addvspace{\baselineskip}} \Ifkomavarempty*{#1}{}{{\usekomafont{refname}\usekomavar*{#1}:\space}} {\usekomafont{refvalue}\strut\usekomavar{#1}} \par } }% \setkomavar{location}{ \ptxcd@location } \setkomafont{backaddress}{\color{rwth-blue-100}\scriptsize} \setkomafont{addressee}{}% normalsize? \setkomafont{fromname}{\usekomafont{fromaddress}\bfseries} \setkomafont{fromaddress}{\small} \setkomafont{refname}{\small} \setkomafont{pagenumber}{\small} \setkomafont{refvalue}{\usekomafont{refname}} \newkomafont{paymentdata}{\footnotesize} \newkomafont{letterdate}{\bfseries} % \end{macrocode} % pagestyle configuration % \begin{macrocode} \DeclareNewLayer[ background, % remove rule if \g_@@_logo_is_letterhead_bool? contents={\color{rwth-blue-25}\rule{\layerwidth}{\layerheight}}, hoffset=\dimexpr137.5mm+ 0.47952bp,% 21 cm - 6cm - 0.75cm - .5cm voffset=44mm, width=1bp, height=8cm, align=c, ]{letter.first.rule} % \end{macrocode} % \changes{v1.0}{2025-12-18}{Configure letterpagemark} % \begin{macrocode} \renewcommand*{\letterpagemark}{% % get lastpage for this letter if not already done \int_if_exist:cF {c_@@_letter\thisletter _lastpage_int} { \cs_if_exist:cTF {r@\thisletter.lastpage} { \int_const:cn {c_@@_letter\thisletter _lastpage_int} { \exp_args:NNc \expandafter \@secondoffive { r@\thisletter.lastpage} } } { % warning -> rerun latex \int_const:cn {c_@@_letter\thisletter _lastpage_int} {0} } } \int_compare:nT { \int_use:c {c_@@_letter\thisletter _lastpage_int} > 1 } { \bool_if:NTF \g_@@_wide_letter_bool { % \setplength{locwidth}{60mm} } { \makebox[\useplength{locwidth}][l] } {\usekomafont{pagenumber}\thepage/\int_to_arabic:n{\int_use:c {c_@@_letter\thisletter _lastpage_int}}} } } \renewpairofpagestyles{letter}{% \bool_if:NF \g_@@_wide_letter_bool {\KOMAoptions{footwidth=18.25cm}} \clearpairofpagestyles \lehead{\usekomavar{nexthead}} \lohead{\usekomavar{nexthead}} \lefoot{\usekomavar{nextfoot}} \lofoot{\usekomavar{nextfoot}} \refoot[\pagemark]{} \rofoot[\pagemark]{} } \ModifyLayer[ voffset=\dimexpr\paperheight-.8cm\relax, hoffset=2cm, width=18.25cm, ]{plain.letter.foot.oneside} \ModifyLayer[ voffset=\dimexpr\paperheight-.8cm\relax, hoffset=2cm, width=18.25cm, ]{letter.foot.oneside} \DeclareNewPageStyleByLayers{letter.first}{plain.letter.foot.oneside,letter.first.rule} \AddToHook{cmd/@datefield/before}{ \removereffields } \AddToHook{cmd/@makelettertitle/after}{ \thispagestyle{letter.first} } \renewcommand{\backaddr@format}[1]{ \makebox[\useplength{toaddrwidth}]{ #1 \hfill\Ifkomavarempty{frominstitution-id}{}{\textcolor{black}{\usekomavar{frominstitution-id}}} } } \setkomavar{specialmail}{\null} \setkomavar{backaddress}{\Ifkomavarempty{frominstitution-short}{}{\textbf{\usekomavar{frominstitution-short}}}\\\usekomavar{fromaddress}} \setkomavar{backaddressseparator}{\space|\space} \setkomavar*{date}{} % \end{macrocode} % \iffalse % % \fi % \end{implementation} % \Finale \endinput