From b337042499e4a4a587c9b6101425641e380605fc Mon Sep 17 00:00:00 2001 From: Gordon Woodhull Date: Fri, 16 Jan 2026 13:52:26 -0500 Subject: [PATCH 1/2] claude: fix relative font-paths in typst extensions (#13745) Resolve relative font paths to absolute paths before passing them to typst compile. This fixes the issue where font-paths specified in extension configurations weren't being found when the input document was in a subdirectory. The extension mechanism resolves font-paths relative to the input document, but typst compile may run from a different working directory. By converting relative paths to absolute paths using the input directory, the fonts are now correctly located. Adds a test case that verifies extension font-paths work correctly when the document is in a subdirectory. Co-Authored-By: Claude Opus 4.5 --- src/command/render/output-typst.ts | 16 ++++++++++++++-- .../_extensions/test-fonts/_extension.yml | 9 +++++++++ .../test-fonts/fonts/Amaranth-Regular.ttf | Bin 0 -> 62608 bytes .../typst/extension-font-paths/_quarto.yml | 2 ++ .../typst/extension-font-paths/subdir/doc.qmd | 16 ++++++++++++++++ 5 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 tests/docs/smoke-all/typst/extension-font-paths/_extensions/test-fonts/_extension.yml create mode 100644 tests/docs/smoke-all/typst/extension-font-paths/_extensions/test-fonts/fonts/Amaranth-Regular.ttf create mode 100644 tests/docs/smoke-all/typst/extension-font-paths/_quarto.yml create mode 100644 tests/docs/smoke-all/typst/extension-font-paths/subdir/doc.qmd diff --git a/src/command/render/output-typst.ts b/src/command/render/output-typst.ts index 83a5b3f9cac..fd6df30f99c 100644 --- a/src/command/render/output-typst.ts +++ b/src/command/render/output-typst.ts @@ -4,7 +4,13 @@ * Copyright (C) 2020-2022 Posit Software, PBC */ -import { dirname, join, normalize, relative } from "../../deno_ral/path.ts"; +import { + dirname, + isAbsolute, + join, + normalize, + relative, +} from "../../deno_ral/path.ts"; import { ensureDirSync, safeRemoveSync } from "../../deno_ral/fs.ts"; import { @@ -63,9 +69,15 @@ export function typstPdfOutputRecipe( // run typst await validateRequiredTypstVersion(); const pdfOutput = join(inputDir, inputStem + ".pdf"); + // Resolve font paths to absolute paths since typst compile may run from + // a different working directory than the input file's directory + const fontPaths = asArray(format.metadata?.[kFontPaths]).map((p) => { + const fontPath = p as string; + return isAbsolute(fontPath) ? fontPath : join(inputDir, fontPath); + }); const typstOptions: TypstCompileOptions = { quiet: options.flags?.quiet, - fontPaths: asArray(format.metadata?.[kFontPaths]) as string[], + fontPaths, }; if (project?.dir) { typstOptions.rootDir = project.dir; diff --git a/tests/docs/smoke-all/typst/extension-font-paths/_extensions/test-fonts/_extension.yml b/tests/docs/smoke-all/typst/extension-font-paths/_extensions/test-fonts/_extension.yml new file mode 100644 index 00000000000..b5e682eeca9 --- /dev/null +++ b/tests/docs/smoke-all/typst/extension-font-paths/_extensions/test-fonts/_extension.yml @@ -0,0 +1,9 @@ +title: test-fonts +author: Quarto +version: 1.0.0 +quarto-required: ">=1.4.0" +contributes: + formats: + typst: + font-paths: + - fonts diff --git a/tests/docs/smoke-all/typst/extension-font-paths/_extensions/test-fonts/fonts/Amaranth-Regular.ttf b/tests/docs/smoke-all/typst/extension-font-paths/_extensions/test-fonts/fonts/Amaranth-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..944ccf7d0a59f678e526f2bbb0382c7e47cb01a5 GIT binary patch literal 62608 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 literal 0 HcmV?d00001 diff --git a/tests/docs/smoke-all/typst/extension-font-paths/_quarto.yml b/tests/docs/smoke-all/typst/extension-font-paths/_quarto.yml new file mode 100644 index 00000000000..b8bae5830fa --- /dev/null +++ b/tests/docs/smoke-all/typst/extension-font-paths/_quarto.yml @@ -0,0 +1,2 @@ +project: + type: default diff --git a/tests/docs/smoke-all/typst/extension-font-paths/subdir/doc.qmd b/tests/docs/smoke-all/typst/extension-font-paths/subdir/doc.qmd new file mode 100644 index 00000000000..4e2df733d6d --- /dev/null +++ b/tests/docs/smoke-all/typst/extension-font-paths/subdir/doc.qmd @@ -0,0 +1,16 @@ +--- +title: Extension Font Paths Test +format: test-fonts-typst +_quarto: + tests: + typst: + printsMessage: + level: INFO + regex: 'warning: unknown font family' + negate: true +--- + +```{=typst} +#set text(font: "Amaranth") +Testing font from extension with relative font-paths. +``` From b586e72c4b594b0fcb7672d3486058186b951bdc Mon Sep 17 00:00:00 2001 From: Gordon Woodhull Date: Fri, 16 Jan 2026 14:20:24 -0500 Subject: [PATCH 2/2] claude: fix relative font-paths in typst extensions (#13745) Only resolve font paths that come from extensions (paths containing _extensions or starting with ..) relative to the input directory. Other relative paths like .quarto/typst-font-cache should remain relative to the working directory where typst runs. This fixes the issue where font-paths specified in extension configurations weren't being found when the input document was in a subdirectory, while preserving correct behavior for brand font cache paths. Adds a test case that verifies extension font-paths work correctly when the document is in a subdirectory. Co-Authored-By: Claude Opus 4.5 --- news/changelog-1.9.md | 1 + src/command/render/output-typst.ts | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/news/changelog-1.9.md b/news/changelog-1.9.md index 14f341aa6d9..30679e759b0 100644 --- a/news/changelog-1.9.md +++ b/news/changelog-1.9.md @@ -41,6 +41,7 @@ All changes included in 1.9: - ([#13555](https://github.com/quarto-dev/quarto-cli/issues/13555)): Add support for `icon=false` in callouts when used in `format: typst`. - ([#13589](https://github.com/quarto-dev/quarto-cli/issues/13589)): Fix callouts with invalid ID prefixes crashing with "attempt to index a nil value". Callouts with unknown reference types now render as non-crossreferenceable callouts with a warning, ignoring the invalid ID. - ([#13602](https://github.com/quarto-dev/quarto-cli/issues/13602)): Fix support for multiple files set in `bibliography` field in `biblio.typ` template partial. +- ([#13745](https://github.com/quarto-dev/quarto-cli/issues/13745)): Fix relative `font-paths` in custom Typst format extensions not working when the input document is in a subdirectory. Extension font paths are now resolved relative to the input file directory. - ([#13775](https://github.com/quarto-dev/quarto-cli/issues/13775)): Fix brand fonts not being applied when using `citeproc: true` with Typst format. Format detection now properly handles Pandoc format variants like `typst-citations`. - ([#13249](https://github.com/quarto-dev/quarto-cli/pull/13249)): Update to Pandoc's Typst template following Pandoc 3.8.3 and Typst 0.14.2 support: - Code syntax highlighting now uses Skylighting by default. diff --git a/src/command/render/output-typst.ts b/src/command/render/output-typst.ts index fd6df30f99c..956560f91df 100644 --- a/src/command/render/output-typst.ts +++ b/src/command/render/output-typst.ts @@ -69,11 +69,22 @@ export function typstPdfOutputRecipe( // run typst await validateRequiredTypstVersion(); const pdfOutput = join(inputDir, inputStem + ".pdf"); - // Resolve font paths to absolute paths since typst compile may run from - // a different working directory than the input file's directory + // Resolve extension font paths to absolute paths since typst compile runs + // from the project root, not the input file's directory. Extension paths + // (containing _extensions or starting with ..) need resolution relative to + // inputDir, while other paths (like .quarto/font-cache) should remain + // relative to the working directory. const fontPaths = asArray(format.metadata?.[kFontPaths]).map((p) => { const fontPath = p as string; - return isAbsolute(fontPath) ? fontPath : join(inputDir, fontPath); + if (isAbsolute(fontPath)) { + return fontPath; + } + // Extension-resolved paths need to be resolved relative to input file + if (fontPath.includes("_extensions") || fontPath.startsWith("..")) { + return join(inputDir, fontPath); + } + // Other relative paths (like .quarto/...) stay relative to working dir + return fontPath; }); const typstOptions: TypstCompileOptions = { quiet: options.flags?.quiet,