👌
QuartoでPDFを出力するときにtasks.jsonを使う
はじめに
宋・矢内のQuartoに関するドキュメント25 Quarto [文書] – 私たちのRでは、自前の.latexmkrc
を使用するようにYAMLフロントマターを設定することにより、より自由な設定で
- 元リンクでは
-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