Проблемы определения новых макросов/функций в LaTeX3

Проблемы определения новых макросов/функций в LaTeX3

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

Связанный контент