Различия в методах генерации функций LaTeX3

Различия в методах генерации функций LaTeX3

В 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.

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