Typst Package User Manual MIT License GitHub Issues Last Commit

Dernière mise à jour : April 2026

1 Introduction

Ce manuel présente synkit et ses fonctions. synkit est une bibliothèque Typst conçue pour simplifier la création de structures syntaxiques tout en maintenant une précision typographique. Typst est un langage de programmation pour la composition typographique. Un excellent tutoriel est disponible ici, ainsi qu’une série d’introduction sur YouTube ici.

La bibliothèque fournit des fonctions pour les arbres en structure de constituants, les flèches de mouvement, la multidominance, l’annotation sémantique, les lignes d’équivalence entre arbres, la notation du mouvement en ligne, les exemples linguistiques numérotés et les gloses interlinéaires. Les objectifs principaux de synkit sont de minimiser l’effort et de maximiser la qualité : la syntaxe de la bibliothèque doit rester intuitive et compacte sans sacrifier la qualité typographique.

Il existe au moins deux excellentes bibliothèques en \(\LaTeX\) pour les arbres syntaxiques, tikz-qtree (Chiang 2009) et forest (Živanović 2017). Typst propose déjà certaines bibliothèques pour les arbres, mais synkit vise à couvrir un ensemble plus large de cas d’usage pertinents en syntaxe et en sémantique, en particulier pour les auteurs qui souhaitent s’éloigner de \(\LaTeX\) sans renoncer aux flèches de mouvement, à la composition sémantique ou à des agencements d’arbres plus riches.

Le dépôt GitHub de la bibliothèque se trouve à guilhermegarcia/synkit. Commentaires, suggestions et signalements de bogues sont bienvenus.

1.1 Installation

Les bibliothèques Typst sont chargées avec la fonction #import au début de votre document typ. Remplacez X.X.X par la version souhaitée :

Importation de la bibliothèque (Typst Universe)

#import "@preview/synkit:X.X.X": *

Si vous souhaitez la version la plus récente, clonez le dépôt et chargez la bibliothèque localement :

Importation locale

#import "synkit/lib.typ": *

Un lien symbolique peut être nécessaire selon la structure de vos fichiers, car Typst restreint les importations aux fichiers situés dans la racine de compilation et ses sous-répertoires.

2 Arbres de base

La fonction principale pour les arbres est #tree(), dont l’argument principal est une chaîne entre crochets. Les espaces sont volontairement souples, de sorte que [S[NP][VP]] et [ S [ NP ] [ VP ] ] sont interprétés de manière identique.

Figure 1: Arbre syntaxique de base avec branches terminales.

Arbre de base

#tree(
  "[S [NP [Det the] [N cat]] [VP[V sat][PP[P on] [NP [Det the] [N mat]]]]]",
  terminal-branch: true,
)

Par défaut, les branches terminales sont omises, mais vous pouvez modifier ce comportement en définissant terminal-branch: true, comme dans la Figure 1 ci-dessus. Les triangles sont ajoutés automatiquement lorsqu’un nœud phrastique domine directement du contenu terminal, comme dans [NP the cat]. Au besoin, vous pouvez également préciser l’argument triangle manuellement.

3 Flèches

Les flèches de mouvement sont ajoutées avec l’argument arrows. Les flèches peuvent être rectangulaires ou courbes, et chaque flèche peut être personnalisée indépendamment au moyen de clés telles que dash, color, line-width, bend et shift.

Figure 2: Plusieurs flèches de mouvement utilisant uniquement les paramètres par défaut de la fonction ; adapté de Carnie.

Arbre avec flèches

#tree(
  "[ CP [ C' [ C Ø_{[+Q]}+T+Mangez ] [ TP [ DP vous ] [ T' [ T *t*_i ] [ VP [ *t*_DP ] [ V' [V *t*_i ] [DP des pommes] ] ]  ] ] ] ]",
  arrows: (
    (from: "trace3", to: "T1"),
    (from: "trace2", to: "DP1"),
    (from: "trace1", to: "C1"),
  ),
  curved: true,
)

Les étiquettes sont créées automatiquement, et les cibles des flèches peuvent être précisées davantage à l’aide de suffixes tels que -up, -down et de valeurs angulaires optionnelles. Cela permet un contrôle fin tout en gardant les cas les plus courants aussi simples que possible.

4 Sémantique

L’argument dominance ajoute des lignes de dominance à longue distance entre les nœuds. Cela est utile pour la multidominance et d’autres structures qui ne peuvent pas être représentées par une simple ramification locale. L’argument annotation permet une annotation détaillée à l’intérieur de l’arbre. L’exemple ci-dessous provient de Fox et Johnson (2016).

