![](https://secure.gravatar.com/avatar/bc68bd7791a2261e6e59722afea6a5d0.jpg?s=120&d=mm&r=g)
List, Is there a way in ConTeXt to adjust the left-side kern for one character? The cap J in the font I am using is being set too close to the preceding characters and I would rather not insert a thinspace before each. (Inserting a thinspace is sufficient, but finer control is welcome.) -- Rik
![](https://secure.gravatar.com/avatar/60f3cc97f94fa3690ba406f8c1a7fc4f.jpg?s=120&d=mm&r=g)
On 12/23/19 10:19 AM, Rik Kabel wrote:
List,
Is there a way in ConTeXt to adjust the left-side kern for one character?
No, kerns always come in pairs.
The cap J in the font I am using is being set too close to the preceding characters and I would rather not insert a thinspace before each. (Inserting a thinspace is sufficient, but finer control is welcome.)
![](https://secure.gravatar.com/avatar/6114858d84b0f40cf715f12237ab67a1.jpg?s=120&d=mm&r=g)
On Sun, 22 Dec 2019 at 22:28, Henri Menke wrote:
On 12/23/19 10:19 AM, Rik Kabel wrote:
List,
Is there a way in ConTeXt to adjust the left-side kern for one character?
No, kerns always come in pairs.
Bounding boxes come per-character, though ;) I'm not familiar with details, but I would guess that it might be possible to change the bounding box of a character on the fly. Mojca
![](https://secure.gravatar.com/avatar/46562c7d27388490d62e8d7a5bc960dd.jpg?s=120&d=mm&r=g)
On 12/23/2019 10:13 AM, Mojca Miklavec wrote:
On Sun, 22 Dec 2019 at 22:28, Henri Menke wrote:
On 12/23/19 10:19 AM, Rik Kabel wrote:
List,
Is there a way in ConTeXt to adjust the left-side kern for one character?
No, kerns always come in pairs.
Bounding boxes come per-character, though ;) I'm not familiar with details, but I would guess that it might be possible to change the bounding box of a character on the fly. you can tweak the width when you load, boundingboxes can only be used for height and depth guessing (fonts provide width information)
Hans ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
![](https://secure.gravatar.com/avatar/114f07f31e228d83eece631b0937df73.jpg?s=120&d=mm&r=g)
Il 22/12/19 22:19, Rik Kabel ha scritto:
List,
Is there a way in ConTeXt to adjust the left-side kern for one character? The cap J in the font I am using is being set too close to the preceding characters and I would rather not insert a thinspace before each. (Inserting a thinspace is sufficient, but finer control is welcome.)
\definecharacterspacing[distantJ] \setupcharacterspacing[distantJ]["004A][left=.15,alternative=1] % 004A is the unicode hex index of letter J \starttext normal: AJB\par \setcharacterspacing[distantJ] more space on the left: AJB\par \resetcharacterspacing normal again: AJB\par \stoptext
![](https://secure.gravatar.com/avatar/e07e15a8be3c4c1723f5a0397bc17424.jpg?s=120&d=mm&r=g)
On 12/22/2019 17:40, mf wrote:
Il 22/12/19 22:19, Rik Kabel ha scritto:
List,
Is there a way in ConTeXt to adjust the left-side kern for one character? The cap J in the font I am using is being set too close to the preceding characters and I would rather not insert a thinspace before each. (Inserting a thinspace is sufficient, but finer control is welcome.)
\definecharacterspacing[distantJ] \setupcharacterspacing[distantJ]["004A][left=.15,alternative=1] % 004A is the unicode hex index of letter J \starttext normal: AJB\par \setcharacterspacing[distantJ] more space on the left: AJB\par \resetcharacterspacing normal again: AJB\par \stoptext
Thank you for that, Massi. Unfortunately, that is too blunt an instrument in this case -- in addition to the body font where the problem exists, it works on the heading and titling font, which does not share the problem. As Henri's answer hints, I was a bit unclear in my request. It is a kern between a word space and the cap J that is the issue. Perhaps a font feature file is the place to do such a thing. -- Rik
![](https://secure.gravatar.com/avatar/60f3cc97f94fa3690ba406f8c1a7fc4f.jpg?s=120&d=mm&r=g)
On 12/23/19 2:30 PM, Rik Kabel wrote:
On 12/22/2019 17:40, mf wrote:
Il 22/12/19 22:19, Rik Kabel ha scritto:
List,
Is there a way in ConTeXt to adjust the left-side kern for one character? The cap J in the font I am using is being set too close to the preceding characters and I would rather not insert a thinspace before each. (Inserting a thinspace is sufficient, but finer control is welcome.)
\definecharacterspacing[distantJ] \setupcharacterspacing[distantJ]["004A][left=.15,alternative=1] % 004A is the unicode hex index of letter J \starttext normal: AJB\par \setcharacterspacing[distantJ] more space on the left: AJB\par \resetcharacterspacing normal again: AJB\par \stoptext
Thank you for that, Massi.
Unfortunately, that is too blunt an instrument in this case -- in addition to the body font where the problem exists, it works on the heading and titling font, which does not share the problem.
As Henri's answer hints, I was a bit unclear in my request. It is a kern between a word space and the cap J that is the issue. Perhaps a font feature file is the place to do such a thing.
\startluacode fonts.handlers.otf.addfeature { name = "kern", type = "kern", data = { [" "] = { ["J"] = 1000 % exaggerated value } } } \stopluacode \setupbodyfont[modern] % have to reload the font \starttext No Jokes! \stoptext
![](https://secure.gravatar.com/avatar/60f3cc97f94fa3690ba406f8c1a7fc4f.jpg?s=120&d=mm&r=g)
On 12/23/19 3:33 PM, Henri Menke wrote:
On 12/23/19 2:30 PM, Rik Kabel wrote:
On 12/22/2019 17:40, mf wrote:
Il 22/12/19 22:19, Rik Kabel ha scritto:
List,
Is there a way in ConTeXt to adjust the left-side kern for one character? The cap J in the font I am using is being set too close to the preceding characters and I would rather not insert a thinspace before each. (Inserting a thinspace is sufficient, but finer control is welcome.)
\definecharacterspacing[distantJ] \setupcharacterspacing[distantJ]["004A][left=.15,alternative=1] % 004A is the unicode hex index of letter J \starttext normal: AJB\par \setcharacterspacing[distantJ] more space on the left: AJB\par \resetcharacterspacing normal again: AJB\par \stoptext
Thank you for that, Massi.
Unfortunately, that is too blunt an instrument in this case -- in addition to the body font where the problem exists, it works on the heading and titling font, which does not share the problem.
As Henri's answer hints, I was a bit unclear in my request. It is a kern between a word space and the cap J that is the issue. Perhaps a font feature file is the place to do such a thing.
\startluacode fonts.handlers.otf.addfeature { name = "kern", type = "kern", data = { [" "] = { ["J"] = 1000 % exaggerated value
Should of course be a Lua comment ["J"] = 1000 -- exaggerated value
} } } \stopluacode
\setupbodyfont[modern] % have to reload the font
\starttext
No Jokes!
\stoptext
![](https://secure.gravatar.com/avatar/e07e15a8be3c4c1723f5a0397bc17424.jpg?s=120&d=mm&r=g)
On 12/22/2019 21:34, Henri Menke wrote:
On 12/23/19 3:33 PM, Henri Menke wrote:
On 12/23/19 2:30 PM, Rik Kabel wrote:
On 12/22/2019 17:40, mf wrote:
Il 22/12/19 22:19, Rik Kabel ha scritto:
List,
Is there a way in ConTeXt to adjust the left-side kern for one character? The cap J in the font I am using is being set too close to the preceding characters and I would rather not insert a thinspace before each. (Inserting a thinspace is sufficient, but finer control is welcome.)
\definecharacterspacing[distantJ] \setupcharacterspacing[distantJ]["004A][left=.15,alternative=1] % 004A is the unicode hex index of letter J \starttext normal: AJB\par \setcharacterspacing[distantJ] more space on the left: AJB\par \resetcharacterspacing normal again: AJB\par \stoptext
Thank you for that, Massi.
Unfortunately, that is too blunt an instrument in this case -- in addition to the body font where the problem exists, it works on the heading and titling font, which does not share the problem.
As Henri's answer hints, I was a bit unclear in my request. It is a kern between a word space and the cap J that is the issue. Perhaps a font feature file is the place to do such a thing.
\startluacode fonts.handlers.otf.addfeature { name = "kern", type = "kern", data = { [" "] = { ["J"] = 1000 % exaggerated value
Should of course be a Lua comment
["J"] = 1000 -- exaggerated value
} } } \stopluacode
\setupbodyfont[modern] % have to reload the font
\starttext
No Jokes!
\stoptext
Henri, This looks very promising. It works, mostly. That is, all fonts that use default fontfeatures pick up the change. So, for example, the companion sansserif for my body font also gets it even though that is not what I want. I can remove kerning from the default fontfeatures and add it back just for the problematic font, but that means no kerning for the sans font. Is there a way to apply this to one font only (serif upright, bold, italic, ...) or even a single face (upright), perhaps by giving it a unique name? I have tried a few variations but had no success. The fonts-mkiv manual has very little on this, and the cld manual nothing. -- Rik
![](https://secure.gravatar.com/avatar/e07e15a8be3c4c1723f5a0397bc17424.jpg?s=120&d=mm&r=g)
On 12/23/2019 18:45, Rik Kabel wrote:
On 12/22/2019 21:34, Henri Menke wrote:
On 12/23/19 3:33 PM, Henri Menke wrote:
On 12/23/19 2:30 PM, Rik Kabel wrote:
On 12/22/2019 17:40, mf wrote:
Il 22/12/19 22:19, Rik Kabel ha scritto:
List,
Is there a way in ConTeXt to adjust the left-side kern for one character? The cap J in the font I am using is being set too close to the preceding characters and I would rather not insert a thinspace before each. (Inserting a thinspace is sufficient, but finer control is welcome.)
\definecharacterspacing[distantJ] \setupcharacterspacing[distantJ]["004A][left=.15,alternative=1] % 004A is the unicode hex index of letter J \starttext normal: AJB\par \setcharacterspacing[distantJ] more space on the left: AJB\par \resetcharacterspacing normal again: AJB\par \stoptext
Thank you for that, Massi.
Unfortunately, that is too blunt an instrument in this case -- in addition to the body font where the problem exists, it works on the heading and titling font, which does not share the problem.
As Henri's answer hints, I was a bit unclear in my request. It is a kern between a word space and the cap J that is the issue. Perhaps a font feature file is the place to do such a thing.
\startluacode fonts.handlers.otf.addfeature { name = "kern", type = "kern", data = { [" "] = { ["J"] = 1000 % exaggerated value
Should of course be a Lua comment
["J"] = 1000 -- exaggerated value
} } } \stopluacode
\setupbodyfont[modern] % have to reload the font
\starttext
No Jokes!
\stoptext
Henri,
This looks very promising. It works, mostly. That is, all fonts that use default fontfeatures pick up the change. So, for example, the companion sansserif for my body font also gets it even though that is not what I want.
I can remove kerning from the default fontfeatures and add it back just for the problematic font, but that means no kerning for the sans font.
Is there a way to apply this to one font only (serif upright, bold, italic, ...) or even a single face (upright), perhaps by giving it a unique name? I have tried a few variations but had no success. The fonts-mkiv manual has very little on this, and the cld manual nothing.
Okay, I have progressed further but have run into something (else) I cannot understand. Consider the following example: \definefontfeature [myserif] [mode=node,kern=yes,xkern=yes] \definefontfeature [mysans] [mode=node,kern=yes,xkern=no] \definefontfeature [none] [mode=node] \definefontfamily [mykerns] [serif] [Baskervaldx] [features=myserif] \definefontfamily [mykerns] [sans] [Dejavusans] [features=mysans] \definefontfamily [default] [serif] [Baskervaldx] [features=default] \definefontfamily [default] [sans] [Dejavusans] [features=default] \definefontfamily [nokerns] [serif] [Baskervaldx] [features=none] \definefontfamily [nokerns] [sans] [Dejavusans] [features=none] \definefontfamily [legends] [mono] [Dejavusansmono] [features=default] \startluacode fonts.handlers.otf.addfeature { name = "kern", type = "kern", data = { ["x"] = { ["x"] = -300 }, [" "] = { ["A"] = 1000 } } } fonts.handlers.otf.addfeature { name = "xkern", type = "kern", data = { ["x"] = { ["x"] = 500 }, [" "] = { ["J"] = 500 } } } \stopluacode \startbuffer[Sample] g, Jaxxb AJon \stopbuffer \define[2]\Test{ {\switchtobodyfont[#1]#2\getbuffer[Sample]}} \setupbodyfont[legends] \starttext \starttabulate[|l|l|l|] \NC test \NC Serif \NC Sans \NC \NR \NC nokerns \NC \Test{nokerns}{\tf} \NC \Test{nokerns}{\ss} \NC \NR \NC default \NC \Test{default}{\tf} \NC \Test{default}{\ss} \NC \NR \NC mykerns \NC \Test{mykerns}{\tf} \NC \Test{mykerns}{\ss} \NC \NR \stoptabulate \stoptext It shows, as far as I see, that the kern feature type supports " ", but only when it is named kern. When it is named xkern, as here, it does not support spaces, but does support other characters. If I can get support for a separate feature name, I can easily apply this corrective kern to the single problematic font. I also tried a goodie file, but it, too, did not support the " ". -- Rik
![](https://secure.gravatar.com/avatar/46562c7d27388490d62e8d7a5bc960dd.jpg?s=120&d=mm&r=g)
Okay, I have progressed further but have run into something (else) I cannot understand. Consider the following example:
\definefontfeature [myserif] [mode=node,kern=yes,xkern=yes] \definefontfeature [mysans] [mode=node,kern=yes,xkern=no] \definefontfeature [none] [mode=node] \definefontfamily [mykerns] [serif] [Baskervaldx] [features=myserif] \definefontfamily [mykerns] [sans] [Dejavusans] [features=mysans] \definefontfamily [default] [serif] [Baskervaldx] [features=default] \definefontfamily [default] [sans] [Dejavusans] [features=default] \definefontfamily [nokerns] [serif] [Baskervaldx] [features=none] \definefontfamily [nokerns] [sans] [Dejavusans] [features=none] \definefontfamily [legends] [mono] [Dejavusansmono] [features=default]
\startluacode fonts.handlers.otf.addfeature { name = "kern", type = "kern", data = { ["x"] = { ["x"] = -300 }, [" "] = { ["A"] = 1000 } } } fonts.handlers.otf.addfeature { name = "xkern", type = "kern", data = { ["x"] = { ["x"] = 500 }, [" "] = { ["J"] = 500 } } } \stopluacode
\startbuffer[Sample] g, Jaxxb AJon \stopbuffer
\define[2]\Test{ {\switchtobodyfont[#1]#2\getbuffer[Sample]}}
\setupbodyfont[legends]
\starttext \starttabulate[|l|l|l|] \NC test \NC Serif \NC Sans \NC \NR \NC nokerns \NC \Test{nokerns}{\tf} \NC \Test{nokerns}{\ss} \NC \NR \NC default \NC \Test{default}{\tf} \NC \Test{default}{\ss} \NC \NR \NC mykerns \NC \Test{mykerns}{\tf} \NC \Test{mykerns}{\ss} \NC \NR \stoptabulate \stoptext
It shows, as far as I see, that the kern feature type supports " ", but only when it is named kern. When it is named xkern, as here, it does not support spaces, but does support other characters. Indeed it's currently bound to 'kern' (mostly for convenience and a
On 12/26/2019 1:41 PM, Rik Kabel wrote: little for performance) but it's not that hard to make it a bit more flexible (but not today). Hans ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
![](https://secure.gravatar.com/avatar/e07e15a8be3c4c1723f5a0397bc17424.jpg?s=120&d=mm&r=g)
On 12/26/2019 08:40, Hans Hagen wrote:
On 12/26/2019 1:41 PM, Rik Kabel wrote:
Okay, I have progressed further but have run into something (else) I cannot understand. Consider the following example:
\definefontfeature [myserif] [mode=node,kern=yes,xkern=yes] \definefontfeature [mysans] [mode=node,kern=yes,xkern=no] \definefontfeature [none] [mode=node] \definefontfamily [mykerns] [serif] [Baskervaldx] [features=myserif] \definefontfamily [mykerns] [sans] [Dejavusans] [features=mysans] \definefontfamily [default] [serif] [Baskervaldx] [features=default] \definefontfamily [default] [sans] [Dejavusans] [features=default] \definefontfamily [nokerns] [serif] [Baskervaldx] [features=none] \definefontfamily [nokerns] [sans] [Dejavusans] [features=none] \definefontfamily [legends] [mono] [Dejavusansmono] [features=default]
\startluacode fonts.handlers.otf.addfeature { name = "kern", type = "kern", data = { ["x"] = { ["x"] = -300 }, [" "] = { ["A"] = 1000 } } } fonts.handlers.otf.addfeature { name = "xkern", type = "kern", data = { ["x"] = { ["x"] = 500 }, [" "] = { ["J"] = 500 } } } \stopluacode
\startbuffer[Sample] g, Jaxxb AJon \stopbuffer
\define[2]\Test{ {\switchtobodyfont[#1]#2\getbuffer[Sample]}}
\setupbodyfont[legends]
\starttext \starttabulate[|l|l|l|] \NC test \NC Serif \NC Sans \NC \NR \NC nokerns \NC \Test{nokerns}{\tf} \NC \Test{nokerns}{\ss} \NC \NR \NC default \NC \Test{default}{\tf} \NC \Test{default}{\ss} \NC \NR \NC mykerns \NC \Test{mykerns}{\tf} \NC \Test{mykerns}{\ss} \NC \NR \stoptabulate \stoptext
It shows, as far as I see, that the kern feature type supports " ", but only when it is named kern. When it is named xkern, as here, it does not support spaces, but does support other characters. Indeed it's currently bound to 'kern' (mostly for convenience and a little for performance) but it's not that hard to make it a bit more flexible (but not today).
Hans
Thank you for the confirmation. I look forward to the update. -- Rik
participants (6)
-
Hans Hagen
-
Henri Menke
-
mf
-
Mojca Miklavec
-
Rik Kabel
-
Rik Kabel