2.4 KiB
Typst
Typst can be configured to include packages from Typst Universe or custom packages.
Custom Environment
You can create a custom Typst environment with a selected set of packages from Typst Universe using the following code. It is also possible to specify a Typst package with a specific version (e.g., cetz_0_3_0
). A package without a version number will always refer to its latest version.
typst.withPackages (
p: with p; [
polylux_0_4_0
cetz_0_3_0
]
)
Handling Outdated Package Hashes
Since Typst Universe does not provide a way to fetch a package with a specific hash, the package hashes in nixpkgs
can sometimes be outdated. To resolve this issue, you can manually override the package source using the following approach:
typst.withPackages.override
(old: {
typstPackages = old.typstPackages.extend (
_: previous: {
polylux_0_4_0 = previous.polylux_0_4_0.overrideAttrs (oldPolylux: {
src = oldPolylux.src.overrideAttrs {
outputHash = YourUpToDatePolyluxHash;
};
});
}
);
})
(
p: with p; [
polylux_0_4_0
cetz_0_3_0
]
)
Custom Packages
Nixpkgs
provides a helper function, buildTypstPackage
, to build custom Typst packages that can be used within the Typst environment. However, all dependencies of the custom package must be explicitly specified in typstDeps
.
Here's how to define a custom Typst package:
{
buildTypstPackage,
typstPackages,
}:
buildTypstPackage (finalAttrs: {
pname = "my-typst-package";
version = "0.0.1";
src = ./.;
typstDeps = with typstPackages; [ cetz_0_3_0 ];
})
Package Scope and Usage
By default, every custom package is scoped under @preview
, as shown below:
#import "@preview/my-typst-package:0.0.1": *
Since @preview
is intended for packages from Typst Universe, it is recommended to use this approach only for temporary or experimental modifications over existing packages from Typst Universe.
On the other hand, local packages, packages scoped under @local
, are not considered part of the Typst environment. This means that local packages must be manually linked to the Typst compiler if needed.