私はLaTeX3の初心者で、この言語を理解しようとしています。ここ 次のようにして新しいマクロを定義することができる。\cs_new:
\cs_new:Npn \SayHello #1
{ \prg_replicate:nn {#1} { Hello~World!~ } }
ここでN
、\SayHello
、p
--- #1
、n
--- に関して{...}
さて、ある数値の二乗を表示する関数を作成してみます。
\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