% \iffalse meta-comment % % Copyright (C) 2006 by Wybo Dekker % ------------------------------------------------------- % % This file may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.2 % 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.2 or later is part of all distributions of LaTeX % version 1999/12/01 or later. % % \fi % % \iffalse %<*driver> \ProvidesFile{isodoc.dtx} % %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\ProvidesClass{isodoc}% %<*class> [2008/08/22 v0.3 isodoc class for letters and invoices] % %\ifnum\pdfoutput=1\else\ClassError{isodoc}{Compile me with pdflatex!}{} %\fi %<*driver> \documentclass[11pt]{ltxdoc} \usepackage[ verbose, pdftex, paper=a4paper, margin=35mm, top=15mm, bottom=20mm, nohead ]{geometry} \usepackage{txfonts}\pdfprotrudechars=1 \usepackage{ctable,pdfpages,paralist,marvosym,sverb,ltablex} \usepackage[colorlinks]{hyperref} \parindent0pt\parskip1ex \EnableCrossrefs \PageIndex \RecordChanges \newcommand{\FIG}[3]{ % pdfname label caption \begin{figure} \begin{center} \fboxsep=0pt \fbox{\includegraphics[width=\hsize]{#1.pdf}} \caption{#3\label{#2}} \bigskip \bigskip \bigskip \end{center} \end{figure} } \newcommand{\OPTS}[3]{ \smallskip\noindent \begin{tabularx}{\hsize}{@{}lX@{}} \multicolumn{2}{@{}l}{\bfseries #1}\NN \multicolumn{2}{@{}p{\hsize}@{}}{#2}\NN\NN #3 \end{tabularx} } \def\T#1{\texttt{#1}} \def\C#1{\texttt{$\mathtt{\backslash}$#1}} \def\CMP#1{\C{#1}\marginpar{\C{#1}}} \begin{document} \DocInput{isodoc.dtx} \PrintChanges \PrintIndex \end{document} % % \fi % % \CheckSum{1676} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % \changes{v0.1}{2006/03/18}{Initial version} % \changes{v0.2}{2007/04/05}{added options phoneprefix, routingno, logoaddress % accountname now optional % accountnumber-> accountno % german and french translations corrected % indents removed in header fields % expect printer to have more unprintable border % ascriptiontext -> accountnametext for dutch % Interdocument language changes now work; % Vatno, if defined, is reported with accountdata; % country in returnaddress now separated with dot; % option changes kept local to the letter/invoice; % English/American accountname text adapted % } % \changes{v0.3}{2007/08/21}{several errors in documentation corrected % } % % \DoNotIndex{% % \", \baselineskip,\ifdim, \quad, % \', \begin, \ifnum, \raggedright, % \\, \bfseries, \ifx, \raisebox, % \^, \cmidrule, \ignorespaces, \rule, % \`, \colorbox, \immediate, \scriptsize, % \@auxout, \def, \includegraphics, \scshape, % \AtBeginDocument, \define@key, \lastpage@putlabel,\selectlanguage, % \AtEndDocument, \definecolor, \let, \setbox, % \CurrentOption, \else, \long, \setkeys, % \DeclareOption, \empty, \multicolumn, \sffamily, % \DescribeMacro, \end, \newcount, \space, % \EUR, \enspace, \newdimen, \tbfigures, % \LARGE, \fancyhead, \newif, \textbf, % \Large, \fancyhf, \newlabel, \textbullet, % \LoadClass, \fi, \noindent, \thepage, % \ML, \footnotesize,\number, \thispagestyle, % \NN, \geometry, \or, \undefined, % \PassOptionsToClass,\hfill, \pageref, \unskip, % \ProcessOptions, \hsize, \pagestyle, \vbox, % \RequirePackage, \hspace, \parindent, \vfill, % \TPGrid, \ht, \pdfinfo, \vspace, % \addtocounter, \if@twoside, \pdfprotrudechars, \write, % \advance, \ifcase, \qquad, \string, % \rightskip, \fileversion, \filedat, \clearpage, % \parskip % } % \GetFileInfo{isodoc.dtx} % % \DoNotIndex{\newcommand,\newenvironment} % % \title{The \textsf{isodoc} class\thanks{This document % corresponds to \textsf{isodoc}~\fileversion, dated \filedate.}\\for % letters, invoices, and more} % \author{Wybo Dekker \\ \texttt{wybo@servalys.nl}} % % \maketitle % % \begin{abstract}\noindent % The \texttt{isodoc} class can be used for the preparation of letters, % invoices, and, in the future, similar documents. % Documents are set up with options, thus making the class easily adaptable to % user's wishes and extensible for other document types. % \\[2ex] % \textbf{Keywords:} letter, invoice, key/value, \textsc{nen1026} % % \end{abstract} % \tableofcontents % \section{Introduction} % % This class is intended to be used for the preparation of letters and % invoices. Its starting point was Victor Eijkhout's NTG % {\texttt{brief}} class\footnote{CTAN: ntgclass/briefdoc.pdf}, which % implements the \textsc{nen 1026} standard. The \texttt{brief} class % does not provide facilities for invoices and it is not easily % extensible. % % The goal for the \texttt{isodoc} class is to be extensible and easy to % use by providing \textsl{key=value} configuration. Furthermore, texts % that need to be placed on prescribed positions on the page (there are % many such texts) are positioned by using the {\texttt{textpos}} % package.\footnote{CTAN: textpos/textpos.pdf} This provides a very % rugged construction of the page. % % The class itself contains many general definitions, but variable data, such as % opening, closing, % address and many more, have to be defined using \textsl{key=value} % definitions, either in the document or % in a style file. The latter is indicated for definitions that don't vary on a % per document basis, such as your company name, address, email address and so % on. Thus if you run a company and are the secretary of a club, % you would have style files for each of them, plus one for your private letters % or invoices.\footnote{If you archive your documents in their source form % only, it may be wise to work without a style file and set all options in the % document itself!} % % The general setup of a document producing one or more letters is (see % figures~\ref{letter1}--\ref{logo2}, page~\pageref{logo1}--\pageref{logo2}, % for examples): % \begin{verbatim} % \documentclass{isodoc} % \usepackage{} % \setupdocument{} % \begin{document} % \letter[]{} % ... more \letter calls ... % \end{document} % \end{verbatim} % Similarly, the general setup of a document producing one or more invoices is % (figure~\ref{invoice}, page~\pageref{invoice}): % \begin{verbatim} % \documentclass{isodoc} % \usepackage{} % \setupdocument{} % \begin{document} % \invoice[]{} % ... more \invoice calls ... % \end{document} % \end{verbatim} % % \section{Options} % % As shown in the two examples in the previous section, there are three commands % that can set options: |\setupdocument|, |\letter|, and |\invoice|. % These commands will be further explained in the \textsl{Commands} section. % |\setupdocument| is normally used to set options that are common to all % letters of invoices in the document, like your company data; |\letter|, and % |\invoice| set only those options that are different for each letter or % invoice, like the |to| and |opening| options. % % This section lists and explains all available options. % All options can be used in both the style files and in the document % source, although several will normally only be used in style files (such as % |company|) and some only in the document source (such as |to| or |opening|). % % \OPTS{Language}{Currently five languages are defined. As I am not particularly % strong in the translation of administrative terminology, please feel free to % send me corrections. And if you don't find your own language here, please send % me your translations and your language will be added. The keywords below set % the language, English is used by default.}{ % \T{dutch} & Set language to Dutch, \NN % \T{english} & English,\NN % \T{german} & German,\NN % \T{american} & American,\NN % \T{french} & or French.\NN % \T{foreign} & Use this key if you send your letter to a foreign % country. With it, your country will be added to % return and logo addresses, your zip code will be % prefixed with your country code, telephone numbers will % be prefixed with +31-- (or whatever your \T{areacode} % option has been set to) instead of just a 0. In % the \C{accountdata} command, it causes \textsc{iban} en % \textsc{bic} code to be included.\NN % } % % \OPTS{Logo}{Information about the sender is defined here. The logo, by % default, consists of a large company name on top a rule with, hanging under the rule, % a contact person's data. % You can define the latter either explicitly with the |logoaddress| option, % or let it automatically be created from the contents of the options |who|, |street|, % |prezip|, |zip|, |city|, |country|, and |foreign|, as far as you have defined those. % Definition in parts can be useful if you need % them elsewhere in your document.}{ % \T{company = ...} & Your company name as it should appear in the logo (if % you use the default logo) and in the return address % (where it may get overridden by the \T{returnaddress} % keyword.) For private documents, use your name or % nickname here.\NN % \T{logoaddress = ...}& Contact person's data; use |\\| commands for line breaks. % If you don't define this option, the data will be constructed % from the following options.\NN % \T{who = ...} & Contact person's name; probably your own name.\NN % \T{street = ...} & Street in the sender's address.\NN % \T{city = ...} & City in the sender's address.\NN % \T{zip = ...} & Zip in the sender's address.\NN % \T{country = ...} & Country in the sender's address. Only used if \T{foreign} % key was used.\NN % \T{countrycode = ...}& Sender's country code. For The Netherlands: NL\NN % \T{areacode = ...} & Sender's area code. For The Netherlands: 31\NN % } % % \OPTS{Address window}{The addressee's address is printed in a window. The % width of the window is two columns (70 mm), and its contents are vertically % centered in it. There are no limits to the vertical size of the % window, other than the physical size of the window in the envelopes you use. % The vertical position of the window's center is set with the \T{addresscenter} % keyword. Horizontally there are two options: left or right.}{ % \T{leftaddress} & Places the window over columns 2 and 3; this is the % default.\NN % \T{rightaddress} & Places the window over columns 4 and 5.\NN % \T{addresscenter = ...} & Distance in mm of the center of the window from the top of the % paper; the default value is 63.5 mm, fitting for a DL % envelope for triple folded A4 (110x220mm) with a window % at 50 mm from the top, 30mm high.\footnote{The middle of % the window is at 50+30/2=65 mm from the top of the % envelope; the paper is folded (see the folding options % below) to give the folded paper a tolerance of 1.5mm on % both sides in the envelope, so the address should be % placed 1.5 mm higher at 65-1.5=63.5 mm.} Use % \T{addresscenter} \textsl{after} \T{fold}, \T{fold2} or \T{fold3}, % because the definition of the folding marks also puts % the window positions at their corresponding % defaults.\NN % \T{to = ...} & The addressee's address. New lines can be introduced with the \C{}\C{} % command; lines longer than 70 mm will cause extra % newlines.\NN\relax % \T{[no]return} & Do or don't print a return address on top of the % addressee's address. This is useful if blank window envelopes % are used. The return address is composed from the % contents of the \T{company}, \T{street}, \T{zip}, \T{city}, and % \T{country} keywords; it is printed in a bold % script size sans serif font and is is separated from % the addressee's address with a rule. The country will % only be printed if the \T{foreign} keyword has been used.\NN % \T{returnaddress = ...}& The return address, if it is composed as just % described, may become too long to fit in the address % window. Or you may want to define a completely % different return address. With the \T{returnaddress} keyword you can % redefine the return address. Use \C{}\C{} to insert % bullets. \NN % } % % \OPTS{Opening and Closing}{A letter is started with an opening -- something % like `Dear John', and ended with a closing -- something like % `Regards,\T{}Betty', perhaps with an autograph (or white space) in between.}{ % \T{opening = ...} & Dear John\NN % \T{closing = ...} & Regards\NN % \T{signature = ...} & Betty\NN % \T{autograph = ...} & \begin{minipage}[t]{\hsize} % This keyword can have one of the 10 values 0--9:\\[-\baselineskip] % \begin{compactitem} % \item [0:] no autograph; the \T{signature} appears right under % the \T{closing}. This is the default if the |autograph| option % is not used (using it without a value is equivalent to % |autograph=2|). % \item [1:] generates extra whitespace between % \T{signature} and \T{closing} for a hand-written % autograph. Change with the \T{closingskip} key. % \item [2--9:] inserts one of eight autograph images % which, with the \C{autograph} command, % may have been defined in the style file.\\\mbox{} % \end{compactitem} % \end{minipage} % \NN % \T{enclosures = ...} & This keyword can be used to add a note, at the end of % the document, which starts with \textbf{Enclosure:} % followed by the value of the keyword. Multiple % enclosures can be separated with \C{}\C{} commands. If % those are found, the starting text will be % \textbf{Enclosures:}.\NN % \T{closingskip = ...} & white space between signature and closing. The % default is \T{2}\C{baselineskip}. % } % % \OPTS{Headline fields}{Under the address window, a headline is printed. The % page is vertically divided in six columns, one each for the left and right % margins, and four which, in the headline, % say: \textsl{Your letter of}, \textsl{Your reference}, \textsl{Our reference}, % and \textsl{Date}, each with their respective contents under them. If the % \T{subject} keyword is used, an extra line starting with \textsl{Subject:} will % appear, followed by the contents on the same line and over a width of 2.5 % columns. If needed, extra lines will be used.}{ % \T{yourletter = ...} & first field in the headline: the date of the letter % this document is reaction on; empty by default.\NN % \T{yourref = ...} & second field in the headline: addressee's reference of the letter % this document is reaction on; empty by default.\NN % \T{ourref = ...} & third field in the headline: your own reference for % this document.\NN % \T{date = ...} & fourth field of the headline; the default is `Undefined % date', i.e.\ the date of \C{today} is not the default % as this would make the date untraceable from the document % source only. The argument of the \T{date} option must % have the form \T{yyyymmdd}; it will be translated into a % date like ``May 3, 2006'' if the document language is % English, or into its translation in the actual language.\NN % \T{subject = ...} & subject of this document; is placed under the headline, % over the width of the first, second and half of the % third fields.\NN % } % % \OPTS{Footer fields}{Footer fields are shown in the order in which % they appear below; they are empty by default, and empty % fields are not displayed.}{ % \T{[no]footer} & enables or disables printing a page footer; there is room % for upto four fields, if you set five fields, the last % one will appear in the right margin.\NN % \T{phone = ...} & if not empty, prints `phone' in the first field of the % page footer, with the contents under it, prefixed with a~0 or, % if the \T{foreign} option was used, the areacode (set with the % \T{areacode} option.) Telephone numbers should thus be entered % without a prefix.\NN % \T{phoneprefix} & prefix for phone numbers. The default is `0'; will be changed % into `+-' if the \T{foreign} option is used.\NN % \T{cellphone = ...} & same for cellphone...\NN % \T{fax = ...} & fax...\NN % \T{email = ...} & email...\NN % \T{website = ...} & and website.\NN % } % % \OPTS{Folding marks}{Folding marks can be useful, particularly if your address % window is used to its limits. Correctly folding your letter then prevents % parts of the address to become invisible because of the letter loosely filling % the envelope.}{ % \T{nofold} & Disable folding marks.\NN % \T{fold2} & Folding mark at about halfway, set for tight fitting % into a 220x162 mm envelope, with a tolerance of 2 mm % at both sides.\NN % \T{fold3} & Folding mark at about one third from the top, set for % tight fitting into a 220x110 mm envelope, with a % tolerance of 1.5 mm at both sides.\NN % \T{fold = ...} & For non-standard envelopes and paper formats the position % of the folding mark can be set at any position (in mm) % from the top of the paper. % } % % \OPTS{Payment data}{In invoices you probably want to make clear where you want % your debtor to transfer his money to. You can do so by calling % the \C{accountdata} command, which generates a little table containing these data. % The contents of this table can be defined with the following keywords:}{ % \T{accountno = ...} & Your bank account number.\NN % \T{routingno = ...} & Your bank's routing number. Will not be cited if undefined.\NN % \T{accountname = ...} & Your bank account's ascription. % Will not be cited if undefined.\NN % \T{iban = ...} & Your account's \textsc{iban}...\NN % \T{bic = ...} & and \textsc{bic} code; \textsc{iban} and \textsc{bic} % are only reported in invoices to foreign % customers---see the \T{foreign} keyword.\NN % \T{vatno = ...} & Your \textsc{vat} reference number, not yet used.\NN % \T{chamber = ...} & Your Chamber of Commerce subscription number, not yet % used.\NN % } % % \OPTS{Accept data}{These keys pertain to data needed for accept forms:}{ % \T{acceptaccount = ...} & Payer's bank account number\NN % \T{acceptaddress = ...} & Payer's address lines, separated with \C{}\C{}\NN % \T{accepteuros = ...} & Euro part of the amount to be paid\NN % \T{acceptcents = ...} & Cents part of the amount to be paid\NN % \T{acceptdescription = ...} & Description to be quoted on the accept form\NN % \T{acceptdesc = ...} & Short version of the description for the % detachable strip of the form to be kept by the payer\NN % \T{acceptreference = ...} & Reference\NN % } % % \OPTS{Miscellaneous}{Normally, texts in letters are set ragged right. This can % be changed with the following keywords:}{ % \T{[no]fill} & Use the \T{fill} keyword to justify text both left and % right; the default is \T{nofill}: left justification % only.\NN % \T{fontpackage = ...} & The default font is Latin Modern (\T{fontpackage = lmodern}), % but with the \T{fontpackage} keyword you can select another % package, like \T{txfonts} or \T{osf-txfonts}. % } % % \section{Commands} % \DescribeMacro{\showkeys} % The \C{showkeys} command can be useful for debugging. It prints a table % showing the option keys described in the previous section, and their current values. % % \DescribeMacro{\setupdocument} % Most of the setup, both in the style files and in the documents % themselves, is done setting options in a call to the class-defined % |\setupdocument| command. The options can be either a key/value pair, or just % a key. % Options with values and those without may occur in any order, with % the exception of |addresscenter| (see there.) % Values need % their surrounding \{\}'s only if they contain any comma's. % The \textsl{Options} section explains the available options. % % Most of the options have a corresponding command with the same name. % Although not very often, it may sometimes be useful to have those % commands available. These are the options with a corresponding % command:\footnote{Note for developers: the table lines below can be % generated with a ruby script listkeys (included at the end of isodoc.dtx): % |listkeys isodoc.dtx show|} % % \noindent\begin{tabular}{@{}lllll@{}} % acceptaccount &areacode &enclosures &returnaddress &zip \NN % acceptaddress &bic &fax &routingno & \NN % acceptcents &cellphone &fontpackage &signature & \NN % acceptdesc &chamber &iban &street & \NN % acceptdescription &city &logoaddress &subject & \NN % accepteuros &closing &opening &vatno & \NN % acceptreference &company &openingcomma &website & \NN % accountname &country &ourref &who & \NN % accountno &countrycode &phone &yourletter & \NN % addresscenter &email &phoneprefix &yourref & \NN % \end{tabular} % % \noindent So you could write in your letter: ``please send me the money on my bank % account: |\accountno\| as soon as possible.'' % % \DescribeMacro{\letter} % The |\letter| command produces one letter and can be called multiple times. It % has two arguments. The first argument is optional and must be a list of % \textsl{key=value} pairs. The options set here are usually those that vary among % different letters. The second argument contains the letter's content. This % content will, depending on the options set, automatically be surrounded by an % opening, a closing, an autograph, a signature and a remark about any % enclosures. The first page of each letter will be decorated with a logo, % the addressee's address, a return address, % various reference fields, a footer, a folding mark---all as defined by % \textsl{key=value} pairs in |\setupdocument| or in the |\letter| command itself. % % The second an following pages will have a heading, quoting the name of the % addressee and a page number. Examples of letters can be found in the % section \textsl{Usage: letters}. % % \DescribeMacro{\invoice} % The |\invoice| command is essentially the same as the |\letter| command, except % that the opening is always ``\textbf{\textsc{invoice}}'', and the content % (argument 2) is largely composed using the |\itable|, |\iitem|, |\itotal|, and % |\accountdata| commands described hereafter. Closing, autograph, and signature % are disabled. % % In the Netherlands, invoices can be provided with an accept form on the lower % third part of the page. If the |accept| option was used, this accept form % will be filled with the available data, in the |ocrb| font where needed. % % The following commands pertain to invoices: % \DescribeMacro{\itable} % The |\itable| command uses |tabularx| to create a two-column table. The % first column of the table will have the header `Description' (or its % equivalent in the language selected), the header of the second column says % `Amount (\EUR)'. The single argument of |\itable| should contain the % contents of the table and is of the form: % \begin{verbatim} % item 1 & amount 1\NN % item 2 & amount 2\NN % ... % item n & amount n \NN % \cmidrule[.05em]{2-2} % Total & amount \NN % \end{verbatim} % However, the next two commands may be used to enter these data more cleanly: % % \DescribeMacro{\iitem} % The |\iitem{item}{amount}| command (|iitem| stands for Invoice Item) is % equivalent to writing |item & amount\NN|. % % \DescribeMacro{\itotal} % The |\itotal{amount}| command (|itotal| stands for Invoice total) is % equivalent to writing\\ % |\cmidrule[.05em]{2-2} Total & amount \NN|, with the additional % advantage that the word `Total' will be replaced with its equivalent % in the current language. Thus, the argument to the |\itable| % command show above can also be written: % \begin{verbatim} % \iitem{item 1}{amount 1} % \iitem{item 2}{amount 2} % ... % \iitem{item n}{amount n} % \total{amount} % \end{verbatim} % \DescribeMacro{\accountdata} % The |\accountdata| command prints a little table with accounting information % needed by the creditor for paying the invoice. It is constructed using the % values of the options |accountno|, |accountname|, |routingno|, |iban|, and % |bic|. The latter two are only included if the |foreign| option was used. % % \DescribeMacro{\autograph} % The \C{autograph} command, which will normally appear in a style file, % serves to define up to eight autographs based % on \textsc{pdf}, \textsc{jpeg} or \textsc{png} images. One of these % autographs will be drawn between the closing (\textsl{Best regards}) % and the signature (\textsl{Betty}) if you use the \T{autograph} option % with a value from 2 through 9. \C{autograph} has 7 arguments: % % \begin{tabularx}{\hsize}{@{}rX@{}} % arg 1:&2,3,...9: autograph number; will be translated internally to define % |\autographA|, |\autographB|... |\autographH|\NN % 2:&scaling factor for the image\NN % 3:&distance the autograph outdents in the margin\NN % 4:&vertical position of the baseline of the closing % (\textsl{Regards,}) from the top\NN % 5:&vertical position of the baseline of the signature (\textsl{John % Letterwriter}) from the top\NN % 6:&height of the image\NN % 7:&the image (jpg, png, pdf...)\NN % \end{tabularx} % % The arguments 3--6 must be dimensions, and for a given autograph image should % be inferred by inspecting the image with an image manipulation program % like, for example, the gimp. In the lower left corner of the gimp window, % select the units of length, move the pointer to the positions where you want % margin, closing, and signature and to the bottom of the image, read the x, y, % y and y positions respectively and use those for the argument 3, 4, 5, and 6. % % \FIG{letter}{letter1}{Minimal letter example} % % \DescribeMacro{\logo} % The |\logo| command is internally used to define the default logo; you can % redefine it with |\renewcommand{\logo}{...}|. An example of logo redefinition % can be found on page~\pageref{logoredef}. % % \section{Usage: letters} % % Usage of the class is best explained with an example. % Here is the latex source for a small letter; its result appears in figure~\ref{letter1}: % \verbinput{letter.txt} % This source essentially shows three items: % \begin{compactenum} % \item the inclusion of a package |mystyle|; we'll come to that shortly. % \item the command |\setupdocument| called with many \textsl{key=value} arguments, each % defining one of the texts that go into the letter. % \item the command |\letter|, enclosing the body of the letter; % just to give the letter some real body, a small text has % been included using |\input|. % \end{compactenum} % Of course this is not all of the information needed to create a % letter. For example, there should be a logo, telling the addressee who I am % and there should be contact information such as my address, telephone number % and so on. This is where the included |mystyle| package plays its part. Here % is an example of such a style file: % \verbinput{mystyle.txt} % So in the style file, too, |\setupdocument| is used to register % information that will common to almost all of my letters. The % |\autograph| command sets up an autograph, based on an image file. Apart % from the code shown here, a style file can contain definitions for more % autographs, and a definition for a logo. Without the latter, a default logo is % produced. Note also that I have included defaults for |opening|, |closing|, % and |signature| in the style file, and that I did not override those in the % letter's source. % % \FIG{logo1}{logo1}{Long letter example with a non-standard logo, page 1} % \FIG{logo2}{logo2}{Long letter example with a non-standard logo, page 2} % % The letter source example shown above, in combination with this style example, % compiles to the letter shown in figure~\ref{letter1}. % This example illustrates some aspects of isodoc: % \begin{compactitem} % \item At the top, you see the default letterhead (logo). The % |\renewcommand{\logo}{...}| command can be used to create your own logo. % \item Under it is the address. It has a return address in script sized sans % serif boldface over % it, because the |return| key has been used. A return address is useful if you % send your letters in a standard window envelope. The positioning of the % address is done in the style file, using the |addresscenter| and |leftaddress| or % |rightaddress| keywords. % \item The paper is vertically divided in six equally wide columns. The outer % two columns are the left and right margins, the second to fifth columns contain % header and footer fields. % \item The ``Your reference'' and ``Our reference'' fields have not been set % (with the |yourref| and |ourref| keys) and therefore stay empty by default, % the date field has also not been set, but it should be. Therefore, the default % value is ``Undefined date'', and a warning is issued by a pink background. % \item A folding mark has been printed in the extreme right margin, such that % on folding the paper along it, it will correctly fit in a 220 x 110 mm % envelope; this has been achieved by using the |fold3| key. % \item In between closing (\textsl{Best regards,}) and signature % (\textsl{W.H.~Dekker}) an autograph has been placed. This was done by setting % |autograph=2|. Alternative values are |0| (nothing between closing and % signature), |1| for white space where an autograph can be placed with a pen % after printing, or one of the values |2-9|, which may have been associated % with other autograph images. In this case, I have used an autograph image in % which I have drawn the boundary box and the \textsl{outdent}, % \textsl{closing}, and \textsl{signature} positions defined in the % |\autograph| command (see the section \textsl{Commands}) with red lines. % \item The bottom of the letter has (up to) four fields with contact % information. This is useful if your logo does not show that information. If it % does, you can omit these fields by using the |nofooter| key, or by not % using the |footer| key, depending on the default set in the style file. % \end{compactitem} % % Let's try another illustrative example, seee figures~\ref{logo1} % and~\ref{logo2}: we use a modified style file, with a % redefined logo, so we don't need a page footer; we use preprinted right-windowed % envelopes, so a return address is not needed. Here is the style file % (|logostyle.sty|): % \verbinput{logostyle.txt} % \label{logoredef} % \FIG{invoice}{invoice}{Invoice example} % The letter source does not use the |autograph| key, so the default value of % |2| is used; we write it in Dutch and use % a larger text, just to see what happens if more than one page is generated: % \verbinput{logoletter.txt} % In this case, the same letter had to be sent to two different people, % with different openings and addresses of course. So the letter's body % is separately defined and the |\letter| command is called twice, with % the same body, but different |to| and |opening| keys. % Figures~\ref{logo1} and~\ref{logo2} show the first two pages (the % first letter) of this document, which actually has four pages. % % \section{Usage: invoices} % \FIG{accept}{accept}{Invoice example with accept form} % % Invoices (can) have the same structure as letters, except that the |\opening| % isn't ``Dear Somebody'' anymore, but something like ``Invoice''. And the % |\closing| doesn't say ``Best regards'', but may provide payment information. % And the body is not a simple text, but a table with descriptions of things to % be paid, and the corresponding amounts of money. % % An example, as usual, is most instructive: % \verbinput{invoice.txt} % The result is shown in figure~\ref{invoice}. % % When the |accept| option is used, the invoice will be created with an invoice % form on the lower third part of the page. Here is an example: % \verbinput{accept.txt} % Normally such invoices are printed on preprinted paper with an easily % detachable, perforated form. In this example, the form itself has been % printed, too. The |graphicx| and |textpos| packages have already been made % available by the |isodoc| class. Figure~\ref{accept} shows the output of this % example. %% \StopEventually{} % % \section{Implementation} % The basis is the |article| class with all options: % % \begin{macrocode} \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} \ProcessOptions \LoadClass{article} % \end{macrocode} % We don't use |\ctable| floats here, but we need |ctable|'s commands for decent % spacing in tables and more. |ctable| also brings us |array|, |tabularx|, % |color|, and |xkeyval|. |marvosym| is used for the euro symbol. % \begin{macrocode} \RequirePackage{ctable,marvosym,graphicx} \RequirePackage[dutch,german,french,american,english]{babel} % \end{macrocode} % % Since the name of the package contains 'iso', make the page A4. % For textpos, divide the page in 210 columns of 1mm each % and 297 rows, 1mm each. The page is vertically divided in 6 columns of % 35mm each: a left margin, 4 fields, and a right margin. % If the class option |landscape| is used, the paper still stays divided in % 1mm x 1mm cells. This may be useful if you use the isodoc class for other % purposes. % % \begin{macrocode} \RequirePackage[a4paper,margin=35mm,head=\baselineskip]{geometry} \RequirePackage[absolute,overlay]{textpos} \ifdim\paperwidth>\paperheight\TPGrid{297}{210}\else\TPGrid{210}{297}\fi % \end{macrocode} % % Use fancy headings, except for the first page. % The heading, on a rule, looks like:\\[2ex] % To: John Doe (April 1st, 2006)\hfill Page 2 of 3\\[2ex] % \begin{macrocode} \RequirePackage{fancyhdr} \pagestyle{fancy} \fancyhf{} \if@twoside \fancyhead[LE,RO]{\pagetext\ \thepage\ \oftext{} \pageref{LastPageOf\thelettercount}} \fancyhead[RE,LO]{\totext: \toname\ (\date)} \else \fancyhead[L]{\totext: \toname\ (\date)} \fancyhead[R]{\pagetext\ \thepage\ \oftext{} \pageref{LastPageOf\thelettercount}} \fi % \end{macrocode} % The |\xxxdoc| commands (like |\dutchdoc|) set the default language via % |\AtBeginDocument|, but other language changes should be done without that. % So we must have a boolean to check if we are in the preamble: % % \begin{macrocode} \newif\ifpreamble\preambletrue \AtBeginDocument{\preamblefalse} % \end{macrocode} % Background color for signaling items that should have been defined, but % weren't: % \begin{macrocode} \definecolor{isodocpink}{rgb}{1,.7,.7} \def\Undefined#1{\colorbox{isodocpink}{Undefined #1}} % \end{macrocode} % A small sans serif font is used for header and footer field names and the % sender's address information. The idea is that this is used for all % pre-printed text on the letter paper. % \begin{macrocode} \def\@hft{\footnotesize\sffamily} % \end{macrocode} % \subsection{The options and their defaults} % \subsubsection{General options} % The default font is latin modern (using the |lmodern| package). % The |fontpackage| option can be used to select another font. % \DescribeMacro{fontpackage} % \begin{macrocode} \define@key{isodoc}{fontpackage}{\def\fontpackage{#1}} \def\fontpackage{lmodern} % \end{macrocode} % Several items in the letter/invoice will be different in documents that are to % be sent abroad; this is set with the |foreign| option, false by default: % \DescribeMacro{foreign} % \begin{macrocode} \define@key{isodoc}{foreign}[\foreigntrue]{\foreigntrue} \newif\ifforeign\foreignfalse \define@key{isodoc}{localbank}[\localbanktrue]{\localbanktrue} \newif\iflocalbank\localbankfalse % \end{macrocode} % The following keys set the language; English, set at the |\EndOfClass| is the % default. % \DescribeMacro{dutch} % \DescribeMacro{english} % \DescribeMacro{german} % \DescribeMacro{american} % \DescribeMacro{french} % \begin{macrocode} \define@key{isodoc}{dutch} []{\dutchdoc} \define@key{isodoc}{english} []{\englishdoc} \AtEndOfClass{\englishdoc} \define@key{isodoc}{german} []{\germandoc} \define@key{isodoc}{american}[]{\americandoc} \define@key{isodoc}{french} []{\frenchdoc} % \end{macrocode} % The default is to have left, but not right justification, allowing for hyphenation % in extreme cases: % \DescribeMacro{fill} % \DescribeMacro{nofill} % \begin{macrocode} \define@key{isodoc}{fill} []{\rightskip=1\rightskip} \define@key{isodoc}{nofill}[]{\rightskip=0mm plus 35mm} \rightskip=0mm plus 35mm % \end{macrocode} % \subsubsection{Logo} % The logo, by default, consists of a large company or personal name on top a % rule, with a contact person's name (probably your own name) and address % hanging under the rule. % Its contents are defined by the following options: % \DescribeMacro{company} % \DescribeMacro{logoaddress} % \DescribeMacro{who} % \DescribeMacro{street} % \DescribeMacro{city} % \DescribeMacro{zip} % \DescribeMacro{country} % \DescribeMacro{countrycode} % \begin{macrocode} \define@key{isodoc}{company} {\def\company{#1}} \def\company{\Undefined{company}} \define@key{isodoc}{logoaddress}{\def\logoaddress{#1}} \define@key{isodoc}{who} {\def\who{#1}} \def\who{\Undefined{who}} \define@key{isodoc}{street} {\def\street{#1}} \def\street{\Undefined{street}} \define@key{isodoc}{city} {\def\city{#1}} \def\city{\Undefined{city}} \define@key{isodoc}{country} {\def\country{#1}} \def\country{\Undefined{country}} \define@key{isodoc}{countrycode}{\def\countrycode{#1}} \def\countrycode{\Undefined{countrycode}} \define@key{isodoc}{zip} {\def\zip{#1}} \def\zip{\Undefined{zip}} \def\prezip{\ifforeign\countrycode\else\fi} % \end{macrocode} % \subsubsection{Address window} % The address can be positioned vertically with the |addresscenter| option; the % default is 63.5mm. This is the vertical position of the center of the address. % Horizontally, the address is positioned either left or right, depending on the % |leftaddress| or |rightaddress| options being used. In the first case, the % address start at x=35mm, which is the left margin (the default), and thus in % line with the first header field, in the second case at 105mm, in line with % the one-but-last header field. % \DescribeMacro{leftaddress} % \DescribeMacro{rightaddress} % \DescribeMacro{addresscenter} % \begin{macrocode} \define@key{isodoc}{leftaddress} []{\def\xaddress{35}} \def\xaddress{35} \define@key{isodoc}{rightaddress}[]{\def\xaddress{105}} \define@key{isodoc}{addresscenter} {\def\addresscenter{#1}} \def\addresscenter{63.5} % \end{macrocode} % The |to| option takes the addressee's address lines. Use |\\| to % separate lines. The info will be split by |\processto| on the first % |\\| separator into the addressee's name (|\toname|) and his address % (|\toaddress|) % The |\toname| will be reported in the pdf's document properties. % However, this works only if the |to| key is set, with |\setupdocument|, in the % preamble. If several letters are composed, |to| is normally set in the % |\letter| or |\invoice| commands and thus is not seen by the |\hypersetup|, % which is called |\AtBeginDocument|; so set the defaults to % |Various people| for the |\toname| and make the address undefined: % \DescribeMacro{to} % \begin{macrocode} \define@key{isodoc}{to}{\processto{#1}}\def\toname{Various people} \def\toaddress{\Undefined{to}} \long\def\processto#1{\xproc #1\\@@@\ifx\toaddress\empty \else \yproc #1@@@\fi} \long\def\xproc #1\\#2@@@{\def\toname{#1}\def\toaddress{#2}} \long\def\yproc #1\\#2@@@{\def\toaddress{#2}} % \end{macrocode} % The default is to have no return address; but this can be changed by using % the |return| (either in the style file or in the source) or, if the default % was changed in the style file, remove it with |noreturn| in the source. % Company and country names are often too long to fit in the address window. Or % you may want to define an entirely different return address. The % |returnaddress| option is provided to redefine the return address: % \DescribeMacro{return} % \DescribeMacro{noreturn} % \DescribeMacro{returnaddress} % \begin{macrocode} \define@key{isodoc}{return} []{\returntrue} \newif\ifreturn\returnfalse \define@key{isodoc}{noreturn} []{\returnfalse} \define@key{isodoc}{returnaddress}{\def\returnaddress{#1}} % \end{macrocode} % \subsubsection{Page footer} % A footer is switched on or off with the |footer| and |nofooter| options. % The default is the have no page footer. % \DescribeMacro{footer} % \DescribeMacro{nofooter} % \begin{macrocode} \define@key{isodoc}{footer} []{\footertrue} \newif\iffooter\footerfalse \define@key{isodoc}{nofooter}[]{\footerfalse} % \end{macrocode} % If there \textsl{is} a page footer, only those fields will be displayed which are not empty. % Currently the |phone|, |cellphone|, |fax|, |email| and |website| are % recognised as possible footer fields. Phone and fax number will be prefixed % with a 0, unless the |foreign| option was used: then the prefix will be % `+nn-', where nn is the areacode. The latter is set with the |areacode| % option, which is `Undefined areacode' by default. % \begin{macrocode} \define@key{isodoc}{areacode} {\def\areacode{#1}} \def\areacode{\Undefined{areacode}} \define@key{isodoc}{phone} {\def\phone{#1}} \def\phone{} \define@key{isodoc}{phoneprefix}{\def\phoneprefix{#1}} \def\phoneprefix{0} \define@key{isodoc}{cellphone} {\def\cellphone{#1}} \def\cellphone{} \define@key{isodoc}{fax} {\def\fax{#1}} \def\fax{} \define@key{isodoc}{website} {\def\website{#1}} \def\website{} \define@key{isodoc}{email} {\def\email{#1}} \def\email{} \def\lead{\ifforeign+\areacode-\else\phoneprefix\fi} % \end{macrocode} % \subsubsection{Folding mark} % The default is to have no folding mark. So start with the folding mark % position outside the paper boundaries: % \DescribeMacro{nofold} % \begin{macrocode} \define@key{isodoc}{nofold}[]{\yfold=-1mm} \newdimen\yfold\yfold=-1mm % \end{macrocode} % The envelope for double folded A4 is C5: 162x220mm, % window 40x110mm, upper left corner at 20x50mm. % Fold the A4 to have a tolerance of 2mm at top and bottom, by % putting the fold mark at 162-4=158 mm. % \DescribeMacro{fold2} % \begin{macrocode} \define@key{isodoc}{fold2}[]{\yfold=158mm} % \end{macrocode} % The envelope for triple folded A4 is DL: 110x220mm, % Fold the A4 to have a tolerance of 1.5mm at top and bottom, by % putting the fold mark at 110-3=107mm. % \DescribeMacro{fold3} % \begin{macrocode} \define@key{isodoc}{fold3}[]{\yfold=107mm} % \end{macrocode} % For non-standard envelopes and paper formats the position of the % folding mark can be set at any position (in mm) from the top of the paper: % \DescribeMacro{fold} % \begin{macrocode} \define@key{isodoc}{fold}{\yfold=#1mm} % \end{macrocode} % % \subsubsection{Header fields} % There are four header fields, each one quarter of the textwidth wide. % Under those, if the subject has been defined, a subject line. % \DescribeMacro{ourref} % \DescribeMacro{yourref} % \DescribeMacro{yourletter} % \begin{macrocode} \define@key{isodoc}{ourref} {\def\ourref{#1}} \def\ourref{} \define@key{isodoc}{yourref} {\def\yourref{#1}} \def\yourref{} \define@key{isodoc}{yourletter}{\def\yourletter{#1}} \def\yourletter{} % \end{macrocode} % The date must be entered in yyyymmdd format; here we check that it % contains exactly 8 digits (thanks Taco Hoekwater, Piet van Oostrum) % \DescribeMacro{date} % \DescribeMacro{subject} % \begin{macrocode} \define@key{isodoc}{date}{\setdate{#1}} \def\date{\Undefined{date}} \define@key{isodoc}{subject}{\def\subject{#1}} \def\subject{} \def\checkdigit#1{% \ifcase0\ifcase1#1\or\or\or\or\or\or\or\or\or\else1\fi \ClassError{test}{non-digit-character (#1) in date}{} \fi } \def\newdate#1#2#3#4#5#6#7#8#9\wybo{% \checkdigit{#1}\checkdigit{#2}\checkdigit{#3}\checkdigit{#4} \checkdigit{#5}\checkdigit{#6}\checkdigit{#7}\checkdigit{#8} \ifx\relax#9\relax \year=#1#2#3#4\month=#5#6\day=#7#8 \ifnum \month > 12 \ClassError{isodoc}{Illegal date }{}\fi \ifnum \day > 31 \ClassError{isodoc}{Illegal date }{}\fi \else \ClassError{isodoc}{Date must have exactly 8 digits}{} \fi } \def\wybo{} \def\setdate#1{\newdate #1\wybo\wybo\wybo\wybo\wybo\wybo\wybo\wybo\wybo} % \end{macrocode} % The opening, something like `Dear Reader', is set by the |opening| option; the % default is `Undefined opening'. It is followed by a comma, unless the % |openingcomma| has been used to set it to a different character, like a % semicolon or an exclamation mark. % \DescribeMacro{opening} % \DescribeMacro{openingcomma} % \begin{macrocode} \define@key{isodoc}{opening} {\def\opening{#1}} \def\openingcomma{,} \define@key{isodoc}{openingcomma}{\def\openingcomma{#1}} \def\opening{\Undefined{opening}} % \end{macrocode} % \subsubsection{Closing, autograph, signature} % The closing, something like `Best regards', is set by the |closing| option; % the default is `Undefined closing'. It will be preceded by a vertical skip, % which can be set by the |closingskip| option, which is |2\baselineskip| by % default: % \DescribeMacro{closing} % \DescribeMacro{closingskip} % \begin{macrocode} \define@key{isodoc}{closing} {\def\closing{#1,}} \def\closing{\Undefined{closing}} % Best regards, \define@key{isodoc}{closingskip}{\closingskip=#1} \newdimen\closingskip\closingskip=2\baselineskip % \end{macrocode} % The autograph is either just a newline, or a vertical spacing where you can % put your autograph manually, or a graphic. In the latter case, is must have % been defined with the macro |\autograph|, which defines an autograph from an % image, see the section \textsl{User Macros}. % Not using the |autograph| option is equivalent to |autograph=0| (just a newline). % Using it without a value is equivalent to |autograph=2| (image inserted): % \DescribeMacro{autograph} % \begin{macrocode} \define@key{isodoc}{autograph}[2]{\def\autographversion{#1}} \def\autographversion{0} % \end{macrocode} % The signature, something like `John Letterwriter', is set by the |signature| option; % the default is `Undefined signature'. % \DescribeMacro{signature} % \begin{macrocode} \define@key{isodoc}{signature}{\def\signature{#1}} \def\signature{\Undefined{signature}} % \end{macrocode} % Enclosures are set by the |enclosures| option. There are none by default. % \begin{macrocode} \define@key{isodoc}{enclosures} {\def\enclosures{#1}} \def\enclosures{} % \end{macrocode} % \subsubsection{Invoice specific data} % Invoices need to state some specific data, like account data and term of % payment: % \begin{macrocode} \define@key{isodoc}{term} [30]{\def\term{#1}} \define@key{isodoc}{accountno} {\def\accountno{#1}} \define@key{isodoc}{routingno} {\def\routingno{#1}} \define@key{isodoc}{accountname}{\def\accountname{#1}} \define@key{isodoc}{iban} {\def\iban{#1}} \define@key{isodoc}{bic} {\def\bic{#1}} \define@key{isodoc}{vatno} {\def\vatno{#1}} \define@key{isodoc}{chamber} {\def\chamber{#1}} \def\chamber{Undefined{chamber}} % \end{macrocode} % If an accept form is to be printed, here are the options to fill in all the % fields: % \begin{macrocode} \define@key{isodoc}{accept}[E05]{\def\accepttype{#1} \newfont\ocrb{ocrb10} } \define@key{isodoc}{acceptaccount} {\def\acceptaccount{#1}} \def\acceptaccount{} \define@key{isodoc}{acceptaddress} {\def\acceptaddress{#1}} \def\acceptaddress{} \define@key{isodoc}{acceptcents} {\def\acceptcents{#1}} \def\acceptcents{Undefined{}} \define@key{isodoc}{acceptdescription}{\def\acceptdescription{#1}} \def\acceptdescription{} \define@key{isodoc}{acceptdesc} {\def\acceptdesc{#1}} \def\acceptdesc{} \define@key{isodoc}{accepteuros} {\def\accepteuros{#1}} \def\accepteuros{Undefined{}} \define@key{isodoc}{acceptreference} {\def\acceptreference{#1}} \def\acceptreference{Undefined{ref}} % \end{macrocode} % For now, we define field positons for the E05 accept form only; when data for % other forms become available, the content of |\accepttype| will have to be % checked. Here is a rough layout of the E05 accept form: % \begin{verbatim} % description % ref description % ref euros cents reference % % eur ct account % % desc address % desc address % desc address % \end{verbatim} % \begin{macrocode} \def\xacceptdescription{105}\def\yacceptdescription{200}\def\wacceptdescription{100} \def\xacceptref{7} \def\yacceptref{212} \def\wacceptref{30} \def\xaccepteuros{60} \def\yaccepteuros{218} \def\waccepteuros{32} \def\xacceptcents{89} \def\yacceptcents{218} \def\wacceptcents{13} \def\xacceptreference{125} \def\yacceptreference{218} \def\wacceptreference{55} \def\xaccepteur{14.4} \def\yaccepteur{231} \def\waccepteur{21} \def\xacceptct{32} \def\yacceptct{231} \def\wacceptct{9} \def\xacceptaccount{75} \def\yacceptaccount{231} \def\wacceptaccount{65} \def\xacceptdesc{7} \def\yacceptdesc{240} \def\wacceptdesc{26} \def\xacceptaddress{58} \def\yacceptaddress{243} \def\wacceptaddress{90} % \end{macrocode} % This is the |\baselineskip| for the two-line reference of the detachable strip: % \begin{macrocode} \newdimen\acceptreferenceskip\acceptreferenceskip=5.15mm % \end{macrocode} % \subsection{User Macros} % The autograph is either just a newline, or a vertical spacing where you can % put your autograph manually, or a graphic. In the latter case, is must have % been defined with the macro |\autograph|, which defines an autograph from an % image.\footnote{Thanks, Hans Hagen and Piet van Oostrum, for its definition}\\ % The arguments 3 - 6 can be found by measuring those (with the gimp, for example) % in the unscaled (raw) image (which is the last argument). % \\[1ex] % \begin{tabularx}{\hsize}{@{}rX@{}} % arg 1:&2,3,...9: autograph number; will be translated internally to define % |\autographA|, |\autographB|... |\autographH|\NN % 2:&scaling factor for the image\NN % 3:&the distance the autograph outdents in the margin\NN % 4:&the vertical position of the baseline of the closing (Regards,) from the top\NN % 5:&the vertical position of the baseline of the signature (John Letterwriter) from the top\NN % 6:&the height of the image\NN % 7:&the image (jpg, png, pdf...)\NN % \end{tabularx} % \DescribeMacro{\autograph} % \begin{macrocode} \newdimen\myoutdent \newdimen\signskip \newdimen\mydown \def\autograph#1#2#3#4#5#6#7{% \ifnum #1<2 \ClassError{isodoc}{autograph #1 cannot be changed (first arg must be 2..9)}{} \fi \ifnum #1>9 \ClassError{isodoc}{autograph #1 cannot be changed (first arg must be 2..9)}{} \fi \bgroup \lccode`2=`A \lccode`6=`E \lccode`3=`B \lccode`7=`F \lccode`4=`C \lccode`8=`G \lccode`5=`D \lccode`9=`H \lowercase{\def\temp{#1}}% \expandafter\egroup\expandafter\def\csname autograph\temp\endcsname{% \myoutdent=#3 \signskip=#5\advance\signskip-#4 \mydown=#6\advance\mydown-#4 \par\hspace*{-#2\myoutdent}% \raisebox{-#2\mydown}[0bp][0bp]{\includegraphics[scale=#2]{#7}}\\[-\baselineskip] \closing\\[-2\baselineskip]\\[#2\signskip]\signature% } } % \end{macrocode} % \subsubsection{Logo} % The logo, by default, consists of a large company name on top a rule, % with a contact person's name (probably your own name) and address % hanging under the rule. % If the osf-txfonts package is used, oldstyle figures are disabled here. % \DescribeMacro{\logo} % \begin{macrocode} \newcommand{\logo}{% \begin{textblock}{140}[0,1](35,20)\noindent \textsf{\LARGE\company}\\[-1.7ex] % large company name \rule{\hsize}{.3pt} % on top a rule \end{textblock} \Tbox{140}{22}{35}{\noindent \@hft \ifx\undefined\logoaddress% \ifx\undefined\tbfigures\else\tbfigures\fi \ifx\who\empty\else\who\\\fi \ifx\street\empty\else\street\\\fi \prezip\ \zip\ \city \ifforeign\\\country\fi \else\logoaddress\fi } } % \end{macrocode} % \DescribeMacro{\returnaddress} % \begin{macrocode} \def\returnaddress{% \company\\ \street\\ \prezip{} \zip{} \city \ifforeign\\\country\fi } % \end{macrocode} % \DescribeMacro{\setupdocument} % \begin{macrocode} \newcommand{\setupdocument}[1]{ \setkeys{isodoc}{#1} \iffooter\else\geometry{bottom=25mm}\fi \RequirePackage[T1]{fontenc} \RequirePackage{\fontpackage}\pdfprotrudechars=1 } % \end{macrocode} % \DescribeMacro{\footfield} % Create any non-empty footfields, starting at left arguments: % \begin{compactenum} % \item fieldlabel % \item a prefix for the content (for phone numbers) % \item the content % \end{compactenum} % \begin{macrocode} \def\footfield#1#2#3{% \ifx#3\empty\else \Tbox{\footcount}{275}{35}{\noindent {\@hft#1}\\ #2#3 } \advance\footcount35 \fi } % \end{macrocode} % \DescribeMacro{\accountdata} % Print a table with banking information. Show account number, account % name + city, and a reference. If the |foreign| key was used, % \textsc{iban} and \textsc{bic} codes are also reported. % \begin{macrocode} \def\accountdata{ \textbf{\accountdatatext:}\\ \begin{tabular}{@{}rl@{}} \ifx\term\undefined\else \termtext: & \term\ \daystext\\ \fi \accountnotext: & \accountno\\ \ifx\accountname\undefined\else \accountnametext: & \accountname{}\\ \fi \ifx\routingno\undefined\else \routingnotext: & \routingno{}\\ \fi \referencetext: & \ourref\\ \ifforeign \iflocalbank\else iban: & \scshape \iban\\ bic: & \scshape \bic\\ \fi \fi \ifx\vatno\undefined\else \vatnotext: & \vatno\\ \fi \end{tabular} } % \end{macrocode} % The showkeys command is useful for debugging. It prints a table showing the % values of most keys.\footnote{Note for developers: the table lines below can % be generated with a ruby script listkeys (included at the end of isodoc.dtx): % |listkeys isodoc.dtx show|} % \DescribeMacro{\showkeys} % \begin{macrocode} \def\showkeys{% \begin{tabular}{ll} acceptaccount & \acceptaccount\NN acceptaddress & \acceptaddress\NN acceptcents & \acceptcents\NN acceptdesc & \acceptdesc\NN acceptdescription & \acceptdescription\NN accepteuros & \accepteuros\NN acceptreference & \acceptreference\NN accountname & \accountname\NN accountno & \accountno\NN addresscenter & \addresscenter\NN areacode & \areacode\NN bic & \bic\NN cellphone & \cellphone\NN chamber & \chamber\NN city & \city\NN closing & \closing\NN company & \company\NN country & \country\NN countrycode & \countrycode\NN email & \email\NN enclosures & \enclosures\NN fax & \fax\NN fontpackage & \fontpackage\NN iban & \iban\NN logoaddress & \logoaddress\NN opening & \opening\NN openingcomma & \openingcomma\NN ourref & \ourref\NN phone & \phone\NN phoneprefix & \phoneprefix\NN returnaddress & \returnaddress\NN routingno & \routingno\NN signature & \signature\NN street & \street\NN subject & \subject\NN vatno & \vatno\NN website & \website\NN who & \who\NN yourletter & \yourletter\NN yourref & \yourref\NN zip & \zip\NN \end{tabular} } \AtEndOfClass{% \usepackage{hyperref} \year=0 } \AtBeginDocument{% \hypersetup{pdfauthor={\who}, pdfsubject={\subject}, pdfproducer={isodoc v\fileversion}, } } % \DescribeMacro{\itable} % |\itable| inserts an invoice table; arg1 should be the rows of the table. % \begin{macrocode} \def\itable#1{ \begin{tabularx}{\hsize}{@{}X@{\barsep\quad\qquad}r@{}} \multicolumn{2}{@{}c@{}}{\sffamily\descriptiontext\hfill \amounttext (\EUR)}\ML #1 \end{tabularx} } % \DescribeMacro{\iitem} % |\iitem| inserts an invoice item in the |\itable|. % It inserts |arg1 & % arg2\NN|: % \begin{macrocode} \def\iitem#1#2{#1\NN} % \DescribeMacro{\itotal} % \end{macrocode} % |\itotal| inserts an invoice total in the |\itable|.\\ % It inserts |\cmidrule[.05em]{2-2}Total & arg1\NN|: % \begin{macrocode} \def\itotal#1{\cmidrule[.05em]{2-2}\Totaltext&\textbf{#1}\NN} % \end{macrocode} % The counter |\lettercount| is used to construct a label on the last % page of each letter/invoice of this document; it wil be set to % \texttt{LastPageOf\textsl{n}}, where \textsl{n} is the letter % number: 1, 2, 3, ... This allows for page headings saying ``Page n % of m.'' Whether we are on the last page of a letter is only known % either at |\end{document}| or when a new letter is started. This is % why a label is set at the start of a |\letter| call, thus labeling % the last page of the previous letter and using |\AtEndDocument| for % the last letter, which would otherwise stay unlabeled. % \begin{macrocode} \newcounter{lettercount}\setcounter{lettercount}{0} \AtEndDocument{\label{LastPageOf\thelettercount}} % \end{macrocode} % \DescribeMacro{\invoice} % |\invoice| prints an invoice. The first argument is optional, and may % contain the same \textsl{key=value} statement as |\setupdocument|. This is % useful if the document contains more than one invoice for different % addressees. % % The second argument creates a two-column table with headings % ``Description'' and ``Amount (\EUR)''. The two columns are separated % with a vertical rule; its construction is somewhat complicated, as the % booktabs/ctable packages are in use that don't provide decent vertical % separators. The |\barsep| macro extends these separators vertically. % \begin{macrocode} \newif\ifclosing\closingtrue \newcount\footcount \newcommand{\invoice}[2][]{% \closingfalse \hypersetup{pdftitle={invoice to \toname\ dated \today}} \def\barsep{\raisebox{-1.5ex}[0pt][0pt]{\rule{.05em}{4ex}}}% \letter[#1,opening=\invoicetext,openingcomma={},closing={},signature={}]{% \noindent #2 } } % \end{macrocode} % |\letter| prints a letter... % \begin{macrocode} \newcommand{\letter}[2][]{{ % extra brace keeps option changes local \hypersetup{pdftitle={letter to \toname\ dated \today}} \setkeys{isodoc}{#1} \label{LastPageOf\thelettercount} \newpage \addtocounter{lettercount}{1} \setcounter{page}{1} \setcounter{footnote}{0} \logo % \end{macrocode} % addresscenter is the center, vertically, of the to-address block: % xaddress should be 1 or 3 for left- and right address windows % \begin{macrocode} \begin{textblock}{70}[0,.5](\xaddress,\addresscenter)\noindent \ifreturn {\def\\{\unskip\enspace\textbullet\enspace\ignorespaces}% \sffamily\scriptsize\bfseries\returnaddress }\\[-.8\baselineskip] \rule{\hsize}{.2pt}\\ \fi \toname\\\toaddress \end{textblock} \ifx\subject\empty\else% \Tbox{35}{108}{105}{\noindent \begin{tabularx}{\hsize}{@{}l>{\raggedright}X@{}} \@hft\subjecttext&\subject \end{tabularx} } \fi \Tbox{35}{98}{35}{\noindent {\@hft\yourlettertext}\\ \yourletter } \Tbox{70}{98}{35}{\noindent {\@hft\yourreftext}\\ \raggedright\yourref } \Tbox{105}{98}{35}{\noindent {\@hft\ourreftext}\\ \raggedright\ourref } \Tbox{140}{98}{35}{\noindent {\@hft\datetext}\\ \ifnum\year=0\Undefined{date}\else\date\fi } \footcount=35 \iffooter \footfield{\websitetext}{}{\website} \footfield{\phonetext}{\lead}{\phone} \footfield{\cellphonetext}{\lead}{\cellphone} \footfield{\faxtext}{\lead}{\fax} \footfield{\emailtext}{}{\email} \fi \begin{textblock*}{3mm}(201mm,\yfold)\noindent % rule from 201-204mm \rule{\hsize}{.2pt} \end{textblock*} \ifx\undefined\accepttype\else\accept\fi \ifx\subject\empty\vspace*{80mm}\else\vspace*{90mm}\fi \noindent\opening\openingcomma\\[\baselineskip] \thispagestyle{empty} \noindent #2 {\parindent=0pt\parskip=\baselineskip \ifclosing \ifcase\autographversion \par\closing\\\signature % 0: closing on the next line \or\par\closing\\[\closingskip]\signature % 1: whiteskip \or\autographA \or\autographB \or\autographC \or\autographD \or\autographE \or\autographF \or\autographG \or\autographH \else \par\Undefined{autograph: \autographversion}\\ \fi \fi \ifx\enclosures\empty\else \vfill \setbox1=\vbox{\enclosures}% \textbf{\ifdim\ht1>\baselineskip\enclosurestext\else\enclosuretext\fi}% \\\enclosures \fi } }} % \end{macrocode} % \subsection{Internal Macros} % The accept is produced from |\Tbox| and |\Cbox| commands only, using the % |textpos| package: % \DescribeMacro{\Cbox} % |\Cbox{x}{y}{width}{text}| places |text| in a box of |\testsl{width}| mm, centered around (|x|,|y|) in mm: % \begin{macrocode} \def\Cbox#1#2#3#4{ \begin{textblock}{#3}[.5,.5](#1,#2) \begin{center} #4 \end{center} \end{textblock}} % \end{macrocode} % \DescribeMacro{\Tbox} % |\Tbox{x}{y}{width}{text}| places |text| in a box of |\testsl{width}| mm, with the upper left corner at (|x|,|y|) in mm: % \begin{macrocode} \long\def\Tbox#1#2#3#4{ \begin{textblock}{#3}(#1,#2)\noindent \begin{minipage}[t]{\hsize} \noindent#4 \end{minipage} \end{textblock} } % \end{macrocode} % \DescribeMacro{\accept} % This macro will have a parameter if other accept forms will have to be % programmed: % \begin{macrocode} \def\accept{ \Tbox{\xacceptdescription} {\yacceptdescription} {\wacceptdescription} {\acceptdescription} \Tbox{\xacceptdesc} {\yacceptdesc} {\wacceptdesc} {\acceptdesc} \Tbox{\xacceptaddress} {\yacceptaddress} {\wacceptaddress} {\ifx\acceptaddress\empty\toname\\\toaddress\else\acceptaddress\fi} \Cbox{\xacceptreference} {\yacceptreference} {\wacceptreference} {\ocrb\acceptreference} \Tbox{\xacceptref} {\yacceptref} {\wacceptref} {\baselineskip=\acceptreferenceskip\ocrb\acceptreference} \Cbox{\xaccepteuros} {\yaccepteuros} {\waccepteuros} {\ocrb\accepteuros} \Cbox{\xacceptaccount} {\yacceptaccount} {\wacceptaccount} {\ocrb\acceptaccount} \Cbox{\xacceptcents} {\yacceptcents} {\wacceptcents} {\ocrb\acceptcents} \Cbox{\xaccepteur} {\yaccepteur} {\waccepteur} {\ocrb\accepteuros} \Cbox{\xacceptct} {\yacceptct} {\wacceptct} {\ocrb\acceptcents} } % \end{macrocode} % Definitions of field names in various languages; corrections and suggestions % are very welcome: % \DescribeMacro{\dutchdoc} % \begin{macrocode} \def\set@lang#1{\ifpreamble\AtBeginDocument{\selectlanguage{#1}}\else\selectlanguage{#1}\fi} \def\dutchdoc{% \set@lang{dutch} \def\yourlettertext{Uw brief van} \def\yourreftext{Uw kenmerk} \def\ourreftext{Ons kenmerk} \def\datetext{Datum} \def\totext{Aan} \def\pagetext{Bladnummer} \def\oftext{van} \def\date{\number\day~\ifcase\month\or januari\or februari\or maart\or april\or mei\or juni\or juli\or augustus\or september\or oktober\or november\or december\fi \space \number\year} \def\subjecttext{Onderwerp:} \def\ccname{Cc:} \def\enclosuretext{Bijlage:} \def\enclosurestext{Bijlagen:} \def\faxtext{telefax} \def\websitetext{webstek} \def\emailtext{email} \def\phonetext{telefoon} \def\cellphonetext{mobiel} \def\chambertext{kvk} \def\invoicetext{{\bfseries\Large\scshape rekening}} \def\descriptiontext{Omschrijving} \def\amounttext{Bedrag} \def\accountdatatext{Betalingsgegevens} \def\termtext{betalingstermijn} \def\daystext{dagen} \def\accountnotext{rekening nr} \def\accountnametext{ten name van} \def\referencetext{kenmerk} \def\chambertext{kvk} \def\vatnotext{btw nr} \def\Vattext{Btw} \def\Totaltext{Totaal} } % \end{macrocode} % \DescribeMacro{\englishdoc} % \begin{macrocode} \def\englishdoc{% \set@lang{english} \def\yourlettertext{Your letter of} \def\yourreftext{Your reference} \def\ourreftext{Our reference} \def\datetext{Date} \def\totext{To} \def\pagetext{Page} \def\oftext{of} \def\date{\ifcase\day\or 1st\or 2nd\or 3rd\or 4th\or 5th\or 6th\or 7th\or 8th\or 9th\or 10th\or 11th\or 12th\or 13th\or 14th\or 15th\or 16th\or 17th\or 18th\or 19th\or 20th\or 21st\or 22nd\or 23rd\or 24th\or 25th\or 26th\or 27th\or 28th\or 29th\or 30th\or 31st\fi~\ifcase\month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi \space \number\year} \def\subjecttext{Subject:} \def\ccname{cc} \def\enclosuretext{Enclosure:} \def\enclosurestext{Enclosures:} \def\faxtext{telefax} \def\websitetext{website} \def\emailtext{email} \def\phonetext{telephone} \def\cellphonetext{cellphone} \def\invoicetext{{\bfseries\Large\scshape invoice}} \def\descriptiontext{Description} \def\amounttext{Amount} \def\accountdatatext{Banking data} \def\termtext{term of payment} \def\daystext{days} \def\accountnotext{Account no.} \def\accountnametext{to the name of} \def\referencetext{Reference} \def\chambertext{ch.comm.} \def\vatnotext{vat no.} \def\Vattext{Vat} \def\Totaltext{Total} } % \end{macrocode} % \DescribeMacro{\americandoc} % \begin{macrocode} \def\americandoc{% \set@lang{american} \def\yourlettertext{Your letter of} \def\yourreftext{Your reference} \def\ourreftext{Our reference} \def\datetext{Date} \def\totext{To} \def\pagetext{Page} \def\oftext{of} \def\date{\ifcase\month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi \space\number\day, \number\year} \def\subjecttext{Subject:} \def\ccname{cc} \def\enclosuretext{Enclosure:} \def\enclosurestext{Enclosures:} \def\faxtext{telefax} \def\websitetext{website} \def\emailtext{email} \def\phonetext{telephone} \def\cellphonetext{cellphone} \def\invoicetext{{\bfseries\Large\scshape invoice}} \def\descriptiontext{Description} \def\amounttext{Amount} \def\accountdatatext{Banking data} \def\termtext{term of payment} \def\daystext{days} \def\accountnotext{Account no.} \def\accountnametext{to the name of} \def\referencetext{Reference} \def\chambertext{ch.comm.} \def\vatnotext{vat no.} \def\Vattext{Vat} \def\Totaltext{Total} } % \end{macrocode} % \DescribeMacro{\germandoc} % \begin{macrocode} \def\germandoc{% \set@lang{german} \def\yourlettertext{Ihr Brief vom} \def\yourreftext{Ihr Zeichen} \def\ourreftext{Unser Zeichen} \def\datetext{Datum} \def\totext{An} \def\pagetext{Seite} \def\oftext{aus} \def\date{\number\day.~\ifcase\month\or Januar\or Februar\or M\"arz\or April\or Mai\or Juni\or Juli\or August\or September\or Oktober\or November\or Dezember\fi \space\number\year} \def\subjecttext{Betrifft:} \def\ccname{Kopien an} \def\enclosuretext{Anlage:} \def\enclosurestext{Anlagen:} \def\faxtext{Telefax} \def\websitetext{Webseite} \def\emailtext{Email} \def\phonetext{Telefon} \def\cellphonetext{Handy} \def\invoicetext{{\bfseries\Large\scshape rechnung}} \def\descriptiontext{Umschreibung} \def\amounttext{Betrag} \def\accountdatatext{Bezahlungsdaten} \def\termtext{Zahlungstermin} \def\daystext{Tage} \def\accountnotext{Konto Nr} \def\routingnotext{BLZ} \def\accountnametext{Name} \def\referencetext{Beleg Nr} \def\chambertext{Register Nr} \def\vatnotext{Ustid Nr} \def\Vattext{MwSt} \def\Totaltext{Insgesamt} } % \end{macrocode} % \DescribeMacro{\frenchdoc} % \begin{macrocode} \def\frenchdoc{% \set@lang{french} \def\yourlettertext{Votre lettre du} \def\yourreftext{Vos r\'ef\'erences:} \def\ourreftext{Nos r\'ef\'erences:} \def\datetext{Date:} \def\totext{\`A l'attention de} \def\pagetext{Page} \def\oftext{de} \def\date{\number\day\ifnum\day=1$^{er}$\fi ~\ifcase\month\or janvier\or f\'evrier\or mars\or avril\or mai\or juin\or juillet\or ao\^ut\or septembre\or octobre\or novembre\or d\'ecembre\fi \space \number\year} \def\subjecttext{Objet:} \def\ccname{Copie \`a} \def\enclosuretext{Pi\`ece jointe:} \def\enclosurestext{Pi\`eces jointes:} \def\faxtext{t\'el\'efax} \def\websitetext{site Web} \def\emailtext{email} \def\phonetext{t\'el\'ephone} \def\cellphonetext{portable} \def\invoicetext{{\bfseries\Large\scshape facture}} \def\descriptiontext{Description} \def\amounttext{Montant} \def\accountdatatext{Cooronn\'ees banquaires} \def\termtext{terme} \def\daystext{jours} \def\accountnotext{no. compte} \def\accountnametext{au nom de} \def\referencetext{r\'ef\'erence} \def\chambertext{c.c.i.} \def\vatnotext{no. T.V.A.} \def\Vattext{T.V.A.} \def\Totaltext{Total} } % \end{macrocode} % \Finale \endinput $Id: isodoc.dtx,v 1.14 2007/08/21 22:16:38 wybo Exp $