手稿中最危險的圖,是三輪修訂前手工做出來的那一張。當分析變了而 PNG 沒變,論文就在悄悄說謊。解決之道:把程式碼放進手稿,讓每次編譯都從資料重新產生圖表——Quarto 負責執行,Folio Writer 負責統籌。
在 Folio Writer 文稿的任何地方,寫一個可執行程式碼區塊,而不是貼上圖片:
```{python}
#| label: fig-eos
#| fig-cap: "Third-order Birch–Murnaghan fit to the P–V data."
import pandas as pd, matplotlib.pyplot as plt
d = pd.read_csv("Research/pv-data.csv")
plt.plot(d.V, d.P, "o"); plt.plot(d.V, fit(d.V))
plt.xlabel("V (ų)"); plt.ylabel("P (GPa)")
```
以 渲染器 = Quarto 編譯,程式碼區塊就會執行:讀取 CSV、繪製擬合曲線,完成的圖表就會出現在 PDF 中——或 Word 檔、HTML 中——並像其他任何圖一樣帶有編號、圖說,可用 @fig-eos 引用。R 的用法完全相同:
```{r}
#| label: fig-spectra
#| fig-cap: "Raman spectra by pressure step."
library(ggplot2)
ggplot(read.csv("Research/spectra.csv"),
aes(shift, intensity, color = factor(P))) + geom_line()
```
更新資料檔、重新編譯,每一張圖就都是最新的。沒有匯出步驟,沒有「圖 3 是哪個指令碼畫的?」,也沒有過時的圖表——手稿本身就是處理流程。
brew install quarto)以及免費的 Folio Helper,讓處於沙盒中的 App Store 版 App 能執行你本機的工具鏈。pip install jupyter matplotlib pandas)。Folio Writer 會自動讓 Quarto 指向能執行 Jupyter 的直譯器,因此程式碼區塊會在真正能執行它們的 Python 上執行——而不是 PATH 上剛好排在第一位的那個 python3。knitr 和 rmarkdown——也就是 Quarto 的標準 R 引擎。Quarto 的程式碼區塊選項以 #| 註解行的形式附帶。以下五個幾乎涵蓋了手稿的所有需求:
```{python}
#| label: fig-eos # cite it as @fig-eos
#| fig-cap: "Compression curve with third-order fit."
#| echo: false # figure in the paper, code not
#| fig-width: 6.5 # inches, match the journal column
#| warning: false # keep library chatter out of the PDF
...
```
如果整部手稿中都不該印出任何程式碼,就在中繼資料文稿中設定一次,而不必逐個程式碼區塊設定:
execute: echo: false warning: false
#| cache: true——Quarto 只在該區塊的程式碼變動時才會重新執行,因此修改文字後重新編譯,不會重新擬合你的模型。
三個原因幾乎涵蓋所有情況。渲染器不對:只有當編譯面板的渲染器設為 Quarto 時,程式碼才會執行——在 pandoc 或 Typst 下,程式碼區塊會以字面上的程式碼區塊原樣輸出(這是刻意的設計:那些流程從不執行任何東西)。缺少引擎:編譯 ▸ 設定外部工具… 會檢查你的工具鏈;Python 程式碼區塊需要直譯器上裝有 Jupyter(pip install
jupyter),R 則需要 knitr + rmarkdown。路徑假設:程式碼區塊以專案作為工作目錄執行,所以讀取資料時請寫 Research/pv-data.csv,而不是你另一台電腦上的絕對路徑——讓路徑保持相對於專案,也正是讓手稿對共同作者可重現的關鍵。
可執行程式碼區塊與一般圖片可以共存。照片或手繪示意圖仍是普通的 Markdown 圖片;由資料衍生的圖表則化為程式碼區塊。Folio Writer 的書稿檢查甚至會留意靜態的那一種——標記出比繪製它的指令碼還舊的圖——因此無論一張圖走哪條路,都不會默默過時。
由於 Quarto 渲染器正是驅動期刊格式的那一個,動態圖表在出版社模板中同樣適用:加入期刊擴充套件(AGU、Elsevier、Copernicus…),在中繼資料中設定 quarto-to:,編譯出的投稿版本就會帶有從你即時分析產生的圖表——任何人只要一個指令,就能從專案中的純文字檔案重現。