ExplSyntaxOn 和 ExplSyntaxOff 有何作用?

ExplSyntaxOn 和 ExplSyntaxOff 有何作用?

與問題相關\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…

相關內容