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.
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.
-
See also: https://zero-to-nix.com/concepts/flakes ↩