summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/makebarcode
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/makebarcode
Initial commit
Diffstat (limited to 'macros/latex/contrib/makebarcode')
-rw-r--r--macros/latex/contrib/makebarcode/README10
-rw-r--r--macros/latex/contrib/makebarcode/doc/latex/makebarcode/License.txt416
-rw-r--r--macros/latex/contrib/makebarcode/doc/latex/makebarcode/makebarcode.pdfbin0 -> 281420 bytes
-rw-r--r--macros/latex/contrib/makebarcode/doc/latex/makebarcode/makebarcode.tex318
-rw-r--r--macros/latex/contrib/makebarcode/tex/latex/makebarcode/makebarcode.sty594
5 files changed, 1338 insertions, 0 deletions
diff --git a/macros/latex/contrib/makebarcode/README b/macros/latex/contrib/makebarcode/README
new file mode 100644
index 0000000000..cd60bbdb78
--- /dev/null
+++ b/macros/latex/contrib/makebarcode/README
@@ -0,0 +1,10 @@
+=============================================================================
+Package: makebarcode Version 1.0 22 July 2008
+=============================================================================
+
+The package contains macros for printing various 2/5 bar codes and Code 39
+bar codes. The macros do not use fonts but create the bar codes directly
+by vrules. It is therefore possible to vary width to height ratio, ratio
+of thin and thick bars. The package is therefore convenient for printing
+ITF bar codes as well as bar codes for identification labels for HP
+storage media.
diff --git a/macros/latex/contrib/makebarcode/doc/latex/makebarcode/License.txt b/macros/latex/contrib/makebarcode/doc/latex/makebarcode/License.txt
new file mode 100644
index 0000000000..90e5e3ab79
--- /dev/null
+++ b/macros/latex/contrib/makebarcode/doc/latex/makebarcode/License.txt
@@ -0,0 +1,416 @@
+The LaTeX Project Public License
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+LPPL Version 1.3c 2006-05-20
+
+Copyright 1999 2002-2006 LaTeX3 Project
+ Everyone is allowed to distribute verbatim copies of this
+ license document, but modification of it is not allowed.
+
+
+PREAMBLE
+========
+
+The LaTeX Project Public License (LPPL) is the primary license under
+which the the LaTeX kernel and the base LaTeX packages are distributed.
+
+You may use this license for any work of which you hold the copyright
+and which you wish to distribute. This license may be particularly
+suitable if your work is TeX-related (such as a LaTeX package), but
+it is written in such a way that you can use it even if your work is
+unrelated to TeX.
+
+The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
+below, gives instructions, examples, and recommendations for authors
+who are considering distributing their works under this license.
+
+This license gives conditions under which a work may be distributed
+and modified, as well as conditions under which modified versions of
+that work may be distributed.
+
+We, the LaTeX3 Project, believe that the conditions below give you
+the freedom to make and distribute modified versions of your work
+that conform with whatever technical specifications you wish while
+maintaining the availability, integrity, and reliability of
+that work. If you do not see how to achieve your goal while
+meeting these conditions, then read the document `cfgguide.tex'
+and `modguide.tex' in the base LaTeX distribution for suggestions.
+
+
+DEFINITIONS
+===========
+
+In this license document the following terms are used:
+
+ `Work'
+ Any work being distributed under this License.
+
+ `Derived Work'
+ Any work that under any applicable law is derived from the Work.
+
+ `Modification'
+ Any procedure that produces a Derived Work under any applicable
+ law -- for example, the production of a file containing an
+ original file associated with the Work or a significant portion of
+ such a file, either verbatim or with modifications and/or
+ translated into another language.
+
+ `Modify'
+ To apply any procedure that produces a Derived Work under any
+ applicable law.
+
+ `Distribution'
+ Making copies of the Work available from one person to another, in
+ whole or in part. Distribution includes (but is not limited to)
+ making any electronic components of the Work accessible by
+ file transfer protocols such as FTP or HTTP or by shared file
+ systems such as Sun's Network File System (NFS).
+
+ `Compiled Work'
+ A version of the Work that has been processed into a form where it
+ is directly usable on a computer system. This processing may
+ include using installation facilities provided by the Work,
+ transformations of the Work, copying of components of the Work, or
+ other activities. Note that modification of any installation
+ facilities provided by the Work constitutes modification of the Work.
+
+ `Current Maintainer'
+ A person or persons nominated as such within the Work. If there is
+ no such explicit nomination then it is the `Copyright Holder' under
+ any applicable law.
+
+ `Base Interpreter'
+ A program or process that is normally needed for running or
+ interpreting a part or the whole of the Work.
+
+ A Base Interpreter may depend on external components but these
+ are not considered part of the Base Interpreter provided that each
+ external component clearly identifies itself whenever it is used
+ interactively. Unless explicitly specified when applying the
+ license to the Work, the only applicable Base Interpreter is a
+ `LaTeX-Format' or in the case of files belonging to the
+ `LaTeX-format' a program implementing the `TeX language'.
+
+
+
+CONDITIONS ON DISTRIBUTION AND MODIFICATION
+===========================================
+
+1. Activities other than distribution and/or modification of the Work
+are not covered by this license; they are outside its scope. In
+particular, the act of running the Work is not restricted and no
+requirements are made concerning any offers of support for the Work.
+
+2. You may distribute a complete, unmodified copy of the Work as you
+received it. Distribution of only part of the Work is considered
+modification of the Work, and no right to distribute such a Derived
+Work may be assumed under the terms of this clause.
+
+3. You may distribute a Compiled Work that has been generated from a
+complete, unmodified copy of the Work as distributed under Clause 2
+above, as long as that Compiled Work is distributed in such a way that
+the recipients may install the Compiled Work on their system exactly
+as it would have been installed if they generated a Compiled Work
+directly from the Work.
+
+4. If you are the Current Maintainer of the Work, you may, without
+restriction, modify the Work, thus creating a Derived Work. You may
+also distribute the Derived Work without restriction, including
+Compiled Works generated from the Derived Work. Derived Works
+distributed in this manner by the Current Maintainer are considered to
+be updated versions of the Work.
+
+5. If you are not the Current Maintainer of the Work, you may modify
+your copy of the Work, thus creating a Derived Work based on the Work,
+and compile this Derived Work, thus creating a Compiled Work based on
+the Derived Work.
+
+6. If you are not the Current Maintainer of the Work, you may
+distribute a Derived Work provided the following conditions are met
+for every component of the Work unless that component clearly states
+in the copyright notice that it is exempt from that condition. Only
+the Current Maintainer is allowed to add such statements of exemption
+to a component of the Work.
+
+ a. If a component of this Derived Work can be a direct replacement
+ for a component of the Work when that component is used with the
+ Base Interpreter, then, wherever this component of the Work
+ identifies itself to the user when used interactively with that
+ Base Interpreter, the replacement component of this Derived Work
+ clearly and unambiguously identifies itself as a modified version
+ of this component to the user when used interactively with that
+ Base Interpreter.
+
+ b. Every component of the Derived Work contains prominent notices
+ detailing the nature of the changes to that component, or a
+ prominent reference to another file that is distributed as part
+ of the Derived Work and that contains a complete and accurate log
+ of the changes.
+
+ c. No information in the Derived Work implies that any persons,
+ including (but not limited to) the authors of the original version
+ of the Work, provide any support, including (but not limited to)
+ the reporting and handling of errors, to recipients of the
+ Derived Work unless those persons have stated explicitly that
+ they do provide such support for the Derived Work.
+
+ d. You distribute at least one of the following with the Derived Work:
+
+ 1. A complete, unmodified copy of the Work;
+ if your distribution of a modified component is made by
+ offering access to copy the modified component from a
+ designated place, then offering equivalent access to copy
+ the Work from the same or some similar place meets this
+ condition, even though third parties are not compelled to
+ copy the Work along with the modified component;
+
+ 2. Information that is sufficient to obtain a complete,
+ unmodified copy of the Work.
+
+7. If you are not the Current Maintainer of the Work, you may
+distribute a Compiled Work generated from a Derived Work, as long as
+the Derived Work is distributed to all recipients of the Compiled
+Work, and as long as the conditions of Clause 6, above, are met with
+regard to the Derived Work.
+
+8. The conditions above are not intended to prohibit, and hence do not
+apply to, the modification, by any method, of any component so that it
+becomes identical to an updated version of that component of the Work as
+it is distributed by the Current Maintainer under Clause 4, above.
+
+9. Distribution of the Work or any Derived Work in an alternative
+format, where the Work or that Derived Work (in whole or in part) is
+then produced by applying some process to that format, does not relax or
+nullify any sections of this license as they pertain to the results of
+applying that process.
+
+10. a. A Derived Work may be distributed under a different license
+ provided that license itself honors the conditions listed in
+ Clause 6 above, in regard to the Work, though it does not have
+ to honor the rest of the conditions in this license.
+
+ b. If a Derived Work is distributed under a different license, that
+ Derived Work must provide sufficient documentation as part of
+ itself to allow each recipient of that Derived Work to honor the
+ restrictions in Clause 6 above, concerning changes from the Work.
+
+11. This license places no restrictions on works that are unrelated to
+the Work, nor does this license place any restrictions on aggregating
+such works with the Work by any means.
+
+12. Nothing in this license is intended to, or may be used to, prevent
+complete compliance by all parties with all applicable laws.
+
+
+NO WARRANTY
+===========
+
+There is no warranty for the Work. Except when otherwise stated in
+writing, the Copyright Holder provides the Work `as is', without
+warranty of any kind, either expressed or implied, including, but not
+limited to, the implied warranties of merchantability and fitness for a
+particular purpose. The entire risk as to the quality and performance
+of the Work is with you. Should the Work prove defective, you assume
+the cost of all necessary servicing, repair, or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will The Copyright Holder, or any author named in the components of the
+Work, or any other party who may distribute and/or modify the Work as
+permitted above, be liable to you for damages, including any general,
+special, incidental or consequential damages arising out of any use of
+the Work or out of inability to use the Work (including, but not limited
+to, loss of data, data being rendered inaccurate, or losses sustained by
+anyone as a result of any failure of the Work to operate with any other
+programs), even if the Copyright Holder or said author or said other
+party has been advised of the possibility of such damages.
+
+
+MAINTENANCE OF THE WORK
+=======================
+
+The Work has the status `author-maintained' if the Copyright Holder
+explicitly and prominently states near the primary copyright notice in
+the Work that the Work can only be maintained by the Copyright Holder
+or simply that it is `author-maintained'.
+
+The Work has the status `maintained' if there is a Current Maintainer
+who has indicated in the Work that they are willing to receive error
+reports for the Work (for example, by supplying a valid e-mail
+address). It is not required for the Current Maintainer to acknowledge
+or act upon these error reports.
+
+The Work changes from status `maintained' to `unmaintained' if there
+is no Current Maintainer, or the person stated to be Current
+Maintainer of the work cannot be reached through the indicated means
+of communication for a period of six months, and there are no other
+significant signs of active maintenance.
+
+You can become the Current Maintainer of the Work by agreement with
+any existing Current Maintainer to take over this role.
+
+If the Work is unmaintained, you can become the Current Maintainer of
+the Work through the following steps:
+
+ 1. Make a reasonable attempt to trace the Current Maintainer (and
+ the Copyright Holder, if the two differ) through the means of
+ an Internet or similar search.
+
+ 2. If this search is successful, then enquire whether the Work
+ is still maintained.
+
+ a. If it is being maintained, then ask the Current Maintainer
+ to update their communication data within one month.
+
+ b. If the search is unsuccessful or no action to resume active
+ maintenance is taken by the Current Maintainer, then announce
+ within the pertinent community your intention to take over
+ maintenance. (If the Work is a LaTeX work, this could be
+ done, for example, by posting to comp.text.tex.)
+
+ 3a. If the Current Maintainer is reachable and agrees to pass
+ maintenance of the Work to you, then this takes effect
+ immediately upon announcement.
+
+ b. If the Current Maintainer is not reachable and the Copyright
+ Holder agrees that maintenance of the Work be passed to you,
+ then this takes effect immediately upon announcement.
+
+ 4. If you make an `intention announcement' as described in 2b. above
+ and after three months your intention is challenged neither by
+ the Current Maintainer nor by the Copyright Holder nor by other
+ people, then you may arrange for the Work to be changed so as
+ to name you as the (new) Current Maintainer.
+
+ 5. If the previously unreachable Current Maintainer becomes
+ reachable once more within three months of a change completed
+ under the terms of 3b) or 4), then that Current Maintainer must
+ become or remain the Current Maintainer upon request provided
+ they then update their communication data within one month.
+
+A change in the Current Maintainer does not, of itself, alter the fact
+that the Work is distributed under the LPPL license.
+
+If you become the Current Maintainer of the Work, you should
+immediately provide, within the Work, a prominent and unambiguous
+statement of your status as Current Maintainer. You should also
+announce your new status to the same pertinent community as
+in 2b) above.
+
+
+WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
+======================================================
+
+This section contains important instructions, examples, and
+recommendations for authors who are considering distributing their
+works under this license. These authors are addressed as `you' in
+this section.
+
+Choosing This License or Another License
+----------------------------------------
+
+If for any part of your work you want or need to use *distribution*
+conditions that differ significantly from those in this license, then
+do not refer to this license anywhere in your work but, instead,
+distribute your work under a different license. You may use the text
+of this license as a model for your own license, but your license
+should not refer to the LPPL or otherwise give the impression that
+your work is distributed under the LPPL.
+
+The document `modguide.tex' in the base LaTeX distribution explains
+the motivation behind the conditions of this license. It explains,
+for example, why distributing LaTeX under the GNU General Public
+License (GPL) was considered inappropriate. Even if your work is
+unrelated to LaTeX, the discussion in `modguide.tex' may still be
+relevant, and authors intending to distribute their works under any
+license are encouraged to read it.
+
+A Recommendation on Modification Without Distribution
+-----------------------------------------------------
+
+It is wise never to modify a component of the Work, even for your own
+personal use, without also meeting the above conditions for
+distributing the modified component. While you might intend that such
+modifications will never be distributed, often this will happen by
+accident -- you may forget that you have modified that component; or
+it may not occur to you when allowing others to access the modified
+version that you are thus distributing it and violating the conditions
+of this license in ways that could have legal implications and, worse,
+cause problems for the community. It is therefore usually in your
+best interest to keep your copy of the Work identical with the public
+one. Many works provide ways to control the behavior of that work
+without altering any of its licensed components.
+
+How to Use This License
+-----------------------
+
+To use this license, place in each of the components of your work both
+an explicit copyright notice including your name and the year the work
+was authored and/or last substantially modified. Include also a
+statement that the distribution and/or modification of that
+component is constrained by the conditions in this license.
+
+Here is an example of such a notice and statement:
+
+ %% pig.dtx
+ %% Copyright 2005 M. Y. Name
+ %
+ % This work may be distributed and/or modified under the
+ % conditions of the LaTeX Project Public License, either version 1.3
+ % 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.3 or later is part of all distributions of LaTeX
+ % version 2005/12/01 or later.
+ %
+ % This work has the LPPL maintenance status `maintained'.
+ %
+ % The Current Maintainer of this work is M. Y. Name.
+ %
+ % This work consists of the files pig.dtx and pig.ins
+ % and the derived file pig.sty.
+
+Given such a notice and statement in a file, the conditions
+given in this license document would apply, with the `Work' referring
+to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being
+generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
+referring to any `LaTeX-Format', and both `Copyright Holder' and
+`Current Maintainer' referring to the person `M. Y. Name'.
+
+If you do not want the Maintenance section of LPPL to apply to your
+Work, change `maintained' above into `author-maintained'.
+However, we recommend that you use `maintained', as the Maintenance
+section was added in order to ensure that your Work remains useful to
+the community even when you can no longer maintain and support it
+yourself.
+
+Derived Works That Are Not Replacements
+---------------------------------------
+
+Several clauses of the LPPL specify means to provide reliability and
+stability for the user community. They therefore concern themselves
+with the case that a Derived Work is intended to be used as a
+(compatible or incompatible) replacement of the original Work. If
+this is not the case (e.g., if a few lines of code are reused for a
+completely different task), then clauses 6b and 6d shall not apply.
+
+
+Important Recommendations
+-------------------------
+
+ Defining What Constitutes the Work
+
+ The LPPL requires that distributions of the Work contain all the
+ files of the Work. It is therefore important that you provide a
+ way for the licensee to determine which files constitute the Work.
+ This could, for example, be achieved by explicitly listing all the
+ files of the Work near the copyright notice of each file or by
+ using a line such as:
+
+ % This work consists of all files listed in manifest.txt.
+
+ in that place. In the absence of an unequivocal list it might be
+ impossible for the licensee to determine what is considered by you
+ to comprise the Work and, in such a case, the licensee would be
+ entitled to make reasonable conjectures as to which files comprise
+ the Work.
+
diff --git a/macros/latex/contrib/makebarcode/doc/latex/makebarcode/makebarcode.pdf b/macros/latex/contrib/makebarcode/doc/latex/makebarcode/makebarcode.pdf
new file mode 100644
index 0000000000..bc11e2a2c1
--- /dev/null
+++ b/macros/latex/contrib/makebarcode/doc/latex/makebarcode/makebarcode.pdf
Binary files differ
diff --git a/macros/latex/contrib/makebarcode/doc/latex/makebarcode/makebarcode.tex b/macros/latex/contrib/makebarcode/doc/latex/makebarcode/makebarcode.tex
new file mode 100644
index 0000000000..98a0faf12a
--- /dev/null
+++ b/macros/latex/contrib/makebarcode/doc/latex/makebarcode/makebarcode.tex
@@ -0,0 +1,318 @@
+%% $Id: zwpagelayout.tex 214 2008-06-26 23:08:07Z zw $
+\input utf8-t1 % encTeX required
+\documentclass[11pt]{article}
+\usepackage{zwgetfdate}
+\usepackage[footskip=30pt,topmargin=2cm,leftmargin=2cm,rightmargin=4cm,botmargin]{zwpagelayout}
+\usepackage[T1]{fontenc}
+\usepackage{lmodern,array,dcolumn,rotating}
+\usepackage[help,H=3mm,S.6]{makebarcode}
+\usepackage[protrusion=false,expansion=true,stretch=8,shrink=24,step=4]{microtype}
+\makeatletter
+\renewcommand*\l@section{\@dottedtocline{1}{\z@}{1.5em}}
+\makeatother
+\extrarowheight 2pt
+\mubytein 0 % important due to bug in url.sty
+\usepackage[pdftitle=Bar\ Codes, pdfauthor=Zdenek\ Wagner,
+ pdfkeywords={bar code, 2/5, Code39, ITF-6, ITF-14, ITF-16},
+ bookmarks,bookmarksopen,bookmarksopenlevel=2]{hyperref}
+\mubytein 1 \mubyteout 1 \mubytelog 1
+
+\marginparwidth\UserRightMargin
+\advance\marginparwidth -1cm
+\advance\marginparwidth-\marginparsep
+
+\def\mg#1{\ifvmode\leavevmode\fi\marginpar{\texttt{#1}}\ignorespaces}
+\def\cmg#1{\mg{\char`\\#1}}
+\def\omg#1{\ifvmode\leavevmode\fi\marginpar{\raggedright\hspace{0pt}\opt{#1}}\ignorespaces}
+\def\opt#1{\texorpdfstring{\textmd{\textsc{#1}}}{#1}}
+\let\pkg\textsc
+\DeclareRobustCommand\cmd[1]{\texttt{\char`\\#1}}
+\def\ie.{i.\,e.\@}
+\def\eg.{e.\,g.\@}
+\def\true{\bool{true}}
+\def\false{\bool{false}}
+\def\bool#1{\texorpdfstring{\textit{#1}}{#1}}
+\def\is{\unskip\nobreak\space =\penalty200 \space\ignorespaces}
+
+\def\bcd#{\barcode[code=Code39,X=.5mm,ratio=2.25,H=1cm]}
+
+\let\zwcomma\,
+\def\,{\texorpdfstring{\zwcomma}{}}
+
+\begin{document}
+
+\clubpenalty 10000
+\widowpenalty 10000
+\raggedbottom
+
+\title{Bar Codes}
+\author{Zdeněk Wagner\\\url{http://icebearsoft.euweb.cz}}
+\date{Package date: \DateOfPackage{makebarcode}}
+\maketitle
+
+\begin{abstract}\noindent
+The package contains macros for printing various 2/5 bar codes and Code 39
+bar codes. The macros do not use fonts but create the bar codes directly
+by vrules. It is therefore possible to vary width to height ratio, ration
+of thin and thick bars. The package is therefore convenient for printing
+ITF bar codes as well as bar codes for identification labels for HP
+storage media.
+\end{abstract}
+
+\tableofcontents
+
+\section{Introduction}
+The development of the package started due to practical need. Bar code labels for HP storage media
+are quite expensive. However, the bar codes may easily be produced by \TeX. The documentation
+clearly specifies that the bar code is of the Code39 type~[\ref{hpstorage}, \ref{hplabel}].
+It may seem that the task is easy.
+
+The common denominator of the 2/5 codes and Code39 is that they are formed of thin and thick bars.
+The ratio of thin and thick bars may vary as well as the width-to-height ratio. It may therefore be
+impossible to use bar code fonts for a particular application. On the other hand a bar code may
+simply be created by rules. This approach was inspired by the \texttt{ean13.tex} file developed by
+Petr Olšák~[\ref{olsak}].
+
+Since the HP documentation does not specify dimensions, it was clear that some experimentation will
+be necessary. The macro should thus be general with dimensions controlled by parameters. It is not
+much work to make the macro really general with bar codes defined in tables. The same macro can
+thus produce several types of barcodes. Moreover, the 2/5 bar codes are simpler and serve therefore
+better to debugging and testing the macro during development.
+
+The structure of the package allows for implementation of other types of the bar codes. Some of
+them will be implemented in the next version.
+
+The bar codes may contain a checksum digit. The macro in this package is able neither to generate
+them nor to check them. It is up to the user to specify the full code.
+
+\section{Usage}\label{usage}
+The package is loaded simply by:
+
+\vb
+\verb;\usepackage[;$\langle$options$\rangle$\verb;]{makebarcode};
+
+\vb\noindent
+The bar code may then be printed by command
+
+\vb
+\verb;\barcode[;$\langle$options$\rangle$\verb;]{;$\langle$code$\rangle$\verb;};
+
+\vb
+Options that ar not given in the \cmd{barcode} command are taken form those specified for the whole
+package or the default values are used. Typically you will specify the most frequently options in
+the \cmd{usepackage} command. Notice that the options in the square brackets of both commands are
+optional. In the extreme case you may wish to print the bar codes of type Code39, module width
+0.5\,mm, ratio of thin and thick bars 2.25 and height 1\,cm. You therefore load the package using
+
+\vb
+\verb;\usepackage[code=Code39,X=.5mm,ratio=2.25,H=1cm]{makebarcode};
+
+\vb\noindent
+and produce the bar codes simply by
+
+\vb
+\verb;\barcode{MAKEBARCODE.STY};\par
+\verb;\barcode{ZDENEK WAGNER};
+
+\vb\noindent
+These commands will produce the following bar codes:
+
+\vb
+\begin{center}
+\bcd{MAKEBARCODE.STY}
+
+\bcd{ZDENEK WAGNER}
+\end{center}
+
+\section{General Options}
+The general options are available both for the \cmd{usepackage} command and for the \cmd{barcode}
+macro. They cannot be used with high-level macros \cmd{ITFbarcode} and \cmd{HPlabel}.
+
+Almost all options have default values and may also be used without specification of a value. This will
+reset the option to the default value. It may be useful if you wish to reset the default in the
+\cmd{barcode} macro.
+
+\omg{help}
+The \opt{help} option can only be used with the \cmd{usepackage} command. It prints the list of the
+supported bar codes to the log file.
+
+\omg{bcorr}
+Some applications require correction of the bar and blank width. The \opt{bcorr} option defines
+dimension that is subtracted from each bar and added to each blank. The default value is 0\,mm.
+
+\section{Low-Level Options}\label{low}
+\omg{code}
+The \opt{code} option select the type of the bar code. The list of valid values will be given
+in later sections. This is the only option that has no default value.
+
+\omg{X}
+Option \opt{X} specifies the module width, \ie. the width of a thin line. Its default value is the
+smallest allowed width 0.19\,mm.
+
+\omg{H}
+The \opt{H} option is the width of the bar code. The default value is calculated dynamically as
+40~times the module width.
+
+\omg{ratio}
+The \opt{ratio} option defines the ratio of thin and thick bars. The default value is~3. Remember
+that some applications require a particular value.
+
+\omg{K}
+The \opt{K} option specifies the width of a bar used in the start/stop characters of the 2/5 Matrix
+bar code as a multiple of the width of the thick bar. It must hold $1.5 \leq \mathrm{K} \leq 4$. The
+default value is~2.
+
+\omg{MtoXratio}
+The characters in most bar codes start and end with a bar so that they must be separated with w
+blank space. The width of the space must be wide at least as the module width but may be larger.
+The width of such a space is defined as a ration to the module width by the \opt{MtoXratio} option.
+Its default value is~1. It will rarely be changed.
+
+\section{Family of 2/5 Bar Codes}
+The package implements the whole family of 2/5 bar codes. Their list is given in table~\ref{25}.
+Remember that the 2/5 Interleaved bar code requires even number of digits. If odd number of digits
+is given, zero is prepended.
+
+\begin{table}[hbt]
+\caption{Samples of 2/5 barcodes, encoded sequence is 0123456789, module width 0,19\,mm, ratio~3,
+height~3\,mm}\label{25}
+\medskip
+\begin{center}
+\begin{tabular}{|r|l|}\hline
+\bfseries Code name & \bfseries Bar code\\\hline
+2/5-Industrial & \barcode[code=2/5-Industrial]{0123456789} \\
+2/5-Inverted& \barcode[code=2/5-Inverted]{0123456789}\\
+2/5-IATA& \barcode[code=2/5-IATA]{0123456789}\\
+2/5-Matrix& \barcode[code=2/5-Matrix]{0123456789}\\
+2/5-Datalogic& \barcode[code=2/5-Datalogic]{0123456789}\\
+2/5-Interleaved& \barcode[code=2/5-Interleaved]{0123456789}\\
+\hline
+\end{tabular}
+\end{center}
+\end{table}
+
+\section{Code39}
+The package currently supports only the basic version of the Code39 bar code. The sample is given in
+section~\ref{usage}. The full ASCII bar code will be implemented in a later version of the package.
+
+\section{Labels for HP Storage Media}
+\cmg{HPlabel}
+The labels for HP storage media are produced by the \cmd{HPlabel} command. Its parametr is the
+requested code. The code must contain exactly 8~characters. The syntax is fixed but not verified by
+the macro. It is only checked whether the number of charactes is correct. It is required that the
+\pkg{rotating} package is loaded manually. Options described in section~\ref{low} cannot be used as
+an optional argument and are ignored if given in the \cmd{usepackage} command because all
+dimensions are fixed.
+
+The author of the package gives no warranty that the code produced by this macro will be usable. HP
+requires high printing quality saying that laser printers are not good enough for such purpose.
+However, bars on the labels bought from HP were grey, not black. As already written the dimensions
+are not given in the documentation. The dimensions used here were determined by careful measuring a
+bought label. A label printed on an HP laser printer with resolution 600\,dpi was tested on a real
+hardware and it worked.
+
+An example of such a bar code is given in figure~\ref{hp}. The frame
+is not a part of the \cmd{HPlabel} macro output but is displayed here in order to show the real
+size of the label.
+
+\begin{figure}[hbt]
+\begin{center}
+\fboxsep 0mm
+\fbox{\HPlabel{CLNU01L1}}
+\end{center}
+\caption{Example of a label for an HP cleaning casette, code CLNU01L1}\label{hp}
+\end{figure}
+
+\section{ITF-6, ITF-14, And ITF-16 Bar Codes}\label{itf}
+\cmg{ITFbarcode}
+The ITF bar codes are basically 2/5 Interleaved codes with 6, 14 or 16 digits. The last digit is a
+checksum calculated by the same algorithm as for EAN13 bar codes. The macro verifies the number of
+digits supplied, not the checksum. The bar code must be printed in a
+frame. Sometimes only horizontal lines are sufficient. Human readable information is printed below
+the bar code. The author has seen several types of formatting the human readable information on real bar
+codes. The one that seemed most reasonable was therefore chosen.
+
+The bar code is always composed in a \cmd{vbox}. It might be necessary to use \cmd{leavevmode} in
+front of the \cmd{ITFbarcode} macro.
+
+Dimensions of the ITF bar codes are fixed. Options defines in section~\ref{low} are thus ignored,
+only the \opt{bcorr} option is allowed. Properties of the ITF bar codes are selected by a special
+set of options that can be given either as an optional argument to the \cmd{ITFbarcode} macro or in
+the \cmd{usepackage} command.
+
+\omg{frame}
+The \opt{frame} option is boolean, \ie. allowed values are \true\ and \false. The default value is
+\true. It requires prining the bar code inside a frame. An example is shown in
+figure~\ref{itf.frame}.
+
+\begin{figure}[hbt]
+\begin{center}
+\leavevmode\ITFbarcode{15412345678908}
+\end{center}
+\caption{ITF-14 bar code with a frame}\label{itf.frame}
+\end{figure}
+
+\omg{lines}
+The \opt{lines} option is complementary to the \opt{frame} options. Its default value is therefore
+\false. It requires printing the bar code within lines as shown in figure~\ref{itf.lines}.
+
+\begin{figure}[hbt]
+\begin{center}
+\leavevmode\ITFbarcode[lines]{15412345678908}
+\end{center}
+\caption{ITF-14 bar code with lines}\label{itf.lines}
+\end{figure}
+
+\omg{S.6}\omg{S.7}\omg{S.8}\omg{S.9}\omg{S1}\omg{S1.1}\omg{S1.2}
+Size of the ITF bar code can be selected from the list of predefined options. The names of these
+options are derived from the values of the scaling factors. By choosing the size options the
+low-level options \opt{X} and \opt{H} are set to proper values. Option \opt{ratio} is always~2.5
+and \opt{MtoXratio} is~1. Option \opt{code} is \texttt{2/5-Interleaved}. The framed form requires a
+blank area in front of and after the bar code (inside the frame). All dimensions are given in
+table~\ref{itfdim}. If no size option is given, \opt{S1} is the default. Human readable information
+is always typeset with the OCR-B font at 12\,pt.
+
+\begin{table}[hbt]
+\caption{Dimensions of the ITF bar codes (in milimeters)}\label{itfdim}
+\medskip
+\begin{center}
+\newcolumntype{N}{D{.}{.}{3}}
+\newcolumntype{M}{D{.}{.}{1}}
+\newcommand*\R[1]{\multicolumn{1}{r}{\bfseries #1}}
+\newcommand*\RR[1]{\multicolumn{1}{r|}{\bfseries #1}}
+\begin{tabular}{|lNNMM|}\hline
+\bfseries Option & \R{Scale} & \R{Module} & \R{Blank area} & \RR{Height}\\ \hline
+S1.2& 1.2 & 1.219 & 13.1 & 38.2 \\
+S1.1& 1.1 & 1.118 & 12.0 & 35.0 \\
+S1 & 1.0 & 1.016 & 10.9 & 31.8 \\
+S.9 & 0.9 & 0.914 & 9.8 & 28.7 \\
+S.8 & 0.8 & 0.813 & 8.7 & 25.4 \\
+S.7 & 0.7 & 0.711 & 7.1 & 22.3 \\
+S.6 & 0.625& 0.635 & 6.4 & 19.8 \\
+\hline
+\end{tabular}
+\end{center}
+\end{table}
+
+
+\section{License}
+The package can be used and distributed according to the LaTeX Project Public License version~1.3
+or later the
+text of which can be found at the \texttt{License.txt} file in the \texttt{doc} directory or at
+\url{http://www.latex-project.org/lppl.txt}
+
+\section{References}
+\begin{enumerate}\itemsep 0mm \parsep 0mm
+\item Storage Media from HP. \url{http://www.hp.com/go/storagemedia}\label{hpstorage}
+\item HP Bar Code Label Packs.
+\url{http://h18006.www1.hp.com/storage/tapestorage/storagemedia/bar\_code\_label.html}\label{hplabel}
+\item Petr Olšák: The EAN barcodes by \TeX. TUGboat 15 (December 1994), No. 4, pp.~459--464.
+\url{http://www.tug.org/TUGboat/Articles/tb15-4/tb45olsa.pdf}\label{olsak}
+
+\item Adriana Benadiková, Stefan Mada and Stanislav
+Weinlich: \textit{Čárové kódy, automatická iden\-ti\-fi\-kace (Barcodes, the Automatic
+Identification)}.
+Grada 1994, 272 pp., ISBN \hbox{80-85623-66-8}.
+\end{enumerate}
+
+\end{document}
diff --git a/macros/latex/contrib/makebarcode/tex/latex/makebarcode/makebarcode.sty b/macros/latex/contrib/makebarcode/tex/latex/makebarcode/makebarcode.sty
new file mode 100644
index 0000000000..c75c87d8e6
--- /dev/null
+++ b/macros/latex/contrib/makebarcode/tex/latex/makebarcode/makebarcode.sty
@@ -0,0 +1,594 @@
+\ProvidesPackage{makebarcode}[2008/07/27 Make various bar codes]
+\PackageInfo{makebarcode}{$Id: makebarcode.sty 224 2008-07-26 23:07:27Z zw $\@gobble}
+
+\RequirePackage{kvoptions}
+\SetupKeyvalOptions{family=zwbc,prefix=zwbc@}
+
+\DeclareStringOption[.19mm]{X}[.19mm]
+\DeclareStringOption[\ZWbc@Hdefault]{H}[\ZWbc@Hdefault]
+\DeclareStringOption[0mm]{bcorr}[0mm]
+\DeclareStringOption[3]{ratio}[3]
+\DeclareStringOption[2]{K} % for 2/5 Matrix, should be in <1.5; 4>
+\DeclareStringOption[1]{MtoXratio}[1]
+\DeclareStringOption{code}
+\DeclareBoolOption{help}
+
+% For ITF codes
+% \ZWbc@ITFdefine X R H
+\def\ZWbc@ITFdefine #1 #2 #3 {\@tempdima #1mm \multiply\@tempdima 5 \divide\@tempdima 2
+ \expandafter\def\expandafter\ZWbc@r\expandafter{\the\@tempdima}%
+ \def\ZWbc@R{#2mm}\def\ZWbc@ITF{X=#1mm,H=#3mm,ratio=2.5,MtoXratio=1,code=2/5-Interleaved}}
+
+\DeclareVoidOption{S1.2}{\ZWbc@ITFdefine 1.219 13.1 38.2 }
+\DeclareVoidOption{S1.1}{\ZWbc@ITFdefine 1.118 12.0 35.0 }
+\DeclareVoidOption{S1}{\ZWbc@ITFdefine 1.016 10.9 31.8 }
+\DeclareVoidOption{S.9}{\ZWbc@ITFdefine 0.914 9.8 28.7 }
+\DeclareVoidOption{S.8}{\ZWbc@ITFdefine 0.813 8.7 25.4 }
+\DeclareVoidOption{S.7}{\ZWbc@ITFdefine 0.711 7.1 22.3 }
+\DeclareVoidOption{S.6}{\ZWbc@ITFdefine 0.635 6.4 19.8 }
+
+\DeclareBoolOption{lines}
+\DeclareComplementaryOption{frame}{lines}
+
+\ZWbc@ITFdefine 1.016 10.9 31.8
+
+\ProcessKeyvalOptions*
+
+% List all bar code names at the end of the package
+\ifzwbc@help
+ \AtEndOfPackage{\PackageInfo{makebarcode}{\ZWbc@codeList\@gobble}}
+\fi
+
+% Disable help at the end of the package
+\AtEndOfPackage{\DisableKeyvalOption[action=warning,package=makebarcode]{zwbc}{help}}
+
+% Interleave two strings, use as \ZWbc@interleave#1/#2*, result goes to \ZWbc@CHAR
+\def\ZWbc@interleave{\def\ZWbc@CHAR{}\ZWbc@dointerleave}
+\def\ZWbc@dointerleave#1#2/#3*{%
+ \expandafter\def\expandafter\ZWbc@CHAR\expandafter{\ZWbc@CHAR #1}%
+ \ifcat_#3_%
+ \def\next{}%
+ \else
+ \def\next{\ZWbc@dointerleave#3/#2*}%
+ \fi \next}
+
+% Temp counter
+\newcount\ZWbc@ctr
+
+% Make the table: \ZWbc@mktable name code code code @
+% The code has the form key|value, if the key is empty, the table is
+% automatically numbered
+
+\def\ZWbc@mktable #1 {\ZWbc@ctr\z@
+ \def\ZWbc@name{#1}\futurelet\next\ZWbc@tblcode}
+
+\def\ZWbc@tblcode{\if\next\zw@sp \def\next{\ZWbc@xsp:}\else
+ \if\next @\let\next\@gobble\else \let\next\ZWbc@mkcode \fi \fi \next}
+
+\def\ZWbc@mkcode #1|#2 {%
+ \ifcat_#1_%
+ \edef\ZWbc@key{\number\ZWbc@ctr}\advance\ZWbc@ctr\@ne
+ \else
+ \def\ZWbc@key{#1}%
+ \fi
+ \expandafter\gdef\csname ZWbc@tbl_\ZWbc@name_\ZWbc@key\endcsname{#2}%
+ \ZWbc@nextcode}
+
+\futurelet\zw@sp{ }
+\def\ZWbc@xsp: {\ZWbc@nextcode}
+\def\ZWbc@nextcode{\futurelet\next\ZWbc@tblcode}
+
+{\catcode`\_12 \lccode`_=32 \lowercase{\gdef\ZWbc@inactspace{_}}}
+
+% Make alias: \ZWbc@alias tblname existing_key new_key
+
+\def\ZWbc@alias #1 #2 #3 {\expandafter\expandafter\expandafter
+ \let\expandafter\csname ZWbc@tbl_#1_#3\expandafter\endcsname
+ \csname ZWbc@tbl_#1_#2\endcsname}
+
+% This macro contains the current bar code name for error messages
+
+\def\ZWbc@currentbarcodename{Unknown}
+
+% This macro performs table lookup. It returns the coresponding character(s). If the
+% character(s) cannot be found in the table, the starred version returns the input
+% character(s) while the standard version emits an error message and returns \ZWbc@.
+% The result will be stored in \ZWbc@CHAR.
+
+\def\ZWbc@lookup{\@ifstar\ZWbc@slookup\ZWbc@nlookup}
+\def\ZWbc@slookup{\ZWbc@dolookup*}
+\def\ZWbc@nlookup{\ZWbc@dolookup!}
+
+\def\ZWbc@dolookup#1#2#3{% switchchar # table_name # character(s)
+ \def\ZWbc@key{ZWbc@tbl_#2_#3}%
+ \expandafter\ifx\csname\ZWbc@key\endcsname\relax
+ \if*#1 #3\else
+ \PackageError{makebarcode}{%
+ Character(s) `#3' not allowed in \ZWbc@currentbarcodename.}%
+ {You want to print `#3' in the bar code \ZWbc@currentbarcodename\MessageBreak
+ but it is not defined in the code table. If you proceed,\MessageBreak
+ it will be ignored and the resulting bar code will be wrong.}%
+ \let\ZWbc@CHAR\ZWbc@
+ \else
+ \def\ZWbc@CHAR{#3}%
+ \fi
+ \else
+ \edef\ZWbc@CHAR{\csname\ZWbc@key\endcsname}%
+ \fi}
+
+% Make \ZWbc@ unexpandable
+\let\ZWbc@\relax
+
+% Dimensions
+
+\newdimen\ZWbc@dimX
+\newdimen\ZWbc@dimH
+\newdimen\ZWbc@dimB
+\newdimen\ZWbc@dim@
+
+% Make a bar or blank of a specified width
+
+\def\ZWbc@bar#1{\ZWbc@dim@#1\advance\ZWbc@dim@ -\ZWbc@dimB
+ \vrule height \ZWbc@dimH depth \z@ width \ZWbc@dim@}
+
+\def\ZWbc@blank#1{\ZWbc@dim@#1\advance\ZWbc@dim@ \ZWbc@dimB
+ \kern \ZWbc@dim@}
+
+% Make an element, bar or blank
+
+\def\ZWbc@element{\ifx\ZWbc@prevelem\ZWbc@blank
+ \let\ZWbc@prevelem\ZWbc@bar \else
+ \let\ZWbc@prevelem\ZWbc@blank \fi \ZWbc@prevelem}
+
+% Set required width to \@tempdima, two algorithms used
+
+\def\ZWbc@widenarrow#1{%
+ \if 0#1%
+ \@tempdima=\ZWbc@dimX
+ \else
+ \@tempdima=\zwbc@ratio\ZWbc@dimX
+ \if K#1%
+ \@tempdima=\zwbc@K\@tempdima
+ \fi
+ \fi}
+
+\def\ZWbc@propwidth#1{\@tempdima=#1\ZWbc@dimX}
+
+% Make a character, width algorithm given as the first token
+% bar specification is delimited by @
+
+\def\ZWbc@character#1{\let\ZWbc@alg#1\let\ZWbc@prevelem\ZWbc@blank
+ \ZWbc@printchar}
+
+\def\ZWbc@printchar#1#2@{\ZWbc@alg#1\ZWbc@element{\@tempdima}%
+ \ifcat_#2_\let\next\ZWbc@endchar\else
+ \def\next{\ZWbc@printchar#2@}\fi \next}
+
+\def\ZWbc@endchar{\ifx\ZWbc@prevelem\ZWbc@bar \ZWbc@blank{\zwbc@MtoXratio\ZWbc@dimX}\fi}
+
+% Make a barcode
+
+\DeclareRobustCommand\barcode{\begingroup \catcode`\-12 \catcode`\"12 \ZWbc@barcode}
+\newcommand*\ZWbc@barcode[1][]{\ifcat$#1$ \else \setkeys{zwbc}{#1}\fi
+ \let\ZWbc@mkbarcode\endgroup
+ \ifcat$\zwbc@code$
+ \PackageError{makebarcode}{%
+ No barcode type specified.}%
+ {You have not specified the type of the barcode. If you proceed,\MessageBreak
+ the argument will be displayed as a normal text.}%
+ \else
+ \edef\ZWbc@currentbarcodename{\zwbc@code}%
+ \edef\ZWbc@@@{ZWbc@code_\ZWbc@currentbarcodename}%
+ \expandafter\ifx\csname\ZWbc@@@\endcsname\relax
+ \PackageError{makebarcode}{%
+ Unknown barcode type \ZWbc@currentbarcodename}%
+ {You have requested barcode type \ZWbc@currentbarcodename which is not\MessageBreak
+ implemented in this package. If you proceed, the argument\MessageBreak
+ will be displayed as a normal text.}%
+ \else
+ \expandafter\let\expandafter\ZWbc@mkbarcode\csname\ZWbc@@@\endcsname\ZWbc@setdims
+ \fi
+ \fi \ZWbc@mkbarcode}
+
+\def\ZWbc@def#1{\ZWbc@addTo{\MessageBreak #1}\expandafter\def\csname ZWbc@code_#1\endcsname}
+
+\def\ZWbc@addTo#1{\expandafter\def\expandafter\ZWbc@codeList\expandafter{\ZWbc@codeList #1}}
+\def\ZWbc@codeList{List of supported bar codes:}
+
+% Set dimensions
+
+\def\ZWbc@setdims{%
+ \ZWbc@dimX=\zwbc@X
+ \ZWbc@dimH=\zwbc@H
+ \ZWbc@dimB=\zwbc@bcorr}
+
+\def\ZWbc@Hdefault{40\ZWbc@dimX}
+
+% Sanitization
+
+\def\BarcodeSanitize{\@sanitize \catcode`\\0 }
+
+% End barcode printing
+
+\def\ZWbc@endbarcode{%
+ \expandafter\ZWbc@character\expandafter\ZWbc@widenarrow\ZWbc@stop @\unkern
+ \endgroup}
+
+% Table for 2/5 codes
+
+\ZWbc@mktable 2/5
+ 0|00110
+ 1|10001
+ 2|01001
+ 3|11000
+ 4|00101
+ 5|10100
+ 6|01100
+ 7|00011
+ 8|10010
+ 9|01010
+ @
+
+% 2/5 Start/Stop characters
+
+\ZWbc@mktable 2/5startstop
+ Start|110
+ Stop|101
+ IATAstart|00
+ IATAstop|10
+ InterleavedStart|000
+ InterleavedStop|100
+ MatrixStart|K0000
+ @
+
+\ZWbc@alias 2/5startstop MatrixStart MatrixStop
+\ZWbc@alias 2/5startstop InterleavedStart DatalogicStart
+\ZWbc@alias 2/5startstop InterleavedStop DatalogicStop
+
+% 2/5 Industrial
+
+\ZWbc@def{2/5-Industrial}{%
+ \ZWbc@lookup{2/5startstop}{Start}%
+ \expandafter\ZWbc@interleave\ZWbc@CHAR/00*%
+ \edef\ZWbc@start{\ZWbc@CHAR}%
+ \ZWbc@lookup{2/5startstop}{Stop}%
+ \expandafter\ZWbc@interleave\ZWbc@CHAR/00*%
+ \edef\ZWbc@stop{\ZWbc@CHAR}\ZWbc@init@twofive}
+
+% 2/5 IATA
+
+\ZWbc@def{2/5-IATA}{%
+ \ZWbc@lookup{2/5startstop}{IATAstart}%
+ \expandafter\ZWbc@interleave\ZWbc@CHAR/0*%
+ \edef\ZWbc@start{\ZWbc@CHAR}%
+ \ZWbc@lookup{2/5startstop}{IATAstop}%
+ \expandafter\ZWbc@interleave\ZWbc@CHAR/0*%
+ \edef\ZWbc@stop{\ZWbc@CHAR}\ZWbc@init@twofive}
+
+% 2/5 Matrix
+
+\ZWbc@def{2/5-Matrix}{%
+ \ZWbc@lookup{2/5startstop}{MatrixStart}%
+ \edef\ZWbc@start{\ZWbc@CHAR}%
+ \ZWbc@lookup{2/5startstop}{MatrixStop}%
+ \edef\ZWbc@stop{\ZWbc@CHAR}\ZWbc@compacttrue\ZWbc@init@twofive}
+
+% 2/5 Datalogic
+
+\ZWbc@def{2/5-Datalogic}{%
+ \ZWbc@lookup{2/5startstop}{DatalogicStart}%
+ \edef\ZWbc@start{\ZWbc@CHAR}%
+ \ZWbc@lookup{2/5startstop}{DatalogicStop}%
+ \edef\ZWbc@stop{\ZWbc@CHAR}\ZWbc@compacttrue\ZWbc@init@twofive}
+
+% 2/5 Inverted
+
+\ZWbc@def{2/5-Inverted}{%
+ \ZWbc@lookup{2/5startstop}{Start}%
+ \edef\ZWbc@CHAR{000/\ZWbc@CHAR*}%
+ \expandafter\ZWbc@interleave\ZWbc@CHAR
+ \edef\ZWbc@start{\ZWbc@CHAR}%
+ \ZWbc@lookup{2/5startstop}{Stop}%
+ \edef\ZWbc@CHAR{0000/\ZWbc@CHAR*}%
+ \expandafter\ZWbc@interleave\ZWbc@CHAR
+ \edef\ZWbc@stop{\ZWbc@CHAR}\ZWbc@invertedtrue\ZWbc@init@twofive}
+
+% 2/5-Interleaved
+
+\ZWbc@def{2/5-Interleaved}{%
+ \ZWbc@lookup{2/5startstop}{InterleavedStart}%
+ \edef\ZWbc@start{\ZWbc@CHAR}%
+ \ZWbc@lookup{2/5startstop}{InterleavedStop}%
+ \edef\ZWbc@stop{\ZWbc@CHAR}\begingroup \BarcodeSanitize \ZWbc@count@twofive}
+
+% Optionally prepend leading zero
+\def\ZWbc@count@twofive#1{\endgroup
+ \edef\ZWbc@string{#1}\expandafter\ZWbc@nextchar\ZWbc@string*}
+
+\def\ZWbc@nextchar#1#2*{\ZWbc@flip
+ \ifcat_#2_%
+ \let\next\ZWbc@int@leading
+ \else
+ \def\next{\ZWbc@nextchar#2*}%
+ \fi \next}
+
+\def\ZWbc@int@leading{\ifZWbc@compact \edef\ZWbc@string{0\ZWbc@string}\fi
+ \expandafter\ZWbc@character\expandafter\ZWbc@widenarrow\ZWbc@start @%
+ \expandafter\ZWbc@int@twofive\ZWbc@string*}
+
+\def\ZWbc@int@twofive#1#2#3*{%
+ \ZWbc@lookup{2/5}{#1}%
+ \ifx\ZWbc@CHAR\ZWbc@ \else
+ \edef\ZWbc@temp{\ZWbc@CHAR}%
+ \ZWbc@lookup{2/5}{#2}%
+ \ifx\ZWbc@CHAR\ZWbc@ \else
+ \edef\ZWbc@temp{\ZWbc@temp/\ZWbc@CHAR*}%
+ \expandafter\ZWbc@interleave\ZWbc@temp
+ \expandafter\ZWbc@character\expandafter\ZWbc@widenarrow\ZWbc@CHAR @%
+ \fi
+ \fi
+ \ifcat_#3_\let\next\ZWbc@endbarcode\else
+ \def\next{\ZWbc@int@twofive#3*}\fi \next}
+
+\def\ZWbc@flip{\ifZWbc@compact \ZWbc@compactfalse \else \ZWbc@compacttrue \fi}
+
+% Common 2/5 commands
+
+\newif\ifZWbc@compact
+\newif\ifZWbc@inverted
+
+\def\ZWbc@init@twofive{\begingroup \BarcodeSanitize \ZWbc@twofive}
+
+\def\ZWbc@twofive#1{\endgroup \edef\ZWbc@string{#1}%
+ \expandafter\ZWbc@character\expandafter\ZWbc@widenarrow\ZWbc@start @%
+ \expandafter\ZWbc@dotwofive\ZWbc@string*}
+
+\def\ZWbc@dotwofive#1#2*{%
+ \ZWbc@lookup{2/5}{#1}%
+ \ifx\ZWbc@CHAR\ZWbc@ \else
+ \ifZWbc@compact \else
+ \ifZWbc@inverted
+ \edef\ZWbc@CHAR{00000/\ZWbc@CHAR*}%
+ \expandafter\ZWbc@interleave\ZWbc@CHAR
+ \else
+ \expandafter\ZWbc@interleave\ZWbc@CHAR/0000*%
+ \fi
+ \fi
+ \expandafter\ZWbc@character\expandafter\ZWbc@widenarrow\ZWbc@CHAR @%
+ \fi
+ \ifcat_#2_\let\next\ZWbc@endbarcode\else
+ \def\next{\ZWbc@dotwofive#2*}\fi \next}
+
+% Table for 39 codes (** is a start/stop character, not 2 stars)
+
+\ZWbc@mktable 39
+ |000110100
+ |100100001
+ |001100001
+ |101100000
+ |000110001
+ |100110000
+ |001110000
+ |000100101
+ |100100100
+ |001100100
+ |100001001
+ |001001001
+ |101001000
+ |000011001
+ |100011000
+ |001011000
+ |000001101
+ |100001100
+ |001001100
+ |000011100
+ |100000011
+ |001000011
+ |101000010
+ |000010011
+ |100010010
+ |001010010
+ |000000111
+ |100000110
+ |001000110
+ |000010110
+ |110000001
+ |011000001
+ |111000000
+ |010010001
+ |110010000
+ |011010000
+ |010000101
+ |110000100
+ |011000100
+ |010101000
+ |010100010
+ |010001010
+ |000101010
+ |010010100
+ @
+
+{\catcode`\$ 12 \catcode`\%12
+\ZWbc@mktable 39num
+ 0|0
+ 1|1
+ 2|2
+ 3|3
+ 4|4
+ 5|5
+ 6|6
+ 7|7
+ 8|8
+ 9|9
+ A|10
+ B|11
+ C|12
+ D|13
+ E|14
+ F|15
+ G|16
+ H|17
+ I|18
+ J|19
+ K|20
+ L|21
+ M|22
+ N|23
+ O|24
+ P|25
+ Q|26
+ R|27
+ S|28
+ T|29
+ U|30
+ V|31
+ W|32
+ X|33
+ Y|34
+ Z|35
+ -|36
+ .|37
+ { }|38
+ $|39
+ /|40
+ +|41
+ %|42
+ **|43
+ @
+}
+
+% Code39
+
+\ZWbc@def{Code39}{%
+ \ZWbc@lookup{39num}{**}%
+ \ZWbc@lookup{39}{\ZWbc@CHAR}%
+ \edef\ZWbc@start{\ZWbc@CHAR}%
+ \let\ZWbc@stop\ZWbc@start
+ \ZWbc@init@threenine}
+
+\def\ZWbc@init@threenine{\begingroup \BarcodeSanitize \ZWbc@threenine}
+
+\def\ZWbc@threenine#1{\endgroup \edef\ZWbc@string{#1}%
+ \expandafter\ZWbc@character\expandafter\ZWbc@widenarrow\ZWbc@start @%
+ \expandafter\ZWbc@dothreenine\ZWbc@string*}
+
+\def\ZWbc@dothreenine#1#2*{%
+ \ZWbc@lookup{39num}{#1}%
+ \ifx\ZWbc@CHAR\ZWbc@ \else
+ \ZWbc@lookup{39}{\ZWbc@CHAR}%
+ \expandafter\ZWbc@character\expandafter\ZWbc@widenarrow\ZWbc@CHAR @%
+ \fi
+ \ifcat_#2_\let\next\ZWbc@endbarcode\else
+ \def\next{\ZWbc@dothreenine#2*}\fi \next}
+
+% HPlabel, requires rotating, must be loaded separatelly
+% see http://www.hp.com/go/storagemedia
+
+\def\HPlabel{\begingroup \BarcodeSanitize \ZWbc@HPlabel}
+\ZWbc@addTo{\MessageBreak\string\HPlabel\space (using Code39)}
+
+\def\ZWbc@HPlabel#1{\endgroup \edef\ZWbc@hpstring{#1}%
+ \vbox to 16.5mm{\hsize 78mm \parindent\z@ \parskip\z@ \lineskiplimit\z@ \lineskip.9mm
+ \usefont{OT1}{phv}{m}{n}\leftskip 5.5mm \rightskip\leftskip
+ \noindent \barcode[code=Code39,X=.42mm,ratio=3,H=6.3mm,bcorr=0mm]{#1}\par
+ \setbox\ZWbc@hpbox=\hbox
+ {\begin{turn}{180}\barcode[code=Code39,X=.23mm,ratio=3,H=6.5mm,bcorr=0mm]{#1}\end{turn}}
+ \noindent \raise\dp\ZWbc@hpbox\box\ZWbc@hpbox \hfill
+ \begin{sideways}\vbox{\hsize 6.5mm \fontsize{10}{11}\selectfont
+ \leftskip\z@ \rightskip\z@ \centering
+ \expandafter\ZWbc@mkHPlabel\ZWbc@hpstring\ZWbc@}\end{sideways}\par
+ \vss
+ \centering \fontsize{6}{6}\selectfont
+ This edge of the label toward hub of tape\par}}
+
+\def\ZWbc@mkHPlabel#1#2#3#4#5#6#7#8#9\ZWbc@{%
+ \ifcat_#8_\ZWbc@HPtoofew\fi
+ \ifcat_#9_\else\ZWbc@HPtoomany\fi
+ #1\par#2\par#3\par#4\par#5\par#6\par#7#8\par}
+
+\newbox\ZWbc@hpbox
+
+\def\ZWbc@HPtoomany{\ZWbc@HPerror{many}}
+\def\ZWbc@HPtoofew{\ZWbc@HPerror{few}}
+\def\ZWbc@HPerror#1{\PackageError{makebarcode}%
+ {Too #1 characters supplied in HP label code \ZWbc@hpstring}%
+ {The label code must contain exactly 8 characters.\MessageBreak
+ Your label will be unusable.}}
+
+% ITF-6/14/16
+
+\def\ITFbarcode{\begingroup \BarcodeSanitize \ZWbc@ITFbarcode}
+\ZWbc@addTo{\MessageBreak\string\ITFbarcode\space (ITF-6/14/16)}
+
+\newbox\ZWbc@ITFbox
+\newdimen\ZWbc@ITFwidth
+\newtoks\ZWbc@ITFtoks
+
+\newcommand*\ZWbc@ITFbarcode[2][]{\ifcat$#1$\else \setkeys{zwbc}{#1}\fi
+ \vbox{\hbox{\vbox{%
+ \ifzwbc@lines
+ \hrule height \ZWbc@r
+ \else
+ \hrule height 4.8mm
+ \fi
+ \setbox\ZWbc@ITFbox=\hbox{%
+ \ifzwbc@lines
+ \hskip\ZWbc@r
+ \else
+ \vrule width 4.8mm \hskip\ZWbc@R
+ \fi
+ \relax
+ \expandafter\barcode\expandafter[\ZWbc@ITF]{#2}%
+ \ifzwbc@lines
+ \hskip\ZWbc@r
+ \else
+ \hskip\ZWbc@R \vrule width 4.8mm
+ \fi}%
+ \global\ZWbc@ITFwidth\wd\ZWbc@ITFbox \box\ZWbc@ITFbox
+ \ifzwbc@lines
+ \hrule height \ZWbc@r
+ \else
+ \hrule height 4.8mm
+ \fi}}%
+ \vskip\ZWbc@r
+ \ZWbc@startITFdigits #2\ZWbc@
+ \font\ocrb ocrb10 at 14.4pt
+ \hbox to \ZWbc@ITFwidth{\hskip\@tempdima \ocrb \the\ZWbc@ITFtoks\hskip\@tempdima}%
+ }%
+ \endgroup}
+
+
+\def\ZWbc@startITFdigits#1{\ZWbc@ctr\@ne
+ \@tempdima\ZWbc@r \multiply\@tempdima 2
+ \ifzwbc@lines
+ \advance\@tempdima\ZWbc@r
+ \else
+ \advance\@tempdima\ZWbc@R
+ \advance\@tempdima 4.8mm
+ \fi
+ \ZWbc@ITFtoks{#1}\ZWbc@ITFdigits}
+
+\def\ZWbc@ITFdigits#1#2\ZWbc@{%
+ \ZWbc@ITFtoks\expandafter{\the\ZWbc@ITFtoks\hfill #1}%
+ \advance\ZWbc@ctr\@ne
+ \ifcat$#2$%
+ \let\next\ZWbc@endITFdigits
+ \else
+ \def\next{\ZWbc@ITFdigits#2\ZWbc@}%
+ \fi \next}
+
+\def\ZWbc@endITFdigits{%
+ \ifnum\ZWbc@ctr=6 \else
+ \ifnum\ZWbc@ctr=14 \else
+ \ifnum\ZWbc@ctr=16 \else
+ \PackageError{makebarcode}%
+ {Wrong number of digits for ITF-6/14/16}%
+ {Only ITF-6, ITF-14, ITF-16 are allowed.\MessageBreak
+ You must supply corresponding number of digits.\MessageBreak
+ This bar code will be unusable.}%
+ \fi
+ \fi
+ \fi}
+
+% Test macro (to be removed)
+\def\ZWBCtest #1 {\csname ZWbc@#1\endcsname}