👌

QuartoでPDFを出力するときにtasks.jsonを使う

に公開

はじめに

宋・矢内のQuartoに関するドキュメント25  Quarto [文書] – 私たちのRでは、自前の.latexmkrcを使用するようにYAMLフロントマターを設定することにより、より自由な設定で\LaTeX文書を出力できるような方法を紹介していますが、個人的な事情により以下のような不都合がありました。

  • 元リンクでは-jobname=outputという記述が必要なため、出力されるPDFファイル名がoutput.pdfとなる。しかし出力されるファイル名はプロジェクトフォルダと同名であってほしい。
  • しかし-jobname=という設定を削除するとinput.pdfとなってしまう。

この事象について原因は「不明」ということでした。そこで、生成AIの助けも借りつつ、上記の要求を満たすような設定ができないか検討しました。
結果として、VS Codeのタスク(tasks.json)にレンダリングの設定を記述をすることで、この問題を回避してPDF出力が可能であることがわかりました。

YAMLフロントマター

まずQuartoドキュメントに記述するYAMLフロントマターについて、本記事に関連する部分だけを抜粋します。元リンクとの主な相違点はpdf-engine-optsオプションで-outdir=-jobname=outputという設定が不要になったことです。

yaml
format:
  pdf:
    pdf-engine: latexmk
    cite-method: natbib
    biblio-style: jecon
    documentclass: ltjsarticle
    pdf-engine-opts:
      - -lualatex
    latex-auto-mk: false

tasks.json

タスクの内容は以下のようになります。元リンクで指定していた-outdir-jobnameなどをこちらで記述しています。これによりVS Codeの事前定義変数を利用することができるため、従前の問題点を回避することができます。
ファイルの配置場所は、プロジェクト固有の場合は各プロジェクトにある.vscode/配下に、全体で共有する場合はWindowsの場合%APPDATA%\Code\User\tasks.jsonとなります。

tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Quarto: Render", // → keybindings.jsonのargsに対応させる。
      "type": "process", // シェル経由にしない=引数の解釈が安定
      "command": "quarto",
      "args": [
        "render",
        "${file}", // ← 開いている qmd の“フルパス”を必ず渡す
        "--to",
        "pdf",
        "--output",
        "${fileBasenameNoExtension}.pdf",
        "--output-dir",
        "${fileDirname}",
        "--pdf-engine-opt=-outdir=${fileDirname}",
        "--pdf-engine-opt=-jobname=${fileBasenameNoExtension}"
      ],
      "options": {
        "cwd": "${fileDirname}" // 相対参照が必要なときに備えて一応揃える
      },
      "problemMatcher": []
    }
  ]
}

keybindings.json

上記で設定したタスクに対してショートカットキーを割り当てると簡単に使用できます。

keybindings.json
{
  "key": "ctrl+alt+k",
  "command": "workbench.action.tasks.runTask",
  "args": "Quarto: Render",
  "when": "resourceExtname == .qmd && editorTextFocus"
}

課題

  • PDFは正しく出力されるが、コンソールにError producing PDF.と表示される。ただし出力には影響なし。
    • 生成AIにも手伝ってもらって原因を探りつつ色々と設定をいじり倒しましたが、あちらを立てるとこちらが立たずの状態でした。

おわり

QuartoやR Markdownは細かい設定を始めると本当に沼ですね。

Discussion