Path: blob/main/src/command/render/latexmk/latexmk.ts
3587 views
/*1* latexmk.ts2*3* Copyright (C) 2020-2022 Posit Software, PBC4*/56import {7kLatexAutoInstall,8kLatexAutoMk,9kLatexClean,10kLatexInputPaths,11kLatexMaxRuns,12kLatexMinRuns,13kLatexOutputDir,14kLatexTinyTex,15kOutputExt,16} from "../../../config/constants.ts";17import { Format } from "../../../config/types.ts";18import { isLatexPdfEngine, pdfEngine } from "../../../config/pdf.ts";1920import { PandocOptions, RenderFlags, RenderOptions } from "../types.ts";21import { OutputRecipe } from "../types.ts";22import { generatePdf } from "./pdf.ts";23import { LatexmkOptions } from "./types.ts";24import { texToPdfOutputRecipe } from "../output-tex.ts";25import { join } from "../../../deno_ral/path.ts";2627export function useQuartoLatexmk(28format: Format,29flags?: RenderFlags,30) {31// check writer and extension32const to = format.pandoc.to;33const ext = format.render[kOutputExt] || "html";3435// Check whether explicitly disabled36if (format.render[kLatexAutoMk] === false) {37return false;38}3940// if we are creating pdf output41if (["beamer", "pdf"].includes(to || "") && ext === "pdf") {42const engine = pdfEngine(format.pandoc, format.render, flags);43return isLatexPdfEngine(engine);44}4546// default to false47return false;48}4950export function quartoLatexmkOutputRecipe(51input: string,52finalOutput: string,53options: RenderOptions,54format: Format,55): OutputRecipe {56// output dir57const outputDir = format.render[kLatexOutputDir];5859const generate = (60input: string,61format: Format,62pandocOptions: PandocOptions,63): Promise<string> => {64// Resolve any tex input paths65const texInputDirs: string[] = [];66if (format.render[kLatexInputPaths]) {67texInputDirs.push(...format.render[kLatexInputPaths]!);68}6970// determine latexmk options71const mkOptions: LatexmkOptions = {72input,73engine: pdfEngine(format.pandoc, format.render, pandocOptions.flags),74autoInstall: format.render[kLatexAutoInstall],75autoMk: format.render[kLatexAutoMk],76minRuns: format.render[kLatexMinRuns],77maxRuns: format.render[kLatexMaxRuns],78tinyTex: format.render[kLatexTinyTex],79texInputDirs,80outputDir: outputDir === null ? undefined : outputDir,81clean: !options.flags?.debug && format.render[kLatexClean] !== false,82quiet: pandocOptions.flags?.quiet,83};8485// run latexmk86return generatePdf(mkOptions);87};8889const computePath = (texStem: string, inputDir: string, format: Format) => {90const mkOutputdir = format.render[kLatexOutputDir];91return mkOutputdir92? join(mkOutputdir, texStem + ".pdf")93: join(inputDir, texStem + ".pdf");94};9596return texToPdfOutputRecipe(97input,98finalOutput,99options,100format,101"latex",102{103generate,104computePath,105},106outputDir,107);108}109110111