![可擴充性:LaTeX3 VS LaTeX](https://rvso.com/image/328469/%E5%8F%AF%E6%93%B4%E5%85%85%E6%80%A7%EF%BC%9ALaTeX3%20VS%20LaTeX.png)
可擴展性是宏/函數的核心。我想知道:
- 如果要更好的理解in的可擴展性
LaTeX3
只能透過良好的可擴展性的背景來實現LaTeX
。他們在多大程度上可以被視為獨立? - 更準確地說,所提供的功能是否
l3expan
足以滿足所有可擴展性需求。換句話說,在 之內LaTeX3
,“LaTeX
可擴展性”,但可以完全取代。 - 有沒有辦法在執行可擴展性過程時檢查中間的步驟(即一些輸出檔、分析選項…)
答案1
expl3
我自己沒有這樣做過,但我相信,對於新的 LaTeX 程式設計師來說,從加載(也稱為 LaTeX3 內核,或)定義的函數開始l3kernel
比首先學習基本的 TeX 程式設計並繼續升級更容易。
這樣做的原因是,它expl3
為您提供了一個非常好的抽象層,它功能強大且內部一致。使用 TeX 編程,您很快就必須學習「技巧」來完成相當簡單的事情。
例如,如果您正在談論兩個命令\foo
和\baz
,請複製\foo
您\baz
寫的
\let\foo\baz
但是如果您需要透過名稱而不是控制序列來引用它們怎麼辦?例如,您可能正在定義一些東西來執行此操作:
\defineacronym{baz}{BAZ}
\useacronym{baz} % => \textsc{\MakeLowercase{BAZ}}
這可以定義為
\makeatletter
\newcommand\defineacronym[2]{%
\@namedef{acronym@#1}{\textsc{\MakeLowercase{BAZ}}}%
}
\newcommand\useacronym[1]{%
\@nameuse{acronym@#1}%
}
\makeatother
到目前為止,一切都很好。但是要定義像這樣的命令\copyacronym{foo}{baz}
,您必須編寫:
\newcommand\copyacronym[2]{%
\expandafter\let\csname acronym@#1\expandafter\endcsname\csname acronym@#2\endcsname
}
這對於經驗豐富的 TeX 程式設計師來說很容易理解,但對於新程式設計師來說就不太好理解了。
在expl3
此可寫為:
\ExplSyntaxOn
\newcommand\copyacronym[2]{
\cs_set_eq:cc {acronym@#1} {acronym@#2}
}
\ExplSyntaxOff
的目標expl3
是使 TeX 程式設計更加結構化,從而更加容易。我們希望對於新的 TeX 程式設計師來說,這種情況比舊程式設計師更是如此。
對於你的最後一個問題,答案是這樣的。 Bruno Le Floch 編寫了該unravel
軟體包,它肯定可以向您展示擴展的進展。寫完後
\usepackage{unravel}
\def\baz{BAZ}
\unravel{\expandafter\let\csname foo\expandafter\endcsname\csname baz\endcsname}
它會傳回以下內容:
======== Welcome to the unravel package ========
"<|" denotes the output to TeX's stomach.
"||" denotes tokens waiting to be used.
"|>" denotes tokens that we will act on.
Press <enter> to continue; 'h' <enter> for help.
||
|> \expandafter \let \csname foo\expandafter \endcsname \csname baz\endcsname
[===== Step 1 =====] \expandafter \let
[===== Step 2 =====] \csname = \csname
|| \expandafter \let
|| \csname
|> foo\expandafter \endcsname \csname baz\endcsname
[===== Step 3 =====] \expandafter \endcsname
|| \expandafter \let
|| \csname foo
|| \expandafter \endcsname
|> \csname baz\endcsname
[===== Step 4 =====] \csname = \csname
|| \expandafter \let
|| \csname foo
|| \expandafter \endcsname
|| \csname
|> baz\endcsname
[===== Step 5 =====] \endcsname
|| \expandafter \let
|| \csname foo
|| \expandafter \endcsname
|| \csname baz\endcsname
|>
[===== Step 6 =====] \csname baz\endcsname =\baz
|| \expandafter \let
|| \csname foo
|| \expandafter \endcsname
|> \baz
[===== Step 7 =====] back_input: \expandafter \endcsname
|| \expandafter \let
|| \csname foo
|> \endcsname \baz
[===== Step 8 =====] \endcsname
|| \expandafter \let
|| \csname foo\endcsname
|> \baz
[===== Step 9 =====] \csname foo\endcsname =\foo
|| \expandafter \let
|> \foo \baz
[===== Step 10 =====] back_input: \expandafter \let
||
|> \let \foo \baz
[===== Step 11 =====] \let \foo
|| \let \foo
|> \baz
[===== Step 12 =====] Set \foo=macro:->BAZ
||
|>
[===== End =====]
正如您所看到的,即使是一個簡單的案例,它也會讓您感到很費力。 (很容易消化,但仍然如此。)特別是在expl3
作為新用戶進行調試時,這可能只在某些情況下有用。