Typst maakt grote stappen
Typst is een systeem voor het opmaken (typesetting) van documenten in diverse formaten: PDF, SVG, PNG en, momenteel in ontwikkeling, HTML. Het is zeer geschikt voor het verwerken van technische materialen en wordt vaak beschouwd als een uiteindelijke vervanger voor LaTeX. Een jaar geleden keken we naar Typst toen versie 0.13 uit was. In juni is versie 0.15 verschenen met veel nieuwe functies, waaronder ondersteuning voor variabele lettertypen, MathML, meerdere bibliografieën en meer. Typst is gratis software onder de Apache-2.0-licentie en is geprogrammeerd in Rust.
Variabele lettertypen
Typst ondersteunt nu variabele lettertypen. De meeste lettertypen worden gedistribueerd als een set bestanden met glyphs in verschillende gewichten en variaties, zoals cursief en vet. Een recente ontwikkeling in de typografie is de komst van variabele lettertypen, waarbij alle variaties in één enkel bestand kunnen worden opgenomen. Dit bespaart ruimte en biedt de auteur of ontwerper meer flexibiliteit.
Lettertypekenmerken en variaties worden gekozen door een waarde in te stellen voor een "as" (axis); elke as verandert een bepaald aspect van de gerenderde glyphs. Meestal zijn er meerdere assen die discrete waarden kunnen hebben (om functies aan of uit te zetten) of continue waarden tussen twee limieten. Dat laatste kan bijvoorbeeld worden gebruikt om het gewicht van het lettertype op een continuüm te bepalen.
Om deze nieuwe functie van Typst te testen, zijn twee open-source variabele lettertypen gedownload: Roboto Flex, een algemeen lettertype met 13 assen, en Zycon, een lettertype zonder letters maar met 17 kleine decoratieve plaatjes. De zes continue assen van Zycon veranderen verschillende aspecten van de plaatjes vloeiend, wat het lettertype nuttig maakt voor animaties.
Hieronder volgt een Typst-document dat beide lettertypen gebruikt en voor elk van hen één van de assen varieert:
#set text(font:"Roboto Flex")
#for n in (-305, -200, -98) {
set text(variations:("YTDE": n))
[A penguin jumped quietly.]
}
#set text(font:"Zycon")
#for n in array.range(0, 10, inclusive:true) {
set text(variations:("M1 ": n/10))
str.from-unicode(127773)
}
In Typst zet het "#"-teken het document in de "code-modus", waarbij de rest van de regel of het blok wordt geïnterpreteerd als code in de ingebouwde taal van Typst. Binnen de code-modus wordt materiaal tussen vierkante haken ([...]) geïnterpreteerd als "tekst-modus", oftewel tekst die moet worden opgemaakt.
De bovenstaande code bevat twee commando's om de lettertypen bij naam in te stellen via de text()-functie. Vervolgens worden for-loops gebruikt. Binnen deze loops wordt de text()-functie aangeroepen om de variabele variations in te stellen. De tekst voor het Roboto Flex-lettertype wordt direct ingevoerd, terwijl de output voor het Zycon-lettertype een enkel teken is dat is gespecificeerd met de functie str.from-unicode(). Dit is gedaan omdat lezers het teken mogelijk niet konden zien, afhankelijk van de lettertype-ondersteuning in hun browser.
De as die in Roboto Flex wordt gemanipuleerd, heet YTDE. Deze as bepaalt de lengte van de descenders (onderhangers) van het lettertype, terwijl andere kenmerken ongewijzigd blijven. Dit kan nuttig zijn bij het opmaken van tabellen, bijvoorbeeld om botsingen tussen de descenders en de celgrenzen van de tabel te voorkomen.
Een van de zes assen van Zycon, genaamd "M1 " (de twee afsluitende spaties maken deel uit van de naam; alle asnamen bevatten vier tekens), heeft per karakter een ander effect. Bij het maan-glyph verandert het de maanfase.
Het compileren van dit document met typst compile vfont.typ resulteert in een PDF-bestand (vfont.pdf).
MathML
HTML-export is nog een experimentele functie van Typst, maar deze release toont aanzienlijke vooruitgang. De belangrijkste nieuwe HTML-functie is de vertaling van wiskundige formules naar MathML. In een vorig artikel over Typst werd de markup getoond voor een bepaalde bepaalde integraal en het resultaat in een PDF. Dezelfde Typst-code produceert, wanneer gerenderd naar HTML, een lange string MathML-markup die vrijwel alle moderne webbrowsers kunnen interpreteren.
Het resultaat ziet er als volgt uit: $\int_0^1 \frac{(\arcsin x)^2}{x^2 \sqrt{1-x^2}} dx = \frac{\pi \ln 2}{2}$
(Als u bovenstaande formule niet ziet, ondersteunt uw browser geen MathML). Een vergelijking met de opgemaakte formule uit het vorige artikel laat zien dat de PDF- en HTML-resultaten in essentie identiek zijn. De mogelijkheid om met Typst wiskunde van TeX-kwaliteit in webbrowsers te produceren, zonder dat daar een JavaScript-bibliotheek zoals MathJax voor nodig is of dat er naar afbeeldingen gegrepen moet worden, is een groot voordeel voor wetenschappelijke communicatie.
Om de experimentele HTML-output in te schakelen, vereist Typst een speciale vlag: typst c --features html integral.typ integral.html
Dit is het commando om de formule-markup in een bestand genaamd integral.typ om te zetten naar HTML.
"Bundle"-output
Het typische gebruik van software zoals Typst is het maken van enkele bestanden, meestal papers of boeken in de vorm van PDF's. De nieuwe "bundle"-functie stelt de auteur in staat om in één bronbestand een collectie outputbestanden op te geven, in elk van de door Typst ondersteunde formaten. Deze bestanden kunnen data delen en zowel interne als externe links bevatten.
Deze functie is ideaal voor het maken van websites, die bestaan uit een netwerk van onderling verbonden HTML-bestanden. Ook is het interessant voor academici die bijvoorbeeld een presentatie voor een conferentie samen met het bijbehorende preprint-artikel willen genereren vanuit één bronbestand.
Hier is een eenvoudig voorbeeld van een Typst-bestand dat drie onderling verbonden documenten maakt (twee HTML-pagina's en een PDF) die een tekstfragment delen:
#let text = ['Twas brillig, and the slithy toves
Did gyre and gimble in the wabe:]
#document("poems.html", title: [Famous Poems])[
#link(<jabberwocky>)[Hier] staat een beroemd nonsensgedicht.
]<home>
#document("jabberwocky.html", title: [Jabberwocky by Lewis Carroll])[
Dit beroemde gedicht begint als volgt:
#text
De #link(<jabberwockyPDF>)[rest] van het gedicht.
Ga terug naar #link(<home>)[home].
]<jabberwocky>
#document("jabberwocky.pdf", title: [Jabberwocky: the Complete Poem])[
#text ....
Ga terug naar #link(<home>)[home].
]<jabberwockyPDF>
Het commando voor het verwerken van deze code, mits opgeslagen in een bestand genaamd bundle.typ, is: typst c --features html,bundle --format bundle bundle.typ
In tests werkte de bundle-functie zoals beloofd, maar omdat dit (samen met de HTML-output) nog als een werk in uitvoering wordt beschouwd, vereist de compiler de --features vlag.
Het bovenstaande commando maakt een nieuwe directory aan genaamd "bundle" met daarin de drie bestanden die in de #document()-functies zijn gedefinieerd. Ze bevatten allemaal de eerste twee regels van het gedicht die in de variabele text zijn opgeslagen. Er zijn hyperlinks tussen de HTML-pagina's, van een van die pagina's naar de PDF, en van de PDF terug naar de tweepagina's website. De links worden aangestuurd via de labels tussen haken (<...>) die volgen op elke documentfunctie.
Meerdere bibliografieën
Typst staat nu meerdere bibliografieën in één document toe, een functie waar lang naar is uitgekeken. De meest voorkomende toepassing is voor boeken die per hoofdstuk een aparte referentiesectie nodig hebben. Dit kan worden geïllustreerd met een eenvoudig voorbeeld:
#show bibliography: set text(size: 8pt)
= Hoofdstuk I
Volgens @smith is Smith ongewoon slim.
#bibliography("works.bib",
title: "Referenties voor Hoofdstuk I",
group: none)
= Hoofdstuk II
Jones@jones heeft een andere visie. De kwestie werd uiteindelijk het volgende jaar beslecht in @mergutroid.
#bibliography("works.bib",
title: "Referenties voor Hoofdstuk II",
group: none)
De eerste regel specificeert dat de bibliografieën een kleiner lettertype moeten gebruiken dan de standaardtekst. In de tekst zorgen de "@"-prefixes voor een citatie in de standaardstijl (nummer tussen haken). Aan het einde van elk hoofdstuk wordt de bibliography()-functie aangeroepen. Het eerste argument bepaalt welke database voor de bibliografische informatie moet worden gebruikt; elke bibliografiesectie kan indien gewenst een andere database of verzameling databases gebruiken. Het group-argument bepaalt hoe de citaties worden genummerd. De waarde none zorgt ervoor dat de nummering per sectie opnieuw begint bij één; alternatief kan de nummering continu zijn voor het gehele werk, of willekeurig worden gegroepeerd.
Meerdere PDF-standaarden
Het vermijden van propriëtaire extensies is normaal gesproken voldoende om te garanderen dat PDF's gemaakt met Typst, LaTeX of andere competente software aan de belofte van het formaat voldoen: documenten kunnen in alle readers worden geopend en zien er nu en in de toekomst identiek uit. Op een dieper niveau is een PDF echter niet zomaar een PDF. Er zijn verschillende PDF-versies en daarop diverse formele standaarden met betrekking tot archiveerbaarheid en toegankelijkheid. Archiveringsstandaarden zijn bedoeld om te garanderen dat het document echt werkt over een breed scala aan reader-software en dat dit eeuwig zo blijft. Toegankelijkheidsstandaarden hebben betrekking op het gebruik van een PDF door mensen met verschillende soorten beperkingen.
Typst had al de mogelijkheid om te richten op diverse PDF-versies en standaarden voor archivering of toegankelijkheid. De nieuwe functie is de optie om tijdens het compileren van een document op meer dan één standaard te richten. Dit is nuttig wanneer men een PDF wil genereren die zowel archiverings- als toegankelijkheidskenmerken heeft. De implementatie helpt de auteur door het woud van PDF-standaarden te navigeren door waarschuwingen of fouten te geven bij incompatibele combinaties of wanneer er niet wordt voldaan aan de best practices van de gekozen standaarden.
Als voorbeeld: een commando dat probeert het "boek"-document uit de vorige sectie te compileren, met de vraag om zowel PDF-versie 1.7 als de A-1b archiefstandaard: typst c --pdf-standard 1.7,a-1b book.typ
De Typst-compiler reageert met deze foutmelding: error: PDF 1.7 is not compatible with PDF/A-1b hint: PDF/A-1b requires version PDF 1.4
PDF-versie 1.7 is wel compatibel met A-2b, dus dit zal werken: typst c --pdf-standard 1.7,a-2b book.typ
Als we echter de UA-1 toegankelijkheidsstandaard toevoegen: typst c --pdf-standard 1.7,a-2b,ua-1 book.typ
Krijgen we opnieuw een fout: error: PDF/UA-1 error: missing document title = hint: set the title with set document(title: [...])
Normaal gesproken eist de Typst-compiler niets meer dan correcte syntaxis, maar als we een specifieke toegankelijkheidsstandaard opgeven, moet het document aan die standaard voldoen. UA-1 vereist, onder andere, een documenttitel.
Dit lijkt wellicht technisch detailwerk, maar deze details zijn cruciaal voor archivisten en uitgevers. Daarnaast is het produceren van toegankelijke PDF's een wettelijke vereiste voor overheidsinstanties in de VS en veel andere landen. De geavanceerde afhandeling van meerdere PDF-standaarden maakt Typst een nuttig instrument in deze contexten.
Conclusie
Typst 0.15 bevat andere verbeteringen die in dit artikel niet in detail worden beschreven. Enkele hiervan zijn ondersteuning voor steunkleuren (spot colors), gedetailleerde diagnostiek die convergentiefouten tijdens het compileren uitlegt, en nieuwe map- en filter-functies in de ingebouwde scripttaal. De documentatie is bijgewerkt voor de nieuwe versie en is nu beschikbaar als een PDF van 26MB.
Typst wordt ontwikkeld op GitHub, waar het 460 bijdragers heeft. De makers van het project hebben een gids geschreven voor nieuwe bijdragers, waarin ze beschrijven hoe een Pull Request (PR) eruit moet zien en waarschuwen dat code of beschrijvingen gegenereerd door een LLM (Large Language Model) zullen worden afgewezen. Ze zijn ook open over het feit dat Typst zowel een bedrijf als een open-source project is, en dat beslissingen over de richting van het project, evenals de geschiktheid van individuele bijdragen, rekening zullen houden met de behoeften van het bedrijf. Dit is een factor die potentiële bijdragers en gebruikers in gedachten moeten houden.
De voortgang in de ontwikkeling van het systeem is indrukwekkend. De gemeenschap van gebruikers is enthousiast; hun deelname heeft het Typst-ecosysteem uitgebreid naar meer dan 1500 pakketten.
Netwerkeffecten in de uitgeverswereld beletten Typst echter om het potentieel te benutten dat we in ons vorige artikel zagen. Hoewel gebruikers sjablonen hebben ontwikkeld die voldoen aan de stijlspecificaties van verschillende tijdschriften, blijven die tijdschriften die bronbestanden vereisen (in plaats van alleen PDF's) vasthouden aan LaTeX, Word of een ander formaat. Zeer weinig accepteren manuscripten die in Typst zijn opgemaakt. Dit zal waarschijnlijk niet veranderen zolang Typst een pre-1.0 status heeft (wat waarschijnlijk nog wel een tijdje duurt) en het risico bestaat dat er aanzienlijke, mogelijk brekende wijzigingen in documenten nodig zijn.
Desondanks is Typst vandaag de dag een immens nuttig instrument. Zo moest ik onlangs een SVG-logo maken en merkte ik dat het schrijven van een tekstuele beschrijving met de ingebouwde grafische commando's van Typst sneller en gemakkelijker was dan het gebruiken van een tekenprogramma. Het is onmogelijk te zeggen of de voordelen van Typst ertoe zullen leiden dat het een "vervanger voor LaTeX" wordt, zoals veel bewonderaars beschrijven. Maar als de ontwikkeling in het huidige tempo doorgaat, is dat een reële mogelijkheid, hoewel het een decennium of twee kan duren voordat dit volledig is gerealiseerd.
Groetjes,