Figure 3: Annotation sémantique combinée à la multidominance.

Multidominance

#tree(
 "[IP [IP [IP [IP [DP† [D the_2] [\\muP every woman] ] 
 [IP [I] [VP is smiling] ] ] [IP [and] [IP [DP‡ [D the_2] [\\muP every man] ] 
 [IP [I] [VP is frowning] ] ] ] ] [\\lambda2] ] [QP [Q \\forall ] 
 [\\muP\\* [\\muP] [CP who came in together] ] ] ]",
 annotation: (
   (
     "IP1",
     [$forall$_y_ [_y_ is a woman+man $and$ _y_ came in together] $arrow$ \
       [the woman part of _y_ is smiling and the man part of _y_ is frowning]],
   ),
   (
     "IP2",
     [$lambda$_x_ : _x_ has a has a unique maximal woman part \
       and a unique maximal man part. \
       the woman part of x is smiling and \
       the man part of x is frowning],
   ),
   (
     "QP1",
     [$lambda$_Q_$forall$_y_[_y_ is woman+man \
       $and$ _y_ came in together] $arrow$ _Q(y)_],
   ),
   (
     "IP3",
     [the woman part of g(2) is smiling \
       and the man part of g(2) is frowning],
   ),
   (
     "DP†1",
     [the woman part \
       of g(2)],
   ),
   (
     "DP‡1",
     [the man part \
       of g(2)],
   ),
 ),
 annotation-size: 0.8,
 dominance: (
   (from: "muP4", to: "muP1", ctrl: (-6.1, 8.5)),
   (from: "muP4", to: "muP2", ctrl: (-6, 5)),
 ),
 scale: 0.8,
 spread: 0.8,
 terminal-branch: true,
)

Le même arbre peut toujours utiliser des arguments d’espacement locaux tels que spread-local et drop-local, ce qui signifie que les arbres multidominants restent faciles à ajuster sans modifier des coordonnées absolues.

5 Arbres bilingues

La fonction #garden() permet à plusieurs arbres de partager une même surface avec des lignes d’équivalence en pointillés entre les nœuds correspondants. Cela est utile pour les comparaisons bilingues ou toute situation où deux structures doivent être alignées visuellement. L’exemple ci-dessous provient du tutoriel de David Chiang sur tikz-qtree.

Figure 4: Arbres bilingues avec lignes d’équivalence entre arbres.

Deux arbres avec lignes d’équivalence

#garden(
  (
    input: "[S [NP [Det the] [N cat]] [VP [V sat] [PP [P on] [NP [Det the] [N mat]]]]]",
    spread: 1.55,
    content-size: 1,
  ),
  (
    input: "[S [NP 猫が] [VP [PP [NP [NP マット] [Part の] [NP 上] ] [P に]] [V 土]]]",
    direction: "up",
    content-size: 1,
  ),
  equivalence: (
    ("Det1-1", "NP1-2"),
    ("P1-1", "P1-2"),
    ("P1-1", "NP4-2"),
    ("N1-1", "NP1-2"),
    ("N2-1", "NP3-2"),
    ("Det2-1", "NP3-2"),
    ("V1-1", "V1-2"),
  ),
  gap: 2.5,
  scale: 0.7,
)

6 Exemples numérotés

La notation du mouvement en ligne est gérée par #move(). Chaque mot devient automatiquement un point d’ancrage pouvant recevoir une étiquette, de sorte que les flèches peuvent viser des copies visibles, des traces ou des mots sans définition manuelle d’ancres.

Figure 5: Mouvement en ligne à l’intérieur d’un exemple numéroté.

Mouvement en ligne

#show: eg-rules

#eg(labels: (<s-plain>, <s-move>))[
  - Who do you think saw Mary?
  - #move(
      "[CP Who do you think [(CP)[TP<who>saw Mary]]]",
      arrows: ((from: "who2", to: "who1", dash: "solid", color: black),),
    )
] <eg-wh>

Lorsqu’il est utilisé comme objet autonome, protect: true est utile, car il réserve un espace vertical pour les flèches sous le texte. À l’intérieur d’exemples numérotés ou de cellules de tableau, protect: false constitue souvent le meilleur choix par défaut, car cela maintient un alignement de ligne plus propre.

L’argument labels permet de référencer individuellement les sous-exemples. L’argument title place un titre sur la même ligne que le numéro d’exemple, et caption devient utile si vous générez ensuite une liste ne ciblant que les exemples linguistiques.

