[looping in groff@gnu since this turned into a status report]

At 2025-03-09T15:49:10+0100, Alejandro Colomar wrote:
> On Sun, Mar 09, 2025 at 01:12:40PM +0000, Deri wrote:
> > I'm wondering why you switched from using a more "up to date" groff
> > back to the 1.23.0 version.
> 
> I bought a new drive for my computer, and reinstalled the OS.  That
> was when.  :)
> 
> I haven't built groff from source since then yet.
[...]
> > Just wondering if you found a problem with the current git version
> > which meant you had to revert?
> 
> Nah, just fresh OS install.  I will eventually build it again from
> source.  I was hoping that groff might release soonish and I wouldn't
> have to do it, but I think it will not happen any soon.

Not reckoned with respect to the speed you work at, I don't think.  :-O

I pushed a batch of changes yesterday, but they mostly didn't reveal
where most of my development time has been going lately.  This requires
a story.

On 16 January, Dave Kemper filed Savannah #66675.[1]

That ticket pointed out a problem with one of the elements of a major
refactor to solve a significant site of the "node getting into
device-independent output" problem, which is challenging to explain
under the best of circumstances.  Suffice to say, it was the origin of
some of the most mysterious and frustrating diagnostic messages that
groff throws.  Mystified users are unhappy users.  The NEWS file for the
forthcoming release represents my best effort to explain.[2]  Feedback
welcome.

Digging into Dave's problem revealed that my refactoring had undesired
consequences on character definitions.  (That is, use of `char` and
similar requests to construct user-defined characters.  For one thing,
it appears that "removing" characters may have never really worked,
because the act of looking one up created it.  But it's hard to know
what really goes on with character name resolution because historically
there is no way outside of source-level debugging to introspect either
the resolution process or the character objects themselves.)

Further study revealed that writing experiments, let alone automated
tests, to determine whether I'd screwed up or regressed the feature was
unreasonably hard, for reasons that I was already familiar with: a lot
of groff data structures have representations that are opaque to the
programming language.  Because *roff _is_ a programming language, not
having a mechanism for it to dump structures that are relevant to the
user (like user-defined characters) is a significant impediment to
debugging not just for groff developers, but for document authors.

Being able to dump such things would help to root-cause not just
Savannah #66675, but other troublesome issues like Savannah #66837[3]
and Savannah #66805[4].  In too many circumstances, to really track down
an issue with the transformation of input to output in the GNU troff
formatter, it's necessary to launch a symbolic debugger.  In my opinion,
that's a failure.  Debuggers' strength lies in helping you resolve
problems with control flow ("logic", we often say), and not as much with
data representation.

So what I decided to do was to take a new feature I'd already
implemented, which exists and works in groff Git since 30 April, the
`pline` request, and give it more power.

     .pline     Report, to the standard error stream, the list of output
                nodes corresponding to the pending output line.

In my working copy, it is documented differently.

     .pline     Report, in JSON syntax to the standard error stream, the
                list of output nodes corresponding to the pending output
                line.  In JSON, a pair of empty brackets “[ ]”
                represents an empty list.

I've got lots and lots of this working, including recursion when nodes
contain (lists of) other nodes.  It's trivial to detect when I've
screwed up the output syntax because jq(1) complains about it, so I have
some hope that I'm producing well-formed output.  And secrets are being
revealed.

As I chew my way through the many types of node groff defines, I keep
finding new data types I need to be able to dump, and so I have to go
off on a tangent to permit their dumping.  But this isn't mere
completism; I've been complaining for years that I wanted a macro
dumper, and because--it turns out--groff re-uses the `macro` class for
some things that it arguably shouldn't (just like `symbol`), I need the
macro dumper in order to make discoverable two things: (1) the contents
of a user-defined character [an acceptable use of `macro`, given how it
works] and (2) the contents of a device extension command [_not_ an
acceptable use of `macro` in my opinion[5]].

