我是 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}
工作正常。但是如果我嘗試定義 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:Npn
or (適用相同的規則)。\cs_new_protected:Nn
此處並非如此,因為\int_eval:n
它是完全可擴展的。