First attempt of printing barcodes with groff

Oliver Corff via GNU roff typesetting system discussion <[email protected]>
Newsgroups gmane.comp.printing.groff.general
Message-ID <[email protected]>
Dear All,

I am experimenting with the \D'.....' drawing command to produce 
barcodes in an attempt to create a generic solution which avoids the 
installation of a special barcode font.

The first experiment follows here. The logic is as follows. The macro 
.barcode is called with two arguments: (1) the sequence to be expressed 
as barcode and (2) the current position of the iterator. .barcode then 
picks the nth number and passes it to .printbar; .printbar in turn calls 
.Rbarcode and .Lbarcode with its appropriate pattern of whitespace and 
bars. Inside .barcode, currently the line "<\\*[mychain]>" is for 
diagnostic purposes only; it shows the current single digit of the 
barcode <n> which, at a later stage, should appear below its barcode.

So far, the logic to translate all digits of a given barcode number into 
black and white patterns works, but that's more or less all I could 
achieve so far.

My problems with this first attempt are twofold:

1. How do I control the size of the basic unit used by \D'P ... ' and 
\h'..' in order to get a nice display?

2. How do I make the barcodes to follow each other horizontally instead 
of each being displayed in a new line? I tried \c in various places but 
to no avail. Strangely enough, within .Rbarcode and .Lbarcode the 
sequence of \D and \h appears horizontally as desired.

Thank you all for pointing out the obvious flaws in my approach.

Best regards,

Oliver.


.\" vim:syntax=groff
.LP
.nr @hgt 2
.de Lbarcode
\h'\\$1p'
\D'P 0 -\n[@hgt] \\$2p 0 0 \n[@hgt]'
\h'\\$3p'
\D'P 0 -\n[@hgt] \\$4p 0 0 \n[@hgt]'
..
.de Rbarcode
\D'P 0 -\n[@hgt] \\$1p 0 0 \n[@hgt]'
\h'\\$2p'
\D'P 0 -\n[@hgt] \\$3p 0 0 \n[@hgt]'
\h'\\$4p'
..
.\" See section "Encoding" inhttps://en.wikipedia.org/wiki/Universal_Product_Code for a UPC-A barcode.
.de printbar
.nr X \\$1
.nr LR \\$2
.ie (\\n[LR] > 4) \{\
.if ( \\n[X] = 0 ) .Rbarcode 3 2 1 1
.if ( \\n[X] = 1 ) .Rbarcode 2 2 2 1
.if ( \\n[X] = 2 ) .Rbarcode 2 1 2 2
.if ( \\n[X] = 3 ) .Rbarcode 1 4 1 1
.if ( \\n[X] = 4 ) .Rbarcode 1 1 3 2
.if ( \\n[X] = 5 ) .Rbarcode 1 2 3 1
.if ( \\n[X] = 6 ) .Rbarcode 1 1 1 4
.if ( \\n[X] = 7 ) .Rbarcode 1 3 1 2
.if ( \\n[X] = 8 ) .Rbarcode 1 2 1 3
.if ( \\n[X] = 9 ) .Rbarcode 3 1 1 2
\}
.el \{\
.if ( \\n[X] = 0 ) .Lbarcode 3 2 1 1
.if ( \\n[X] = 1 ) .Lbarcode 2 2 2 1
.if ( \\n[X] = 2 ) .Lbarcode 2 1 2 2
.if ( \\n[X] = 3 ) .Lbarcode 1 4 1 1
.if ( \\n[X] = 4 ) .Lbarcode 1 1 3 2
.if ( \\n[X] = 5 ) .Lbarcode 1 2 3 1
.if ( \\n[X] = 6 ) .Lbarcode 1 1 1 4
.if ( \\n[X] = 7 ) .Lbarcode 1 3 1 2
.if ( \\n[X] = 8 ) .Lbarcode 1 2 1 3
.if ( \\n[X] = 9 ) .Lbarcode 3 1 1 2
\}
..
.de barcode
.ds mychain \\$1
.nr mypos \\$2
.substring mychain \\n[mypos] \\n[mypos]
<\\*[mychain]>
.printbar \\*[mychain] \\n[mypos]
..
My attempt:
.length @count 9876543210
.nr mynum 0 1
.while (\n[mynum] < \n[@count]) \{
.       barcode 9876543210 \n[mynum]
         \n+[mynum]\}




-- 
Dr. Oliver Corff
mailto:[email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.