Anyway, since I _do_ want to release the damnable groff 1.24 sooner
rather than later, I mean to leave refactoring the device extension
node data structure for some other time, even though I already have
a `string` dumper.  All I want and need for right now is a way for a
`device_extension_node` to dump itself to stderr.  And that means
writing a macro dumper.

But guess what?  Once I have a macro dumper, I can cross _another_
old goal off the list.

And that's--having a macro dumper!  Ever wanted to ask the formatter
to tell you what's _really_ in a macro?  Well, soon you'll be able to!
I should be able to hook this up to `pm` with little effort, to `pchar`
with little more, and then bada-boom, bada-bing, we'll have inspectable
character definitions, macros, (*roff) strings, _and_ diversions.

Now, before you get _too_ excited, my goal for now--for 1.24--is only to
represent these things as JSON strings.  Meaning that all those places
GNU troff uses C0 and C1 controls to represent `nodes` are likely to get
dumped as inscrutable character codes: think "\u000B".  It won't take
much experience to learn that these are nodes, but to decode them you'll
still need the groff source tree.[6]

"But wait," you may be wondering, "didn't you just imply that you have a
recursive node dumper?"  Yes.  But the `macro` class is weird.  The
information most users really want (the contents) is in a sub-object of
type `macro_header`[7].  And _that_ object does a funny thing.  It
represents its contents in two ways simultaneously: as a `char_list` and
a `node_list`.  That makes only partial sense to me.  I know why you'd
need both--nodes can have a lot of data, where as `\u000B` encodes only
the _kind_ of node at that place in the macro--but I still experience a
bit of a Philip J. Fry squint when considering the `macro_header` type.
Possibly, an optimization has been performed to speed iteration through
the macro, and that's why we don't have just one list of objects that
can be either proper characters or `node`s, the latter with their full
payload.

So, for groff 1.24, I don't expect the macro dumper to be as helpful as
it could be.  But it _will_ be helpful to tell us when a device
extension command node contains nodes--which it should not do.  We
developers can maybe then attack the cases where they occur with more
visibility into what we're doing.  For the past year or so I've been
gunning at that problem in much lower light, which I think is at least
in part why Savannah #66675 happened.

Here's what the `git --log --oneline` of my working copy looks like.

25dbd2c40 (HEAD -> master) [troff]: Implement recursive node dumping (8e/x).
86cbc983b [troff]: Implement recursive node dumping (8d/x).
9c8adf1b0 [troff]: Implement recursive node dumping (8c/x).
9d5e3c8f1 [troff]: Implement recursive node dumping (8b/x).
aaf9ab17f [troff]: Implement recursive node dumping (8a/x).
652bd0999 [troff]: Implement recursive node dumping (7/x).
49d5260b0 [troff]: Implement recursive node dumping (6/x).
45bc27083 src/roff/troff/node.{h,cpp}: Annotate next steps.
05561276e NEED EXAMPLE [troff]: Implement recursive node dumping (5t/x).
3b897b472 [troff]: Implement recursive node dumping (5s/x).
43050da14 [troff]: Implement recursive node dumping (5r/x).
58cc84208 REWORD [troff]: Implement recursive node dumping (5q/x).
7a298e56b [troff]: Implement recursive node dumping (5p/x).
bd1d75190 [troff]: Implement recursive node dumping (5o/x).
037010eb7 [troff]: Implement recursive node dumping (5n/x).
835d7e181 [troff]: Implement recursive node dumping (5m/x).
8d1c061d2 [troff]: Implement recursive node dumping (5l/x).
b9e48b758 [troff]: Implement recursive node dumping (5k/x).
dccbd0600 [troff]: Implement recursive node dumping (5j/x).
e977c49b3 [troff]: Implement recursive node dumping (5i/x).
11efa353a [troff]: Implement recursive node dumping (5h/x).
eede69c3f [troff]: Implement recursive node dumping (5g/x).
e77e5a5d8 [troff]: Implement recursive node dumping (5f/x).
b52c3db6b [troff]: Implement recursive node dumping (5e/x).
ff1ee40a5 [troff]: Implement recursive node dumping (5d/x).
dbc926e0e [troff]: Implement recursive node dumping (5c/x).
d2918b88d [troff]: Implement recursive node dumping (5b/x).
d0ed8fc7f [troff]: Implement recursive node dumping (5a/x).
757390dba [troff]: Implement recursive node dumping (4/x).
e21b22cd6 [troff]: Implement recursive node dumping (3/x).
51245af62 [troff]: Implement recursive node dumping (2/x).
08444f311 [doc,man]: Revise description of `pline` output.
606fab045 [troff]: Implement recursive node dumping (1/x).
cefa3e337 [troff]: Revise `pline` output style.
fc0d2de71 XXX squash more squash
068aa1925 XXX squash after verifying correct operation
ec7ed6f69 [libgroff]: Support JSON extraction of `symbol`s.
8fed5923b [libgroff]: Support JSON extraction of `string`s.
55d607746 (origin/master, origin/HEAD) [troff]: Unit-test `.devicem` and `\Y`.

