Folio Writer

自動重新產生的圖表:
用 Quarto、Python 與 R 動態繪圖

手稿中最危險的圖,是三輪修訂前手工做出來的那一張。當分析變了而 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 的用法完全相同:

一個 {python} 程式碼區塊及其執行後的圖表,即時顯示在預覽中。
一個 {python} 程式碼區塊及其執行後的圖表,即時顯示在預覽中。
```{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 是哪個指令碼畫的?」,也沒有過時的圖表——手稿本身就是處理流程。

同一份手稿也能說 R——knitr 引擎、echo: false、帶編號的圖。
同一份手稿也能說 R——knitr 引擎、echo: false、帶編號的圖。

設定方式

  1. 安裝 Quarto(quarto.org,或 brew install quarto)以及免費的 Folio Helper,讓處於沙盒中的 App Store 版 App 能執行你本機的工具鏈。
  2. Python 程式碼區塊:你需要一個裝有 Jupyter 的 Python(pip install jupyter matplotlib pandas)。Folio Writer 會自動讓 Quarto 指向能執行 Jupyter 的直譯器,因此程式碼區塊會在真正能執行它們的 Python 上執行——而不是 PATH 上剛好排在第一位的那個 python3。
  3. R 程式碼區塊:安裝 R 以及 knitr 和 rmarkdown——也就是 Quarto 的標準 R 引擎。
  4. 把資料與分析指令碼放在專案的 Research 資料夾中,整條處理流程就會隨手稿一起移動(與同步)。
等級說明:執行程式碼區塊與編譯一樣,屬於一次性 Pro 解鎖的一部分(含 7 天完整試用)。撰寫程式碼區塊,以及不執行程式碼的一般 Quarto 渲染,則不需要 Pro。
在哪裡執行:即時預覽刻意保持即時——它會排版文字與數學公式,但不執行程式碼。程式碼區塊在編譯時執行,也就是 Quarto 渲染縫合好的手稿時。想快速看看某張圖,只編譯你正在處理的章節即可(範圍 ▸ 所選文稿)。

對手稿真正重要的程式碼區塊選項

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 只在該區塊的程式碼變動時才會重新執行,因此修改文字後重新編譯,不會重新擬合你的模型。
真實的工作流程:從 Research 中的 .xlsx 讀取 P–V 資料,進行 Birch–Murnaghan 擬合,在編譯時加上註記並編號。
真實的工作流程:從 Research 中的 .xlsx 讀取 P–V 資料,進行 Birch–Murnaghan 擬合,在編譯時加上註記並編號。

如果程式碼區塊沒有執行

三個原因幾乎涵蓋所有情況。渲染器不對:只有當編譯面板的渲染器設為 Quarto 時,程式碼才會執行——在 pandoc 或 Typst 下,程式碼區塊會以字面上的程式碼區塊原樣輸出(這是刻意的設計:那些流程從不執行任何東西)。缺少引擎:編譯 ▸ 設定外部工具… 會檢查你的工具鏈;Python 程式碼區塊需要直譯器上裝有 Jupyter(pip install jupyter),R 則需要 knitr + rmarkdown。路徑假設:程式碼區塊以專案作為工作目錄執行,所以讀取資料時請寫 Research/pv-data.csv,而不是你另一台電腦上的絕對路徑——讓路徑保持相對於專案,也正是讓手稿對共同作者可重現的關鍵。

想要靜態時就靜態,重要時就動態

可執行程式碼區塊與一般圖片可以共存。照片或手繪示意圖仍是普通的 Markdown 圖片;由資料衍生的圖表則化為程式碼區塊。Folio Writer 的書稿檢查甚至會留意靜態的那一種——標記出比繪製它的指令碼還舊的圖——因此無論一張圖走哪條路,都不會默默過時。

內含期刊等級的輸出

由於 Quarto 渲染器正是驅動期刊格式的那一個,動態圖表在出版社模板中同樣適用:加入期刊擴充套件(AGU、Elsevier、Copernicus…),在中繼資料中設定 quarto-to:,編譯出的投稿版本就會帶有從你即時分析產生的圖表——任何人只要一個指令,就能從專案中的純文字檔案重現。

免費下載 Folio Writer → · 更多指南