![拡張性: LaTeX3 VS LaTeX](https://rvso.com/image/328469/%E6%8B%A1%E5%BC%B5%E6%80%A7%3A%20LaTeX3%20VS%20LaTeX.png)
拡張性はマクロ/関数の核心です。知りたいこと:
- の拡張性についての理解を深めるには、
LaTeX3
の拡張性に関する十分な背景知識が必要ですLaTeX
。 はどの程度まで独立していると見なせるでしょうか。 - より正確には、 が提供する機能が
l3expan
すべての拡張性のニーズを満たすのに十分であるかどうかです。言い換えれば、 ではLaTeX3
、「LaTeX
拡張性」はサポートされていますが、完全に代用されました。 - 拡張性プロセスの実行中に、途中のステップ (出力ファイル、プロファイリング オプションなど) を確認する方法はありますか?
答え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
新しいユーザーとしてデバッグする場合、これは特定の状況でのみ役立つ場合があります。