summaryrefslogtreecommitdiff
path: root/macros/generic/upca/upca.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/generic/upca/upca.tex')
-rw-r--r--macros/generic/upca/upca.tex166
1 files changed, 166 insertions, 0 deletions
diff --git a/macros/generic/upca/upca.tex b/macros/generic/upca/upca.tex
new file mode 100644
index 0000000000..cae5a0d7e0
--- /dev/null
+++ b/macros/generic/upca/upca.tex
@@ -0,0 +1,166 @@
+%Author: Ji\v{r}\'{i} Mrkus
+%License: LaTeX Project Public License
+\newcount\stringlength
+\stringlength=0
+\newcount\check
+\check=0
+\newcount\badchar
+\badchar=0
+\newcount\oddcount
+\oddcount=0
+\newcount\evencount
+\evencount=0
+\newcount\helplen
+\helplen=0
+\newcount\moda
+\newcount\modb
+
+\newdimen\module
+\newdimen\height
+\newdimen\fivemodule
+\newdimen\fntsize
+\newdimen\unita
+\newdimen\unitb
+\newdimen\unitc
+\newdimen\helpind
+
+\fntsize=12pt
+\module=0.33mm
+\height=25.9mm
+
+
+
+\def\upca#1 {\kern 1.5mm\edef\currfont{\the\font}%
+ \helpind=\parindent%
+ \parindent=0pt%
+ \unita=\module%
+ \multiply\unita by1065%
+ \divide\unita by1000%
+ \unitb=\unita%
+ \unitc=\unita%
+ \multiply\unita by4%
+ \multiply\unitb by11%
+ \multiply\unitc by2%
+ \fntsize=\module%
+ \multiply\fntsize by950%
+ \divide\fntsize by100%
+ \font\upcafont=ocrb10 at \fntsize%
+ \upcafont%
+ \fivemodule=\module%
+ \multiply\fivemodule by5%
+ \stringlength=0 \badchar=0%
+ \control[#1] \ifnum\badchar=0 \ifnum\check=1 \controlchar[#1]%
+ \hbox{\upcacode[#1{\checkchar}]}\else%
+ \hbox{\upcacode[#1]}\fi\else\fi%
+ \parindent=\helpind \currfont \kern 1.5mm}
+
+
+
+\def\upcacode[#1]{\stringlength=1%
+ \advance\height by\fivemodule%
+ \ooalign{\split[00000]\split[101] \upcahash[#1]\split[00000]\cr%
+ \hbox{\kern-\unitc \lower \unita\hbox{\upcatext[#1]}}}}
+
+
+%Macro which prints text under the code
+\def\upcatext[#1#2]{#1\kern\unitb \sndtext[#2]}
+\def\sndtext[#1#2#3#4#5#6]{#1#2#3#4#5\kern\unita \rdtext[#6]}
+\def\rdtext[#1#2#3#4#5#6]{#1#2#3#4#5\kern\unitb #6}
+
+%This macro converts number to sequence of 0 and 1
+\def\upcahash[#1#2]{%
+ \if#10 \ifnum\stringlength=1 \split[0001101]\else%
+ \ifnum\stringlength<7%
+ \raise\fivemodule\hbox{\split[0001101]}\else%
+ \ifnum\stringlength=12 \split[1110010]\else%
+ \raise\fivemodule\hbox{\split[1110010]}\fi\fi\fi\else%
+ \if#11 \ifnum\stringlength=1 \split[0011001]\else%
+ \ifnum\stringlength<7%
+ \raise\fivemodule\mbox{\split[0011001]}\else%
+ \ifnum\stringlength=12 \split[1100110]\else%
+ \raise\fivemodule\hbox{\split[1100110]}\fi\fi\fi\else%
+ \if#12 \ifnum\stringlength=1 \split[0010011]\else%
+ \ifnum\stringlength<7%
+ \raise\fivemodule\hbox{\split[0010011]}\else%
+ \ifnum\stringlength=12 \split[1101100]\else%
+ \raise\fivemodule\hbox{\split[1101100]}\fi\fi\fi\else%
+ \if#13 \ifnum\stringlength=1 \split[0111101]\else%
+ \ifnum\stringlength<7%
+ \raise\fivemodule\hbox{\split[0111101]}\else%
+ \ifnum\stringlength=12 \split[1000010]\else%
+ \raise\fivemodule\hbox{\split[1000010]}\fi\fi\fi\else%
+ \if#14 \ifnum\stringlength=1 \split[0100011]\else%
+ \ifnum\stringlength<7%
+ \raise\fivemodule\hbox{\split[0100011]}\else%
+ \ifnum\stringlength=12 \split[1011100]\else%
+ \raise\fivemodule\hbox{\split[1011100]}\fi\fi\fi\else%
+ \if#15 \ifnum\stringlength=1 \split[0110001]\else%
+ \ifnum\stringlength<7%
+ \raise\fivemodule\hbox{\split[0110001]}\else%
+ \ifnum\stringlength=12 \split[1001110]\else%
+ \raise\fivemodule\hbox{\split[1001110]}\fi\fi\fi\else%
+ \if#16 \ifnum\stringlength=1 \split[0101111]\else%
+ \ifnum\stringlength<7%
+ \raise\fivemodule\hbox{\split[0101111]}\else%
+ \ifnum\stringlength=12 \split[1010000]\else%
+ \raise\fivemodule\hbox{\split[1010000]}\fi\fi\fi\else%
+ \if#17 \ifnum\stringlength=1 \split[0111011]\else%
+ \ifnum\stringlength<7%
+ \raise\fivemodule\hbox{\split[0111011]}\else%
+ \ifnum\stringlength=12 \split[1000100]\else%
+ \raise\fivemodule\hbox{\split[1000100]}\fi\fi\fi\else%
+ \if#18 \ifnum\stringlength=1 \split[0110111]\else%
+ \ifnum\stringlength<7%
+ \raise\fivemodule\hbox{\split[0110111]}\else%
+ \ifnum\stringlength=12 \split[1001000]\else%
+ \raise\fivemodule\hbox{\split[1001000]}\fi\fi\fi\else%
+ \if#19 \ifnum\stringlength=1 \split[0001011]\else%
+ \ifnum\stringlength<7%
+ \raise\fivemodule\hbox{\split[0001011]}\else%
+ \ifnum\stringlength=12 \split[1110010]\else%
+ \raise\fivemodule\hbox{\split[1110100]}\fi\fi\fi \else \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi%
+ \ifnum\stringlength=11 \advance\height by\fivemodule\else\fi%
+ \ifnum\stringlength=6%
+ \advance\height by\fivemodule%
+ \split[01010]%
+ \advance\height by-\fivemodule \else \fi%
+ \ifnum\stringlength=1 \advance\height by-\fivemodule \else\fi%
+ \advance\stringlength by1%
+ \if:#2: \split[101]%
+ \advance\height by-\fivemodule%
+ \else\upcahash[#2]\fi}
+
+%Macro takes as parameter sequence of 0 and 1, every character passes on draw macro
+\def\split[#1#2]{\draw[#1] \if:#2: \else \split[#2] \fi}
+
+%This macro takes as parameter one character (0 or 1) and draws a bar or space
+\def\draw[#1]{\if#11\vrule height \height width \module \else \if#10\hskip \module \fi \fi}
+
+%Returns true if character in parameter is a digit, false otherwise
+\newif\ifnext
+\def\ifdigit[#1]{\ifnum`#1>47 \ifnum`#1<58 \nexttrue\else\nextfalse\fi\else\nextfalse\fi\ifnext}
+
+%This macro computes length of string in parameter - result is in helplen register
+\def\strlen[#1#2]{\if:#2: \advance\helplen by1 \else \advance\helplen by1\strlen[#2]\fi}
+
+%Macro which computes modulo of two numbers in moda and modb registers - result in moda
+\def\modulo{%
+ \ifnum\moda>\modb \advance\moda by-\modb \modulo%
+ \else \fi\ifnum\moda=\modb \moda=0 \else \fi}
+
+%Macro which controls if parameter has length 11 or 12 characters and contains only digits
+\def\control[#1#2]{\ifdigit[#1]\advance\stringlength by1%
+ \if:#2: \ifnum\stringlength=11 \check=1 \else%
+ \ifnum\stringlength=12 \check=0%
+ \else \message{String must have 11 or 12 characters}\badchar=1\fi\fi\else\control[#2]\fi%
+ \else \message{Invalid characters: code can contain only digits}\badchar=1\fi}
+
+%Macro which computes the check digit
+\def\controlchar[#1#2]{\helplen=0 \if:#2: \else \strlen[#2]\fi \moda=\helplen \modb=2 \modulo%
+ \ifnum\moda=0 \advance\oddcount by`#1 \advance\oddcount by-48 \else%
+ \advance\evencount by`#1 \advance\evencount by-48 \fi%
+ \ifnum\helplen>0 \controlchar[#2]\else%
+ \multiply\oddcount by3 \advance\oddcount by\evencount \moda=\oddcount \modb=10 \modulo%
+ \ifnum\moda=0 \check=0 \else \check=10 \advance\check by-\moda\fi \def\checkchar{\the\check}\fi}
+
+\endinput \ No newline at end of file