可擴充性:LaTeX3 VS LaTeX

可擴充性:LaTeX3 VS LaTeX

可擴展性是宏/函數的核心。我想知道:

  1. 如果要更好的理解in的可擴展性LaTeX3只能透過良好的可擴展性的背景來實現LaTeX。他們在多大程度上可以被視為獨立?
  2. 更準確地說,所提供的功能是否l3expan足以滿足所有可擴展性需求。換句話說,在 之內LaTeX3,“LaTeX可擴展性”,但可以完全取代。
  3. 有沒有辦法在執行可擴展性過程時檢查中間的步驟(即一些輸出檔、分析選項…)

答案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作為新用戶進行調試時,這可能只在某些情況下有用。

相關內容