# biblatex-apa-zh

**Version 0.2.0 — Licence: LPPL 1.3c — Author: Che Cheng**

## Abstract (English)

`biblatex-apa-zh` is a companion package for `biblatex-apa`. It adapts APA 7
citation rendering to **Traditional Chinese** prose.

`biblatex-apa` ships localisation files for more than twenty languages but none
for Chinese. Writing in Chinese while citing Western sources therefore produces
half-width parentheses and commas where Chinese typographic convention requires
full-width ones, and the `andothers` string cannot be switched per entry when a
bibliography mixes Chinese and Western works.

The package separates two axes that are easy to conflate. The **language of the
running text** determines citation punctuation and is a document-level option
(`prose=chinese|english`). The **language of each cited work** determines name
strings and bibliography punctuation, and is taken from the `langid` field of
each entry, so a single reference list may mix both.

Unlike `biblatex`'s native `autolang` mechanism, it does not require `babel` or
`polyglossia`, which makes it usable in the common `xeCJK` setup.

Usage:

```latex
\usepackage[style=apa, backend=biber]{biblatex}
\usepackage[prose=chinese]{biblatex-apa-zh}   % must come after biblatex
```

The strings and bibliography punctuation follow Traditional Chinese academic
convention as used in Taiwan. Simplified Chinese conventions differ and are not
covered by this release.

Documentation: `doc/biblatex-apa-zh.pdf` (English abstract, Chinese body).
A test suite (`test/run-tests.sh`) asserts on the rendered output and exits
non-zero on any mismatch.

---

## 中文說明

