Typst
Envie de tips sur Typst ? Oui, ya du jeu de mot dans l'air...
Voici quelques configurations qui peuvent être intégrées dans style.typ du template ou un autre fichier dédié. Chaque solution a pris souvent plus que 1minute, parfois une heure à trouver. Elles pourraient être intégrées au template Typst potentiellement à l'avenir.
Bibliographie
Gérer l'affichage de la bibliographie
Dans la bibliographie générée par #bibliography il n'y a actuellement (2025-07-12) pas moyen d'avoir une version françaises des termes insérés automatiquement. On aimerait avoir Available from en français Disponible à l'adresse et Online remplacé par En ligne. Heureusement, il est possible de faire un rechercher remplacer dynamique pour corriger ce problème avec les deux lignes suivantes! A ajouter uniquement dans _bibliography.typ pour ne pas impacter le reste du document !
// The text language is not integrated in all citation styles...
// Here is a simple hack that translate the 2 pieces of English to French !
#show "Available from": "Disponible sur"
#show "Online": "En ligne"
#show "Accessed": "Accédé le"
Ajouter une entrée
todo
Référencer une entrée de la bibliographie
Il suffit de faire @id avec id l'ID attribuée dans le fichier .bib ou yaml.
Justifier le texte
// Justify the paragraph's text
#set par(justify: true)
// Don't justify text in tables
#show table: set par(justify: false)
Changer l'affichage des types de #figure
// Configure figures supplement color
#let figure_supplement_color = blue
// If the figure contains a #raw snippet (a code block), we use "Snippet" instead of "Figure" as the supplement
#show figure.where(kind: raw): set figure(
supplement: "Snippet"
)
// Show the figure caption (the text below) with the correct supplement ("Figure" or "Snippet")
// Replace "Fig." by "Figure"
// Remove the dot after the supplement and after the number
// Some a small space above the caption
#show figure.caption: c => context [
#v(0.1cm)
#text(fill: figure_supplement_color)[
#c.supplement.text.replace("Fig.", "Figure") #c.counter.display(c.numbering)
]#c.separator.text.replace(".", "") #c.body
]
// Help from https://github.com/typst/typst/discussions/3871
// Show the reference to a label with the name of the supplement of this reference
// It's sadly not possible to to add the figure_supplement_color to both the supplement and the number
#set ref(supplement: it => {
if it.func() == figure {
if type(it.body) == content {
text(it.supplement.text.replace("Fig.", "Figure"))
}
}
})
Gérer l'affichage du code
Bout de code avec bordures
Définir un fonction pour afficher un bloc avec bordure
// A box with a rounded border of light gray
#let roundedbox(body) = {
box(
inset: 10pt,
outset: (y: 3pt),
radius: 2pt,
stroke: 1pt + luma(200),
)[#body]
}
#import "../template/style.typ": roundedbox
#roundedbox()[#include "../sources/plx-dy-simple.typ"]
Ensuite on peut définit par exemple que les images de format SVG auront ce bloc avec bordure autour.
#show image: it => {
if str.ends-with(it.source, "svg") {
roundedbox(it)
} else {
it
}
}
Affichage du code block avec une légère bordure grise et arrondie
// Display block code in a larger block with more padding
// include a rounded border around it
// Add `fill` attribute to define background color
#show raw.where(block: true): block.with(
inset: 10pt,
radius: 2pt,
stroke: 1pt + luma(200)
)
Affichage du code inline, pour avoir des bouts comme ceci: great_variable avec un fond grisé léger.
// Display inline code in a small box with light gray backround that retains the correct baseline.
#show raw.where(block: false): box.with(
fill: luma(240),
inset: (x: 3pt, y: 0pt),
outset: (y: 3pt),
radius: 2pt,
)
Inclure un morceau de code d'un fichier externe
Parfois il est plus simple de rédiger le code dans un fichier externe, surtout s'il est long.
Il est possible de lire un fichier externe avec read et définir la colorisation avec l'attribut lang de #raw
#figure(raw(block: true, lang: "json", read("../sources/plx-dy-simple.json")), caption: [Equivalent JSON de l'exercice])
Meilleure colorisation du code
Typst fait déjà le job mais vite fait, c'est long d'être parfait ni entièrement colorisé, une bonne partie des éléments restent juste en noir alors qu'ils ne sont pas du même type.
Un plugin du nom de syntastica-typst existe pour avoir une meilleure colorisation du code (basé sur TreeSitter). Le plugin est document sur RubixDev/syntastica-typst. Comparaison de la colorisation native à gauche d'un morceau de Rust et de la colorisation avancée faite par syntastica-typst.
Il n'est pas publié car trop lourd et un peu lent malheureusement mais il est facile à installer localement.
Tiré de leur README
git clone https://github.com/RubixDev/syntastica-typst
cd syntastica-typst
./install_local.sh
Ensuite dans style.typ
- Ajouter tout en haut
#import "@local/syntastica:0.1.1": syntastica, languages, themes, theme-bg, theme-fg - Créer un fichier
build.mode.txtcontenantfull - Ajouter dans le style existant le remplacement conditionnel des
#rawpar#syntastica// Enable syntastica only if the build mode is "full" as it is slow let syntastica-enabled = read("../build.mode.txt") == "full" show raw: it => if syntastica-enabled { align(left)[#syntastica(it, theme: "catppuccin::latte")]} else { it } - Changer le thème
catppuccin::lattesi nécessaire. Une liste des thèmes avec exemple est disponible ici. Sur quelques tests rapides, je n'ai trouvé quetokio::dayetcatppuccin::lattequi ressortaient bien sur un fond clair.
Build et watch séparé pour contourner la lenteur de syntastica
Cette partie nécessite d'avoir le CLI typst installé.
Sur Fedora
Besoin d'avoir la librairie openssl pour être compilée
sudo dnf install openssl-devel
A ajouter dans la configuration du shell, ici défini pour Fish.
# This is required to build openssl-sys crate when cargo install typst-cli
# This is also required to build dependencies of Tauri apps !
set -x PKG_CONFIG_PATH /usr/lib64/pkgconfig:/usr/share/pkgconfig
Puis à installer via cargo.
cargo install --locked typst-cli
Voici deux scripts à copier coller dans le dossier de ton rapport.
watch.sh
#!/bin/bash
# The fast build for redaction. It uses the basic syntax highlighting of Typst.
# The first build takes a few seconds, then less than a second.
DEST=rapport-final-tb.pdf
# Define this flag so Syntastica plugin is disabled, see style.typ
echo -n fast >build.mode.txt
echo Starting watch build and opening $DEST
xdg-open "$DEST"
typst watch main.typ "$DEST"
build.sh
#!/bin/bash
# The slow build for release export. It includes the nice colors in code snippets, made by the Syntastica plugin
# It can take a few minutes if there are a lot of code snippets
DEST=rapport-final-tb.pdf
# Define this flag so Syntastica plugin is enabled, see style.typ
echo -n full >build.mode.txt
echo Starting full build to generate $DEST
echo Note: this can be slow and take a few minutes at maximum
echo Running: typst compile main.typ "$DEST"
time typst compile main.typ "$DEST"
echo Done !
echo Opening $DEST
xdg-open "$DEST"
Ils peuvent être ensuite être lancé pour la rédaction avec watch.sh ou avec build.sh avec toutes les couleurs pour un rendu.
VSCode
Support de Typst
Il suffit d'installer l'extension Tinymist Typst de Myriad Dreamin
code --install-extension myriad-dreamin.tinymist
Corriger les erreurs de références non trouvés
Comme le template a plusieurs fichier vous aurez des erreurs de @superarticle not found parce qu'il ne sait pas où est la bibliographie... Dans la commande palette, il y a une option Typst Pin à lancer sur le main.typ pour lui indiquer le fichier d'entrée. Ensuite les erreurs disparaitront!
Preview intégré
Dans la commande palette, il y a une option Typst Preview qui fait ça.
Coller des images du presse papiers
Il y a des chances pour que vous ayez besoin d'inclure plusieurs images dans votre rapport... Sauver le fichier au bon endroit, créer la figure, créer l'image et référence le bon chemin jusqu'à l'image est un peu lent...
Il serait cool de pouvoir copier une image après un screenshot ou en copiant depuis le web, puis de la coller, donner un nom si utile et d'avoir l'image immédiatement intégrée, non ?
Et bien si on en parle c'est que c'est possible ! Avec l'extension Paste Image de mushan , tu peux juste coller des images du presse papiers.
code --install-extension mushan.vscode-paste-image
Je recommende cette configuration à coller dans les réglages JSON (Command Palette > Open User Settings (JSON)).
"pasteImage.defaultName": "YMMDDHHmmss",
"pasteImage.path": "${currentFileDir}/imgs/",
"pasteImage.insertPattern": "#figure(\n image(\"${imageFilePath}${imageSyntaxSuffix}\", width: 100%),\n caption: [],\n)",
"pasteImage.showFilePathConfirmInputBox": true,
"pasteImage.filePathConfirmInputBoxMode": "onlyName",
Sur Linux, il reste à installer xclip (sudo dnf install xclip sur Fedora).
Ensuite copie une image quelquepart et tape ctrl+alt+v (raccourci différent pour coller, sinon c'est le collage natif de VSCode qui est utilisé) et le contenu suivants est généré, en plus d'avoir créé l'image dans un sous dossiers imgs.
#figure(
image("imgs/super-app.svg", width: 100%),
caption: [],
)
Si besoin, lis le README de l'extension pour changer d'autres réglages.