1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
|
%%
%% This is file `eandoc.tex',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% barcodes.dtx (with options: `eandoc')
%% As this is a generated file, you may perhaps not want to edit it.
%% This file belongs to the barcode package.
%% It may be of no great use without the rest of the barcode package.
%% \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 \~}
%%
\documentclass{article}
\begin{document}
\author{Peter Willadt}
\title{EAN Barcodes by \TeX{} an Metafont}
\date{1998-01-24}
\maketitle
\begin{abstract}
This article documents the use of the font {\tt wlean.mf}. With the font,
there also comes an auxiliary Perl file for preprocessing TeX source.
Its use is also documented here.
\end{abstract}
\section{Legal Restrictions and Introduction}
All the files in this package are subject to the \LaTeX\ Project Public
License. Also I got a special wish: If you find this package useful,
support TUG or your local \TeX\ user group.
The complete contents of this package is
described in the file {\tt README}. That file also contains some
information about the use of the other barcode fonts that are
contained. For more information about these other files you may want
to read an article that has appeared in the december, 1997 issue of
{\em TUGboat}. Please see also the remarks in the section {\em
Address} later in this file.
\section{About {\sc ean}}
In stores, {\sc upc} and {\sc ean} codes are widely used for automatic
identification, pricing etc. {\sc ean} consist of either eight or
thirteen digits. Twelve digit {\sc upc} codes are like thirteen digit
{\sc ean} with the first digit equal to zero. {\sc ean} specifications
do not only
require bars, also the encoded number has to be written in plain text,
in case a reader is defective or the code is too hard to read. {\sc
ean} is a high-density code, and so it is highly vulnerable.
\subsection{Coding}
The last digit of an {\sc ean} is a weighted mod 10 checksum. Digits
are alternatingly multiplied by 1 or 3. The so calculated sum over all
digits has to be divisible by ten without any remainder.
There are three different {\sc ean} character sets labeled A, B, and
C. Eight digit {\sc ean} codes use character sets A and C, {\sc ean}
codes with thirteen digits use all three character sets---see below.
\begin{verse}
{\sc ean} with eight digits consists of:\\
a sidebar\\
the first four digits (coded in character set A),\\
the middle separator,\\
the other four digits (coded in character set C)\\
another sidebar.
\end{verse}
The first half of an {\sc ean} code with thirteen digits is coded in
the character sets A and B, the second half in character set C. The
coding of the very first digit is hidden in the varying use of the
character sets A and B. A C programmer might use the following table
and algorithm to decide which character set to use for digits 2--7:
\begin{verbatim}
static UBYTE abtab[10][6]={
{0,0,0,0,0,0}, /* 0 */
{0,0,1,0,1,1}, /* 1 */
{0,0,1,1,0,1}, /* 2 */
{0,0,1,1,1,0}, /* 3 */
{0,1,0,0,1,1}, /* 4 */
{0,1,1,0,0,1}, /* 5 */
{0,1,1,1,0,0}, /* 6 */
{0,1,0,1,0,1}, /* 7 */
{0,1,0,1,1,0}, /* 8 */
{0,1,1,0,1,0} /* 9 */
};
char eancode[18];
char eansource[14]="4025700001030";
eancode[0]=eansource[0];
eancode[1]=' ';
eancode[2]='+';
for(i=1;i<7;i++)
eancode[i+2]='A'+eansource[i]-'0'
+abtab[eansource[0]-'0'][i-1]*('a'-'A');
/* then the middle separator, digits 7--13,
* and the final + sign */
\end{verbatim}
A zero means to use character set A and a one means to use character
set B for the respective digit. The printed code of an {\sc ean} 13
consist of the following elements, from left to right:
\begin{verse}
The first digit in human-readable form\\
an {\sc ean} sidebar\\
six digits in character sets A or B\\
the {\sc ean} middle separator\\
six digits in character set C\\
another {\sc ean} sidebar
\end{verse}
Magazines or codes with pricing have a so called extension following
the main code with some fixed distance. This extension consists of one
sidebar and two or five digits. As I have no full {\sc ean}
documentation at hand at the time of this writing, I am sorry that I
am not able to tell you more about this.
The {\sc ean} digits themselves obey to the following rules: Each
digit takes seven units of space. Some of the seven elements are
white, others are black. Digits from character set A always are white
at the left edge and black at the right, and they always have an odd numer
of black elements. Digits from character set B are quit similiar, but
they have an even number of black elements. Digits from Character set C
always start with a black element and have an even number of
black elements. The rightmost element in character set C is always white.
The sidebars are three elements wide, the middle separator takes five
elements.
\subsection{What {\sc ean} numbers may I use?}
For inhouse use, you may use any 13-digit {\sc ean} that starts with a
2. If you want to have your products sold elsewhere, you have to buy a
set of {\sc ean} numbers from the organisation in your country that
holds these numbers. For germany, this organisation is the {\em
Zentrale f\"ur Coorganisation} in Cologne. Almost any country has a
similiar organisation.
The first digit or sometimes the first two digits code the country of
origin, the next five to six digits code the manufacturer, the eigth
to twelfth digits are for free use by the manufacturer. The
thirteenth digit is, as explained above, a checksum. {\sc ean} do not
contain any qualifiers, so if you get an {\sc ean} from somewhere, you
may find out about the country of origin and about the manufacturer of
the product, but if you want to know more, you have to contact the
manufacturer.
\section{Using {\tt wlean.mf}}
{\tt wlean.mf} is rather raw. It contains all three {\sc ean}
character sets within one single font, but at different places.
The character sets A, B, C, and the digits are
featured through the following characters:
\begin{verse}
0 to 9 yield the digits from 0 to 9\\
A to J yield the codes from character set A\\
a to j yield the codes from character set B\\
K to T yield the codes from character set C\\
+ makes the left and right sidebar and\\
- makes the middle sign
\end{verse}
So, to code the number {\tt 2099993098253}, you have to write\\
\verb*|{\eanfont2 +AJjjJd-KTSMPN+}|. The space is necessary to separate
the leading 2 from the barcode.
{\tt wlean.mf} does not use true {\sc ocr} digits, as it should. As
the digits will not be used for {\sc ocr}, I do not consider this as
a serious restriction. If you really need {\sc ocr} digits, there is
an {\sc ocr} font on {\sc ctan}. And in {\em TUGboat}, there has been
a publication about {\sc ean}, where \TeX{} draws the bars and
the {\sc ocr} font prints the digits, see [1].
{\tt wlean.mf} uses the normal {\sc ean} dimensions. If you would like
lower bars---in contradiction to the {\sc ean} rules---you have to edit
the source. The rules also make recommendations about the scaling. To
be fully compatible, this font may be scaled 0.8, 0.9, 1, 1.2, 1.4,
1.5, 1.7, 1.85, or 2 times the original size. With a 300 dpi printer,
I do not recommend using sizes$<1.0$.
\subsection{Installation}
The installation itself is pretty mundane, like with any plain font.
Just copy {\tt wlean.mf} to a location where Metafont can find
it. Then invoke Metafont to create a {\sc tfm} file. Move this {\sc
tfm} file where \TeX{} can find it. Type in the example at the end of
this file and run it through \TeX{}. Then call Metafont again to
produce a font suitable for your printer or previewer and move this
font to an appropriate location. You may also want to edit {\tt
codean.pl} to run on your shell. For this purpose you have to read
your system's documentation or the documentation that comes with Perl.
\subsection{Making readable output}
Don't make {\sc ean} too small. With a 300 dpi printer, you should not
use this font with magnification$<1$; {\tt scaled 1200} will be okay.
If you want to do mass production, go to somebody with a barcode
reader and check your output, {\em before} you loose money. You also
should consider changes in the blackness that may be caused by
production printing devices. And, of course, you should only use
colours that can be used with barcode reading devices. Especially, do
not use red and watch for much contrast between the colour you print
and the colour of the paper.
\subsection{Coding the numbers}
You will perhaps not want to write something as ugly and error-prone
as \verb*|{\eanfont2 +AJjjJd-KTSMPN+}| manually. So you have to use a
preprocessor\footnote{See bcfaq.tex for \TeX{} code to go without
preprocessing. It is very fine.}. With {\tt wlean.mf} there comes a
tiny Perl program ({\tt codean.pl}) that does preprocessing within
your \TeX{} sources\footnote{codean.pl in the meantime also handles
code 128. See bcfaq.tex}.
The \TeX{} file to be filtered may contain any number of lines
that have one of the following commands starting at the leftmost position.
\begin{itemize}
\item \verb|\ean{|{\em12 or 13 digit number}\verb|}|
The number will be coded as {\sc ean}. If it is only 12 digits long, the
checksum will be calculated, too.
\item \verb|\embed{|{\em12 or 13 digit number}\verb|}|
The number is used as a base for embedding article numbers \&c.\
within an {\sc ean}.
\item \verb|\eean{|{\em number with at most 11 digits}\verb|}|
This number is to be embedded within an {\sc ean}.
\item \verb|\isbn{|{\em valid ISBN}\verb|}| An {\sc isbn} to
make an embedded {\sc ean} of.
\end{itemize}
Let's look at an example: You want the {\sc isbn} {\tt0-201-13448-9}
to be embedded. So you write \verb|\isbn{0201134489}|, but you might
also use the embedding method and write
\verb|\embed{9780000000000}| and, somewhere later in the file,
\verb|\eean{020113448}|. In this latter case you have to omit the last digit,
as {\sc isbn} loose their check digit in favour of the {\sc ean} check digit.
Anyway you do it, you get your command replaced by
\verb|\EAN{|{\em13-digit-number-coded-strange}\verb|}| in the output
file.
But embedding is especially useful if you also write the program that
reads the barcodes. This program might then extract your article
number from an {\sc ean} starting with {\tt20}, eg.
What you have to do is, of course, to use stub definitions for the
three macros mentioned above---as they shall never actually be
typeset---and to use a valid definition for \verb|\EAN|. Then you run
your \TeX{} source through {\tt codean.pl}. This program takes as
first parameter the name of your original file and as second parameter
the name of your destination file. If you omit the parameters, you will
be asked for them.
You may of course also peek the source of {\tt codean.pl} to see how
{\sc ean} checksums are calculated, and so on.
\subsection{Example}
Here is a full example.
Use this \TeX{} source:
\begin{verbatim}
\font\eanfont=WLEAN
\def\ean#1{\message{Call codean.pl}}
\def\eean#1{\message{Call codean.pl}}
\def\isbn#1{\message{Call codean.pl}}
\def\embed#1{}
\def\EAN#1{\vbox{\vskip10pt\eanfont#1\vskip10pt}}
Now, something to do:
\ean{4025700001030} % or, without checksum:
\ean{402570000103}
\embed{2500000000000}
\eean{123}
\isbn{0201134489}
\end{verbatim}
Having run your file through {\tt codean.pl}, the lines after the percent
sign look like this:
\begin{verbatim}
Now, something to do:
\EAN{4 +AcFHaa-KKLKNK+} % or, without checksum: %(4025700001030)
\EAN{4 +AcFHaa-KKLKNK+} %(402570000103)
\embed{2500000000000}
\EAN{2 +FAaaAa-KKLMNT+} % embedded(123)
\EAN{9 +HiaCaB-LNOOSN+} % ISBN(0201134489)
\end{verbatim}
Running this file through \TeX{}, you get {\sc dvi} output containig
{\sc ean} barcodes. Perhaps you wonder why there is not even a
single {\sc ean} contained within this documentation. The reason is
quite simple: You should be able to read the docs {\em before} you
have installed the font. But now is the right time to try the example
on your own. Better yet, you may code an {\sc ean} where you have
taken the number from something like your favourite candy and then,
having printed it, you may compare the bars. This is a nice way to
spend your evenings. I actually started deciphering {\sc ean} codes in
this way, several years ago.
\section{The End}
\subsection{Address}
Just in case you want to write to me, here is my address---but
please note: I am not the {\sc ean} guru.
\begin{verbatim}
Peter Willadt
75177 Pforzheim
Germany
email: Willadt@t-online.de
\end{verbatim}
I also would appreciate if only one version of the material contained
in this package is distributed. So if you have any corrections,
suggestions, \&c., please do not hesitate to send them to me to
incorporate them within this package.
\subsection{Acknowledgement}
I want to express my special thanks to Barbara Beeton for proofreading
and making valuable suggestions. If there are still any typos or
illegibilities, that is due to the fact that I had to change some
things later on.
\begin{thebibliography}{1}
\bibitem{bc:ean}
Peter Ol{\v{s}}ak.
\newblock The {\sc ean} barcodes by {\TeX}.
\newblock {\em TUGboat}, 15(4):459--464, 1994.
\end{thebibliography}
\end{document}
\endinput
%%
%% End of file `eandoc.tex'.
|