
Среда программирования expl3 предоставляет множество функций, которые в interface3.pdf отмечены черной звездочкой (полностью расширяемые) или белой звездочкой (ограниченно расширяемые).
Почему так много функций помечены как полностью расширяемые, но при этом не предоставляется официальная информация о количестве расширений, необходимых для получения результата?
Ну, с некоторыми полностью расширяемыми хвостовыми рекурсивными вещами, где средства управления расширением, такие как \exp:w
/, \exp_end:
не применяются в реализации, и количество рекурсий, и количество расширений, необходимых для получения результата, зависят от аргументов, предоставленных пользователями. Поэтому точная информация о количестве расширений, необходимых для получения результата, не может быть предоставлена там.
Однако существует множество функций, где это не так и где можно было бы предоставить точную информацию о количестве расширений, необходимых для получения результата.
Как, имея такие полностью расширяемые функции expl3, можно точно знать в контексте расширения момент, когда результат получен?
Например, я хотел бы узнать количество расширений, которые необходимо запустить для получения результата \str_tail:n
.
В контекстах расширения вы не можете использовать x
-expansion, так как он сам по себе не расширяем.
Вы не можете безопасно просто использовать f
-expansion, так как это может удалить еще один начальный пробел из строки.
Если полностью расширяемая функция, о которой идет речь, не была \str_tail:n
чем-то, где сами аргументы не являются строками нерасширяемых явных символьных токенов, то e
-expansion может вызвать большее расширение, чем требуется. Кроме того, с движками, где -primitive \expanded
недоступен, e
-expansion является дорогостоящим.
В этом случае \str_tail:n
можно было бы заглянуть в source3.pdf и выяснить, что в текущей реализации необходимы четыре расширения:
\cs_new:Npn \str_tail:n #1
{
\exp_after:wN \__str_tail_auxi:w
\reverse_if:N \if_charcode:w
\scan_stop: \tl_to_str:n {#1} X X \s__str_stop
}
\cs_new:Npn \__str_tail_auxi:w #1 X #2 \s__str_stop { \fi: #1 }
Расширение 1 возвращает вам текст замены \str_tail:n
.
Расширение 2 выполняет -штуку, которая заканчивается, когда оценивается \exp_after:wN
результат -теста , и таким образом первый токен строки используется как аргумент для сравнения его кода категории с кодом категории . Расширение 3 расширяет , который добавляется для сопоставления и сохраняет аргумент с разделителем category-11- и удаляет аргумент с разделителем. Расширение 4 удаляет .\if_charcode:w
\scan_stop:
\__str_tail_auxi:w
\fi:
\if_charcode:w
X
\s__str_stop
\fi:
Однако просмотр source3.pdf не является способом получения информации об официальных подробностях реализации.
\str_tail:n
В случае изменения внутренней реализации может измениться и количество расширений, необходимых для получения результата .
Я не вижу общего метода с полностью расширяемой функцией, который бы гарантировал, что вы получите правильный момент для окружения некоторыми другими токенами токенов, которые формируют результат этой функции, кроме как зная количество расширений, после которых результат функции будет там.
При использовании \exp:w
для запуска расширения полностью расширяемой функции, предоставляемой средой программирования expl3, до тех пор, пока не будет результата этой функции, я не вижу общего метода, который бы гарантировал, что \exp_end:
выполняется в правильный момент времени для остановки \exp:w
-expansion, который может обойтись без знания количества расширений, после которых будет результат этой функции.
Поэтому я считаю, что при наличии полностью расширяемых функций эта информация должна быть предоставлена в качестве официальной.
Сколько расширений необходимо до результата функций \exp_args:...
или \use_i:nn
есть ли?
Эта информация официально не предоставлена в interface3.pdf.
Могу ли я спокойно положиться, например, на то, что \use_i:nn
всегда требуется ровно одно расширение, без чьих-либо жалоб, потому что я вывожу информацию из внутренних деталей реализации, а не полагаюсь только на факты, которые официально задокументированы?
Что должно заставить меня полагаться на согласованность между выпусками expl3 в аспектах, которые официально не документированы?
(Дистрибутив LaTeX, который идет вместе с моим дистрибутивом Linux, так сильно отличается от TeX Live 2024... )
решение1
Ситуация с документацией является намеренной. Существует очень мало (низкоуровневых) функций, где количество расширений важно, и где команда или другие должны знать/полагаться на это: они документированы. В других случаях использование расширения типа e
- или - f
обычно достаточно. Например,\str_tail:n
обязательносоздает строку - поэтому это безопасно вe
контексте -типа, поэтому естьнезачемдля документирования необходимого количества расширений.
В более общем смысле, если функция принимаетдокументтокенов, то вы не можете использовать e
расширение -type, но в целом придерживайтесь, \protected@edef
так как это работает с надежными командами LaTeX2e - expl3
обычно не делает этого. Для чистого текста \text_expand:n
делает что-то похожее, \protected@edef
но не работает хорошо с нетекстовым расширением. В любом случае, эти подходы позволяют расширять expl3
функции, сохраняя хрупкий материал LaTeX2e (например, \textbf
или подобный).
Документирование количества требуемых расширений накладывает ограничение на любые изменения кода: насколько это возможно, мы этого не делаем — ограничения касаются только тех, которые являются частью API. Если у вас есть четкий вариант использования, который, как кажется, требует такой стабильности API, зарегистрируйте проблему и попросите изменить (документацию).