diff --git a/services/clsi/app/js/QuartoRunner.js b/services/clsi/app/js/QuartoRunner.js index c664bc5691..75ad7bf404 100644 --- a/services/clsi/app/js/QuartoRunner.js +++ b/services/clsi/app/js/QuartoRunner.js @@ -52,18 +52,19 @@ function _buildQuartoCommand(mainFile) { // Run through a POSIX shell so stderr is merged into stdout (2>&1). // Quarto writes all progress and error messages to stderr; without this // the log panel would be empty on failure. - // LocalCommandRunner replaces $COMPILE_DIR before the shell sees the - // string, so no shell variable expansion occurs for that token. - const quartoArgs = [ - 'quarto', - 'render', - `$COMPILE_DIR/${mainFile}`, - '--to', - 'typst', - '--output', - 'output.pdf', - ].join(' ') - return ['/bin/sh', '-c', `${quartoArgs} 2>&1`] + // LocalCommandRunner replaces $COMPILE_DIR before the shell sees it. + // + // Do NOT pass --output: combining --to typst with --output *.pdf causes + // Quarto to write a Typst source file (.typ) with a .pdf extension instead + // of running the full typst→PDF pipeline. Instead, let Quarto name the PDF + // after the source file (main.qmd → main.pdf) and rename it afterwards. + const inputPath = `$COMPILE_DIR/${mainFile}` + const pdfName = mainFile.replace(/\.[^/.]+$/, '') + '.pdf' + const renderedPdf = `$COMPILE_DIR/${pdfName}` + const cmd = + `quarto render ${inputPath} --to typst 2>&1 && ` + + `mv ${renderedPdf} $COMPILE_DIR/output.pdf` + return ['/bin/sh', '-c', cmd] } function _writeLogOutput(compileName, directory, output, callback) {