]> git.sur5r.net Git - glabels/blobdiff - bc-backends/barcode-0.98/doc/doc.barcode
Relocated barcode backends.
[glabels] / bc-backends / barcode-0.98 / doc / doc.barcode
diff --git a/bc-backends/barcode-0.98/doc/doc.barcode b/bc-backends/barcode-0.98/doc/doc.barcode
new file mode 100644 (file)
index 0000000..7b46055
--- /dev/null
@@ -0,0 +1,939 @@
+\input texinfo    @c -*-texinfo-*-
+%
+% doc.barcode - main file for the documentation
+%
+%%%%
+
+%------------------------------------------------------------------------------
+%
+%                         NOTE FOR THE UNAWARE USER
+%                         =========================
+%
+%    This file is a texinfo source. It isn't the binary file of some strange
+%    editor of mine. If you want ascii, you should "make barcodedoc.txt".
+%
+%------------------------------------------------------------------------------
+
+%
+% This is not a conventional info file...
+% I use two extra features:
+%       - The '%' as a comment marker, if at beg. of line ("\%" -> "%")
+%       - leading blanks are allowed
+%
+
+@comment %**start of header
+@setfilename barcode.info
+@settitle Barcode @value{version}
+@iftex
+@afourpaper
+@end iftex
+@comment %**end of header
+
+@setchapternewpage off
+
+@set version 0.98
+@set update-month March 2002
+
+@finalout
+
+@ifinfo
+
+This file is the User's Manual for the barcode library (version
+@value{version}).
+
+@end ifinfo
+
+@setchapternewpage odd
+@titlepage
+@c use the new format for titles
+@title barcode @value{version}
+@subtitle A library for drawing bar codes
+@subtitle @value{update-month}
+
+@author by Alessandro Rubini (@code{rubini@@gnu.org})
+
+@end titlepage
+@setchapternewpage off
+@headings single
+
+
+@node Top, Overview, (dir), (dir)
+@top Barcode tools
+
+This file documents version @value{version} of the barcode
+library and sample programs (@value{update-month}).
+
+@menu
+* Overview::                    
+* The Barcode Object::          
+* Supported Flags::             
+* The API::                     
+* The barcode Executable::      
+* Supported Encodings::         
+* PCL Output::                  
+* Bugs and Pending Issues::     
+@end menu
+
+
+%##########################################################################
+%##########################################################################
+
+@node Overview, The Barcode Object, Top, Top
+@chapter Overview
+
+The @dfn{barcode} package is mainly a C library for creating bar-code
+output files. It also includes a command line front-end and (in a
+foreseeable future) a graphic frontend.
+
+The package is designed as a library because we think the main use for
+barcode-generation tools is inside more featured applications. The
+library addresses bar code printing as two distinct problems: creation
+of bar information and actual conversion to an output format. To this
+aim we use an intermediate representation for bar codes, which is
+currently documented in the @file{ps.c} source file (not in this
+document).
+
+Note that the library and the accompanying material is released
+according to the GPL license, not the LGPL one. A copy of the GPL is
+included in the distribution tarball.
+
+%##########################################################################
+
+@node  The Barcode Object, Supported Flags, Overview, Top
+@chapter The Underlying Data Structure
+
+Every barcode-related function acts on a data structure defined in the
+@file{barcode.h} header, which must be included by any C source file
+that uses the library. The header is installed by @t{make install}.
+
+The definition of the data structure is included here for reference:
+
+@lisp
+struct Barcode_Item @{
+    int flags;         /* type of encoding and other flags */
+    char *ascii;       /* malloced */
+    char *partial;     /* malloced too */
+    char *textinfo;    /* information about text placement */
+    char *encoding;    /* code name, filled by encoding engine */
+    int width, height; /* output units */
+    int xoff, yoff;    /* output units */
+    int margin;        /* output units */
+    double scalef;     /* requested scaling for barcode */
+    int error;         /* an errno-like value, in case of failure */
+@};
+@end lisp
+
+The exact meaning of each field and the various flags implemented are
+described in the following sections.
+
+Even though you won't usually need to act on the contents of this
+structure, some of the functions in the library receive arguments that
+are directly related to one or more of these fields.
+
+%==========================================================================
+
+@menu
+* The Field List::              
+* The Intermediate Representation::  
+@end menu
+
+%--------------------------------------------------------------------------
+@node The Field List, The Intermediate Representation, The Barcode Object, The Barcode Object
+@section The Fields
+
+@table @code
+
+@item int flags;
+
+        The flags are, as you may suspect, meant to specify the exact
+        behaviour of the library. They are often passed as an argument
+        to @i{barcode} functions and are discussed in the next section.
+
+@item char *ascii;
+@itemx char *partial;
+@itemx char *textinfo;
+@itemx char *encoding;
+
+        These fields are internally managed by the library, and you are
+        not expected to touch them if you use the provided API. All
+        of them are allocated with @i{malloc}.
+
+@item int width;
+@itemx int height;
+
+        They specify the width and height of the @i{active} barcode
+       region (i.e., excluding the white margin), in the units used
+       to create output data (for postscript they are points, 1/72th
+       of an inch, 0.352 mm). The fields can be either assigned to
+       in the structure or via @i{Barcode_Position()}, at your
+       choice.  If either value or both are left to their default
+       value of zero, the output engine will assign default values
+       according to the specified scaling factor. If the specified
+       width is bigger than needed (according to the scaling factor),
+       the output barcode will be centered in its requested
+       region. If either the width of the height are too small for
+       the specified scale factor, the output bar code will expand
+       symmetrically around the requested region.
+        
+@item int xoff;
+@itemx int yoff;
+
+       The fields specify offset from the coordinate origin of the
+       output engine (for postscript, position 0,0 is the lower left
+       corner of the page).  The fields can be either assigned to in
+       the structure or via @i{Barcode_Position()}, at your choice.
+       The offset specifies where the white margin begins, not where
+       the first bar will be printed. To print real ink to the
+       specified position you should set @i{margin} to 0.
+
+@item int margin;
+
+       The white margin that will be left around the printed area of
+       the bar code. The same margin is applied to all sides of the
+       printed area. The default value for the margin is defined in
+       @file{barcode.h} as @t{BARCODE_DEFAULT_MARGIN} (10).
+
+@item double scalef;
+
+       The enlarge or shrink value for the bar code over its default
+       dimension. The @i{width} and @i{scalef} fields interact deeply
+       in the creation of the output, and a complete description of
+       the issues appears later in this section.
+
+@item int error;
+
+       The field is used when a @i{barcode} function fails to host
+        an @t{errno}-like integer value.
+
+@end table
+
+
+@unnumberedsubsec Use of the @i{width} and @i{scalef} fields.
+
+A width unit is the width of the thinnest bar and/or space in the
+chosen code; it defaults to 1 point if the output is postscript or
+encapsulated postscript.
+
+Either or both the code width and the scale factor can be left
+unspecified (i.e., zero). The library deals with defaults in the
+following way:
+
+@table @i
+
+@item Both unspecified
+
+       If both the width and the scale factor are unspecified, the
+       scale factor will default to 1.0 and the width is calculated
+       according to the actual width of the bar code being printed.
+
+@item Width unspecified
+
+       If the width is not specified, it is calculated according to
+       the values of @i{scalef}. 
+
+@item Scale factor unspecified
+
+       If the scale factor is not specified, it will be chosen so
+       that the generated bar code exactly fits the specified width.
+
+@item Both specified
+
+       The code will be printed inside the specified region according
+       to the specified scale factor. It will be aligned to the left.
+       If, however, the chosen width is too small for the specific
+       bar code and scaling factor, then the code will extend
+       symmetrically to the left and to the right of the chosen
+       region.
+
+@end table
+
+%--------------------------------------------------------------------------
+@node The Intermediate Representation,  , The Field List, The Barcode Object
+@section The Intermediate Representation
+
+The encoding functions print their output into the @t{partial} and
+@t{texinfo} fields of the barcode data structure. Those fields, together
+with position information, are then used to generate actual output.
+This is an informal description of the intermediate format.
+
+The first char in @t{partial} tells how much extra space to add to the
+left of the bars. For EAN-13, it is used to leave space to print the
+first digit, other codes may have '0' for no-extra-space-needed.
+
+The next characters are alternating bars and spaces, as multiples of the
+base dimension which is 1 unless the code is rescaled. Rescaling is
+calculated as the ratio from the requested width and the calculated
+width.  Digits represent bar/space dimensions. Lower-case letters
+represent those bars that should extend lower than the others: 'a' is
+equivalent to '1', 'b' is '2' and so on up to 'i' which is equivalent to
+'9'. Other letters will be used for encoding-specific meanings, as soon
+as I implement them.
+
+The @t{textinfo} string is made up of fields @t{%lf:%lf:%c} separated by
+blank space. The first integer is the x position of the character,
+the second is the font size (before rescaling) and the char item is
+the character to be printed.
+
+Both the @t{partial} and @t{textinfo} strings may include ``@t{-}'' or
+``@t{+}'' as special characters (in @t{textinfo} the char should be a
+stand-alone word).  They state where the text should be printed: below
+the bars (``@t{-}'', default) or above the bars. This is used, for
+example, to print the add-5 and add-2 codes to the right of UPC or EAN
+codes (the add-5 extension is mostly used in ISBN codes).
+
+
+
+
+%==========================================================================
+
+@node Supported Flags, The API, The Barcode Object, Top
+@chapter The Flags
+
+The following flags are supported by version @value{version} of the
+library:
+
+@table @code
+
+@item BARCODE_ENCODING_MASK
+
+       The mask is used to extract the encoding-type identifier from
+       the @i{flags} field.
+
+@item BARCODE_EAN
+@itemx BARCODE_UPC
+@itemx BARCODE_ISBN
+@itemx BARCODE_128B
+@itemx BARCODE_128C
+@itemx BARCODE_128
+@itemx BARCODE_128RAW
+@itemx BARCODE_39
+@itemx BARCODE_I25
+@itemx BARCODE_CBR
+@itemx BARCODE_MSI
+@itemx BARCODE_PLS
+@itemx BARCODE_93
+
+       The currently supported encoding types: EAN (13 digits, 8
+       digits, 13 + 2 add-on and 13 + 5 add-on), UPC (UPC-A, UPC-E,
+       UPC-A with 2 or 5 digit add-on), ISBN (with or without the
+       5-digit add-on), CODE128-B (the whole set of printable
+        ASCII characters), CODE128-C (two digits encoded by each barcode
+       symbol), CODE128 (all ASCII values), a ``raw-input'' pseudo-code
+       that generates CODE128 output, CODE39 (alphanumeric),
+        "interleaved 2 of 5" (numeric), Codabar (numeric plus a few
+       symbols), MSI (numeric) and Plessey (hex digits).
+        @xref{Supported Encodings}.
+
+@item BARCODE_ANY
+
+       This special encoding type (represented by a value of zero, so
+       it will be the default) tells the encoding procedure to look
+       for the first encoding type that can deal with a textual
+       string.  Therefore, a 11-digit code will be printed as UPC (as
+       well as 6-digit, 11+2 and 11+5), a 12-digit (or 7-digit, or
+       12+2 or 12+5) as EAN13, an ISBN code (with or without hyphens,
+       with or without add-5) will be encoded in its EAN13
+       representation, an even number of digits is encoded using
+       CODE128C and a generic string is encoded using CODE128B. Since
+        code-39 offers a much larger representation for the same
+        text string, code128-b is preferred over code39 for
+        alphanumeric strings.
+
+@item BARCODE_NO_ASCII
+
+       Instructs the engine not to print the ascii string on
+       output. By default the bar code is accompanied with an ascii
+       version of the text it encodes.
+
+@item BARCODE_NO_CHECKSUM
+
+       Instructs the engine not to add the checksum character to the
+       output. Not all the encoding types can drop the checksum;
+       those where the checksum is mandatory (like EAN and UPC)
+       just ignore the flag.
+
+@item BARCODE_OUTPUT_MASK
+
+       The mask is used to extract the output-type identifier from
+       the @i{flags} field.
+
+@item BARCODE_OUT_PS
+@itemx BARCODE_OUT_EPS
+@itemx BARCODE_OUT_PCL
+@itemx BARCODE_OUT_PCL_III
+
+       The currently supported encoding types: full-page postscript
+       and encapsulated postscript; PCL (print command language, for
+        HP printers) and PCL-III (same as PCL, but uses a font not
+        available on older printers).
+
+@item BARCODE_OUT_NOHEADERS
+
+       The flag instructs the printing engine not to print the header
+       and footer part of the file. This makes sense for the
+       postscript engine but might not make sense for other engines;
+       such other engines will silently ignore the flag just like
+        the PCL back-end does.
+
+@end table
+
+%##########################################################################
+
+@node  The API, The barcode Executable, Supported Flags, Top
+@chapter Functions Exported by the Library
+
+%MANPAGE barcode.3
+%M .TH BARCODE 3 "October 1999" "GNU" "GNU barcode"
+%M .UC 4
+%M .SH NAME
+%M barcode \- a library to create and print bar codes
+%M .SH SYNOPSIS
+%M .B #include <barcode.h>
+%M .sp
+%M .BI "struct Barcode_Item *Barcode_Create(char *" text ");"
+%M .br
+%M .BI "int Barcode_Delete(struct Barcode_Item *" bc ");"
+%M .br
+%M .BI "int Barcode_Encode(struct Barcode_Item *" bc ", int " flags ");"
+%M .br
+%M .BI "int Barcode_Print(struct Barcode_Item *" bc ", FILE *" f ", int " flags ");"
+%M .br
+%M .BI "int Barcode_Position(struct Barcode_Item *" bc ", int " wid ", int " hei ", int " xoff ", int " yoff " , double " scalef ");"
+%M .br
+%M .BI "int Barcode_Encode_and_Print(char *" text ", FILE *" f ", int " wid ", int " hei ", int " xoff ", int " yoff ", int " flags ");"
+%M .br
+%M .BI "int Barcode_Version(char *" versionname ");"
+%M
+%M .SH DESCRIPTION
+%M
+%M The barcode family of library functions is meant to ease
+%M creation of bar-code printouts.
+%M
+%M The information below is extracted from the texinfo file, which is the
+%M preferred source of information.
+
+The functions included in the barcode library are declared in the
+header file @t{barcode.h}.  They perform the following tasks:
+
+@table @code
+
+@item struct Barcode_Item *Barcode_Create(char *text);
+       The function creates a new barcode object to deal with a
+       specified text string.  It returns NULL in case of failure and
+       a pointer to a barcode data structure in case of success.
+
+@item int Barcode_Delete(struct Barcode_Item *bc);
+       Destroy a barcode object. Always returns 0 (success)
+
+@item int Barcode_Encode(struct Barcode_Item *bc, int flags);
+       Encode the text included in the @i{bc} object. Valid flags are
+       the encoding type (other flags are ignored) and
+       BARCODE_NO_CHECKSUM (other flags are silently ignored); if the
+       flag argument is zero, @t{bc->flags} will apply. The function
+       returns 0 on success and -1 in case of error. After
+       successful termination the data structure will host the
+       description of the bar code and its textual representation,
+       after a failure the @t{error} field will include the reason of
+       the failure.
+
+@item int Barcode_Print(struct Barcode_Item *bc, FILE *f, int flags);
+       Print the bar code described by @t{bc} to the specified file.
+       Valid flags are the output type, @t{BARCODE_NO_ASCII} and
+       @t{BARCODE_OUT_NOHEADERS}, other flags are ignored. If any of
+       these flags is zero, it will be inherited from @t{bc->flags}
+       which therefore takes precedence. The function returns 0 on
+       success and -1 in case of error (with @t{bc->error} set
+       accordingly). In case of success, the bar code is printed to
+       the specified file, which won't be closed after use.
+
+@item int Barcode_Position(struct Barcode_Item *bc, int wid, int hei, int xoff, int yoff, double scalef);
+       The function is a shortcut to assign values to the data
+       structure.
+
+@item int Barcode_Encode_and_Print(char *text, FILE *f, int wid, int hei, int xoff, int yoff, int flags);
+       The function deals with the whole life of the barcode
+       object by calling the other functions; it uses all the specified
+       flags.
+
+@item int Barcode_Version(char *versionname);
+       Returns the current version as an integer number of the form
+       major * 10000 + minor * 100 + release. Therefore, version
+       1.03.5 will be returned as 10305 and version 0.53 as 5300.  If
+        the argument is non-null, it will be used to return the version
+        number as a string. Note that the same information is available from
+        two preprocessor macros: @t{BARCODE_VERSION} (the string) and
+        @t{BARCODE_VERSION_INT} (the integer number).
+
+@end table
+
+%MANPAGE END
+
+%##########################################################################
+
+@node  The barcode Executable, Supported Encodings, The API, Top
+@chapter The @i{barcode} frontend program
+
+%MANPAGE barcode.1
+%M .TH BARCODE 1 "October 2001" "GNU" "GNU barcode"
+%M .UC 4
+%M .SH NAME
+%M barcode \- a stand alone program to run the barcode library
+%M .SH SYNOPSIS
+%M .B barcode
+%M [\-b - | string] [\-e encoding] [\-o - | outfile] [
+%M .I other-flags
+%M ]
+%M .SH DESCRIPTION
+%M
+%M The information below is extracted from the texinfo file, which is the
+%M preferred source of information.
+%M .PP
+The @b{barcode} program is a front-end to access some features of the
+library from the command line.  It is able to read user supplied
+strings from the command line or a data file (standard input by default)
+and encode all of them.
+
+%M .SH OPTIONS
+%M .PP
+
+@menu
+* The Command Line::            
+@end menu
+
+%--------------------------------------------------------------------------
+@node  The Command Line,  , The barcode Executable, The barcode Executable
+@section The Command Line
+
+
+@b{barcode} accepts the following options:
+
+@table @code
+
+@item --help or -h
+       Print a usage summary and exit.
+
+@item -i filename
+       Identify a file where strings to be encoded are read from. If
+       missing (and if @t{-b} is not used) it defaults to standard
+       input. Each data line of the input file will be used to create
+       one barcode output.
+
+@item -o filename
+       Output file. It defaults to standard output.
+
+@item -b string
+       Specify a single ``barcode'' string to be encoded.
+        The option can be used multiple times in order to encode
+        multiple strings (this will result in multi-page postscript
+        output or a table of barcodes if @t{-t} is specified).  The
+        strings must match the encoding chosen; if it doesn't
+        match the program will print a warning to @t{stderr} and
+        generate ``blank'' output (although not zero-length).
+        Please note that a string including spaces or
+        other special characters must be properly quoted.
+
+@item -e encoding
+        @b{encoding} is the name of the chosen encoding format being
+       used. It defaults to the value of the environment variable
+       @t{BARCODE_ENCODING} or to auto detection if the environment is
+       also unset.
+
+@item -g geometry
+       The geometry argument is of the form ``[@i{<width>} @t{x}
+       @i{<height>}] [@t{+} @i{<xmargin>} @t{+} @i{<ymargin>}]'' (with
+       no intervening spaces). Unspecified margin values will result in
+        no margin; unspecified size results in default size.
+       The specified values represent print points by
+       default, and can be inches, millimeters or other units
+       according to the @t{-u} option or the @t{BARCODE_UNIT}
+       environment variable.  The argument is used to place the
+       printout code on the page. Note that an additional white
+       margin of 10 points is added to the printout. If the option is
+       unspecified, @t{BARCODE_GEOMETRY} is looked up in the
+       environment, if missing a default size and no margin (but the
+       default 10 points) are used.
+
+@item -t table-geometry
+       Used to print several barcodes to a single page, this option
+        is meant to be used to print stickers. The argument is of the
+        form ``@i{<columns>} @t{x} @i{<lines>} [@t{+} @i{<leftmargin>}
+        @t{+} @i{<bottommargin>} [@t{-} @i{<rightmargin>} [@t{-}
+        @i{<topmargin>}]]]'' (with no intervening spaces); if missing,
+        the top and right margin will default to be the same as the
+        bottom and left margin. The margins are specified in print
+        points or in the chosen unit (see @t{-u} below).  If the
+        option is not specified, @t{BARCODE_TABLE} is looked up in the
+        environment, otherwise no table is printed and each barcode
+        will get its own page.  The size (but not the position)
+        of a barcode item within a table can also be selected using
+        @t{-g} (see "geometry" above), without struggling with
+        external and internal margins.  I still think management of
+        geometries in a table is suboptimal, but I can't make it
+        better without introducing incompatibilities.
+
+
+@item -m margin(s)
+       Specifies an internal margin for each sticker in the
+       table. The argument is of the form
+       ``@i{<xmargin>}@t{,}@i{<ymargin>}'' and the margin is applied
+       symmetrically to the sticker. If unspecified, the environment
+       variable @t{BARCODE_MARGIN} is used or a default internal
+       margin of 10 points is used.
+
+@item -n
+       ``Numeric'' output: don't print the ASCII form of the code,
+       only the bars.
+
+@item -c
+       No checksum character (for encodings that allow it, like code 39,
+       other codes, like UPC or EAN, ignore this option).
+
+@item -E
+       Encapsulated postscript (default is normal postscript). When
+       the output is generated as EPS only one barcode is encoded.
+
+@item -P
+       PCL output. Please note that the Y direction goes from top
+        to bottom for PCL, and the origin for an image is the top-left
+        corner instead of the bottom-left
+
+@item -p pagesize
+       Specify a non-default page size. The page size can be specified
+        in millimeters, inches or plain numbers (for example: "@t{210x297mm}",
+        "@t{8.5x11in}", "@t{595x842}"). A page specification as numbers
+       will be interpreted according to the current unit specification
+       (see @t{-u} below). If libpaper is available,
+        you can also specify the page size with its name, like "@t{A3}"
+        or "@t{letter}" (libpaper is a standard component of Debian
+        GNU/Linux, but may be missing elsewhere). The default page
+        size is your system-wide default if libpaper is there, A4 otherwise.
+
+@item -u unit
+       Choose the unit used in size specifications. Accepted values
+       are ``mm'', ``cm'', ``in'' and ``pt''. By default, the program
+       will check @t{BARCODE_UNIT} in the environment, and assume
+       points otherwise (this behaviour is compatible with 0.92 and
+       previous versions. If @t{-u} appears more than once, each
+       instance will modified the behaviour for the arguments at its
+       right, as the command line is processes left to right. The
+       program internally works with points, and any size is
+       approximated to the nearest multiple of one point. The @t{-u}
+       option affect @t{-g} (geometry), @t{-t} (table) and @t{-p}
+       (page size).
+       
+@end table
+
+%M .SH ENCODING TYPES
+%M .PP
+
+%##########################################################################
+@node  Supported Encodings, PCL Output, The barcode Executable, Top
+@chapter Supported Encodings
+
+The program encodes text strings passed either on the command line
+(with -b) or retrieved from standard input. The text representation is
+interpreted according to the following rules. When auto-detection
+of the encoding is enabled (i.e, no explicit encoding type is specified),
+the encoding types are scanned to find one that can digest the text string.
+The following list of supported types is sorted in the same order
+the library uses when auto-detecting a suitable encoding for a string.
+
+@table @var
+
+@item EAN
+       The EAN frontend is similar to UPC; it accepts strings of
+       digits, 12 or 7 characters long. Strings of 13 or 8 characters
+        are accepted if the provided checksum digit is correct.
+        I expect most users to feed input without a 
+        checksum, though. The add-2 and add-5 extension are accepted for both
+        the EAN-13 and the EAN-8 encodings.
+        The following are example of valid input strings:
+       ``@t{123456789012}'' (EAN-13), ``@t{1234567890128}'' (EAN-13 wih
+        checksum),  ``@t{1234567}'' (EAN-8), ``@t{12345670 12345}'' (EAN-8
+        with checksum and add-5),
+       ``@t{123456789012 12}'' (EAN-13 with add-2),
+       ``@t{123456789012 12345}'' (EAN-13 with add-5).
+
+@item UPC
+       The UPC frontend accepts only strings made up of digits (and,
+       if a supplemental encoding is used, a blank to separate it).
+       It accepts strings of 11 or 12 digits (UPC-A) and 6 or 7 or 8
+        digits (UPC-E).
+
+       The 12th digit of UPC-A is the checksum and is added by the
+       library if not specified in the input; if it is specified, it
+        must be the right checksum or the code is rejected as invalid.
+        For UPC-E, 6 digit are considered to be the middle part of the
+        code, a leading 0 is assumed and the checksum is added;
+        7 digits are either considered the initial part (leading digit
+        0 or 1, checksum missing) or the final part (checksum specified,
+        leading 0 assumed); 8 digits are considered to be the complete code,
+        with leading 0 or 1 and checksum.
+        For both UPC-A and UPC-E, a trailing string of 2 digits or 5 digits
+       is accepted as well. Therefore, the following are examples
+        of valid strings that can be encoded as UPC:
+       ``@t{01234567890}'' (UPC-A)
+        ``@t{012345678905}'' (UPC-A with checksum), ``@t{012345}''
+       (UPC-E), ``@t{01234567890 12}'' (UPC-A, add-2) and
+       ``@t{01234567890 12345}'' (UPC-A, add-5), ``@t{0123456 12}''
+        (UPC-E, add-2).
+        Please note that when setting @t{BARCODE_ANY} to auto-detect
+        the encoding to be used, 12-digit strings and 7-digit strings
+        will always be identified as EAN. This because I expect most
+        user to provide input without a checksum. If you need to
+        specify UPC-with-checksum as input you must explicitly set
+        @t{BARCODE_UPC} as a flag or use @t{-e upc} on the command line.
+
+@item ISBN
+       ISBN numbers are encoded as EAN-13 symbols, with an optional
+       add-5 trailer. The ISBN frontend of the library accepts real
+       ISBN numbers and deals with any hyphen and, if present, the
+       ISBN checksum character before encoding data. Valid
+       representations for ISBN strings are for example:
+       ``@t{1-56592-292-1}'', ``@t{3-89721-122-X}'' and ``@t{3-89721-122-X
+       06900}''.
+
+@item code 128-B
+       This encoding can represent all of the printing ASCII
+        characters, from the space (32) to DEL (127). The checksum
+        digit is mandatory in this encoding.
+
+@item code 128-C
+       The ``C'' variation of Code-128 uses Code-128 symbols to
+       represent two digits at a time (Code-128 is made up of 104
+       symbols whose interpretation is controlled by the start symbol
+       being used). Code 128-C is thus the most compact way to
+       represent any even number of digits. The encoder refuses to
+       deal with an odd number of digits because the caller is
+       expected to provide proper padding to an even number of
+       digits. (Since Code-128 includes control symbols to switch
+       charset, it is theoretically possible to represent the odd
+       digit as a Code 128-A or 128-B symbol, but this tool doesn't
+       currently implement this option).
+
+@item code 128 raw
+       Code-128 output represented symbol-by-symbol in the input
+       string.  To override part of the problems outlined below in
+       specifying code128 symbols, this pseudo-encoding allows the
+       used to specify a list of code128 symbols separated by
+       spaces. Each symbol is represented by a number in the range
+       0-105.  The list should include the leading character.The
+       checksum and the stop character are automatically added by the
+       library. Most likely this pseudo-encoding will be used with
+       @t{BARCODE_NO_ASCII} and some external program to supply the
+       printed text.
+
+@item code 39
+       The code-39 standard can encode uppercase letters, digits, the
+       blank space, plus, minus, dot, star, dollar, slash, percent.
+       Any string that is only composed of such characters is
+       accepted by the code-39 encoder. To avoid loosing information,
+       the encoder refuses to encode mixed-case strings (a lowercase
+       string is nonetheless accepted as a shortcut, but is encoded
+       as uppercase).
+
+@item interleaved 2 of 5
+       This encoding can only represent an even number of digits
+        (odd digits are represented by bars, and even digits by the
+        interleaving spaces). The name stresses the fact that two
+        of the five items (bars or spaces) allocated to each symbol
+        are wide, while the rest are narrow. The checksum digit is
+        optional (can be disabled via @t{BARCODE_NO_CHECKSUM}).
+        Since the number of digits, including the checksum, must be even,
+        a leading zero is inserted in the string being encoded if needed
+        (this is specifically stated in the specs I have access to).
+
+@item code 128
+       Automatic selection between alphabet A, B and C of the Code-128
+        standard. This encoding can represent all ASCII symbols, from
+        0 (NUL) to 127 (DEL), as well as four special symbols, named
+        F1, F2, F3, F4. The set of symbols available in this encoding
+        is not easily represented as input to the @i{barcode} library,
+        so the following convention is used.  In the input string,
+        which is a C-language null-terminated string, the NUL char
+        is represented by the value 128 (0x80, 0200) and the F1-F4 characters
+        are represented by the values 193-196 (0xc1-0xc4, 0301-0304).
+        The values have been chosen to ease their representation as
+        escape sequences.
+
+        Since the shell doesn't seem to interpret escape sequences on the
+        command line, the "-b" option cannot be easily used to designate
+        the strings to be encoded. As a workaround you can resort
+        to the command @t{echo}, either within back-ticks or used
+        separately to create a file that is then fed to the standard-input
+        of @i{barcode} -- assuming your @t{echo} command processes escape
+        sequences.  The newline character is especially though to encode
+        (but not impossible unless you use a @t{csh} variant.
+
+        These problems only apply to the command-line tool; the use of
+        library functions doesn't give any problem. In needed, you can
+        use the ``@i{code 128 raw}'' pseudo-encoding to represent
+        code128 symbols by their numerical value. This encoding is
+        used late in the auto-selection mechanism because (almost) any
+        input string can be represented using code128.
+
+@item Codabar
+       Codabar can encode the ten digits and a few special symbols
+       (minus, plus, dollar, colon, bar, dot). The characters
+       ``@t{A}'', ``@t{B}'', ``@t{C}'' and ``@t{D}'' are used to
+       represent four different start/stop characters. The input
+       string to the barcode library can include the start and stop
+       characters or not include them (in which case ``@t{A}'' is
+       used as start and ``@t{B}'' as stop). Start and stop
+       characters in the input string can be either all lowercase or
+       all uppercase and are always printed as uppercase.
+
+@item Plessey
+       Plessey barcodes can encode all the hexadecimal
+       digits. Alphabetic digits in the input string must either be
+       all lowercase or all uppercase. The output text is always
+       uppercase.
+
+@item MSI
+       MSI can only encode the decimal digits. While the standard
+       specifies either one or two check digits, the current
+       implementation in this library only generates one check digit.
+
+@item code 93
+      The code-93 standard can natively encode 48 different characters,
+      including uppercase letters, digits, the blank space, plus, minus,
+      dot, star, dollar, slash, percent, as well as five special
+      characters:  a start/stop delimiter and four "shift characters" used
+      for extended encoding.    Using this "extended encoding" method, any
+      standard 7-bit ASCII character can be encoded, but it takes up two
+      symbol lengths in barcode if the character is not natively supported
+      (one of the 48).
+      The encoder here fully implements the code 93 encoding standard.
+      Any characters natively supported (A-Z, 0-9, ".+-/$&%") will be
+      encoded as such - for any other characters (such as lower case
+      letters, brackets, parentheses, etc.), the encoder will revert
+      to extended encoding.
+      As a note, the option to exclude the checksum will eliminate the
+      two modulo-47 checksums (called C and K) from the barcode, but this
+      probably will make it unreadable by 99% of all scanning systems.
+      These checksums are specified to be used at the firmware level,
+      and their absence will be interpreted as an invalid barcode.
+
+
+@end table
+
+%M .SH PCL OUTPUT
+
+%##########################################################################
+@node  PCL Output, Bugs and Pending Issues, Supported Encodings, Top
+@chapter PCL Output
+
+While the default output is Postscript (possibly EPS), and Postscript
+can be post-processed to almost anything, it is sometimes desirable to
+create output directly usable by the specific printer at hand. 
+PCL is currently supported as an output format for this reason.
+Please note that the Y coordinate for PCL goes from top to bottom, while
+for Postscript it goes from bottom to top. Consistently, while in
+Postscript you specify the bottom-left corner as origin, for PCL
+you specify the top-left corner.
+
+Barcode output for PCL Printers (HP LaserJet and compatibles),
+was developed using PCL5 Reference manuals from HP.
+that really refers to these printers:
+@itemize @bullet
+
+@item
+LaserJet III, III P, III D, III Si,
+
+@item
+LaserJet 4 family
+
+@item
+LaserJet 5 family
+
+@item
+LaserJet 6 family
+
+@item
+Color LaserJet
+
+@item
+DeskJet 1200 and 1600.
+
+@end itemize
+
+However, barcode printing uses a very small subset of PCL, probably also
+LaserJet II should print it without problem, but the resulting text may
+be horrible.
+
+The only real difference from one printer to another really depends on
+which font are available in the printer, used in printing the label
+associated to the bars (if requested).
+
+Earlier LaserJet supports only bitmaps fonts, so these are not
+"scalable". (Ljet II ?), Also these fonts, when available, have a
+specified direction, and not all of them are available in
+both Portrait and Landscape mode.
+
+From LaserJet 4 series, (except 4L/5L that are entry-level printers),
+Arial scalable font should be available, so it's the "default font"
+used by this program.
+
+LaserJet III series printers (and 4L, 5L), don't feature "Arial" as a
+resident font, so you should use @t{BARCODE_OUT_PCL_III} instead of
+@t{BARCODE_OUT_PCL.}, and font the font used will be "Univers" instead
+of "Arial".
+
+Results on compatible printers, may depend on consistency of
+PCL5 compatibility, in doubt, try BARCODE_OUT_PCL_III
+
+PJL commands are not used here, as it's not very compatible.
+
+
+Tested Printers:
+@itemize @bullet
+@item
+Hp LaserJet 4050
+@item
+Hp LaserJet 2100
+@item
+Epson N-1200 emul PCL
+@item
+Toshiba DP2570 (copier) + PCL option
+@item
+Epson EPL-7100 emul. HP LaserJet II: bars print fine but text is bad.
+@end itemize
+
+
+%M .SH BUGS
+
+%##########################################################################
+@node  Bugs and Pending Issues,  , PCL Output, Top
+@chapter Bugs and Pending Issues.
+
+The current management of borders/margins is far from optimal. The
+``default'' margin applied by the library interferes with the external
+representation, but I feel it is mandatory to avoid creating barcode
+output with no surrounding white space (the problem is especially
+relevant for EPS output).
+
+EAN-128 is not (yet) supported. I plan to implement it pretty soon and
+then bless the package as version 1.0.
+
+%M .SH "SEE ALSO"
+%M \fBbarcode(3)\fP
+%M
+%M .SH AUTHORS
+%M Alessandro Rubini <rubini@gnu.org> (maintainer)
+%M .PP
+%M Leonid A. Broukhis <leob@mailcom.com> (several encodings)
+%M .PP
+%M Andrea Scopece <a.scopece@tin.it> (PCL output)
+%MANPAGE END
+
+@iftex
+@contents
+@end iftex
+
+@bye
+@c  LocalWords:  barcode ifinfo titlepage iftex texinfo ascii frontend LGPL
+@c  LocalWords:  tarball malloced textinfo scalef isbn Plessey codabar GPL Ljet
+@c  LocalWords:  LocalWords LaserJet Univers Arial Debian libpaper pagesize
+@c  LocalWords:  Epson MANPAGE stderr barcodes emul DeskJet xmargin ymargin
+@c  LocalWords:  leftmargin rightmargin topmargin bottommargin unset struct
+@c  LocalWords:  NOHEADERS yoff xoff versionname errno malloc behaviour charset