I'm attaching a copy of the script I've been using to exercise this
stuff, and the output it produces.  The latter should be given to jq(1)
for best results.

Regards,
Branden

[1] https://savannah.gnu.org/bugs/?66675
[2] 
https://git.savannah.gnu.org/cgit/groff.git/tree/NEWS?id=55d6077463806294bd7e38c633f438a90c02a9a5#n131
[3] https://savannah.gnu.org/bugs/?66837
[4] https://savannah.gnu.org/bugs/?66805

[5] I cannot imagine why `macro` was selected as the data structure to
    back the contents of a device extension node.  It seems to me that
    groff's `string` class (which isn't C++'s, because groff is _old_)
    would serve just as well because it's really a memory buffer.  No
    byte values are invalid, and it's not null-terminated.  A `macro`
    can contain a mixture of characters and `node`s, but nodes no longer
    exist once device-independent output is produced.  The entire point
    of device-independent output is to translate *roff's internal
    representations of typesetting objects ("nodes") into a page
    description language.  Letting nodes escape into the output of GNU
    troff would be like having your GCC output sprinkle the lists of
    assembly instructions it produces with chunks of RTL or GIMPLE.
    That strikes me as..."ill-conceived" is the politest way I can
    phrase it.

    Any time James Clark or Werner Lemberg wants to show up and smack
    some sense into my head--please do!

[6] Here's where to start.
    
https://git.savannah.gnu.org/cgit/groff.git/tree/src/roff/troff/input.h?id=55d6077463806294bd7e38c633f438a90c02a9a5

[7] Why is the meaty "body" of a macro called the "header"?  Ask Clark.

Attachment: newmodel.sh
Description: Bourne shell script

