A Typst library for writing algorithms. On Typst v0.6.0+ you can import the algo package:
#import "@preview/algo:0.3.0": algo, i, d, comment, code
Otherwise, add the algo.typ file to your project and import it as normal:
#import "algo.typ": algo, i, d, comment, code
Use the algo function for writing pseudocode and the code function for writing code blocks with line numbers. Check out the examples below for a quick overview. See the usage section to read about all the options each function has.
Examples
Here’s a basic use of algo:
#algo(
title: "Fib",
parameters: ("n",)
)[
if $n < 0$:#i\ // use #i to indent the following lines
return null#d\ // use #d to to dedent the following lines
if $n = 0$ or $n = 1$:#i #comment[you can also]\
return $n$#d #comment[add comments!]\
return #smallcaps("Fib")$(n-1) +$ #smallcaps("Fib")$(n-2)$
]
Here’s a use of algo without a title, parameters, line numbers, or syntax highlighting:
#algo(
line-numbers: false,
strong-keywords: false
)[
if $n < 0$:#i\
return null#d\
if $n = 0$ or $n = 1$:#i\
return $n$#d\
\
let $x <- 0$\
let $y <- 1$\
for $i <- 2$ to $n-1$:#i #comment[so dynamic!]\
let $z <- x+y$\
$x <- y$\
$y <- z$#d\
\
return $x+y$
]
And here’s algo with more styling options:
#algo(
title: [ // note that title and parameters
#set text(size: 15pt) // can be content
#emph(smallcaps("Fib"))
],
parameters: ([#math.italic("n")],),
comment-prefix: [#sym.triangle.stroked.r ],
comment-styles: (fill: rgb(100%, 0%, 0%)),
indent-size: 15pt,
indent-guides: 1pt + gray,
row-gutter: 5pt,
column-gutter: 5pt,
inset: 5pt,
stroke: 2pt + black,
fill: none,
)[
if $n < 0$:#i\
return null#d\
if $n = 0$ or $n = 1$:#i\
return $n$#d\
\
let $x <- 0$\
let $y <- 1$\
for $i <- 2$ to $n-1$:#i #comment[so dynamic!]\
let $z <- x+y$\
$x <- y$\
$y <- z$#d\
\
return $x+y$
]
Here’s a basic use of code:
#code()[
```py
def fib(n):
if n < 0:
return None
if n == 0 or n == 1: # this comment is
return n # normal raw text
return fib(n-1) + fib(n-2)
```
]
And here’s code with some styling options:
#code(
indent-guides: 1pt + gray,
row-gutter: 5pt,
column-gutter: 5pt,
inset: 5pt,
stroke: 2pt + black,
fill: none,
)[
```py
def fib(n):
if n < 0:
return None
if n == 0 or n == 1: # this comment is
return n # normal raw text
return fib(n-1) + fib(n-2)
```
]
Usage
algo
Makes a pseudocode element.
Parameters:
body:content— Main algorithm content.header:content— Algorithm header. If specified,titleandparametersare ignored.title:stringorcontent— Algorithm title. Ignored ifheaderis specified.Parameters:array— List of algorithm parameters. Elements can bestringorcontentvalues.stringvalues will automatically be displayed in math mode. Ignored ifheaderis specified.line-numbers:boolean— Whether to display line numbers.strong-keywords:boolean— Whether to strongly emphasize keywords.keywords:array— List of terms to receive strong emphasis. Elements must bestringvalues. Ignored ifstrong-keywordsisfalse.comment-prefix:content— What to prepend comments with.indent-size:length— Size of line indentations.indent-guides:stroke— Stroke for indent guides.indent-guides-offset:length— Horizontal offset of indent guides.row-gutter:length— Space between lines.column-gutter:length— Space between line numbers, text, and comments.inset:length— Size of inner padding.fill:color— Fill color.stroke:stroke— Stroke for the element’s border.radius:length— Corner radius.breakable:boolean— Whether the element can break across pages. WARNING: indent guides may look off when broken across pages.block-align:noneoralignmentor2d alignment— Alignment of thealgoon the page. Usingnonewill cause the internalblockelement to be returned as-is.main-text-styles:dictionary— Styling options for the main algorithm text. Supports all parameters in Typst’s nativetextfunction.comment-styles:dictionary— Styling options for comment text. Supports all parameters in Typst’s nativetextfunction.line-number-styles:dictionary— Styling options for line numbers. Supports all parameters in Typst’s nativetextfunction.
i and d
For use in an algo body. #i indents all following lines and #d dedents all following lines.
comment
For use in an algo body. Adds a comment to the line in which it’s placed.
Parameters:
body:content— Comment content.
code
Makes a code block element.
Parameters:
body:content— Main content. Expectsrawtext.line-numbers:boolean— Whether to display line numbers.indent-guides:stroke— Stroke for indent guides.indent-guides-offset:length— Horizontal offset of indent guides.tab-size:integer— Amount of spaces that should be considered an indent. If unspecified, the tab size is determined automatically from the first instance of starting whitespace.row-gutter:length— Space between lines.column-gutter:length— Space between line numbers and text.inset:length— Size of inner padding.fill:color— Fill color.stroke:stroke— Stroke for the element’s border.radius:length— Corner radius.breakable:boolean— Whether the element can break across pages. WARNING: indent guides may look off when broken across pages.block-align:noneoralignmentor2d alignment— Alignment of thecodeon the page. Usingnonewill cause the internalblockelement to be returned as-is.main-text-styles:dictionary— Styling options for the main raw text. Supports all parameters in Typst’s nativetextfunction.line-number-styles:dictionary— Styling options for line numbers. Supports all parameters in Typst’s nativetextfunction.
Contributing
PRs are welcome! And if you encounter any bugs or have any requests/ideas, feel free to open an issue.