Of course, lots! remains to be done before this is usable. The start,
middle and end patterns haven't been coded yet, as much as the quiet
zones, which are also still missing. Also, a nice frame around
everything (barcode + human-readable digits below) as well as start,
middle and end patterns being longer than the digits, wait to be
implemented. This experiment really is an exercise to learn the language
and a proof of concept (to myself only).
Oliver.
On 27/11/2025 00:33, Oliver Corff via GNU roff typesetting system
discussion wrote:
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]