В LaTeX3, каковы различия - как практические, так и философские - между закрытой командой без параметров и локальной переменной списка токенов? В каких ситуациях следует отдавать предпочтение одному из них? Существует ли общепринятая лучшая практика?
В качестве примера предположим, что я определяю клавишу для хранения переключателей шрифтов, например \color{red}\itshape
. Используя частную команду для хранения переключателей шрифтов, я мог бы определить:
\cs_new:Npn \@@_font: { }
\keys_define:nn { @@ } {
font .code:n = { \cs_set:Npn \@@_font: {#1} } ,
font .value_required:n = true ,
font .initial:n = ,
}
С другой стороны, используя локальную переменную списка токенов, я мог бы определить:
\tl_new:N \l_@@_font_tl
\keys_define:nn { @@ } {
font .tl_set:N = \l_@@_font_tl ,
font .value_required:n = true ,
font .initial:n = ,
}
Какая из этих двух версий предпочтительнее в LaTeX3?
решение1
Это пограничный случай. Различие между функциями и переменными заключается в том, что
- функции выполняют действия
- переменные хранят значения
Изменение текущего шрифта — это действие, поэтому в данном случае я больше склоняюсь к функции.
Самый чистый способ продолжить это сделать что-то вроде
\cs_new_protected:Nn \@@_use_font:n { #1 }
\cs_generate_variant:Nn \@@_use_font:n { V }
\keys_define:nn { @@ }
{
font .tl_set:N = \l_@@_font_tl ,
font .value_required:n = true ,
font .initial:n = ,
}
с
\@@_use_font:V \l_@@_font_tl
в месте использования.
С другой стороны, прямое использование переменной списка токенов довольно распространено в существующем expl3
коде для эффективности. Таким образом, для такого случая это скорее личное предпочтение, чем строгое соблюдение руководящих принципов: накладные расходы, вносимые с помощью, \@@_use_font:V
в этом случае незначительны, в других подобных случаях эффективность может сделать выбор использования переменной более привлекательным.