%%%%%%%%%%%% The macro EAN generates EAN-13 barcodes. %%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% May 8, 1995                                 Petr Olsak (Ol\v{s}\'ak)

% Don't change the (C) message.
% You can use the macro on your own risk.
% There is no warranty that the macro works OK.
% For more detail about algorithm see the article in TUGboat.

% Usage: For example \EAN 978-80-901950-0-4 generates the \vbox with barcodes
% in TeX hight accuracy using \rule primitive.
% The EAN number is appended downwards in OCR-b font (9pt).

% If the macro \ISBN is used before the \EAN macro call, the ISBN is
% appended upwards in OCR-b font (7pt) and the hight of barcodes is reduced.
% Example: \ISBN 80-901950-0-8  \EAN 978-80-901950-0-4
% Don't use brackets in parameters!
% The macro checks the checkdigit in EAN; it does not in ISBN.

% The bar correction is defined by \bcorr.
% Each bar width will be reduced by \bcorr amount and
% each space between bars will be enlarged by the same amount.
% Recommendation: If you plan the print by offset process, use the barcode
% correction 20 for your phototypesetter. This is the implicit value of
% \bcorr=.020mm (see bellow).

% You can overwrite some parameters at user level. For example:
% \input ean13
% \X=0.396mm                         % the module size is 120% of standard
% \font\ocrb=ocrb9 scaled 1200       % re-load font to the new size
% \font\ocrbsmall=ocrb7 scaled 1200  % re-load font to the new size
% \bcorr=0.015mm                     % new bar correction
% \ISBN 80-901950-0-8
% \barheight=1.5cm                   % this must be after \ISBN call
% \EAN 978-80-901950-0-8             % produces barcode with ISBN
% \end                               % at 120% with height of bars 1.5cm

% The tolerance of dimensions for basic size (100%, module size .33mm)
% is 0.101 mm, 0.049 mm and 0.096 mm for various parameters.
% You can compare: The TeX accuracy is 0.0000054 mm.
% If you use the phototypesetter 2400 dpi then the accuracy is 0.01 mm.


\message{The EAN-13 barcodes macro. Copyright (C) Petr Olsak, 1995}
\font\ocrb=ocrb9       % for EAN in ``number form''
\font\ocrbsmall=ocrb7  % for ISBN
\newcount\numlines \newcount\nummodules  % number of bars and of modules.
\newcount\numdigit \newcount\evensum \newcount\oddsum  % internal variables
\newdimen\X            % the module size X,
\newdimen\bcorr        % the bar correction (see bellow).
\newdimen\workdimen \newdimen\barheight   % internal variables
\def\internalcode{0111}             % Begin mark at start
\def\frontdigits{}                  % 12--7 digit of EAN
\def\EAN{\begingroup\EANscan}
\def\EANscan#1{\if#1-\let\next=\EANscan \else
    \advance\numdigit by1
    \ifnum\numdigit<13
      \ifodd\numdigit \advance\oddsum by #1 \else \advance\evensum by #1 \fi
      \let\next=\EANscan
      \ifnum\numdigit=1 \settables#1\def\firstdigit{#1}\else
      \ifnum\numdigit<8 \usetabAB#1\edef\frontdigits{\frontdigits#1}\else
      \ifnum\numdigit=8 \insertseparator \A \usetabC #1\def\enddigits{#1}%
      \else             \usetabC#1\edef\enddigits{\enddigits#1}%
      \fi\fi\fi
    \else \testchecksum#1\usetabC#1\edef\enddigits{\enddigits#1}%
      \let\next=\EANclose
    \fi\fi \next}