[{"type": "line_start_node", "diversion level": 0, "is_special_node": false},
{"type": "zero_width_node", "diversion level": 0, "is_special_node": false, 
"contents": [{"type": "dummy_node", "diversion level": 0, "is_special": false}, 
{"type": "glyph_node", "diversion level": 0, "is_special": false, "character": 
"a"}, {"type": "glyph_node", "diversion level": 0, "is_special": false, 
"character": "b"}, {"type": "glyph_node", "diversion level": 0, "is_special": 
false, "character": "c"}, {"type": "hmotion_node", "diversion level": 0, 
"is_special": false, "hunits": 30000, "was_tab": false, "unformat": false, 
"terminal_color": "default"}]},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "f"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false}]
[{"type": "line_start_node", "diversion level": 0, "is_special_node": false},
{"type": "hline_node", "diversion level": 0, "is_special_node": false, 
"hunits": 144, "contents": [{"type": "glyph_node", "diversion level": 0, 
"is_special": false, "character": "A"}]},
{"type": "zero_width_node", "diversion level": 0, "is_special_node": false, 
"contents": [{"type": "dummy_node", "diversion level": 0, "is_special": false}, 
{"type": "glyph_node", "diversion level": 0, "is_special": false, "character": 
"a"}, {"type": "glyph_node", "diversion level": 0, "is_special": false, 
"character": "b"}, {"type": "glyph_node", "diversion level": 0, "is_special": 
false, "character": "c"}, {"type": "hmotion_node", "diversion level": 0, 
"is_special": false, "hunits": 144, "was_tab": false, "unformat": false, 
"terminal_color": "default"}]},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, "state": 
"<state>", "character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, "state": 
"<state>", "character": "e"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, "state": 
"<state>", "character": "f"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 24, "width_list": [{ "width": 24, "sentence_width": 24 }], 
"unformat": false}]
[ ]
[{"type": "line_start_node", "diversion level": 0, "is_special_node": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "s"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "h"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "u"},
{"type": "composite_node", "diversion level": 0, "is_special_node": false, 
"character": "\\Fl"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "s"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "u"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "p"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "dbreak_node", "none": {"type": "glyph_node", "diversion level": 0, 
"is_special_node": false, "character": "r"}, "pre": {"type": "kern_pair_node", 
"diversion level": 0, "is_special": false, "amount": -200}, "diversion level": 
0, "is_special": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "t"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "a"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "kern_pair_node", "diversion level": 0, "is_special_node": false, 
"amount": -100},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "r"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false},
{"type": "hline_node", "diversion level": 0, "is_special_node": false, 
"hunits": 60000, "contents": [{"type": "glyph_node", "diversion level": 0, 
"is_special": false, "character": "A"}]},
{"type": "zero_width_node", "diversion level": 0, "is_special_node": false, 
"contents": [{"type": "dummy_node", "diversion level": 0, "is_special": false}, 
{"type": "glyph_node", "diversion level": 0, "is_special": false, "character": 
"a"}, {"type": "glyph_node", "diversion level": 0, "is_special": false, 
"character": "b"}, {"type": "glyph_node", "diversion level": 0, "is_special": 
false, "character": "c"}, {"type": "hmotion_node", "diversion level": 0, 
"is_special": false, "hunits": 30000, "was_tab": false, "unformat": false, 
"terminal_color": "default"}]},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "f"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false}]
[{"type": "line_start_node", "diversion level": 0, "is_special_node": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "s"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "p"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "a"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "c"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 0},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false}]
[{"type": "line_start_node", "diversion level": 0, "is_special_node": false},
{"type": "kern_pair_node", "diversion level": 0, "is_special_node": false, 
"amount": -150},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "t"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "r"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "a"},
{"type": "break_char_node", "diversion level": 0, "is_special_node": false, 
"break_code_before": 2, "break_code_after": 0, "terminal_color": "default"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "s"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "i"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "z"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "extra_size_node", "diversion level": 0, "is_special_node": false, 
"vunits": 3000},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false}]
[{"type": "line_start_node", "diversion level": 0, "is_special_node": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "h"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "r"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "i"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "z"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "t"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "a"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "l"},
{"type": "break_char_node", "diversion level": 0, "is_special_node": false, 
"break_code_before": 2, "break_code_after": 0, "terminal_color": "default"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "m"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "t"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "i"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "hmotion_node", "diversion level": 0, "is_special_node": false, 
"hunits": 10000, "was_tab": false, "unformat": false, "terminal_color": 
"default"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false}]
[{"type": "line_start_node", "diversion level": 0, "is_special_node": false},
{"type": "kern_pair_node", "diversion level": 0, "is_special_node": false, 
"amount": -150},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "r"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "t"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "i"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "c"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "a"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "l"},
{"type": "break_char_node", "diversion level": 0, "is_special_node": false, 
"break_code_before": 2, "break_code_after": 0, "terminal_color": "default"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "m"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "t"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "i"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "vmotion_node", "diversion level": 0, "is_special_node": false, 
"vunits": 10000, "terminal_color": "default"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false}]
[{"type": "line_start_node", "diversion level": 0, "is_special_node": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "h"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "l"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "i"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "hline_node", "diversion level": 0, "is_special_node": false, 
"hunits": 15000, "contents": [{"type": "glyph_node", "diversion level": 0, 
"is_special": false, "character": "!"}]},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false}]
[{"type": "line_start_node", "diversion level": 0, "is_special_node": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "v"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "l"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "i"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "vline_node", "diversion level": 0, "is_special_node": false, 
"vunits": 15000, "contents": [{"type": "glyph_node", "diversion level": 0, 
"is_special": false, "character": "!"}]},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false}]
[{"type": "line_start_node", "diversion level": 0, "is_special_node": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "i"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "t"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "a"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "l"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "i"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "c"},
{"type": "break_char_node", "diversion level": 0, "is_special_node": false, 
"break_code_before": 2, "break_code_after": 0, "terminal_color": "default"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "c"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "r"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "r"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "c"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "t"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false},
{"type": "italic_corrected_node", "diversion level": 0, "is_special_node": 
false, "hunits": 1960, "contents": [{"type": "glyph_node", "diversion level": 
0, "is_special": false, "character": "f"}]},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": ")"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false}]
[{"type": "line_start_node", "diversion level": 0, "is_special_node": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "l"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "f"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "t"},
{"type": "break_char_node", "diversion level": 0, "is_special_node": false, 
"break_code_before": 2, "break_code_after": 0, "terminal_color": "default"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "i"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "t"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "a"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "l"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "i"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "c"},
{"type": "break_char_node", "diversion level": 0, "is_special_node": false, 
"break_code_before": 2, "break_code_after": 0, "terminal_color": "default"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "c"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "r"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "r"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "c"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "t"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "("},
{"type": "left_italic_corrected_node", "diversion level": 0, "is_special_node": 
false, "hunits": 1970},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false}]
[{"type": "line_start_node", "diversion level": 0, "is_special_node": false},
{"type": "kern_pair_node", "diversion level": 0, "is_special_node": false, 
"amount": -150},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "r"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "s"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "t"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "r"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "i"},
{"type": "kern_pair_node", "diversion level": 0, "is_special_node": false, 
"amount": -100},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false},
{"type": "overstrike_node", "diversion level": 0, "is_special_node": false, 
"max_width": 7220},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false}]
[{"type": "line_start_node", "diversion level": 0, "is_special_node": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "b"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "r"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "a"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "c"},
{"type": "kern_pair_node", "diversion level": 0, "is_special_node": false, 
"amount": -100},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "t"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false},
{"type": "bracket_node", "diversion level": 0, "is_special_node": false, 
"max_width": 5640},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false}]
[{"type": "line_start_node", "diversion level": 0, "is_special_node": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "kern_pair_node", "diversion level": 0, "is_special_node": false, 
"amount": -250},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "i"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "c"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false},
{"type": "kern_pair_node", "diversion level": 0, "is_special_node": false, 
"amount": -150},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "t"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "s"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "i"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false},
{"type": "device_extension_node", "diversion level": 0, "is_special_node": 
true, "tfont": "TR", "stroke_color": "default", "fill_color": "default"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false}]
[{"type": "line_start_node", "diversion level": 0, "is_special_node": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "r"},
{"type": "kern_pair_node", "diversion level": 0, "is_special_node": false, 
"amount": -150},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "n"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "o"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "d"},
{"type": "glyph_node", "diversion level": 0, "is_special_node": false, 
"character": "e"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false},
{"type": "draw_node", "diversion level": 0, "is_special_node": false, "code": 
"l", "npoints": 1, "font_size": 10000, "stroke_color": "default", "fill_color": 
"default", "point": "(72000, 72000)"},
{"type": "word_space_node", "diversion level": 0, "is_special_node": false, 
"hunits": 2500, "width_list": [{ "width": 2500, "sentence_width": 2500 }], 
"unformat": false}]

Attachment: signature.asc
Description: PGP signature

Reply via email to