Ich bin ein Neuling in LaTeX3 und versuche, diese Sprache zu verstehen. Während ich leseHier Man kann ein neues Makro definieren, indem man\cs_new:
\cs_new:Npn \SayHello #1
{ \prg_replicate:nn {#1} { Hello~World!~ } }
wobei N
in Bezug auf \SayHello
, p
--- bis #1
und n
--- bis{...}
Ok, ich versuche, meine Funktion zu erstellen, um das Quadrat einer Zahl anzuzeigen:
\cs_new:Npn \Show #1
{
\int_eval:n {#1*#1}
}
Makros \Show{number}
funktionieren einwandfrei. Aber wenn ich versuche, ein Makro zu definieren \Show
, das mir eine Ganzzahl anzeigen sollte:
\cs_new:Nn \Show
{
\int_eval:n {2+2}
}
Ich bekomme ein LaTeX error: "kernel/missing-colon"
.
Ok, dann füge ich einen Doppelpunkt hinzu:
\cs_new:Nn \Show:n
{
\int_eval:n {2+2}
}
und ich bekomme immer wieder eine Fehlermeldung, aber jetzt ist es einfach so ! Undefined control sequence
.
Mir ist dieses Verhalten nicht klar.Wo verstoße ich gegen die Regeln?
MWE unten.
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new:Nn \Show:n
{
\int_eval:n {2+2}
}
\ExplSyntaxOff
\begin{document}
\Show{}
\end{document}
Antwort1
Mit \cs_new:Nn
dürfen Sie nur eine Funktion (Makro) definieren, die eineUnterschrift, das ist eine Liste der Argumenttypen nach einem Doppelpunkt.
Bei \cs_new:Npn
hast Du diese Einschränkung nicht, da Du den Parametertext (der p
in der Signatur steht) explizit eintippen musst.
Beispielsweise \cs_new:Nn
erwartet ein einzelnes Token-Argument ( N
) und ein geschweiftes Argument ( n
). Umgekehrt \cs_new:Npn
erwartet ein einzelnes Token-Argument, ein „Parameter-Argument“ (siehe die Diskussion vonParametertextim TeXbook oder TeX nach Thema), gefolgt von einem Argument in Klammern.
Die Codes
\cs_new:Nn \sergio_show:n { \int_eval:n { #1+#1 } }
Und
\cs_new:Npn \sergio_show:n #1 { \int_eval:n { #1+#1 } }
sind völlig gleichwertig, da \cs_new:Nn
sich aus der Signatur ein passender Parametertext bilden lässt.
Wenn der Befehl, den Sie definieren möchten, keine Signatur hat,mussDefinieren Sie es mit \cs_new:Npn
oder \cs_new_protected:Npn
.
Alternativ können Sie
\cs_new:Nn \sergio_show:n { \int_eval:n { #1+#1 } }
\cs_set_eq:NN \Show \sergio_show:n
Für Befehle im Benutzerbereich xparse
wird jedoch die Verwendung der Schnittstelle empfohlen.
Das geht nicht
\cs_new:Nn \Show:n { \int_eval:n { #1+#1 } }
und dann \Show
im Dokument verwenden, da Sie es nie definiert haben \Show
.
\cs_new_protected:Npn
Beachten Sie, dass Sie oder verwenden sollten \cs_new_protected:Nn
(es gelten dieselben Regeln), wenn der Code nicht erweiterbare Funktionen enthält (die ohne roten ausgefüllten oder hohlen Stern im Handbuch). Dies ist hier nicht der Fall, da \int_eval:n
vollständig erweiterbar ist.