
在 LaTeX 中可以寫諸如 之類的表達式\frac12
,它應該等同於諸如 之類的表達式\frac{1}{2}
。第一種表示法有正式用語嗎?
答案1
不。
這只是 TeX 吸收非分隔巨集參數的正常方式的一部分。如果你定義
\def\foo#1{Something using #1 (or not).}
或同等地
\newcommand\foo[1]{Something using #1 (or not).}
當擴展時,它吸收輸入流中的下一個標記或平衡組作為其參數(在定義中\foo
可用)。#1
假設正常類別代碼
- 標記是單一字元(除了
\
、{
、}
或%
空格或換行符(因為它們被忽略))或命令序列(以 開頭\
), - 平衡組以不屬於不同組(稍後開始)的
{
第一個組開始並結束。}
吸收後,大括號將從組中剝離(即#1
不包含它們)。
這就是為什麼\foo x
和\foo{x}
、\newcommand{\foo}
和\newcommand\foo
或\frac 12
、\frac{1}{2}
、\frac{1}2
和\frac1 2
是等價的。
最好選擇最清晰的版本,這通常意味著使用群組。就我個人而言,如果我必須輸入單一標記,例如\newcommand\foo
.
答案2
可能值得補充的是,在 LaTeX3/ 中區分單標記參數和大括號中的參數更加明確expl3
。依照慣例,每個expl3
巨集名稱都應以 結尾,:
後面跟著一系列字母,稱為參數說明符,每個字母反映對應參數的類型。
除了許多其他的我們還有
n
對於花括號組或單標記參數,以及N
僅適用於單標記參數,通常是巨集/函數名稱或變數名稱。
這些說明符仍然不會改變 (La)TeX 處理各個參數的方式,但它向使用者提示如何在巨集內部使用參數。
例如,該l3tl
包提供了兩個函數\tl_if_empty:nTF
和\tl_if_empty:NTF
。雖然這兩個函數都會檢查標記列表是否為空並有條件地執行程式碼,但前者預計會使用一組標記進行調用,而後者則期望在對其內容執行測試之前首先擴展標記列表變數。