[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.
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}]
signature.asc
Description: PGP signature