Я новичок в 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
or \cs_new_protected:Nn
(применяются те же правила) всякий раз, когда код содержит нерасширяемые функции (те, которые не отмечены красной полной или пустой звездочкой в руководстве). В данном случае это не так, поскольку \int_eval:n
полностью расширяемо.