% \iffalse % % Copyright (C) 1996-98 by Jochen R"utschlin. All rights reserved. % % This file is part of the `barcodes' package. % % IMPORTANT NOTICE: % % You are not allowed to change this file. % % You are NOT ALLOWED to distribute this file alone. You are NOT % ALLOWED to take money for the distribution or use of this file (or % a changed version). % % If you receive only some of these files from someone, complain! % % \fi % % \CheckSum{100} % % \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 \~} % % \iffalse %<*driver> \documentclass[a4paper,11pt]{ltxdoc} \pagestyle{empty} \DisableCrossrefs \OnlyDescription \usepackage[german]{babel} \usepackage{typearea} \typearea{15} \usepackage{multicol,hhline,barcodes} \renewcommand{\meta}[1]{{\normalfont\textit{#1}}} \renewcommand{\DescribeMacro}[1]{\relax} \renewcommand{\DescribeEnv}[1]{\relax} \newcommand*{\Describe}[1]{% \bigskip\noindent\fbox{\footnotesize\texttt{\bslash{}#1}}\par\smallskip} \begin{document} \DocInput{barcodes.dtx} \end{document} % % \fi % % \title{Das \textsf{barcodes} Paket v1.1b} % \author{Jochen R"utschlin} % \date{22.\ M"arz 1998} % \maketitle % % \thispagestyle{empty} % % \begin{abstract} % Dieses Paket enth"alt ein hilfreiches Makro f"ur die Darstellung von % Strichcodes. Ausgangspunkt hierf"ur ist Europ"aische Artikelnummer % (EAN) nach der DIN~66\,236. % \end{abstract} % % \noindent\rule{\hsize}{.4pt} % % \enlargethispage{1cm} % % \begin{multicols}{2} % Die Darstellung eines Strichcodes erfolgt durch eine Folge von % schwarzen (1) und wei"sen (0) Balken. Durch das Aufeinandertreffen % gleichfarbiger Balken ergeben sich unterschiedlich breite schwarze und % wei"se Fl"achen, die die Codierung bilden. Meist wird durch das % Hinzuf"ugen einer Klarschriftzeile zus"atzlich das personelle Lesen % erm"oglicht. % % % % \Describe{barcodeheight} % \DescribeMacro{\barcodeheight} % |\barcodeheight| ist ein L"angenregister und gibt die H"ohe des % Barcodes an. % % \subsubsection*{EAN 13} % Die EAN~13 besteht aus 13 Ziffern (bezeichnet mit $a_{1},\ldots, % a_{13}$), die sich in die L"anderkennung\footnote{Beispielsweise wird % 40 bis 43 f"ur Deutschland und 76 f"ur die Schweiz verwendet.} % ($a_{1},a_{2}$), die Herstellernummer ($a_{2},\ldots,a_{7}$) und die % Artikelnummer ($a_{8},\ldots, a_{12}$) sowie einer Pr"ufziffer % ($a_{13}$) untergliedern. % % \smallskip Die Pr"ufziffer berechnet sich aus der Formel % % % \begin{displaymath} % \begin{array}{rcr@{}l@{\:}c@{\:}l} % a_{13} & \equiv & -( & 1\cdot a_{1} & + & 3\cdot a_{2} +\\ % & & & 1\cdot a_{3} & + & 3\cdot a_{4}+\\ % & & & \multicolumn{3}{c}{\cdots}\\ % & & & 1\cdot a_{11}& + & 3\cdot a_{12}) \pmod{10}\\ % \end{array} % \end{displaymath} % % Die dreizehn Ziffern werden in drei Gruppen aufgeteilt: die % Einzelziffer ($a_{1}$) und zwei sechstellige Bl"ocke % ($a_{2},\ldots,a_{7}$ und $a_{8},\ldots,a_{13}$). % % Zwischen der Einzelziffer und dem ersten 6er-Block sowie am Ende der EAN % (nach Ziffer $a_{13}$) befindet sich die Rahmenstrichfolge 101; % zwischen den beiden 6er-Bl"ocken befindet sich die Trennstrichfolge % 01010. Jede Ziffer wird aus sieben schwarzen und wei"sen Balken % (gleicher Breite) zusammengesetzt. % % Der Wert der Einzelziffer bestimmt nach Tabelle~1 die verwendete % Codierung (entweder $A$ oder $B$) f"ur den ersten 6er-Block und codiert % dadurch sich selbst. Die in der Tabelle angesprochenen Codierungen $A$ % und $B$ befinden sich in Tabelle~2 und 3. % % Der zweite 6er-Block wird einheitlich durch die Codierung $C$ (in % Tabelle~4) dargestellt. % % % % \Describe{ean\oarg{Ziffer}\marg{links}\marg{rechts}} % \DescribeMacro{\ean} % Das optionale Argument \meta{Ziffer} bezeichnet die erste Ziffer, die % links neben dem Strichcode plaziert wird. \meta{links} ist der linke % sechstellige Ziffernblock, welcher die zweite L"anderkennziffer und den % Herstellercode enth"alt, w"ahrend \meta{rechts} die f"unfstellige % Artikelnummer zusammen mit der Pr"ufziffer enth"alt. % % \medskip\noindent\hbox to\hsize{\hfill % \ean[9]{783453}{053397}\footnotemark\hfill} % \footnotetext{Strichcode zur deutschsprachigen Ausgabe von Stephen % Kings \glqq{}tot\grqq{}. Hier l"a"st sich erkennen, da"s bei B"uchern % die L"anderkennung immer 97, gefolgt von einer 8 und der ISBN-Nummer % (ohne deren Pr"ufziffer!) ist.} % % \subsubsection*{EAN 8} % Die EAN~8 besteht aus 8 Ziffern (bezeichnet mit $a_{1},\ldots, % a_{8}$). % % Die 8 Ziffern werden in zwei 4er-Bl"ocken aufgeteilt, die durch die % Trennstrichfolge 01010 getrennt werden. Rechts und links ist die EAN~8 % von der Rahmenstrichfolge 101 umgeben. % % Die Codierung der linken H"alfte erfolgt "uber den Code $A$ in % Tabelle~2, die rechte H"alfte "uber den Code $C$ aus Tabelle~4. % % \Describe{ean\marg{links}\marg{rechts}} % Das erste Argument \meta{links} bezeichnet den vierstelligen linken % Block, \meta{rechts} den vierstelligen rechten Block. % % \medskip\noindent\hbox to\hsize{\hfill % \ean{4005}{8153} % \hfill} % \end{multicols} % % \DeleteShortVerb{\|} % \bigskip\noindent\hbox to\hsize{\footnotesize% % \begin{tabular}[b]{|c|*{6}{@{~}c}@{~}|}\hline % Wert der& \multicolumn{6}{c|}{Code f"ur die}\\ % Zeichen & \multicolumn{6}{c|}{Ziffer}\\\hhline{|~|------|} % $a_{1}$ & $a_{2}$ & $a_{3}$ & $a_{4}$ & $a_{5}$ & $a_{6}$ & $a_{7}$\\\hline % 0 & $A$ & $A$ & $A$ & $A$ & $A$ & $A$\\ % 1 & $A$ & $A$ & $B$ & $A$ & $B$ & $B$\\ % 2 & $A$ & $A$ & $B$ & $B$ & $A$ & $B$\\ % 3 & $A$ & $A$ & $B$ & $B$ & $B$ & $A$\\ % 4 & $A$ & $B$ & $A$ & $A$ & $B$ & $B$\\ % 5 & $A$ & $B$ & $B$ & $A$ & $A$ & $B$\\ % 6 & $A$ & $B$ & $B$ & $B$ & $A$ & $A$\\ % 7 & $A$ & $B$ & $A$ & $B$ & $A$ & $B$\\ % 8 & $A$ & $B$ & $A$ & $B$ & $B$ & $A$\\ % 9 & $A$ & $B$ & $B$ & $A$ & $B$ & $A$\\\hline % \multicolumn{7}{c}{\hbox{}}\\ % \multicolumn{7}{c}{\emph{Tabelle 1}} % \end{tabular} % \hfill % \begin{tabular}[b]{|c|*{7}{@{~}c}@{~}|}\hline % Zeichen & \multicolumn{7}{c|}{Code $A$}\\\hline % 0 & 0 & 0 & 0 & 1 & 1 & 0 & 1\\ % 1 & 0 & 0 & 1 & 1 & 0 & 0 & 1\\ % 2 & 0 & 0 & 1 & 0 & 0 & 1 & 1\\ % 3 & 0 & 1 & 1 & 1 & 1 & 0 & 1\\ % 4 & 0 & 1 & 0 & 0 & 0 & 1 & 1\\ % 5 & 0 & 1 & 1 & 0 & 0 & 0 & 1\\ % 6 & 0 & 1 & 0 & 1 & 1 & 1 & 1\\ % 7 & 0 & 1 & 1 & 1 & 0 & 1 & 1\\ % 8 & 0 & 1 & 1 & 0 & 1 & 1 & 1\\ % 9 & 0 & 0 & 0 & 1 & 0 & 1 & 1\\\hline % \multicolumn{8}{c}{\hbox{}}\\ % \multicolumn{8}{c}{\emph{Tabelle 2}} % \end{tabular} % \hfill % \begin{tabular}[b]{|c|*{7}{@{~}c}@{~}|}\hline % Zeichen & \multicolumn{7}{c|}{Code $B$}\\\hline % 0 & 0 & 1 & 0 & 0 & 1 & 1 & 1\\ % 1 & 0 & 1 & 1 & 0 & 0 & 1 & 1\\ % 2 & 0 & 0 & 1 & 1 & 0 & 1 & 1\\ % 3 & 0 & 1 & 0 & 0 & 0 & 0 & 1\\ % 4 & 0 & 0 & 1 & 1 & 1 & 0 & 1\\ % 5 & 0 & 1 & 1 & 1 & 0 & 0 & 1\\ % 6 & 0 & 0 & 0 & 0 & 1 & 0 & 1\\ % 7 & 0 & 0 & 1 & 0 & 0 & 0 & 1\\ % 8 & 0 & 0 & 0 & 1 & 0 & 0 & 1\\ % 9 & 0 & 0 & 1 & 0 & 1 & 1 & 1\\\hline % \multicolumn{8}{c}{\hbox{}}\\ % \multicolumn{8}{c}{\emph{Tabelle 3}} % \end{tabular} % \hfill % \begin{tabular}[b]{|c|*{7}{@{~}c}@{~}|}\hline % Zeichen & \multicolumn{7}{c|}{Code $C$}\\\hline % 0 & 1 & 1 & 1 & 0 & 0 & 1 & 0\\ % 1 & 1 & 1 & 0 & 0 & 1 & 1 & 0\\ % 2 & 1 & 1 & 0 & 1 & 1 & 0 & 0\\ % 3 & 1 & 0 & 0 & 0 & 0 & 1 & 0\\ % 4 & 1 & 0 & 1 & 1 & 1 & 0 & 0\\ % 5 & 1 & 0 & 0 & 1 & 1 & 1 & 0\\ % 6 & 1 & 0 & 1 & 0 & 0 & 0 & 0\\ % 7 & 1 & 0 & 0 & 0 & 1 & 0 & 0\\ % 8 & 1 & 0 & 0 & 1 & 0 & 0 & 0\\ % 9 & 1 & 1 & 1 & 0 & 1 & 0 & 0\\\hline % \multicolumn{8}{c}{\hbox{}}\\ % \multicolumn{8}{c}{\emph{Tabelle 4}} % \end{tabular}} % % \begin{quote}\footnotesize % \emph{Anmerkung:} Grundlage f"ur die drei Codes ist die Codierung % $A$; % $B$ erh"alt man aus der $A$-Codierung durch Vertauschung von 0 und 1 % und Umkehrung der Reihenfolge der Komponenten, die Codierung $C$ aus % der $A$-Codierung durch Vertauschung von 0 und 1. % \end{quote} % % \StopEventually{\Finale} % % \iffalse %<*package> % \fi % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{barcodes} [1998/02/22 v1.1b barcodes package (jr)] % \end{macrocode} % % \begin{macrocode} \newlength{\bar@height} \newlength{\bar@widthO} \newlength{\bar@widthX} \newlength{\barcodeheight} \newsavebox{\bar@box} \newtoks\bar@inputlist \newtoks\bar@codelist % \end{macrocode} % % \begin{macrocode} \setlength{\barcodeheight}{7ex} % \end{macrocode} % % \begin{macrocode} \def\@UpToHere{\relax}% \def\@IgnoreRest#1#2\@UpToHere{#1} \def\@IgnoreFirst#1#2\relax\@UpToHere{#2} \def\@First#1{\expandafter\@IgnoreRest\the#1{}\@UpToHere} \def\@Rest#1{\expandafter\@IgnoreFirst\the#1\relax\@UpToHere} \def\@RestOf#1{\expandafter\expandafter\expandafter {\expandafter\@IgnoreFirst\the#1\relax\@UpToHere}} \def\@FirstOf#1{\expandafter\expandafter\expandafter {\expandafter\@IgnoreRest\the#1{}\@UpToHere}} \def\@MoveFirst(#1to#2){\global#2=\@FirstOf{#1}} \def\@MoveRest(#1to#2){\global#2=\@RestOf{#1}} % \end{macrocode} % % \begin{macro}{\ean} % \begin{macrocode} \def\ean{% \sbox{\bar@box}{\texttt{0}}% \setlength{\bar@widthX}{\wd\bar@box}% \divide\bar@widthX by 7% \setlength{\bar@widthO}{\bar@widthX}% \addtolength{\bar@widthO}{.25\bar@widthO}% \setlength{\bar@height}{\ht\bar@box}% \addtolength{\bar@height}{2\bar@widthO}% \addtolength{\bar@height}{\barcodeheight}% \@ifnextchar[{\@ean}{\@ean[\@empty]}} % \end{macrocode} % \end{macro} % % \begin{macrocode} \def\@ean[#1]#2#3{% \hbox{% \baselineskip 0pt% \ttfamily% \ifx\@empty#1% \bar@codelist={AAAAAA}% \else% #1\hspace*{1mm}% \ifcase #1% \bar@codelist={AAAAAA}% 0 \or\bar@codelist={AABABB}% 1 \or\bar@codelist={AABBAB}% 2 \or\bar@codelist={AABBBA}% 3 \or\bar@codelist={ABAABB}% 4 \or\bar@codelist={ABBAAB}% 5 \or\bar@codelist={ABBBAA}% 6 \or\bar@codelist={ABABAB}% 7 \or\bar@codelist={ABABBA}% 8 \or\bar@codelist={ABBABA}% 9 \fi% \fi% \seperator{\bar@leftrightsep}% \do@ean{#2}% \seperator{\bar@midsep}% \ifx\@empty#1% \bar@codelist={CCCC}% \else% \bar@codelist={CCCCCC}% \fi% \do@ean{#3}% \seperator{\bar@leftrightsep}% }} % \end{macrocode} % \end{macro} % % \begin{macrocode} \def\do@ean#1{\bar@inputlist={#1\relax}\do@eanloop} \def\do@eanloop{% \if\relax \@First\bar@inputlist% \let\next\relax% \else% \ifcase \@First\bar@inputlist% \digit{0}[EAN]% \or\digit{1}[EAN]% \or\digit{2}[EAN]% \or\digit{3}[EAN]% \or\digit{4}[EAN]% \or\digit{5}[EAN]% \or\digit{6}[EAN]% \or\digit{7}[EAN]% \or\digit{8}[EAN]% \or\digit{9}[EAN]% \else% \digit{?}% \fi% \@MoveRest(\bar@inputlist to\bar@inputlist)% \let\next\do@eanloop% \fi\next} % \end{macrocode} % % \begin{macrocode} \def\seperator#1{\vbox to\bar@height{\hbox{#1}\vfill}} % \end{macrocode} % % \begin{macrocode} \def\digit#1{\@ifnextchar[{\@digit{#1}}{\@digit{#1}[\@empty]}} \def\@digit#1[#2]{% \vbox to\bar@height{% \if\@empty#2% \else% \edef\code@tmp{#2code\@First\bar@codelist\code@x{#1}}% \@MoveRest(\bar@codelist to\bar@codelist)% \hbox{\expandafter\csname\code@tmp\endcsname}% \fi% \vfill% \hbox{#1}}} % \end{macrocode} % % \begin{macrocode} \def\code@x#1{% \ifcase#1 a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m\or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\else\@ctrerr\fi} % \end{macrocode} % % \begin{macrocode} \def\EANcodeAa{\bar@digit{0001101}} \def\EANcodeAb{\bar@digit{0011001}} \def\EANcodeAc{\bar@digit{0010011}} \def\EANcodeAd{\bar@digit{0111101}} \def\EANcodeAe{\bar@digit{0100011}} \def\EANcodeAf{\bar@digit{0110001}} \def\EANcodeAg{\bar@digit{0101111}} \def\EANcodeAh{\bar@digit{0111011}} \def\EANcodeAi{\bar@digit{0110111}} \def\EANcodeAj{\bar@digit{0001011}} % \end{macrocode} % % \begin{macrocode} \def\EANcodeBa{\bar@digit{0100111}} \def\EANcodeBb{\bar@digit{0110011}} \def\EANcodeBc{\bar@digit{0011011}} \def\EANcodeBd{\bar@digit{0100001}} \def\EANcodeBe{\bar@digit{0011101}} \def\EANcodeBf{\bar@digit{0111001}} \def\EANcodeBg{\bar@digit{0000101}} \def\EANcodeBh{\bar@digit{0010001}} \def\EANcodeBi{\bar@digit{0001001}} \def\EANcodeBj{\bar@digit{0010111}} % \end{macrocode} % % \begin{macrocode} \def\EANcodeCa{\bar@digit{1110010}} \def\EANcodeCb{\bar@digit{1100110}} \def\EANcodeCc{\bar@digit{1101100}} \def\EANcodeCd{\bar@digit{1000010}} \def\EANcodeCe{\bar@digit{1011100}} \def\EANcodeCf{\bar@digit{1001110}} \def\EANcodeCg{\bar@digit{1010000}} \def\EANcodeCh{\bar@digit{1000100}} \def\EANcodeCi{\bar@digit{1001000}} \def\EANcodeCj{\bar@digit{1110100}} % \end{macrocode} % % \begin{macrocode} \def\bar@digit#1{\do@digit#1\relax} \def\do@digit{\afterassignment\do@digitloop\let\next= } \def\do@digitloop{% \ifx\next\relax% \let\next\relax% \else% \if\next 0% \rule{\bar@widthO}{0ex}% \else% 1 \rule{\bar@widthX}{\barcodeheight}% \fi% \let\next\do@digit% \fi\next} % \end{macrocode} % % \begin{macrocode} \def\bar@midsep{% \addtolength{\barcodeheight}{1ex}% \rule{\bar@widthO}{0ex}% \rule{\bar@widthX}{\barcodeheight}% \rule{\bar@widthO}{0ex}% \rule{\bar@widthX}{\barcodeheight}% \rule{\bar@widthO}{0ex}% \addtolength{\barcodeheight}{-1ex}} % \end{macrocode} % % \begin{macrocode} \def\bar@leftrightsep{% \addtolength{\barcodeheight}{1ex}% \rule{\bar@widthX}{\barcodeheight}% \rule{\bar@widthO}{0ex}% \rule{\bar@widthX}{\barcodeheight}% \addtolength{\barcodeheight}{-1ex}} % \end{macrocode} % \iffalse % % \fi % \Finale