В l3basics
модуле предусмотрено два метода для каждой функции генерации команды. Один требует предоставления сигнатуры функции, а второй — нет.
Поскольку второй метод более лаконичен, есть ли какие-либо преимущества использования одного из них по сравнению с другим? (За исключением, конечно, очевидных случаев, когда необходимо полностью удалить один токен, например, гипотетический \removefirstoftwo
случай и т. д., и второй метод не может быть применен).
Я предлагаю модель MWE, иллюстрирующую оба подхода.
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\cs_new:Npn \exampleone:nn #1 #2 {#1 #2}
\cs_new:Nn \exampletwo:nn{#1 #2}
\exampleone:nn {one~}{two~}
\exampletwo:nn {three~}{four}
\ExplSyntaxOff
\end{document}
решение1
Эти два метода совершенно эквивалентны, если к определяемой функции добавляется сигнатура.
Метод \cs_new:Nn
менее эффективен, так как необходимо построить текст параметра.
Если я добавлю кое-что к вашему примеру, то идентичность станет более ясной:
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\cs_new:Npn \exampleone:nn #1 #2 {#1 #2}
\cs_new:Nn \exampletwo:nn{#1 #2}
\texttt{\cs_meaning:N \exampleone:nn}\par
\texttt{\cs_meaning:N \exampletwo:nn}\par
\ExplSyntaxOff
\end{document}
Лаконичность последнего метода может заставить кого-то предпочесть его, но по сути это вопрос личных предпочтений.
Обычно я предпочитаю видеть явный текст параметров, но это мое мнение.
Почему предлагаются оба варианта? Вероятно, потому что :Nn
метод похож на традиционный \newcommand
, где текст параметра формируется из необязательного аргумента, здесь заменяемого сигнатурой определяемого макроса.
Предостережение.Можно определить функцию без сигнатуры, но в этом случае :Npn
метод является обязательным. То же самое, если сигнатура не «стандартная», то есть только с N
, n
, T
или F
спецификаторами. Функция со w
спецификаторомдолжениспользовать :Npn
.