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.
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.
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).
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.
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.
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).
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.
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 :
- Importer depuis le dépôt officiel de bibliothèques Typst avec
@preview/.... - 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_nameLe 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