7 Gloses

La fonction #gloss() crée des gloses interlinéaires alignées partageant la même numérotation que #eg(). Sa syntaxe est volontairement minimale : chaque ligne est simplement un élément de liste, et la fonction aligne le contenu en le segmentant sur les espaces. L’exemple ci-dessous provient de O’Grady et Archibald (2016).

Figure 6: Glose inuktitut sur quatre lignes.

Glose sur quatre lignes avec forme orthographique échappée

#show: eg-rules

#gloss(per: 4, escape: (0,), caption: [An example from Inuktitut])[
  - Qasuiirsarvigssarsingitluinarnarpuq
  - Qasu -iir -sar -vig -ssar -si -ngit-luinar -nar -puq
  - tired not cause-to-be place-for suitable find not-completely someone 3.{sg}
  - 'Someone did not find a completely suitable resting place.'
]

L’argument per contrôle le nombre de lignes appartenant à chaque glose, tandis que escape vous permet d’exempter certaines lignes de la logique d’analyse et d’alignement.

8 Suppléments

Cette section rassemble plusieurs arguments qui facilitent l’ajustement des arbres en pratique.

8.1 Espacement

Quatre arguments sont centraux pour l’espacement dans #tree() :

Paramètre Rôle
spread Espacement global entre nœuds sœurs
spread-local Espacement local entre nœuds sœurs
drop Espacement global entre niveaux
drop-local Espacement local entre niveaux

Ces quatre arguments reposent sur des multiplicateurs directs, ce qui les rend plus faciles à raisonner que des ajustements de position absolue.

Exemple d’espacement

#tree(
  "[ A [ B [C] [D] ] [ E [F] [G] ] ]",
  spread-local: ( ("C1", 0.4), ),
  drop-local: (
    ("C1", 0.5),
    ("F1", 1.3),
  ),
  arrows: ("C1", "F1"),
)

8.2 Sauts de ligne

Les syntagmes longs peuvent être coupés avec \\n, ce qui est souvent préférable à forcer un arbre à devenir trop large.

Sauts de ligne dans les syntagmes

#tree(
  "[S [NP the orange cat \\n that lives next door]
    [VP[V sat][PP[P on]
    [NP the new couch \\n we purchased \\n last week]]]]",
)

8.3 Mise en forme

Puisque l’entrée de l’arbre est une chaîne de caractères, les raccourcis de mise en forme sont importants. #tree() prend directement en charge les italiques, le gras, les petites capitales, les exposants, les indices et certains raccourcis de symboles dans la chaîne d’entrée. La mise en évidence est gérée séparément au moyen de l’argument highlight.

Figure 7: Couleur, police, emoji et style de branches dans un même arbre.

Raccourcis de mise en forme

#tree(
  "[S [NP the 🐈] [VP[V sat][PP[P on] [NP the mat]]]]",
  content-size: 1,
  drop: 0.8,
  spread: 1.5,
  dash-branches: (
    ("VP1", "V1"),
    ("S1", "VP1"),
  ),
  color: (
    ("S1", green.darken(20%)),
    ("NP1", red),
    ("NP2", red),
    ("P1down", blue),
    ("VP1", "V1", orange),
  ),
  font: "Comic Sans MS",
)

8.4 Direction

Les arbres peuvent croître dans quatre directions : "down", "up", "left" et "right". Cela est particulièrement important pour les arbres bilingues en miroir et les mises en page compactes orientées latéralement.

Changer la direction de l’arbre

#tree(
  "[S [NP_\\omega the *cat*] [VP[V @sat@][PP[P on] [NP^\\phi the **mat**]]]]",
  direction: "left",
)

8.5 Dimensionnement

Les arguments scale, content-size et node-size affectent différentes couches de la mise en page. scale modifie l’objet entier, tandis que content-size et node-size ajustent plus localement le contenu terminal et les étiquettes des nœuds.

Exemple de dimensionnement

#tree(
  "[S [NP the cat] [VP[V sat][PP[P on] [NP the mat]]]]",
  content-size: 1.2,
  node-size: 0.6,
  drop: 0.8,
  spread: 1.5,
)

8.6 Style des branches

L’apparence des branches peut être modifiée avec dash-branches, tandis que color peut cibler les nœuds, le contenu terminal ou des branches parent-enfant spécifiques.

8.7 Police