**繁體中文**行文的 APA 7 引用呈現層。這是 [`biblatex-apa`](https://ctan.org/pkg/biblatex-apa) 的補丁，不是獨立的 bibliography style。

字串與書目標點採**臺灣**的學術慣例（教育部與中華心理學刊）。簡體中文的慣例不同（例如最後兩位作者之間的連接詞），本版不涵蓋。

## 它解決什麼

`biblatex-apa` 實作 APA 7，在地化檔（`.lbx`）出了二十幾種語言（德、法、西、俄、土、匈、羅⋯），**就是沒有中文**。用中文寫作、引用外文文獻時會出現三個問題：

| 問題 | 現象 | 中文規範 |
|---|---|---|
| 括號式引用印半形 | `(Meehl & Hathaway, 1946)` | `（Meehl & Hathaway，1946）` |
| `et al.` / `&` 無法逐筆切換 | `andothers` 是全域字串，中英混排時兩邊被套成同一種 | 中文文獻要「等人」「與」 |
| 中文文獻的書目沿用英文標點 | `王四與李五. (2021). ... 52(3), 45–68.` | `王四與李五（2021）。⋯52(3)，45–68。` |

## 兩個軸，兩套機制

這是本套件的核心設計。兩件事看起來都是「語言」，但它們的層級不同：

| 軸 | 決定什麼 | 機制 | 層級 |
|---|---|---|---|
| **內文語言** | 標點：括號、逗號全形或半形 | 套件選項 `prose` | **文件層**（一份 PDF 只有一種內文語言）|
| **文獻語言** | 字串與姓名：`et al.`／等人、`&`／與、頓號 | `.bib` 的 `langid` 欄位 | **逐筆條目**（同一份文獻表可中英並存）|

biblatex 原生的逐筆切換（`autolang=langname` + `\DeclareLanguageMapping`）依賴 babel／polyglossia。**用 `xeCJK` 而不載 babel 的文件**（中文 LaTeX 的常見組態）沒有那條路，所以本套件改成直接判斷 `langid` 欄位，不要求 babel。

## 安裝

尚未上 CTAN。把 `biblatex-apa-zh.sty` 放在文件同目錄，或放進 `TEXMFHOME`：

```bash
mkdir -p "$(kpsewhich -var-value TEXMFHOME)/tex/latex/biblatex-apa-zh"
cp biblatex-apa-zh.sty "$(kpsewhich -var-value TEXMFHOME)/tex/latex/biblatex-apa-zh/"
```

## 用法

```latex
\usepackage[style=apa, backend=biber]{biblatex}
\usepackage[prose=chinese]{biblatex-apa-zh}   % 必須在 biblatex 之後
\addbibresource{refs.bib}
```

中文文獻在 `.bib` 裡標 `langid`：

```bibtex
@article{chen2019,
  author = {陳一 and 林二 and 黃三},
  title  = {中文閱讀理解測驗的編製與信效度分析},
  ...
  langid = {chinese},
}
```

### 選項

| 選項 | 值 | 預設 | 說明 |
|---|---|---|---|
| `prose` | `chinese` / `english` | `chinese` | 內文語言，決定引用標點的全形半形 |
| `foreignandothers` | `etal` / `zh` | `etal` | 中文行文中，**外文**文獻的 `et al.` 印英文還是「等人」 |

`foreignandothers` 預設 `etal` 是刻意保守：既有文件升級到本套件時，外文引用的輸出一個字都不會變，不會憑空產生一批需要勘誤的差異。中文文獻（`langid=chinese`）一律用「等人」「與」，不受這個選項影響。

## 實測輸出

`test/fixtures/chinese-prose.tex`，`prose=chinese`、`foreignandothers=etal`：

| | `\parencite` | `\textcite` |
|---|---|---|
| 外文 2 人 | （Meehl & Hathaway，1946） | Meehl and Hathaway（1946） |
| 外文 3+ 人 | （Haladyna et al.，2002） | Haladyna et al.（2002） |
| 中文 2 人 | （王四與李五，2021） | 王四與李五（2021） |
| 中文 3+ 人 | （陳一等人，2019） | 陳一等人（2019） |

`&` 與 `and` 的分工是 APA 本身的規定（括號式用 `&`、敘述式用 `and`），本套件保留。

## 中文文獻的書目格式（v0.2 起）

中文條目用中文標點，英文條目維持 APA 原樣，兩者在同一份文獻表裡並存：

```
王四與李五（2021）。學習動機量表的跨年級測量恆等性。教育心理學報，52(3)，45–68。

Gregory, R. J. (2015). Psychological testing: History, principles, and applications
    (7th ed.). Pearson.
```

逐筆切換靠 `\AtEveryBibitem` 內的局部重定義，實測確認侷限在該筆條目內。英文條目**不會**被中文規則波及這一點，有專門的斷言守著——那是「逐筆」這個核心設計唯一的直接證據。

## 已知限制

- **條目型別覆蓋**：中文書目格式目前針對期刊論文與專書的常見欄位調校過。會議論文集、學位論文、法規等較少見的型別尚未逐一處理。
- **排序**：中英混排的文獻表依 `biblatex` 預設規則排序，沒有實作依筆畫或注音的中文排序。
- **中文姓名**：不倒置、不縮寫（本來就不該做），但沒有處理複姓等特殊情況。
- **簡體中文**：本套件輸出的是繁體字串（「等人」「與」「、」）。簡體的書目慣例不同，需要的話應該做成一個 `variant` 選項，目前沒有。

## 已知陷阱（給後續維護者）

這兩個都實際踩過，症狀都是**安靜地沒有效果**，不會報錯：

1. **`\DeclareFieldFormat{parens}` 對 `\parencite` 無效。** `\parencite` 的外框走 `\mkbibparens` → `\bibopenparen`，不吃那個 field format。要改必須重寫整個 `\DeclareCiteCommand`。
2. **delimiter 要在三個 context 各宣告一次。** `biblatex-apa` 對 `finalnamedelim` 宣告了預設、`[parencite]`（`apa.cbx:477`）、`[bib,biblist]`（`apa.bbx:704`）三份。只覆寫預設的話，括號式引用與參考文獻表會維持原樣——半套的結果比全沒改更難發現。

3. **`\autocite` 不需要「重新綁定」。** 這一條記的是一個**錯誤診斷**，不是陷阱本身。

   v0.1 曾在套件裡加一行 `\ExecuteBibliographyOptions{autocite=inline}`，依據是「biblatex 在處理選項當下就把 `\autocite` 綁到當時的 `\parencite`，之後重定義無效」。那個依據是錯的：`biblatex.sty:15906` 的 `\letcs\autocite{blx@acite@inline}` 綁的是中介巨集，而 `biblatex.def:2667` 的 `\DeclareAutoCiteCommand{inline}{\parencite}` 讓它在**使用時**才去找 `\parencite`。所以重定義本來就會傳導。

   拆穿它的正是 `autocite` 固件：把那行註解掉，測試照樣全綠。真正的原因單純得多——手寫補丁的 `\parencite` 用了半形的 `\mkbibparens`。

   **留著這條紀錄是因為錯誤的診斷會再長回來。** 下一個人看到 `\autocite` 出問題時，很可能會再加一次那行，然後以為是它修好的。

另外：**不要**整個重定義 `\bibopenparen` 成全形。那會連參考文獻表裡的 `(2002)`、`15(3)` 一起改掉，而那些屬於英文書目格式，APA 要求半形。

## 測試

```bash
bash test/run-tests.sh                # 全部固件
bash test/run-tests.sh chinese-prose  # 單一固件
```

全數通過 exit 0，任一條斷言不符 exit 1，可以直接掛在 CI 或 pre-commit 上。目前 4 個固件、47 條斷言。

| 固件 | 守什麼 |
|---|---|
| `chinese-prose` | 內文四象限、中文姓名無贅空格、參考文獻表維持半形、跨行正規化 |
| `english-prose` | `prose=english` 時回到半形；且 `langid` 決定的字串不受 `prose` 影響 |
| `autocite` | `\autocite` 與 `\parencite` 產出一致 |
| `maxprtauth` | 作者被截斷時的分隔符行為與上游一致 |

斷言寫在 `test/expected/<固件>.txt`，`+` 為必須出現、`-` 為必須不出現。

**兩件關於斷言的紀律**（都是實測踩出來的）：

- **比對前必須正規化空白。** `pdftotext` 會硬斷行，同一個引用可能被切成兩行；不正規化的話斷言會因為與套件行為無關的換行位置而失敗。
- **負向斷言要盯住「會壞的那個字元」，不要寫完整字串。** 把 `\parencite` 改回 `\mkbibparens` 之後，輸出是 `(Meehl & Hathaway，1946)` 這種半形括號配全形逗號的**混合**形式；寫完整字串的負向斷言兩種都不命中，缺陷被引入了測試卻全綠。

相依：`xelatex`、`biber`、`pdftotext`（poppler）。CJK 字型由 `test/fixtures/_cjkfont.tex` 依序偵測（PingFang TC → Noto Sans/Serif CJK TC → Source Han Sans TC → Microsoft JhengHei），都找不到才報錯並列出該裝哪一個。

## 要發布到 CTAN 的話

上游 `biblatex-apa` 的維護者明說歡迎在地化貢獻（未翻譯字串都標 `%FIXME`），所以有兩條路，**建議兩條都走但有先後**：

**先做獨立套件**（本 repo）。本套件做的事超出 `.lbx` 的範圍——`.lbx` 只能放字串，而全形括號與 delimiter context 要改的是 cite command 與 delimiter 宣告，那不屬於在地化檔。

**之後再送 `chinese-apa.lbx` 給上游**當補充，把純字串的部分（`andothers`、`and`、`in`、`editor`、`translator` 等）交給上游維護。

### CTAN 上傳需要的東西

| 項目 | 狀態 | 說明 |
|---|---|---|
| 套件檔 | ✅ `biblatex-apa-zh.sty` | |
| 授權 | ✅ LPPL 1.3c | LaTeX 套件的標準授權，CTAN 接受度最高 |
| `README` | ✅ 本檔 | 要寫明名稱、版本、作者、用途、安裝、授權 |
| 說明文件 PDF | ✅ `doc/biblatex-apa-zh.pdf` | 3 頁，英文摘要 + 中文正文 |
| 版本與日期 | ✅ `.sty` 的 `\ProvidesPackage` | 每次上傳都要遞增 |
| 測試套件 | ✅ `test/run-tests.sh` | 4 固件、47 條斷言，含兩個回歸固件；兩者都已驗證「缺陷重新引入時會紅」 |
| TDS zip | ✅ 內附於主 archive 頂層 | CTAN 明寫「不接受只有 .tds.zip 的上傳」、每個套件都必須出現在未壓縮的那一份，所以是附在裡面而非另外送 |

上傳在 <https://ctan.org/upload>，填套件名、版本、授權、作者、一句話摘要，附 zip。通過之後會自動流進 TeX Live 與 MiKTeX。

**`.dtx`／`.ins` 不是必要的。** 那是 docstrip 的文學式編程格式，CTAN 上很多套件用，但純 `.sty` + 獨立說明書一樣會被接受。以本套件的規模（不到 150 行）不值得為它多維護一層。

### 上傳前該做的事

1. 在 educator 專案內部實際用一季，確認沒有回歸（測試套件擋得住已知的兩個缺陷，擋不住還沒想到的）
2. 決定 `foreignandothers` 的預設要不要改（目前保守設 `etal`）
3. 擴充較少見的條目型別（會議論文集、學位論文），或在說明書裡明寫本版不涵蓋


## 授權

LPPL 1.3c。見 `LICENSE`。
