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}工作正常。但是如果我嘗試定義 Macro \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 by topic 中),後面跟著一個大括號參數。

程式碼

\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:Npnor (適用相同的規則)。\cs_new_protected:Nn此處並非如此,因為\int_eval:n它是完全可擴展的。

相關內容