拡張性: LaTeX3 VS LaTeX

拡張性: LaTeX3 VS LaTeX

拡張性はマクロ/関数の核心です。知りたいこと:

  1. の拡張性についての理解を深めるには、LaTeX3の拡張性に関する十分な背景知識が必要ですLaTeX。 はどの程度まで独立していると見なせるでしょうか。
  2. より正確には、 が提供する機能がl3expanすべての拡張性のニーズを満たすのに十分であるかどうかです。言い換えれば、 ではLaTeX3、「LaTeX拡張性」はサポートされていますが、完全に代用されました。
  3. 拡張性プロセスの実行中に、途中のステップ (出力ファイル、プロファイリング オプションなど) を確認する方法はありますか?

答え1

私自身はやったことがないのですが、LaTeX の初心者プログラマーにとっては、まず基本的な TeX プログラミングを学んでからステップアップするよりも、loading expl3(LaTeX3 カーネルまたは とも呼ばれますl3kernel) で定義された関数から始める方が簡単だと思います。

その理由は、expl3強力で内部的に一貫性のある非常に優れた抽象化レイヤーが提供されるためです。TeX プログラミングでは、かなり単純なことを行うために、すぐに「トリック」を習得する必要があります。

例えば、 と という2つのコマンドについて話しているとき\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 プログラマーよりも新しい 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新しいユーザーとしてデバッグする場合、これは特定の状況でのみ役立つ場合があります。

関連情報