\def\testchecksum#1{\multiply\evensum by3 \advance\evensum by\oddsum
    \oddsum=\evensum
    \divide\oddsum by10 \multiply\oddsum by10 \advance\oddsum by10
    \advance\oddsum by-\evensum \ifnum\oddsum=10 \oddsum=0 \fi
    \ifnum#1=\oddsum \else
    \errmessage{The checksum digit has to be \the\oddsum, no #1 !}\fi}
\def\EANclose{\insertendmark
    \wlog{EAN: \firstdigit\space\frontdigits\space\enddigits}%
    \wlog{EANinternal: \internalcode}%
    \expandafter\EANbox\internalcode..\endgroup}
\def\A{\def\0{3211}\def\1{2221}\def\2{2122}\def\3{1411}\def\4{1132}%
  \def\5{1231}\def\6{1114}\def\7{1312}\def\8{1213}\def\9{3112}}
\def\B{\def\0{1123}\def\1{1222}\def\2{2212}\def\3{1141}\def\4{2311}%
  \def\5{1321}\def\6{4111}\def\7{2131}\def\8{3121}\def\9{2113}}
\def\settables#1{\ifnum#1=0 \def\tabs{\A\A\A\A\A\A}\fi
                 \ifnum#1=1 \def\tabs{\A\A\B\A\B\B}\fi
                 \ifnum#1=2 \def\tabs{\A\A\B\B\A\B}\fi
                 \ifnum#1=3 \def\tabs{\A\A\B\B\B\A}\fi
                 \ifnum#1=4 \def\tabs{\A\B\A\A\B\B}\fi
                 \ifnum#1=5 \def\tabs{\A\B\B\A\A\B}\fi
                 \ifnum#1=6 \def\tabs{\A\B\B\B\A\A}\fi
                 \ifnum#1=7 \def\tabs{\A\B\A\B\A\B}\fi
                 \ifnum#1=8 \def\tabs{\A\B\A\B\B\A}\fi
                 \ifnum#1=9 \def\tabs{\A\B\B\A\B\A}\fi}
\def\usetabAB#1{\expandafter\scantab\tabs\end \usetabC #1}
\def\scantab#1#2\end{#1\def\tabs{#2}} % The tab #1 is activated and removed
\def\usetabC#1{\edef\internalcode{\internalcode\csname#1\endcsname}}
\def\insertseparator{\edef\internalcode{\internalcode 11111}}
\def\insertendmark{\edef\internalcode{\internalcode 111}}
\def\EANbox{\vbox\bgroup\offinterlineskip
  \setbox0=\hbox\bgroup \kern11\X\EANrepeat}
\def\EANrepeat#1#2{\if#1.\let\next=\EANfinal \else\let\next=\EANrepeat
  \advance\numlines by1
  \advance\nummodules by#1 \advance\nummodules by#2
  \workdimen=#1\X \advance\workdimen by \bcorr \kern\workdimen
  \workdimen=#2\X \advance\workdimen by-\bcorr \vrule width\workdimen
     \ifdim\barheight=0pt height 69.24242424\X \else height\barheight \fi
     \ifnum\numlines=1    depth5\X\else  % the start mark
     \ifnum\numlines=2    depth5\X\else
     \ifnum\numlines=15   depth5\X\else  % the separator mark
     \ifnum\numlines=16   depth5\X\else
     \ifnum\numlines=29   depth5\X\else  % the end mark
     \ifnum\numlines=30   depth5\X\else depth0pt \fi\fi\fi\fi\fi\fi
  \fi\next}
\def\EANfinal{\testconsistence
  \kern7\X\egroup
  \hbox{\ocrbsmall \kern10\X \ISBNnum}\kern1\X
  \dp0=0pt \box0 \kern-1\X
  \hbox{\ocrb\kern2\X\firstdigit\kern5\X \frontdigits\kern5\X \enddigits}
  \egroup \global\barheight=0pt \gdef\ISBNnum{}}
\def\testconsistence{\ifnum\numlines=30\else\internalerr\fi
  \ifnum\nummodules=95\else\internalerr\fi}
\def\internalerr{\errmassage{Sorry, my internal tables are wrong, may be.}}
\barheight=0pt
\def\ISBNnum{}
\def\ISBN #1 {\def\ISBNnum{ISBN #1}\barheight=45.151515\X\relax}
\X=.33mm       % Basic size 100%, SC2 code
\bcorr=.020mm  % Bar-correction for offset process
\endinput




