Probleme mit der Definition neuer Makros/Funktionen in LaTeX3

Probleme mit der Definition neuer Makros/Funktionen in LaTeX3

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 Nin Bezug auf \SayHello, p --- bis #1und 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:Nndürfen Sie nur eine Funktion (Makro) definieren, die eineUnterschrift, das ist eine Liste der Argumenttypen nach einem Doppelpunkt.

Bei \cs_new:Npnhast Du diese Einschränkung nicht, da Du den Parametertext (der pin der Signatur steht) explizit eintippen musst.

Beispielsweise \cs_new:Nnerwartet ein einzelnes Token-Argument ( N) und ein geschweiftes Argument ( n). Umgekehrt \cs_new:Npnerwartet 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:Nnsich 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:Npnoder \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 xparsewird jedoch die Verwendung der Schnittstelle empfohlen.

Das geht nicht

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

und dann \Showim Dokument verwenden, da Sie es nie definiert haben \Show.

\cs_new_protected:NpnBeachten 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:nvollständig erweiterbar ist.

verwandte Informationen