[Fontinst] \resetslot in multislot.sty would be nice to have working

Lars Hellström Lars.Hellstrom at residenset.net
Mon Aug 5 23:35:38 CEST 2013


Reuben Thomas skrev 2013-08-03 22.02:
> multislot.sty says (at least in the version currently on CTAN, marked
> "Second version":

FWIW, what constitutes the "first version" is a private extension to 
fontinst v1.504 that I wrote back in 1997. When I took over development in 
1999, I also started to integrate the features of that extension (e.g. 
\resetkern) into the master fontinst, but \resetslot and such never made it 
--- partly because they didn't work all that correctly, and partly because 
the command interface was clumsy --- even though the \..._etx_pass_hook 
macros was introduced specifically for such a mechanism to hook into.

The current (second) version is a rewrite from 2009, during an effort to 
record and collect the development history of fontinst. It has a sane 
command interface, but it still faces some fundamental technical limitations.

> % This is of course a BUG, and there doesn't seem to be any way
> % around it, short of adding another pass of reading ETX files. Doing
> % so would probably not be worth the effort, since the usefulness of
> % a \resetslot command is not clear; unlike \resetglyph, it cannot be
> % used to amend an existing \set..., but only to override it.
>
> I beg to differ: I'm trying to write customized versions of t1.etx,

Oh, cool! May I ask to what ends they are customised?

> updating a now-lost package of Ulrik Vieth's in which he simply supplied
> patched versions of that file. That has all the usual maintenance problems
> described in newlatin.mtx [sic]. Currently, the best I can do is something
> like:
>
> \inputetx{t1}
> \nextslot{n}
> \setslot{whatever}...\endsetslot

Is there a reason you don't just do those tasks in the opposite order, i.e., go

\encoding

% First do my stuff:
\nextslot{n}
\setslot{whatever}...\endsetslot

% Then fill in the rest as in T1 encoding:
\inputetx{t1}

\endencoding

? Then it is always the first \setslot that does what you want, so there's 
no need to reset any slot. Which is part of why I labelled its usefulness as 
"unclear".

> which lets me add to slots(at least, despite warnings that a slot is
> multiply-defined, that seems to be the effect it has, which is exactly what
> I want),

You may be lucky with how vptovf deals with multiple definitions here. 
(Which in principle one shouldn't rely on, but OTOH as software goes, vptovf 
is probably one of the more fixed fulcrums one might come across.)

> but since there's no way to remove the kerns and ligatures of an
> existing slot (since the buggy \resetslot doesn't do that),

The catch is that during \etxtovpl, fontinst maintains lists (organised per 
glyph) of in which slot(s) each glyph is placed, since those are needed when 
encoding kerns and ligatures in terms of slots (as the (V)PL format 
requires). Removing items from these lists would be *extremely* difficult, 
and a \resetslot wouldn't even know what list to remove anything from in the 
first place! The only practical solution would therefore be to hold off on 
making slot assignments until after all \setslot commands had been looked at 
once, but that in turn would require making an extra zeroeth pass over the 
ETX file just to figure this out. And my feeling (expressed in the quoted 
comment) is that Yet Another ETX Pass just isn't worth it.

> there's no way
> properly to override a slot; with multislot.sty I can do:
>
> \input multislot.sty
>
> \nextslot{n}
> \setslot{whatever}...\endsetslot
>
> \inputetx{t1}
>
> but then I can't add to a slot.

Could you clarify what you mean by "add to a slot" here? I don't see what it 
could possibly correspond to in a virtual font.

> I can see two solutions:
>
> 1. Make \resetslot work properly, then a slot can be overridden with
> multislot.sty.
>
> 2. Allow multislot.sty to take the last definition, not the first. Then I
> could do:
>
> \inputetx{t1}
>
> % Add to a slot
> \nextslot{n}
> \setslot{whatever}...\endsetslot
>
> \input multislot.sty
> \multislottakelast % Take last definition of a slot, not first

There's simply no way that could work. Bear in mind that fontinst makes 
*four* passes over each ETX file when generating a font! There's simply no 
such thing as a position halfway through an encoding where you could start 
to redefine the way things work, because any point in an ETX file is both 
preceeded (processing-wise) by the whole file and succeeded by the whole 
file, due to the situation with multiple passes.

> % Override a slot
> \nextslot{n}
> \setslot{whatever}...\endsetslot
>
> I'd argue that it's also more logical this way around, because that's how
> "overriding" normally works: you load the original version, then you
> override it.

There are indeed two possible principles for handling multiple definitions: 
first definition wins or last definition wins. If the latter is more common, 
then it is probably because it is the easiest to implement when each 
definition is like a variable assignment; defining just overwrites old contents.

Fontinst is however quite consistent in rather adhering to the "first 
definition wins" principle, at least in commands named \set<something>. For 
metrics, this comes at some cost, but is motivated by the observation that 
earlier definitions (in particular those made in font metrics files) are 
likely to be more specific and thus more authorative.

For encodings, it is really misleading to imagine the data being specified 
as a simple variable assignment; the reality is much more one of setting up 
a correspondance between things (e.g. glyphs and slots). This correspondance 
is in general not 1-to-1, so it is nothing like a simple assignment, and the 
way data that is actually stored more resembles having the "values" know 
where they are "stored" than "variables" knowing what is "stored in" them. 
So "first definition wins" is not only the consistent principle for this, it 
is also the by far easiest to implement!

> With multislot.sty as it stands, you have to put overrides
> first, and both overriding and adding to slots is impossible (unless I've
> missed something).

Hard for me to say, as I don't see what technical effect you seek to achieve 
by "adding to slots". Or what it amounts to.

> At present I can see only two rather unsatisfactory options:
>
> 1. Ship diffs to t1.etx and have my build process produce patched versions.

t1.etx is not particularly in flux, so shipping the patched versions is 
probably far more user-friendly than shipping a bunch of patches.

> 2. Ship a modified multislot.sty which implements \multislottakelast

Creating that in the first place would be a /highly/ nontrivial task.

> If there's a workaround I haven't thought of, I'd love to hear it.


Lars Hellström







More information about the fontinst mailing list