While each designer might have their own workflow, this tutorial illustrates our recommended step-by-step process to build a Devanagari font by utilizing all of Glyphs’ cool features!
Setting up a Devanagari font file
When you create a new file in Glyphs (File > New, Cmd-N), it will open a window with Latin characters by default. There are two ways to add glyphs for Devanagari – one through Glyph > Add Glyphs (Cmd-Shift-G), or from the sidebar under the Languages > Indic > Devanagari section. Right-click on the subcategories inside Devanagari to see a list of glyphs included in each section then you can select the ones to add to the font:
You can see that all Devanagari glyphs have descriptive glyph names and a
-deva suffix. This makes it possible for the app to determine the script of the glyph and automatically build the appropriate OpenType code later on.
The First Step
Let's start with the most basic element of a Devanagari letter, the vertical stroke as found in
aaMatra-deva. This defines the most basic proportions of our Devanagari letterforms, and it is used in most glyphs. So it would be great if we could design it once, and use it as a component in all the other glyphs needing it. You will find this character listed in the sidebar under Languages > Indic > Devanagari > Vowels. Or you can manually add it by typing Cmd-Shift-G, then, in the upcoming dialog, aaMatra-deva and pressing the Generate button.
You can also go ahead and add a value for the shoulder-line with the
shoulderHeight custom parameter in File > Font Info > Masters (cmd-I). This will help the placement of anchors in not only the aaMatra-deva, but many other glyphs as well.
Pro tip: In File > Font Info > Masters, we can also set an alignment zone for the entire headline thickness (with a negative value that goes down from the shoulder height). this will allow us to easily make sure our shirorekha always has the correct thickness.
A note about spacing: Devanagari usually has a connecting headline, so you will probably want to extend the headline out slightly, so the sidebearings have negative values. You can define a standard value here and it will apply to many glyphs later on as well. Don’t worry, if you change your mind later, it’s very easy to update everything at once.
It is never too early to start thinking about anchors. Most vowel and intonation marks will align in the same place relative to the vertical stem, so we can simply add anchors to the aaMatra-deva and they will be automatically copied to any glyph using this as a component. With the
shoulderHeight defined, you only need to run Glyph > Set Anchors (Cmd-U), and the anchors will be automatically added at the correct vertical height. You may need to move them horizontally depending on your design.
Hint: In components, anchors ‘shine through’ from their original glyph. So you do not need to set anchors in compound glyphs. However, if necessary, we can override these anchors by placing another anchor of the same name in higher-order components.
Building Compounds from Half-Consonants and Half-Forms
Now we can prepare the components needed for the consonants. Most of the consonants are constructed with a half-form connected to the
aaMatra-deva. These half-forms are not only used to form the full consonants, but also to build conjuncts – the ligatures of two or more consonants where the inherent vowel
aaMatra-deva has been deleted (e.g. ‘pepper’ = पेप्पर). More about conjuncts later, let’s first design the
p-deva, which is the half-form of
pa-deva. You may now want to go ahead and add the half-forms from the aptly named Halfform section in the sidebar.
To create the full consonant
pa-deva, we can generate that glyph (via Glyph > Add Glyphs…, Cmd-Shift-G), then add the
aaMatra-deva as components by choosing Glyph > Add Component (Cmd-Shift-C) for both of them. If you are not happy with the alignment, you can just adjust the right sidebearing of the
p-deva to look good next to an
aaMatra-deva, then the
pa-deva should automatically match perfectly.
Using this approach, we can design much of the basic Devanagari consonants. Let’s go ahead and add some more in the same way:
Completing the Basic Consonants
You will notice that not all consonants can be built from half-forms, e.g., glyphs like
ha-deva. These will need custom designed full forms. In cases like this, we generally draw the full forms first, then use those as the basis for their half forms.
There is also a small set of hanging consonants that do not have normal half-forms:
tta-deva ttha-deva dda-deva ddha-deva da-deva nga-deva. Instead of turning into a half-form, they receive a ‘halant’ at the bottom (also referred to as ‘virama’). In other words, now may be a good time to draw the
halant-deva glyph. Find it in the sidebar under Languages > Indic > Devanagari > Marks. Do not forget to hit Cmd-U to give the halant an anchor.
Once you have the hanging consonants and the halant in your font, you can create the remaining consonants: Choose Glyph > Add Glyphs… and paste this:
tt-deva tth-deva dd-deva ddh-deva d-deva ng-deva
Then press Generate. I.e., the same glyph names, but without the
a at the end. Glyphs is smart enough to create them right away as compounds of the respective hanging consonant and the halant.
Spacing Consonants and Kerning Groups
We can start spacing our glyphs by switching to the Text tool (T) in an Edit view. Let’s space the
tta-deva next to an
We can go ahead and define the right kerning group for all the consonants using
aaMatra-deva at this stage. As for the left groups, you can identify similar left side shapes and define those as well; be sure to also do it for the half-forms.
Hint: To quickly find all compounds containing the
aaMatra-deva, right-click on it and choose Show all glyphs using this glyph as component from its context menu.
Conjuncts are another important element needed to correctly render the Devanagari script. The way you choose to form these will vary depending on your design. Generally, most can be written horizontally/linearly, as a combination of a half-form and full consonant. Others occur either vertically stacked or combined into a more complex letterform – these are referred to as ‘akhand conjuncts’.
In this comparison, you can see how some linear conjuncts are built with default half-forms, and then, their modified, custom versions to make nicer clusters:
If one considers any two, three, four or more consonant combinations, there can be thousands of combinations. Sanskrit requires many conjuncts – and many of them are of the akhand variety. But Hindi, Marathi and other modern languages use conjuncts less frequently. So if one were to support advanced Sanskrit, the number of akhand conjuncts to be designed could easily be a few thousand. Hence, the function of the font will decide the character set. If you are looking to support modern Hindi, Marathi, Sindhi, Nepali, etc., the number of conjuncts required could be considerably less.
Instead of designing all the thousands of possible combinations, Glyphs allows for the linear conjuncts to be automatically composed from the half-forms and full-forms we designed earlier. It will be up to the style and requirements of your design to decide which, or how many, linear conjuncts you will custom-design. In some cases you may need very few, other times you may need lots. There is no easy way around it, you will need to test all the combinations to see which look good by default and which should have custom linear conjuncts.
Generating the OpenType Features
As alluded to earlier, Devanagari requires a lot of complicated OpenType code to get it to render correctly. Fear not, Glyphs can generate it all automatically! Open File > Font Info > Features (Cmd-I). Now just press the Update button and Glyphs will write all the OpenType code needed to preview what you have so far.
If you haven’t noticed already, in the Edit view you can insert any character by pressing Cmd-F. Try inserting a consonant, a halant, and another a consonant. Now look in the lower left corner of the Edit view, and click the Features button: The features and languages your typeface supports are now listed under their scripts. Select Devanagari to see the OpenType code in action:
Different Forms for ra-deva
Now let’s move on to the shapeshifting letter Ra. In Devanagari, the Ra can take on four different forms depending on its context. If it is first in a cluster, it becomes a Reph, and is placed over the vertical stem of the last full-form consonant in the cluster.
If the Ra is placed after consonants with a vertical stroke, it will turn into a ‘leg’, attached to the vertical stem of the preceding consonant:
But wait, there’s more. If the Ra combines with a consonant without a vertical stroke, it becomes a Rakar. This applies primarily to
tta_ra-deva ttha_ra-deva dda_ra-deva ddha_ra-deva cha_ra-deva:
But wait, there’s even more! In Marathi, the Ra can also take on the form of an ‘eyelash’:
Phew! Let’s quickly recap these variations.
The Reph and the Rakar are easy. Just create
rakar-deva, draw your shapes, and place the anchors with Cmd-U. By the way, both
rakar-deva are in the sidebar under Languages > Indic > Devanagari > Marks.
The ‘leg’ form conjuncts takes a bit more effort. Let’s first design
rakar-deva.leg (note the dot suffix
.leg) to use as a component. This one is not in the sidebar, so just create it manually with Glyph > Add Glyphs… (Cmd-Shift-G). Once we have done that, we can place a
_leg anchor in it: right-click in the canvas, choose Add Anchor from the context menu, then type the anchor name:
This leg form of Ra can also appear in the middle of clusters. For that, we should also design ‘half-conjuncts’. Such a concept does not exactly exist in Devanagari, but by utilizing these new glyphs as components, we can dynamically create numerous custom looking conjuncts – without actually having to design every conceivable permutation individually.
To have the
rakar-deva.leg automatically connect to the consonants, we should place a
leg anchor on all the half-consonants. This way, they will show up as a combination with the half-forms as well as the full-forms. You can then generate the conjuncts from the sidebar, or with Glyph > Add Glyphs… (Cmd-Shift-G) and manually typing names. But pay attention because correct naming of these conjuncts is essential for Glyphs to construct the compounds and automatically generate the OpenType feature code.
It’s important to note that the nomenclature of Ra conjuncts is slightly different from the other conjuncts. Name the conjuncts the way they look. In the case of the text
pa-deva halant-deva ra-deva we see a
pa-deva with a Ra (the Ra has the form of a leg, but it is a Ra none the less). Therefore we call the conjunct
pa_ra-deva. Once you make the conjunct glyphs using the anchor, you might want to change the position and angle of the leg depending on the consonant it appears with. In some cases, you may have to decompose the components to ensure that the leg does not clash with the consonant.
Pro Tip: you can make your
rakar-deva.legas a smart component to allow for modifications without decomposition.
Let’s make the ‘half-conjunct’ for
pa-deva halant-deva ra-deva halant-deva. Following the visual-appearance model of naming, our new glyph should be named
Creating half-conjuncts will speed up the generating of the full-form akhand conjuncts. And it will allow for more dynamic building of complex linear conjuncts, like this fake one:
This is working great so far but what about the Nukta (nukta-deva)? Begin by drawing this little dot, or using another existing dot as a component. Then hit Cmd-U to add the appropriate anchor.
Luckily for us, anchors found inside components will get used, they ‘shine through’. This usually saves a lot of work (just think about the
aaMatra-deva). But sometimes the anchor position in a component will cause problems with more complicated conjuncts. Then you can override the anchor by placing an anchor with the same name in the compound.
Now let’s look at this
p_ra-deva that we just made. In cases like these, we can avoid this overlap by adding a
nukta anchor in the
p_ra-deva glyph. Now anytime you use this component, the new anchor will always override the
nukta that shines through from the
Creating Vowel Marks
Devanagari vowel marks, or ‘matras’, are forms of vowels that appear in combination with consonants and conjuncts. Most will be positioned automatically with the help of
bottom anchors. We took care of this already when we created the stem anchor at the beginning:
Just like with the
nukta anchor, you should check each glyph and the vowel positions, because on certain combinations, they will need to be adjusted.
The i matras are another exception to the rule. They need their own special
imatra anchor to work properly. (Hint:
iiMatra-deva gets an
iimatra anchor.) Depending on your design, you might choose to create any number of
iMatra-deva length variations. The
iMatra-deva glyph should extend to connect with the vertical stem of the modified letter, and this can vary significantly because of the numerous conjunct possibilities. But this is also a stylistic decision, so you may want more or fewer options.
Create as many
iMatra-deva variants with number suffixes as you feel necessary:
iMatra-deva.001 iMatra-deva.002 iMatra-deva.003, etc., and give each of them an
imatra anchor (Cmd-U). Glyphs will use these anchors to calculate which
iMatra-deva variant is best fitting to your top anchors in your main consonants and conjuncts when it is generating the OpenType code. To check on the result, see the
pres feature in File > Font Info > Features.
Hint: In the mekkablue scripts repository, there is a script called Masters > Variation Interpolator. It will create any number of interpolation steps between the foreground and background of a selected glyph. So you can draw the shortest i matra in the foreground layer, select all (Cmd-A) and copy it to the background layer (Paths > Selection to Background, Cmd-J), switch to the background (Paths > Edit Background, Cmd-B), and turn the i matra into its longest variant, while keeping the outlines compatible with the foreground. You can Ctrl-Opt-drag the nodes at the tip to extend curves elegantly. Once you are done, run the Variation Interpolator script, and update your features.
There are more nice tricks to setting up the
iMatra-devalength variations. They can be also be made with smart components. This will soon be covered in a separate post.
So, that is an overview of our recommendations for developing Devanagari fonts. Gone are the days of being overwhelmed by complicated OT coding, you can now just focus on making beautiful typefaces and let Glyphs do the heavy lifting in production.
Guest tutorial by Kimya Gandhi and Rob Keller (Mota Italic, Mumbai).
SAMPLE FONT: VESPER DEVANAGARI BY MOTA ITALIC