Chaque fonction hérite par défaut de la police du document, mais vous pouvez choisir une police locale avec l’argument font. Cela peut être utile lorsque vous souhaitez qu’un seul arbre se démarque ou lorsqu’une police particulière gère certains symboles avec plus d’élégance.

9 Travaux futurs

La bibliothèque est encore jeune, il y aura donc des bogues et des limitations. Les commentaires et suggestions sont particulièrement utiles à ce stade, car ils améliorent directement la précision et la couverture de la bibliothèque. La bibliothèque a également bénéficié des retours de collègues travaillant en syntaxe et en sémantique.

10 Arguments

Le tableau ci-dessous résume les arguments actuellement disponibles dans #tree().

Argument Type Défaut Description
arrows array () Flèches entre nœuds sous forme de tuples ou de dictionnaires
scale number 1.0 Facteur d’échelle uniforme pour l’arbre entier
triangle array () Noms d’ancres rendus avec un triangle
content-size number 0.8 Multiplicateur de taille pour le contenu terminal
node-size number 1.0 Multiplicateur de taille pour les étiquettes des nœuds
curved bool false Utiliser des courbes de Bézier plutôt que des flèches rectangulaires
direction string "down" Direction de croissance
highlight array () Ancres à encadrer
bottom bool false Aligner toutes les feuilles sur le niveau le plus bas
terminal-branch bool false Tracer les branches jusqu’aux terminaux
dash-branches array () Branches parent-enfant en pointillés
delinks array () Marques de délien sur les hampes des flèches
index array () Indices de coréférence
append array () Texte supplémentaire en indice après une étiquette de nœud
drop number 1.0 Multiplicateur d’espacement vertical
drop-local array () Ajustements verticaux par niveau ou par nœud
spread number 1.0 Largeur horizontale par feuille
spread-local array () Ajustements horizontaux par niveau ou par nœud
dominance array () Lignes de dominance à longue distance
color array () Couleurs pour les nœuds, les feuilles ou les branches
annotation array () Contenu entre une étiquette de nœud et ses branches
annotation-size number 0.70 Multiplicateur de taille pour le texte d’annotation
annotation-leading length or auto auto Interligne pour les annotations multilignes
numbers array () Nombres cerclés à côté des étiquettes de nœuds
numbers-size number 0.85 Multiplicateur de taille pour les nombres cerclés
line-width number 1.0 Multiplicateur d’épaisseur des traits de l’arbre
font string none Famille de police locale

11 Typst hors ligne

Bien que l’éditeur en ligne sur Typst.app soit très pratique, de nombreux utilisateurs préfèrent travailler localement. L’une des meilleures options d’EDI est VS Code avec l’extension Tinymist (Dreamin et Varner 2024). Tinymist est également disponible dans d’autres éditeurs, notamment NeoVim et Positron.

12 Bibliothèques Typst

Les bibliothèques Typst sont importées plutôt qu’installées à l’échelle du système, contrairement à ce que peuvent attendre les utilisateurs de LaTeX ou de Python. Les deux flux de travail les plus courants sont les suivants :

  1. Importer depuis le dépôt officiel de bibliothèques Typst avec @preview/....
  2. Cloner un dépôt localement et importer son fichier lib.typ.

Si la bibliothèque est stockée en dehors de la racine de votre document, un lien symbolique constitue souvent la solution la plus simple.

Créer un lien symbolique local vers une bibliothèque

# From your working directory:
ln -s PATH_TO_PACKAGE_DIRECTORY package_name

Le dépôt de bibliothèques Typst conserve également chaque version publiée dans son propre répertoire, ce qui explique pourquoi les importations avec version explicite sont si importantes.

Copyright © Guilherme Duarte Garcia

Références

Chiang, David. 2009. tikz-qtree – Use existing qtree syntax for trees in TikZ. https://ctan.org/pkg/tikz-qtree.
Dreamin, Myriad, et Nathan Varner. 2024. Tinymist: An integrated language service for Typst. Version 0.14.4. https://github.com/Myriad-Dreamin/tinymist.
Fox, Danny, et Kyle Johnson. 2016. « QR is restrictor sharing ». In Proceedings of the 33rd West Coast Conference on Formal Linguistics, édité par Kyeong-min Kim, Pocholo Umbal, Trevor Block, et al. Cascadilla Proceedings Project.
O’Grady, William, et John Archibald. 2016. Contemporary Linguistic Analysis: An Introduction. 8th éd. Toronto: Pearson.
Živanović, Sašo. 2017. The forest package: Drawing linguistic (and other) trees. https://ctan.org/pkg/forest.