LaTeX3 の新しいマクロ/関数定義の問題

LaTeX3 の新しいマクロ/関数定義の問題

私はLaTeX3の初心者で、この言語を理解しようとしています。ここ 次のようにして新しいマクロを定義することができる。\cs_new:

\cs_new:Npn \SayHello #1
 { \prg_replicate:nn {#1} { Hello~World!~ } }

ここでN\SayHellop --- #1n--- に関して{...}

さて、ある数値の二乗を表示する関数を作成してみます。

\cs_new:Npn \Show #1 
{
\int_eval:n {#1*#1}
}

マクロは\Show{number}正常に動作します。ただし、マクロを定義しようとすると\Show、整数が表示されます:

\cs_new:Nn \Show 
{
\int_eval:n {2+2}
}

私は を取得しますLaTeX error: "kernel/missing-colon"

わかりました。次にコロンを追加します。

\cs_new:Nn \Show:n 
{
\int_eval:n {2+2}
}

そしてまたエラーが発生しますが、今はただ! Undefined control sequence.

この動作は私には分かりません。どこでルールを破っているのでしょうか?

以下MWE。

\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new:Nn \Show:n 
{
\int_eval:n {2+2}
}
\ExplSyntaxOff

\begin{document}
\Show{}
\end{document}

答え1

では、\cs_new:Nn次の関数(マクロ)のみを定義できます。サイン、つまりコロンの後の引数の種類のリストです。

では、パラメーター テキスト (署名内の意味)\cs_new:Npnを明示的に入力する必要があるため、この制限はありません。p

たとえば、\cs_new:Nnは単一のトークン引数(N)と中括弧付き引数(n)を期待します。逆に、\cs_new:Npnは単一のトークン引数、つまり「パラメータ引数」(パラメータテキストTeXbook またはトピック別の TeX で、括弧付きの引数を指定します。

コード

\cs_new:Nn \sergio_show:n { \int_eval:n { #1+#1 } }

そして

\cs_new:Npn \sergio_show:n #1 { \int_eval:n { #1+#1 } }

\cs_new:Nn署名から適切なパラメータ テキストを構築できるため、完全に同等です。

定義したいコマンドにシグネチャがない場合は、しなければならない\cs_new:Npnまたはで定義します\cs_new_protected:Npn

あるいは、

\cs_new:Nn \sergio_show:n { \int_eval:n { #1+#1 } }
\cs_set_eq:NN \Show \sergio_show:n

ただし、ユーザー空間コマンドの場合は、xparseインターフェースを使用することをお勧めします。

できない

\cs_new:Nn \Show:n { \int_eval:n { #1+#1 } }

\Showを定義していないため、ドキュメント内でを使用します\Show

\cs_new_protected:Npnコードに展開不可能な関数 (マニュアルに赤い満点または中空の星印が付いていない関数) が含まれている場合は、または(同じルールが適用されます)を使用する必要があります。 は完全に展開可能な\cs_new_protected:Nnので、この場合は当てはまりません。\int_eval:n

関連情報