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名前にアクセスするために必須ではありませんが、 の組み合わせによって で「より明確な」プログラミングが可能になるため、この 2 つは密接に結びついていることに注意してくださいexpl3

\ExplSyntaxOffこれを逆にして、、を以前の値に戻し:、スペースを再び「重要」にします。_~\ExplSyntaxOn

技術的には、コマンド名にカテゴリコードを使用するという考え方はまったく同じです。\makeatletter と \makeatother は何をしますか?ただし、\ExplSyntax...スイッチはさらに多くのことを行います。


コードブロック内のの扱いについて注意すべき点がいくつかあります~。まず、~コードブロック内の「スペース」と同様に、~行頭の はTeXによって無視されます。

\ExplSyntaxOn
~ \cs_new:Npn .... 

と全く同じです

\ExplSyntaxOn
\cs_new:Npn .... 

'スペース' は無視されます。

次に、 は~コード ブロック内の「スペース」ですが\␣\~は依然として区別され、 LaTeX2e 定義を持ちます。


完全性のために、さらにいくつか詳細を説明します。\ExplSyntaxOnまた、暗黙的に構文の一部である他の文字に対しても、catcodes を適切に設定します。

  • TAB — 無視されます(スペースと同様)
  • "— 16進数入力に必要な「その他」の文字(例:\int_eval:n { "F }(= 15))
  • &— 表形式の資料の配置文字
  • ^^^64—スタイル表記の上付き文字
  • |expl3—ブール式に必要な「その他」の文字

答え2

LaTeX2e カーネル マクロと expl3 関数の組み合わせに関する情報を追加したいと思います。 コマンドは、\ExplSyntaxOn特殊トークンの catcode を変更しません@。したがって、LaTeX2e カーネル マクロと expl3 関数を組み合わせるには、 も呼び出す必要があります\makeatletter

\ExplSyntaxOn
\makeatletter
\cs_set:Npn \@maketitle…

関連情報