Adding dependencies
You can add dependencies to your flake inputs1 so that Typst compilation does not depend on the transient state of the local system: instead, any dependencies are automatically fetched and made available in a sandboxed environment.
Examples of dependencies you might want to add:
- Font files —
fontPaths
- Image files —
virtualPaths
- Data files (e.g. JSON,
TOML, XML) —
virtualPaths
For a more complete description of how to specify flake inputs, see the Nix Reference Manual section on flakerefs.
See also: https://zero-to-nix.com/concepts/flakes
nixpkgs
Many popular fonts are available as packages to nixpkgs, so if you're wanting to add a font it's good to try that before anything else.
To determine the path(s) to the files you wish to include, first run the
following command (which creates a symbolic link named result
in the current
directory):
nix-build '<nixpkgs>' --out-link result --attr PACKAGE_NAME
Then explore the result
with whichever commands you like — for instance, using
unix-tree
:
tree ./result
result
└── share
└── fonts
└── truetype
├── Roboto-BlackItalic.ttf
├── Roboto-Black.ttf
├── Roboto-BoldItalic.ttf
├── Roboto-Bold.ttf
├── RobotoCondensed-BoldItalic.ttf
├── RobotoCondensed-Bold.ttf
├── RobotoCondensed-Italic.ttf
├── RobotoCondensed-LightItalic.ttf
├── RobotoCondensed-Light.ttf
├── RobotoCondensed-MediumItalic.ttf
├── RobotoCondensed-Medium.ttf
├── RobotoCondensed-Regular.ttf
├── Roboto-Italic.ttf
├── Roboto-LightItalic.ttf
├── Roboto-Light.ttf
├── Roboto-MediumItalic.ttf
├── Roboto-Medium.ttf
├── Roboto-Regular.ttf
├── Roboto-ThinItalic.ttf
└── Roboto-Thin.ttf
Here, we can see that the relative path should be share/fonts/truetype
, so in
flake.nix
we use that information like so:
{
outputs = { nixpkgs, typix }: let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
in {
packages.${system}.default = typix.lib.${system}.mkTypstDerivation {
fontPaths = [
"${pkgs.roboto}/share/fonts/truetype"
];
};
};
}
GitHub
GitHub hosts a great deal of fonts and icon libraries, and Nix makes it easy to add GitHub repositories as flake inputs with URL-like syntax.
Here's an example of specifying a GitHub URL as a flake input and adding it to
virtualPaths
, specifying
that we want the svgs/regular
directory to be accessible from icons
:
{
inputs = {
font-awesome = {
url = "github:FortAwesome/Font-Awesome";
flake = false;
};
};
outputs = { typix, font-awesome }: let
system = "x86_64-linux";
in {
packages.${system}.default = typix.lib.${system}.mkTypstDerivation {
virtualPaths = [
{
dest = "icons";
src = "${font-awesome}/svgs/regular";
}
];
};
};
}
With this, we can use it in Typst as if it were any other local path:
#image("icons/heart.svg")
Using local files
If all else fails, you can always manually download what you need and move it to your Typst project directory.
Here's what you need to know:
- The Typst compiler invoked by
buildTypstProject
,buildTypstProjectLocal
, etc. won't see the files you've added unless they're present in one of the source tree parameters — in practice, these aresrc
,fontPaths
, andvirtualPaths
. (This doesn't apply towatchTypstProject
.) - Paths to font files must still be passed in
fontPaths
or otherwise made known to the Typst compiler (e.g. via--font-path
).
See "Specifying sources" for information on how to expand a source tree to include the files you need.