
在 LaTeX3 中,不帶參數的私有命令和本地標記列表變數之間有哪些實際和哲學上的差異?在什麼情況下應該優先選擇其中之一?是否有公認的最佳實踐?
舉個例子,假設我正在定義一個鍵來保存字體開關,例如\color{red}\itshape
.使用私有命令來儲存字體開關,我可以定義:
\cs_new:Npn \@@_font: { }
\keys_define:nn { @@ } {
font .code:n = { \cs_set:Npn \@@_font: {#1} } ,
font .value_required:n = true ,
font .initial:n = ,
}
另一方面,使用本地標記列表變量,我可以定義:
\tl_new:N \l_@@_font_tl
\keys_define:nn { @@ } {
font .tl_set:N = \l_@@_font_tl ,
font .value_required:n = true ,
font .initial:n = ,
}
LaTeX3 中這兩個版本中哪一個是首選?
答案1
這是一個邊緣案例。函數和變數的差別在於
- 函數執行動作
- 變數儲存值
更改當前字體是一個動作,因此在這種情況下我更傾向於函數。
最乾淨的方法是這樣的
\cs_new_protected:Nn \@@_use_font:n { #1 }
\cs_generate_variant:Nn \@@_use_font:n { V }
\keys_define:nn { @@ }
{
font .tl_set:N = \l_@@_font_tl ,
font .value_required:n = true ,
font .initial:n = ,
}
和
\@@_use_font:V \l_@@_font_tl
在使用點。
另一方面,expl3
為了提高效率,直接使用標記列表變數在現有程式碼中相當常見。因此,對於這樣的情況,更多的是個人偏好,而不是嚴格遵守準則:在這種情況下引入的開銷\@@_use_font:V
可以忽略不計,在其他類似的情況下,效率可能會使使用變數的選擇更具吸引力。