Add an article about typst
This commit is contained in:
parent
7f1d2b274e
commit
59fe511c25
BIN
content/images/covers/printing-press.jpg
Normal file
BIN
content/images/covers/printing-press.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 473 KiB |
176
content/software/typst.md
Normal file
176
content/software/typst.md
Normal file
@ -0,0 +1,176 @@
|
||||
---
|
||||
Title: Typesetting with Typst
|
||||
Date: 2024-10-19 18:00
|
||||
Lang: en
|
||||
Author: Fabrice
|
||||
Category: software
|
||||
Tags: vim, neovim. typst
|
||||
Slug: typst-intro
|
||||
table-of-contents: true
|
||||
Summary: Simple typesetting with Typst.
|
||||
Header_Cover: ../images/covers/printing-press.jpg
|
||||
---
|
||||
|
||||
For about ten years now, I’ve been using _LaTeX_ to typeset any document which
|
||||
aims to be printed. The main reason is that I’m quite familiar with the syntax
|
||||
to adjust the page setting to what I imagine. Other solutions exist to ease this
|
||||
workflow, such as [Pandoc](https://pandoc.org/) to convert easier to write syntax to
|
||||
other formats. However, this solution was not palatable to me as the universal
|
||||
aspect of Pandoc, makes it a pain to specify pagination properties. And, to
|
||||
produce a PDF in the end, Pandoc calls _LaTeX_, and for the sake of simplicity I
|
||||
prefer to directly write in _LaTeX_ (see the conclusion for clarification).
|
||||
|
||||
However, for some kind of documents that I don’t write very often, such as
|
||||
letters, it’s sometimes a pain to find the syntax of the [LaTeX class for
|
||||
letters](https://texlive.mycozy.space/macros/latex/contrib/lettre/lettre.pdf)<sup>(fr)</sup>
|
||||
I use. Recently, I had to write small documents (approx 3 pages), with a
|
||||
bibliography, and that just needed to have a nice and neat presentation. Before
|
||||
going farther, I decided to give a try to [typst](https://typst.app/). It is an
|
||||
open-source typesetting engine that is written in
|
||||
[rust](https://rust-lang.org/), that promotes modern features such as
|
||||
_incremental compilation_, and a scripting language that is actually readable by
|
||||
humans. Moreover, the markup language is clean, and as in
|
||||
[markdown](https://daringfireball.net/projects/markdown/) or
|
||||
[asciidoc](https://asciidoc.org/), it can be read from the source (without a
|
||||
[concealer](https://alok.github.io/2018/04/26/using-vim-s-conceal-to-make-languages-more-tolerable/))
|
||||
to have an idea of the typeset text before compiling it.
|
||||
|
||||
The project is still in development and some features may break before the first
|
||||
major version is out. However, to quickly generate a document, it can be a good
|
||||
idea to consider. It is also to note that there is no native output from Typst
|
||||
to html, but Pandoc can read and write `.typ` files, so it’s an alternative
|
||||
worth considering given that native LaTeX is **not** easy to write for that
|
||||
purpose.
|
||||
|
||||
In the following, it will be a quick overview of the features that I find nice
|
||||
in Typst. Please don’t expect a in-depth review, I only used it for a couple of
|
||||
opportunities.
|
||||
|
||||
# Example: a letter (the French way)
|
||||
|
||||
Now, let us look at what a Typst document looks like. For a simple example, I’ll
|
||||
take the letter one, for which I wrote a simple template to generate them. The
|
||||
template is available in [this
|
||||
repository](https://git.epheme.re/fmouhart/typst-lettre). The main issue I had
|
||||
is that the French way of doing letters revert the order of the addresses of the
|
||||
sender and recipient are… reverted compared to the English style.
|
||||
|
||||
Let us dig in what it does by looking at the example file.
|
||||
|
||||
First thing first, the file is loading the template from `lettre.typ`. This file
|
||||
defines the typesetting and the paginations properties, and provide a
|
||||
initialisation function to define the different headers, which you can look into
|
||||
if you feel curious. If you find it a bit unbearable, you can create a new file
|
||||
`preamble.typ` to hide everything, and include it with `#include "preamble.typ"`
|
||||
at the outset of the file.
|
||||
|
||||
```typst
|
||||
#import "lettre.typ": *
|
||||
#show link: strong
|
||||
|
||||
#show: doc => lettre(
|
||||
de: [
|
||||
Sender\
|
||||
Address
|
||||
],
|
||||
pour: [
|
||||
Recipient\
|
||||
Address
|
||||
],
|
||||
objet: "subject of the letter", // optional
|
||||
date: "date of sending", // optional
|
||||
lieu: "location",
|
||||
introduction: "opening",
|
||||
cloture: "closing",
|
||||
signature: "signature",
|
||||
post: [
|
||||
post-letter (e.g., post-scriptum)
|
||||
],
|
||||
doc
|
||||
)
|
||||
```
|
||||
|
||||
This will generate the template with the elements where they should be, in a
|
||||
very simple fashion. Now, we just have to write the content of the letter and
|
||||
have a `pdf` file pretty easily with `typst compile` without all the files that
|
||||
_LaTeX_ generates for us. As a bonus, it also set some PDFs metadata from the
|
||||
input variables.
|
||||
|
||||
# Bibliography
|
||||
|
||||
Another nice feature is that Typst embeds a bibliography engine, that is
|
||||
compatible with the bibtex format. Meaning that I don’t have to change the way I
|
||||
manage my bibliography or directly use [community-managed
|
||||
bibliography](https://cryptobib.di.ens.fr/)
|
||||
|
||||
For that you simply have to call the bibliography function where you want it to be generated:
|
||||
|
||||
```typst
|
||||
#bibliography("bibliography.bib", title: "References", style: "springer-basic")
|
||||
```
|
||||
|
||||
And cite the references you want with the `@bibkey` syntax (note that it’s the
|
||||
same syntax for cross-referencing) or the `#cite` function. Note that if you
|
||||
have a `+` in your bibliography key, the label won’t be recognized. It is my
|
||||
case as my bibkeys are in the _alpha_ style with the initials of the authors +
|
||||
year up to 3 names, and a `+` afterward… To be able to cite the reference
|
||||
anyway, just do `#cite(label("bib+key"))`.
|
||||
|
||||
The full list of natively available style is given in the [Typst
|
||||
documentation](https://typst.app/docs/reference/model/bibliography/#parameters-style),
|
||||
however you can define your own in the [Citation Style
|
||||
Language](https://citationstyles.org/). Meaning that you can pick the best one
|
||||
for your usage in the [CSL
|
||||
repository](https://github.com/citation-style-language/styles).
|
||||
|
||||
Note that the bibliography command does not seem to be recognized
|
||||
|
||||
# Tooling
|
||||
|
||||
Unlike my [blogpost about using nvim for LaTeX]({filename}./nvim-latex.md),
|
||||
it’s pretty much easier here.
|
||||
|
||||
I just added the [`typst.vim`](https://github.com/kaarmu/typst.vim) plugin to
|
||||
_neovim_, added a binding for the `:TypstWatch` command and that’s basically
|
||||
all. It is possible to set the `g:typst_pdf_viewer` (`vim.g.typst_pdf_viewer` in
|
||||
Lua) global variable as well if you want to have a different default PDF viewer
|
||||
for your system and for edition.
|
||||
|
||||
Now, each time I save, the document is incrementally compiled (I think) and
|
||||
updated in my PDF viewer.
|
||||
|
||||
I tried using typst language servers as well, but they don’t seem mature yet and
|
||||
in the end the `typst.vim` plugin suffices to my needs without being too nosy.
|
||||
|
||||
Hopefully, the tooling will be better with time.
|
||||
|
||||
# Conclusion
|
||||
|
||||
For simple document typesetting, even with features such as bibliography,
|
||||
cross-referencing, and table of contents, Typst seems to be a good choice.
|
||||
However, for long-term support documents, such as documentation, I would wait to
|
||||
see it more stable. Even while writing this blog post, the _lettre_ template I
|
||||
made was done in Typst 0.11, and preparing it in a repository raises some
|
||||
warnings about breaking changes from 0.12:
|
||||
|
||||
> Added
|
||||
> [`par.spacing`](https://typst.app/docs/reference/model/par/#parameters-spacing
|
||||
> "Typst Documentation: paragraph spacing") property for configuring paragraph
|
||||
> spacing. This should now be used instead of `show par: set block(spacing: ..)`
|
||||
> **(Breaking change)**
|
||||
|
||||
Which let me also say that one other advantage from Typst is… the error messages
|
||||
that are way much cleaner than the ones from _LaTeX_. Leading to easier
|
||||
debugging as well. I, however, can’t say for sure as I didn’t typeset big documents using
|
||||
Typst yet (which is unlikely to happen given my stance so far, but who knows…).
|
||||
|
||||
Finally, to complete the note about compiling in latex from Pandoc in the
|
||||
introduction of this blogpost… I’m apparently not up to date. For the sake of
|
||||
transparency, it is possible to use different PDF engines with Pandoc according
|
||||
to the [documentation](https://pandoc.org/MANUAL.html#option--pdf-engine). I
|
||||
didn’t try them yet, so I can’t provide feedbacks about them. Note that Typst is
|
||||
part of the PDF generators, as well as other nice typesetting projects such as
|
||||
[pagedjs](https://pagedjs.org/) that aims at paginating HTML sources to have
|
||||
great web page and print-ready PDFs. However, the argument about avoiding
|
||||
intermediate steps if possible still holds (moreover when the syntax of Typst is
|
||||
already clean enough).
|
Loading…
Reference in New Issue
Block a user