{"course":{"slug":"vector-and-print","title":"Vectors, Logos and Things That Get Printed","url":"https://addaly.com/learn/vector-and-print","level":"beginner","track":"create"},"lesson":{"slug":"complex-scripts","title":"Devanagari, Arabic, and the scripts that break","url":"https://addaly.com/learn/vector-and-print/complex-scripts","position":24,"of":73,"minutes":10,"answer":"Complex scripts need a shaping engine that forms conjuncts and reorders matras, so the same text can be correct on screen and wrong in the PDF: test with a real string of hard cases.","keyIdea":"Complex scripts need a shaping engine that forms conjuncts and reorders matras, so the same text can be correct on screen and wrong in the PDF: test with a real string of hard cases, have a native reader check it before outlining, and never use legacy non-Unicode fonts."},"body":{"format":"markdown","text":"## Latin is the easy case\n\nIn Latin, a string of characters maps almost one-to-one onto a string of glyphs, left to right. Almost every text engine gets it right.\n\nMost of the world's scripts do not work that way, and the failures are specific and recognisable.\n\n## What shaping means\n\nBetween \"the user typed these characters\" and \"draw these glyphs here\" sits a **shaping engine**, which consults the font's `GSUB` and `GPOS` tables and applies rules. For Devanagari the rules include:\n\n- **Conjuncts.** क + ् + ष becomes क्ष: one glyph, not three. There are hundreds of these and the font must contain them.\n- **Reordering.** The vowel sign ि is typed *after* its consonant and drawn *before* it. कि is stored as क then ि and rendered with the matra on the left.\n- **Matra positioning.** Vowel marks attach above, below, left or right, and their exact position depends on the consonant's width and on whether a conjunct formed.\n- **Reph.** र followed by a virama moves to the top right of the following cluster as a small hook.\n\nArabic adds contextual forms (each letter has isolated, initial, medial and final shapes) plus right-to-left order and vertical stacking in some styles. Tamil, Kannada, Telugu, Bengali, Khmer and Thai each have their own rules.\n\n**HarfBuzz** is the open-source shaping engine that does this correctly, and it is what LibreOffice, Firefox, Chrome, Android, Scribus and Inkscape 1.x use. Applications that use an older engine, or their own, get it wrong in visible ways.\n\n## The failures you will see\n\n- **Boxes** (`□`) or the missing-glyph rectangle: the font has no glyph for that character. Change the font.\n- **Conjuncts split into separate letters with a visible virama**: the shaping ran but the font lacks the conjunct, so it fell back to the explicit half-form. Change the font.\n- **Matras in the wrong place, or detached**: the engine did not reorder. This is an application problem, not a font problem.\n- **Correct on screen, wrong in the PDF**: the export path used a different engine from the editing view. This is the one that costs money, because it is invisible until the proof arrives.\n\n## The test you must actually run\n\nNever test a complex script with placeholder text. Type the client's real name, the real address, the real headline, in the real font, at the real size, and look at it.\n\nBuild a test string that exercises the hard cases. For Devanagari:\n\n```\nक्ष त्र ज्ञ श्री हिन्दी कार्यालय द्वितीय पुस्तक\n```\n\nThose cover a three-consonant conjunct, a reph, a left-side matra and a below-base form. If all of them render correctly, the combination of font and application is sound. If any of them is wrong, you have found it in thirty seconds rather than after printing.\n\n## Outlining a complex script\n\nThis is where jobs are lost. Converting to curves freezes whatever the shaping engine produced. If the engine was wrong, you have now made the error permanent and undetectable: the file no longer contains characters anyone can proofread, only shapes.\n\nSo the order is:\n\n1. Render it.\n2. **Have a native reader check it on screen**, at size, before you outline anything.\n3. Outline.\n4. Check the outlined version against the live version, side by side, letter by letter.\n\nStep 2 is not optional and it is not something you can do yourself unless you read the script. A wrong matra is not a typo a non-reader can see.\n\n> Figure: The only safe order for a complex script. Steps: 1. Set it live (Real words, real font, real size); 2. A reader checks (Somebody who reads the script, on screen); 3. Outline (Only now, and the shaping is frozen); 4. Compare (Outlined against live, letter by letter). Outlining freezes whatever the shaping engine produced. After step three the file holds shapes rather than characters, so a wrong matra can no longer be proofread by anybody, in any application, ever.\n\n## Font sources that work\n\n- **Noto**: Google's family, covering essentially every script in Unicode, OFL, well-shaped.\n- **Ek Type**: Mukta, Baloo and others, designed for Devanagari and Gujarati first rather than Latin-first.\n- **Indian Type Foundry / Fontshare**: high-quality Indic and Latin.\n- **Google Fonts' Indic section**: Hind, Rozha, Yantramanav, Tiro Devanagari.\n\nAvoid legacy non-Unicode fonts entirely: Kruti Dev, Chanakya, Shree-Lipi and similar map Devanagari shapes onto Latin codepoints. Text set in them is not Devanagari at all; it is Latin letters wearing a costume. It cannot be searched, spellchecked, copied into anything, or converted without a mapping tool. A great deal of Indian government and legal material is still typed this way, and converting it is real paid work; tools like the free `Unicode Converter` scripts and several web converters handle the common mappings.\n\n## In each program\n\nInkscape 1.x and Scribus use HarfBuzz and are dependable. LibreOffice is dependable. Illustrator needs the **World-Ready Composer** enabled: Paragraph panel menu ▸ *Middle Eastern & South Asian Composer*; without it, Indic text will not shape. CorelDRAW's support varies markedly by version and is the single most common source of broken conjuncts in Indian print work. Test your own version with the string above before you promise anybody anything."},"check":{"question":"A Hindi wedding card renders correctly in the designer's editing window, but the exported PDF shows the ि matra after its consonant rather than before it. The font contains every required glyph. Where is the fault?","options":[{"text":"The font lacks the reordering rules in its `GSUB` table, which only load when the font is embedded rather than installed.","correct":false,"tempting":"Font tables do not behave differently when embedded, and the question states the font has the glyphs; reordering is applied by the engine, not stored per-render."},{"text":"The PDF export path used a different text engine from the editing view, and that one did not apply the reordering rules.","correct":true},{"text":"The text was outlined on export, and outlining always freezes glyphs in their stored character order.","correct":false,"tempting":"Outlining freezes whatever the engine produced. If the engine had shaped correctly, the outlines would be in the correct visual order."},{"text":"The PDF was exported in a version that predates Unicode support for Devanagari, so the characters fell back to code order.","correct":false,"tempting":"PDF has carried Unicode text for decades and glyph positions are written explicitly, not reconstructed from character codes at display time."}]},"prev":{"slug":"type-on-a-path","title":"Type on a curve, and why it splays","url":"https://addaly.com/learn/vector-and-print/type-on-a-path"},"next":{"slug":"figures-dashes-and-missing-glyphs","title":"Figures, dashes and the characters nobody checks","url":"https://addaly.com/learn/vector-and-print/figures-dashes-and-missing-glyphs"},"authorship":"Founder and series editor: Dr Mustafa Mun. Written by AI models to a written standard. Exam keys checked blind by a second model: 3,665 of 3,666 agreed. Academic review invited.","review":{"status":"Draft, open for academic review"},"cite":"Addaly (2026) 'Devanagari, Arabic, and the scripts that break', in Vectors, Logos and Things That Get Printed. Edited by M. Mun. Addaly. Available at: https://addaly.com/learn/vector-and-print/complex-scripts (Accessed: 13 October 2026).","licence":{"name":"CC BY-NC-SA 4.0","url":"https://creativecommons.org/licenses/by-nc-sa/4.0/"},"reader":{"schema":1,"title":"Devanagari, Arabic, and the scripts that break","courseTitle":"Vectors, Logos and Things That Get Printed","module":{"index":3,"slug":"type-as-shape","title":"Type, which is also vector"},"answer":null,"keyIdea":"Complex scripts need a shaping engine that forms conjuncts and reorders matras, so the same text can be correct on screen and wrong in the PDF: test with a real string of hard cases, have a native reader check it before outlining, and never use legacy non-Unicode fonts.","hero":{"kind":"figure","figure":{"t":"figure","label":"Figure","figure":{"type":"flow","steps":[{"label":"Set it live","detail":"Real words, real font, real size"},{"label":"A reader checks","detail":"Somebody who reads the script, on screen"},{"label":"Outline","detail":"Only now, and the shaping is frozen"},{"label":"Compare","detail":"Outlined against live, letter by letter"}],"title":"The only safe order for a complex script","caption":"Outlining freezes whatever the shaping engine produced. After step three the file holds shapes rather than characters, so a wrong matra can no longer be proofread by anybody, in any application, ever."},"alt":"Figure: The only safe order for a complex script. Steps: 1. Set it live (Real words, real font, real size); 2. A reader checks (Somebody who reads the script, on screen); 3. Outline (Only now, and the shaping is frozen); 4. Compare (Outlined against live, letter by letter). Outlining freezes whatever the shaping engine produced. After step three the file holds shapes rather than characters, so a wrong matra can no longer be proofread by anybody, in any application, ever."}},"blocks":[{"t":"h2","id":"latin-is-the-easy-case","runs":[{"text":"Latin is the easy case"}]},{"t":"p","runs":[{"text":"In Latin, a string of characters maps almost one-to-one onto a string of glyphs, left to right. Almost every text engine gets it right."}]},{"t":"p","runs":[{"text":"Most of the world’s scripts do not work that way, and the failures are specific and recognisable."}]},{"t":"h2","id":"what-shaping-means","runs":[{"text":"What shaping means"}]},{"t":"p","runs":[{"text":"Between “the user typed these characters” and “draw these glyphs here” sits a "},{"text":"shaping engine","b":true},{"text":", which consults the font’s "},{"text":"GSUB","code":true},{"text":" and "},{"text":"GPOS","code":true},{"text":" tables and applies rules. For Devanagari the rules include:"}]},{"t":"ul","items":[[{"text":"Conjuncts.","b":true},{"text":" क + ् + ष becomes क्ष: one glyph, not three. There are hundreds of these and the font must contain them."}],[{"text":"Reordering.","b":true},{"text":" The vowel sign ि is typed "},{"text":"after","i":true},{"text":" its consonant and drawn "},{"text":"before","i":true},{"text":" it. कि is stored as क then ि and rendered with the matra on the left."}],[{"text":"Matra positioning.","b":true},{"text":" Vowel marks attach above, below, left or right, and their exact position depends on the consonant’s width and on whether a conjunct formed."}],[{"text":"Reph.","b":true},{"text":" र followed by a virama moves to the top right of the following cluster as a small hook."}]]},{"t":"p","runs":[{"text":"Arabic adds contextual forms (each letter has isolated, initial, medial and final shapes) plus right-to-left order and vertical stacking in some styles. Tamil, Kannada, Telugu, Bengali, Khmer and Thai each have their own rules."}]},{"t":"p","runs":[{"text":"HarfBuzz","b":true},{"text":" is the open-source shaping engine that does this correctly, and it is what LibreOffice, Firefox, Chrome, Android, Scribus and Inkscape 1.x use. Applications that use an older engine, or their own, get it wrong in visible ways."}]},{"t":"h2","id":"the-failures-you-will-see","runs":[{"text":"The failures you will see"}]},{"t":"ul","items":[[{"text":"Boxes","b":true},{"text":" ("},{"text":"□","code":true},{"text":") or the missing-glyph rectangle: the font has no glyph for that character. Change the font."}],[{"text":"Conjuncts split into separate letters with a visible virama","b":true},{"text":": the shaping ran but the font lacks the conjunct, so it fell back to the explicit half-form. Change the font."}],[{"text":"Matras in the wrong place, or detached","b":true},{"text":": the engine did not reorder. This is an application problem, not a font problem."}],[{"text":"Correct on screen, wrong in the PDF","b":true},{"text":": the export path used a different engine from the editing view. This is the one that costs money, because it is invisible until the proof arrives."}]]},{"t":"h2","id":"the-test-you-must-actually-run","runs":[{"text":"The test you must actually run"}]},{"t":"p","runs":[{"text":"Never test a complex script with placeholder text. Type the client’s real name, the real address, the real headline, in the real font, at the real size, and look at it."}]},{"t":"p","runs":[{"text":"Build a test string that exercises the hard cases. For Devanagari:"}]},{"t":"code","lang":"","label":"Text","text":"क्ष त्र ज्ञ श्री हिन्दी कार्यालय द्वितीय पुस्तक"},{"t":"p","runs":[{"text":"Those cover a three-consonant conjunct, a reph, a left-side matra and a below-base form. If all of them render correctly, the combination of font and application is sound. If any of them is wrong, you have found it in thirty seconds rather than after printing."}]},{"t":"h2","id":"outlining-a-complex-script","runs":[{"text":"Outlining a complex script"}]},{"t":"p","runs":[{"text":"This is where jobs are lost. Converting to curves freezes whatever the shaping engine produced. If the engine was wrong, you have now made the error permanent and undetectable: the file no longer contains characters anyone can proofread, only shapes."}]},{"t":"p","runs":[{"text":"So the order is:"}]},{"t":"ol","start":1,"items":[[{"text":"Render it."}],[{"text":"Have a native reader check it on screen","b":true},{"text":", at size, before you outline anything."}],[{"text":"Outline."}],[{"text":"Check the outlined version against the live version, side by side, letter by letter."}]]},{"t":"p","runs":[{"text":"Step 2 is not optional and it is not something you can do yourself unless you read the script. A wrong matra is not a typo a non-reader can see."}]},{"t":"h2","id":"font-sources-that-work","runs":[{"text":"Font sources that work"}]},{"t":"ul","items":[[{"text":"Noto","b":true},{"text":": Google’s family, covering essentially every script in Unicode, OFL, well-shaped."}],[{"text":"Ek Type","b":true},{"text":": Mukta, Baloo and others, designed for Devanagari and Gujarati first rather than Latin-first."}],[{"text":"Indian Type Foundry / Fontshare","b":true},{"text":": high-quality Indic and Latin."}],[{"text":"Google Fonts’ Indic section","b":true},{"text":": Hind, Rozha, Yantramanav, Tiro Devanagari."}]]},{"t":"p","runs":[{"text":"Avoid legacy non-Unicode fonts entirely: Kruti Dev, Chanakya, Shree-Lipi and similar map Devanagari shapes onto Latin codepoints. Text set in them is not Devanagari at all; it is Latin letters wearing a costume. It cannot be searched, spellchecked, copied into anything, or converted without a mapping tool. A great deal of Indian government and legal material is still typed this way, and converting it is real paid work; tools like the free "},{"text":"Unicode Converter","code":true},{"text":" scripts and several web converters handle the common mappings."}]},{"t":"h2","id":"in-each-program","runs":[{"text":"In each program"}]},{"t":"p","runs":[{"text":"Inkscape 1.x and Scribus use HarfBuzz and are dependable. LibreOffice is dependable. Illustrator needs the "},{"text":"World-Ready Composer","b":true},{"text":" enabled: Paragraph panel menu ▸ "},{"text":"Middle Eastern & South Asian Composer","i":true},{"text":"; without it, Indic text will not shape. CorelDRAW’s support varies markedly by version and is the single most common source of broken conjuncts in Indian print work. Test your own version with the string above before you promise anybody anything."}]}],"check":{"question":[{"text":"A Hindi wedding card renders correctly in the designer’s editing window, but the exported PDF shows the ि matra after its consonant rather than before it. The font contains every required glyph. Where is the fault?"}],"options":[{"text":[{"text":"The font lacks the reordering rules in its "},{"text":"GSUB","code":true},{"text":" table, which only load when the font is embedded rather than installed."}],"correct":false,"tempting":[{"text":"Font tables do not behave differently when embedded, and the question states the font has the glyphs; reordering is applied by the engine, not stored per-render."}]},{"text":[{"text":"The PDF export path used a different text engine from the editing view, and that one did not apply the reordering rules."}],"correct":true,"tempting":null},{"text":[{"text":"The text was outlined on export, and outlining always freezes glyphs in their stored character order."}],"correct":false,"tempting":[{"text":"Outlining freezes whatever the engine produced. If the engine had shaped correctly, the outlines would be in the correct visual order."}]},{"text":[{"text":"The PDF was exported in a version that predates Unicode support for Devanagari, so the characters fell back to code order."}],"correct":false,"tempting":[{"text":"PDF has carried Unicode text for decades and glyph positions are written explicitly, not reconstructed from character codes at display time."}]}],"order":[2,3,1,0],"why":null},"prev":{"slug":"type-on-a-path","title":"Type on a curve, and why it splays","minutes":8},"next":{"slug":"figures-dashes-and-missing-glyphs","title":"Figures, dashes and the characters nobody checks","minutes":8}}}