Spaces:
Sleeping
Sleeping
| description: | | |
| Are you a LaTeX user? This guide explains the differences and | |
| similarities between Typst and LaTeX so you can get started quickly. | |
| # Guide for LaTeX users { # } | |
| This page is a good starting point if you have used LaTeX before and want to try | |
| out Typst. We will explore the main differences between these two systems from a | |
| user perspective. Although Typst is not built upon LaTeX and has a different | |
| syntax, you will learn how to use your LaTeX skills to get a head start. | |
| Just like LaTeX, Typst is a markup-based typesetting system: You compose your | |
| document in a text file and mark it up with commands and other syntax. Then, you | |
| use a compiler to typeset the source file into a PDF. However, Typst also | |
| differs from LaTeX in several aspects: For one, Typst uses more dedicated syntax | |
| (like you may know from Markdown) for common tasks. Typst's commands are also | |
| more principled: They all work the same, so unlike in LaTeX, you just need to | |
| understand a few general concepts instead of learning different conventions for | |
| each package. Moreover Typst compiles faster than LaTeX: Compilation usually | |
| takes milliseconds, not seconds, so the web app and the compiler can both | |
| provide instant previews. | |
| In the following, we will cover some of the most common questions a user | |
| switching from LaTeX will have when composing a document in Typst. If you prefer | |
| a step-by-step introduction to Typst, check out our [tutorial]. | |
| ## Installation | |
| You have two ways to use Typst: In [our web app](https://typst.app/signup/) or | |
| by [installing the compiler](https://github.com/typst/typst/releases) on your | |
| computer. When you use the web app, we provide a batteries-included | |
| collaborative editor and run Typst in your browser, no installation required. | |
| If you choose to use Typst on your computer instead, you can download the | |
| compiler as a single, small binary which any user can run, no root privileges | |
| required. Unlike LaTeX, packages are downloaded when you first use them and | |
| then cached locally, keeping your Typst installation lean. You can use your own | |
| editor and decide where to store your files with the local compiler. | |
| ## How do I create a new, empty document? { #getting-started } | |
| That's easy. You just create a new, empty text file (the file extension is | |
| `.typ`). No boilerplate is needed to get started. Simply start by writing your | |
| text. It will be set on an empty A4-sized page. If you are using the web app, | |
| click "+ Empty document" to create a new project with a file and enter the | |
| editor. [Paragraph breaks]($parbreak) work just as they do in LaTeX, just use a | |
| blank line. | |
| ```example | |
| Hey there! | |
| Here are two paragraphs. The | |
| output is shown to the right. | |
| ``` | |
| If you want to start from an preexisting LaTeX document instead, you can use | |
| [Pandoc](https://pandoc.org) to convert your source code to Typst markup. This | |
| conversion is also built into our web app, so you can upload your `.tex` file to | |
| start your project in Typst. | |
| ## How do I create section headings, emphasis, ...? { #elements } | |
| LaTeX uses the command `\section` to create a section heading. Nested headings | |
| are indicated with `\subsection`, `\subsubsection`, etc. Depending on your | |
| document class, there is also `\part` or `\chapter`. | |
| In Typst, [headings]($heading) are less verbose: You prefix the line with the | |
| heading on it with an equals sign and a space to get a first-order heading: | |
| `[= Introduction]`. If you need a second-order heading, you use two equals | |
| signs: `[== In this paper]`. You can nest headings as deeply as you'd like by | |
| adding more equals signs. | |
| Emphasis (usually rendered as italic text) is expressed by enclosing text in | |
| `[_underscores_]` and strong emphasis (usually rendered in boldface) by using | |
| `[*stars*]` instead. | |
| Here is a list of common markup commands used in LaTeX and their Typst | |
| equivalents. You can also check out the [full syntax cheat sheet]($syntax). | |
| | Element | LaTeX | Typst | See | | |
| |:-----------------|:--------------------------|:-----------------------|:-----------| | |
| | Strong emphasis | `\textbf{strong}` | `[*strong*]` | [`strong`] | | |
| | Emphasis | `\emph{emphasis}` | `[_emphasis_]` | [`emph`] | | |
| | Monospace / code | `\texttt{print(1)}` | ``[`print(1)`]`` | [`raw`] | | |
| | Link | `\url{https://typst.app}` | `[https://typst.app/]` | [`link`] | | |
| | Label | `\label{intro}` | `[<intro>]` | [`label`] | | |
| | Reference | `\ref{intro}` | `[@intro]` | [`ref`] | | |
| | Citation | `\cite{humphrey97}` | `[@humphrey97]` | [`cite`] | | |
| | Bullet list | `itemize` environment | `[- List]` | [`list`] | | |
| | Numbered list | `enumerate` environment | `[+ List]` | [`enum`] | | |
| | Term list | `description` environment | `[/ Term: List]` | [`terms`] | | |
| | Figure | `figure` environment | `figure` function | [`figure`] | | |
| | Table | `table` environment | `table` function | [`table`] | | |
| | Equation | `$x$`, `align` / `equation` environments | `[$x$]`, `[$ x = y $]` | [`equation`]($math.equation) | | |
| [Lists]($list) do not rely on environments in Typst. Instead, they have | |
| lightweight syntax like headings. To create an unordered list (`itemize`), | |
| prefix each line of an item with a hyphen: | |
| ````example | |
| To write this list in Typst... | |
| ```latex | |
| \begin{itemize} | |
| \item Fast | |
| \item Flexible | |
| \item Intuitive | |
| \end{itemize} | |
| ``` | |
| ...just type this: | |
| - Fast | |
| - Flexible | |
| - Intuitive | |
| ```` | |
| Nesting lists works just by using proper indentation. Adding a blank line in | |
| between items results in a more [widely]($list.tight) spaced list. | |
| To get a [numbered list]($enum) (`enumerate`) instead, use a `+` instead of the | |
| hyphen. For a [term list]($terms) (`description`), write `[/ Term: Description]` | |
| instead. | |
| ## How do I use a command? { #commands } | |
| LaTeX heavily relies on commands (prefixed by backslashes). It uses these | |
| _macros_ to affect the typesetting process and to insert and manipulate content. | |
| Some commands accept arguments, which are most frequently enclosed in curly | |
| braces: `\cite{rasmus}`. | |
| Typst differentiates between [markup mode and code mode]($scripting/#blocks). | |
| The default is markup mode, where you compose text and apply syntactic | |
| constructs such as `[*stars for bold text*]`. Code mode, on the other hand, | |
| parallels programming languages like Python, providing the option to input and | |
| execute segments of code. | |
| Within Typst's markup, you can switch to code mode for a single command (or | |
| rather, _expression_) using a hash (`#`). This is how you call functions to, for | |
| example, split your project into different [files]($scripting/#modules) or | |
| render text based on some [condition]($scripting/#conditionals). Within code | |
| mode, it is possible to include normal markup [_content_]($content) by using | |
| square brackets. Within code mode, this content is treated just as any other | |
| normal value for a variable. | |
| ```example | |
| First, a rectangle: | |
| #rect() | |
| Let me show how to do | |
| #underline([_underlined_ text]) | |
| We can also do some maths: | |
| #calc.max(3, 2 * 4) | |
| And finally a little loop: | |
| #for x in range(3) [ | |
| Hi #x. | |
| ] | |
| ``` | |
| A function call always involves the name of the function ([`rect`], | |
| [`underline`], [`calc.max`]($calc.max), [`range`]($array.range)) followed by | |
| parentheses (as opposed to LaTeX where the square brackets and curly braces are | |
| optional if the macro requires no arguments). The expected list of arguments | |
| passed within those parentheses depends on the concrete function and is | |
| specified in the [reference]. | |
| ### Arguments | |
| A function can have multiple arguments. Some arguments are positional, i.e., you | |
| just provide the value: The function `[#lower("SCREAM")]` returns its argument | |
| in all-lowercase. Many functions use named arguments instead of positional | |
| arguments to increase legibility. For example, the dimensions and stroke of a | |
| rectangle are defined with named arguments: | |
| ```example | |
| #rect( | |
| width: 2cm, | |
| height: 1cm, | |
| stroke: red, | |
| ) | |
| ``` | |
| You specify a named argument by first entering its name (above, it's `width`, | |
| `height`, and `stroke`), then a colon, followed by the value (`2cm`, `1cm`, | |
| `red`). You can find the available named arguments in the [reference | |
| page]($reference) for each function or in the autocomplete panel when typing. | |
| Named arguments are similar to how some LaTeX environments are configured, for | |
| example, you would type `\begin{enumerate}[label={\alph*)}]` to start a list | |
| with the labels `a)`, `b)`, and so on. | |
| Often, you want to provide some [content] to a function. For example, the LaTeX | |
| command `\underline{Alternative A}` would translate to | |
| `[#underline([Alternative A])]` in Typst. The square brackets indicate that a | |
| value is [content]. Within these brackets, you can use normal markup. | |
| However, that's a lot of parentheses for a pretty simple construct. This is why | |
| you can also move trailing content arguments after the parentheses (and omit the | |
| parentheses if they would end up empty). | |
| ```example | |
| Typst is an #underline[alternative] | |
| to LaTeX. | |
| #rect(fill: aqua)[Get started here!] | |
| ``` | |
| ### Data types | |
| You likely already noticed that the arguments have distinctive data types. Typst | |
| supports many [data types]($type). Below, there is a table with some of the most | |
| important ones and how to write them. In order to specify values of any of these | |
| types, you have to be in code mode! | |
| | Data type | Example | | |
| |:--------------------------------|:----------------------------------| | |
| | [Content]($content) | `{[*fast* typesetting]}` | | |
| | [String]($str) | `{"Pietro S. Author"}` | | |
| | [Integer]($int) | `{23}` | | |
| | [Floating point number]($float) | `{1.459}` | | |
| | [Absolute length]($length) | `{12pt}`, `{5in}`, `{0.3cm}`, ... | | |
| | [Relative length]($ratio) | `{65%}` | | |
| The difference between content and string is that content can contain markup, | |
| including function calls, while a string really is just a plain sequence of | |
| characters. | |
| Typst provides [control flow constructs]($scripting/#conditionals) and | |
| [operators]($scripting/#operators) such as `+` for adding things or `==` for | |
| checking equality between two variables. | |
| You can also store values, including functions, in your own | |
| [variables]($scripting/#bindings). This can be useful to perform computations on | |
| them, create reusable automations, or reference a value multiple times. The | |
| variable binding is accomplished with the let keyword, which works similar to | |
| `\newcommand`: | |
| ```example | |
| // Store the integer `5`. | |
| #let five = 5 | |
| // Define a function that | |
| // increments a value. | |
| #let inc(i) = i + 1 | |
| // Reference the variables. | |
| I have #five fingers. | |
| If I had one more, I'd have | |
| #inc(five) fingers. Whoa! | |
| ``` | |
| ### Commands to affect the remaining document { #rules } | |
| In LaTeX, some commands like `\textbf{bold text}` receive an argument in curly | |
| braces and only affect that argument. Other commands such as `\bfseries bold | |
| text` act as switches (LaTeX calls this a declaration), altering the appearance | |
| of all subsequent content within the document or current scope. | |
| In Typst, the same function can be used both to affect the appearance for the | |
| remainder of the document, a block (or scope), or just its arguments. For | |
| example, `[#text(weight: "bold")[bold text]]` will only embolden its argument, | |
| while `[#set text(weight: "bold")]` will embolden any text until the end of the | |
| current block, or, if there is none, document. The effects of a function are | |
| immediately obvious based on whether it is used in a call or a | |
| [set rule.]($styling/#set-rules) | |
| ```example | |
| I am starting out with small text. | |
| #set text(14pt) | |
| This is a bit #text(18pt)[larger,] | |
| don't you think? | |
| ``` | |
| Set rules may appear anywhere in the document. They can be thought of as | |
| default argument values of their respective function: | |
| ```example | |
| #set enum(numbering: "I.") | |
| Good results can only be obtained by | |
| + following best practices | |
| + being aware of current results | |
| of other researchers | |
| + checking the data for biases | |
| ``` | |
| The `+` is syntactic sugar (think of it as an abbreviation) for a call to the | |
| [`{enum}`]($enum) function, to which we apply a set rule above. | |
| [Most syntax is linked to a function in this way.]($syntax) If you need to style | |
| an element beyond what its arguments enable, you can completely redefine its | |
| appearance with a [show rule]($styling/#show-rules) (somewhat comparable to | |
| `\renewcommand`). | |
| You can achieve the effects of LaTeX commands like `\textbf`, `\textsf`, | |
| `\rmfamily`, `\mdseries`, and `\itshape` with the [`font`]($text.font), | |
| [`style`]($text.style), and [`weight`]($text.weight) arguments of the `text` | |
| function. The text function can be used in a set rule (declaration style) or | |
| with a content argument. To replace `\textsc`, you can use the [`smallcaps`] | |
| function, which renders its content argument as smallcaps. Should you want to | |
| use it declaration style (like `\scshape`), you can use an | |
| [_everything_ show rule]($styling/#show-rules) that applies the function to the | |
| rest of the scope: | |
| ```example | |
| #show: smallcaps | |
| Boisterous Accusations | |
| ``` | |
| ## How do I load a document class? { #templates } | |
| In LaTeX, you start your main `.tex` file with the `\documentclass{article}` | |
| command to define how your document is supposed to look. In that command, you | |
| may have replaced `article` with another value such as `report` and `amsart` to | |
| select a different look. | |
| When using Typst, you style your documents with [functions]($function). | |
| Typically, you use a template that provides a function that styles your whole | |
| document. First, you import the function from a template file. Then, you apply | |
| it to your whole document. This is accomplished with a | |
| [show rule]($styling/#show-rules) that wraps the following document in a given | |
| function. The following example illustrates how it works: | |
| ```example:single | |
| >>> #let conf( | |
| >>> title: none, | |
| >>> authors: (), | |
| >>> abstract: [], | |
| >>> doc, | |
| >>> ) = { | |
| >>> set text(font: "Libertinus Serif", 11pt) | |
| >>> set par(justify: true) | |
| >>> set page( | |
| >>> "us-letter", | |
| >>> margin: auto, | |
| >>> header: align( | |
| >>> right + horizon, | |
| >>> title | |
| >>> ), | |
| >>> numbering: "1", | |
| >>> columns: 2 | |
| >>> ) | |
| >>> | |
| >>> show heading.where( | |
| >>> level: 1 | |
| >>> ): it => block( | |
| >>> align(center, | |
| >>> text( | |
| >>> 13pt, | |
| >>> weight: "regular", | |
| >>> smallcaps(it.body), | |
| >>> ) | |
| >>> ), | |
| >>> ) | |
| >>> show heading.where( | |
| >>> level: 2 | |
| >>> ): it => box( | |
| >>> text( | |
| >>> 11pt, | |
| >>> weight: "regular", | |
| >>> style: "italic", | |
| >>> it.body + [.], | |
| >>> ) | |
| >>> ) | |
| >>> | |
| >>> place(top, float: true, scope: "parent", { | |
| >>> set align(center) | |
| >>> text(17pt, title) | |
| >>> | |
| >>> let count = calc.min(authors.len(), 3) | |
| >>> grid( | |
| >>> columns: (1fr,) * count, | |
| >>> row-gutter: 24pt, | |
| >>> ..authors.map(author => [ | |
| >>> #author.name \ | |
| >>> #author.affiliation \ | |
| >>> #link("mailto:" + author.email) | |
| >>> ]), | |
| >>> ) | |
| >>> | |
| >>> par(justify: false)[ | |
| >>> *Abstract* \ | |
| >>> #abstract | |
| >>> ] | |
| >>> }) | |
| >>> | |
| >>> set align(left) | |
| >>> doc | |
| >>> } | |
| <<< #import "conf.typ": conf | |
| #show: conf.with( | |
| title: [ | |
| Towards Improved Modelling | |
| ], | |
| authors: ( | |
| ( | |
| name: "Theresa Tungsten", | |
| affiliation: "Artos Institute", | |
| email: "tung@artos.edu", | |
| ), | |
| ( | |
| name: "Eugene Deklan", | |
| affiliation: "Honduras State", | |
| email: "e.deklan@hstate.hn", | |
| ), | |
| ), | |
| abstract: lorem(80), | |
| ) | |
| Let's get started writing this | |
| article by putting insightful | |
| paragraphs right here! | |
| >>> #lorem(500) | |
| ``` | |
| The [`{import}`]($scripting/#modules) statement makes [functions]($function) | |
| (and other definitions) from another file available. In this example, it imports | |
| the `conf` function from the `conf.typ` file. This function formats a document | |
| as a conference article. We use a show rule to apply it to the document and also | |
| configure some metadata of the article. After applying the show rule, we can | |
| start writing our article right away! | |
| You can also use templates from Typst Universe (which is Typst's equivalent of | |
| CTAN) using an import statement like this: `[#import | |
| "@preview/elsearticle:0.2.1": elsearticle]`. Check the documentation of an | |
| individual template to learn the name of its template function. Templates and | |
| packages from Typst Universe are automatically downloaded when you first use | |
| them. | |
| In the web app, you can choose to create a project from a template on Typst | |
| Universe or even create your own using the template wizard. Locally, you can use | |
| the `typst init` CLI to create a new project from a template. Check out [the | |
| list of templates]($universe/search/?kind=templates) published on Typst | |
| Universe. You can also take a look at the [`awesome-typst` | |
| repository](https://github.com/qjcg/awesome-typst) to find community templates | |
| that aren't available through Universe. | |
| You can also [create your own, custom templates.]($tutorial/making-a-template) | |
| They are shorter and more readable than the corresponding LaTeX `.sty` files by | |
| orders of magnitude, so give it a try! | |
| <div class="info-box"> | |
| Functions are Typst's "commands" and can transform their arguments to an output | |
| value, including document _content._ Functions are "pure", which means that they | |
| cannot have any effects beyond creating an output value / output content. This | |
| is in stark contrast to LaTeX macros that can have arbitrary effects on your | |
| document. | |
| To let a function style your whole document, the show rule processes everything | |
| that comes after it and calls the function specified after the colon with the | |
| result as an argument. The `.with` part is a _method_ that takes the `conf` | |
| function and pre-configures some of its arguments before passing it on to the | |
| show rule. | |
| </div> | |
| ## How do I load packages? { #packages } | |
| Typst is "batteries included," so the equivalent of many popular LaTeX packages | |
| is built right-in. Below, we compiled a table with frequently loaded packages | |
| and their corresponding Typst functions. | |
| | LaTeX Package | Typst Alternative | | |
| |:--------------------------------|:-------------------------------------------| | |
| | graphicx, svg | [`image`] function | | |
| | tabularx | [`table`], [`grid`] functions | | |
| | fontenc, inputenc, unicode-math | Just start writing! | | |
| | babel, polyglossia | [`text`]($text.lang) function: `[#set text(lang: "zh")]` | | |
| | amsmath | [Math mode]($category/math) | | |
| | amsfonts, amssymb | [`sym`]($category/symbols) module and [syntax]($syntax/#math) | | |
| | geometry, fancyhdr | [`page`] function | | |
| | xcolor | [`text`]($text.fill) function: `[#set text(fill: rgb("#0178A4"))]` | | |
| | hyperref | [`link`] function | | |
| | bibtex, biblatex, natbib | [`cite`], [`bibliography`] functions | | |
| | lstlisting, minted | [`raw`] function and syntax | | |
| | parskip | [`block`]($block.spacing) and [`par`]($par.first-line-indent) functions | | |
| | csquotes | Set the [`text`]($text.lang) language and type `["]` or `[']` | | |
| | caption | [`figure`] function | | |
| | enumitem | [`list`], [`enum`], [`terms`] functions | | |
| Although _many_ things are built-in, not everything can be. That's why Typst has | |
| its own [package ecosystem]($universe) where the community share its creations | |
| and automations. Let's take, for instance, the _cetz_ package: This package | |
| allows you to create complex drawings and plots. To use cetz in your document, | |
| you can just write: | |
| ```typ | |
| #import "@preview/cetz:0.2.1" | |
| ``` | |
| (The `@preview` is a _namespace_ that is used while the package manager is still | |
| in its early and experimental state. It will be replaced in the future.) | |
| Aside from the official package hub, you might also want to check out the | |
| [awesome-typst repository](https://github.com/qjcg/awesome-typst), which | |
| compiles a curated list of resources created for Typst. | |
| If you need to load functions and variables from another file within your | |
| project, for example to use a template, you can use the same | |
| [`import`]($scripting/#modules) statement with a file name rather than a | |
| package specification. To instead include the textual content of another file, | |
| you can use an [`include`]($scripting/#modules) statement. It will retrieve | |
| the content of the specified file and put it in your document. | |
| ## How do I input maths? { #maths } | |
| To enter math mode in Typst, just enclose your equation in dollar signs. You can | |
| enter display mode by adding spaces or newlines between the equation's contents | |
| and its enclosing dollar signs. | |
| ```example | |
| The sum of the numbers from | |
| $1$ to $n$ is: | |
| $ sum_(k=1)^n k = (n(n+1))/2 $ | |
| ``` | |
| [Math mode]($category/math) works differently than regular markup or code mode. | |
| Numbers and single characters are displayed verbatim, while multiple consecutive | |
| (non-number) characters will be interpreted as Typst variables. | |
| Typst pre-defines a lot of useful variables in math mode. All Greek (`alpha`, | |
| `beta`, ...) and some Hebrew letters (`alef`, `bet`, ...) are available through | |
| their name. Some symbols are additionally available through shorthands, such as | |
| `<=`, `>=`, and `->`. | |
| Refer to the [symbol pages]($reference/symbols) for a full list of the symbols. | |
| If a symbol is missing, you can also access it through a | |
| [Unicode escape sequence]($syntax/#escapes). | |
| Alternate and related forms of symbols can often be selected by | |
| [appending a modifier]($symbol) after a period. For example, | |
| `arrow.l.squiggly` inserts a squiggly left-pointing arrow. If you want to insert | |
| multiletter text in your expression instead, enclose it in double quotes: | |
| ```example | |
| $ delta "if" x <= 5 $ | |
| ``` | |
| In Typst, delimiters will scale automatically for their expressions, just as if | |
| `\left` and `\right` commands were implicitly inserted in LaTeX. You can | |
| customize delimiter behaviour using the [`lr` function]($math.lr). To | |
| prevent a pair of delimiters from scaling, you can escape them with backslashes. | |
| Typst will automatically set terms around a slash `/` as a fraction while | |
| honoring operator precedence. All round parentheses not made redundant by the | |
| fraction will appear in the output. | |
| ```example | |
| $ f(x) = (x + 1) / x $ | |
| ``` | |
| [Sub- and superscripts]($math.attach) work similarly in Typst and LaTeX. | |
| `{$x^2$}` will produce a superscript, `{$x_2$}` yields a subscript. If you want | |
| to include more than one value in a sub- or superscript, enclose their contents | |
| in parentheses: `{$x_(a -> epsilon)$}`. | |
| Since variables in math mode do not need to be prepended with a `#` or a `/`, | |
| you can also call functions without these special characters: | |
| ```example | |
| $ f(x, y) := cases( | |
| 1 "if" (x dot y)/2 <= 0, | |
| 2 "if" x "is even", | |
| 3 "if" x in NN, | |
| 4 "else", | |
| ) $ | |
| ``` | |
| The above example uses the [`cases` function]($math.cases) to describe f. Within | |
| the cases function, arguments are delimited using commas and the arguments are | |
| also interpreted as math. If you need to interpret arguments as Typst | |
| values instead, prefix them with a `#`: | |
| ```example | |
| $ (a + b)^2 | |
| = a^2 | |
| + text(fill: #maroon, 2 a b) | |
| + b^2 $ | |
| ``` | |
| You can use all Typst functions within math mode and insert any content. If you | |
| want them to work normally, with code mode in the argument list, you can prefix | |
| their call with a `#`. Nobody can stop you from using rectangles or emoji as | |
| your variables anymore: | |
| ```example | |
| $ sum^10_(🥸=1) | |
| #rect(width: 4mm, height: 2mm)/🥸 | |
| = 🧠 maltese $ | |
| ``` | |
| If you'd like to enter your mathematical symbols directly as Unicode, that is | |
| possible, too! | |
| Math calls can have two-dimensional argument lists using `;` as a delimiter. The | |
| most common use for this is the [`mat` function]($math.mat) that creates | |
| matrices: | |
| ```example | |
| $ mat( | |
| 1, 2, ..., 10; | |
| 2, 2, ..., 10; | |
| dots.v, dots.v, dots.down, dots.v; | |
| 10, 10, ..., 10; | |
| ) $ | |
| ``` | |
| ## How do I get the "LaTeX look?" { #latex-look } | |
| Papers set in LaTeX have an unmistakeable look. This is mostly due to their | |
| font, Computer Modern, justification, narrow line spacing, and wide margins. | |
| The example below | |
| - sets wide [margins]($page.margin) | |
| - enables [justification]($par.justify), [tighter lines]($par.leading) and | |
| [first-line-indent]($par.first-line-indent) | |
| - [sets the font]($text.font) to "New Computer Modern", an OpenType derivative of | |
| Computer Modern for both text and [code blocks]($raw) | |
| - disables paragraph [spacing]($block.spacing) | |
| - increases [spacing]($block.spacing) around [headings]($heading) | |
| ```typ | |
| #set page(margin: 1.75in) | |
| #set par(leading: 0.55em, spacing: 0.55em, first-line-indent: 1.8em, justify: true) | |
| #set text(font: "New Computer Modern") | |
| #show raw: set text(font: "New Computer Modern Mono") | |
| #show heading: set block(above: 1.4em, below: 1em) | |
| ``` | |
| This should be a good starting point! If you want to go further, why not create | |
| a reusable template? | |
| ## Bibliographies | |
| Typst includes a fully-featured bibliography system that is compatible with | |
| BibTeX files. You can continue to use your `.bib` literature libraries by | |
| loading them with the [`bibliography`] function. Another possibility is to use | |
| [Typst's YAML-based native format](https://github.com/typst/hayagriva/blob/main/docs/file-format.md). | |
| Typst uses the Citation Style Language to define and process citation and | |
| bibliography styles. You can compare CSL files to BibLaTeX's `.bbx` files. | |
| The compiler already includes [over 80 citation styles]($bibliography.style), | |
| but you can use any CSL-compliant style from the | |
| [CSL repository](https://github.com/citation-style-language/styles) or write | |
| your own. | |
| You can cite an entry in your bibliography or reference a label in your document | |
| with the same syntax: `[@key]` (this would reference an entry called `key`). | |
| Alternatively, you can use the [`cite`] function. | |
| Alternative forms for your citation, such as year only and citations for natural | |
| use in prose (cf. `\citet` and `\textcite`) are available with | |
| [`[#cite(<key>, form: "prose")]`]($cite.form). | |
| You can find more information on the documentation page of the [`bibliography`] | |
| function. | |
| ## What limitations does Typst currently have compared to LaTeX? { #limitations } | |
| Although Typst can be a LaTeX replacement for many today, there are still | |
| features that Typst does not (yet) support. Here is a list of them which, where | |
| applicable, contains possible workarounds. | |
| - **Well-established plotting ecosystem.** LaTeX users often create elaborate | |
| charts along with their documents in PGF/TikZ. The Typst ecosystem does not | |
| yet offer the same breadth of available options, but the ecosystem around the | |
| [`cetz` package](https://typst.app/universe/package/cetz) is catching up | |
| quickly. | |
| - **Change page margins without a pagebreak.** In LaTeX, margins can always be | |
| adjusted, even without a pagebreak. To change margins in Typst, you use the | |
| [`page` function]($page) which will force a page break. If you just want a few | |
| paragraphs to stretch into the margins, then reverting to the old margins, you | |
| can use the [`pad` function]($pad) with negative padding. | |
| - **Include PDFs as images.** In LaTeX, it has become customary to insert vector | |
| graphics as PDF or EPS files. Typst supports neither format as an image | |
| format, but you can easily convert both into SVG files with [online | |
| tools](https://cloudconvert.com/pdf-to-svg) or | |
| [Inkscape](https://inkscape.org/). The web app will automatically convert PDF | |
| files to SVG files upon uploading them. You can also use the | |
| community-provided [`muchpdf` package](https://typst.app/universe/package/muchpdf) | |
| to embed PDFs. It internally converts PDFs to SVGs on-the-fly. | |