
與問題相關\makeatletter 和 \makeatother 做什麼?對於LaTeX2e,這裡與LaTeX3相關
做什麼\ExplSyntaxOn
和\ExplSyntaxOff
做什麼?
答案1
LaTeX3 編碼語言 ,expl3
使用:
和_
作為函數和變數名稱中的「字母」。這允許expl3
在文件中使用代碼級材料
\cs_new:Npn .... % fails: command \cs followed by characters '_', 'n', 'e', 'w', etc.
\ExplSyntaxOn
\cs_new:Npn .... % works here: command name \cs_new:Npn
該\ExplSyntaxOn
命令啟動此功能,並更改空格和行結尾的處理,以便忽略它們,這意味著
\ExplSyntaxOn
\cs_new:Npn \my_function:nn #1#2
{
% Code hre
}
不需要%
在每行末尾(與“正常”LaTeX2e 程式碼相比)。為了允許在輸出中包含空格,~
被 製成「正常」空格\ExplSyntaxOn
。請注意,空間行為的這種變化對於訪問expl3
名稱來說並不是必需的,但是兩者緊密相連,因為這種組合允許在expl3
.
\ExplSyntaxOff
反轉這一點,將:
、_
和恢復~
為先前的值\ExplSyntaxOn
,並使空格再次變得「重要」。
從技術層面來說,命令名稱中類別代碼的想法與\makeatletter 和 \makeatother 做什麼?,儘管\ExplSyntax...
開關的作用更多。
~
關於程式碼區塊內的處理需要注意幾點。首先,就像~
程式碼區塊內的「空格」一樣,~
TeX 會忽略行開頭的a
\ExplSyntaxOn
~ \cs_new:Npn ....
完全一樣
\ExplSyntaxOn
\cs_new:Npn ....
因為“空格”被忽略。
其次, while~
是程式碼區塊內的“空格”,\␣
並且\~
仍然不同且具有 LaTeX2e 定義。
為了完整性,還有一些細節需要討論。\ExplSyntaxOn
也為隱式屬於其語法一部分的其他字元設定適當的catcodes:
- TAB — 被忽略(就像空格一樣)
"
— 一個「其他」字符,對於十六進位輸入是必需的,例如\int_eval:n { "F }
(= 15)&
— 表格材料的對齊字符^
^^64
—樣式表示法的上標字符|
expl3
—布林表達式必需的「其他」字符
答案2
我想添加一些有關 LaTeX2e 內核巨集和 expl3 函數組合的資訊。該指令\ExplSyntaxOn
不會更改特殊令牌的catcode @
。因此,您還必須呼叫 LaTeX2e 核心巨集和 expl3 函數的組合\makeatletter
:
\ExplSyntaxOn
\makeatletter
\cs_set:Npn \@maketitle…