Как использовать l3skip в качестве аргумента для setlength?

Как использовать l3skip в качестве аргумента для setlength?

Как восстановить выражения send l3skip в setlength? Или: Как преобразовать length + stretch - shrinkв length plus stretch minus shrink\relax?

\ExplSyntaxOn
\skip_const:Nn \c__par_skip    { 1ex  +0.2ex     -0.1ex   }
\setlength {\c__par_skip}   % NOPE!
\exp_args:Nv \setlength {\skip_use:N \c__par_skip}   % ALSO NO: skip_use:N evaluates

решение1

Превращаю свои комментарии в ответ:

Ваш входной синтаксис для \skip_const:Nnскорее всего не тот, что вам нужен. Пропуски в выражении оцениваются, поэтому вы можете использовать простые вычисления, и ваш 1ex + 0.2ex - 0.1exis оценивается как такое вычисление, и результат (который TeX 1.1exпревращает в pt/ , использует базовые регистры TeX).spl3skip

Вместо этого, если вы хотите ввести пропуск с клеем, вам все равно следует ввести plusи minusвот так:

\skip_const:Nn \c__douglas_par_skip { 1ex plus 0.2ex minus 0.1ex }

При articleзагрузке и размере шрифта по умолчанию это приведет к \c__douglas_par_skipустановке значения 4.30554pt plus 0.86108pt minus 0.43057pt.

Теперь, если вы хотите присвоить это длине LaTeX2e, вы можете просто использовать , \skip_use:Nчто приведет к вставке указанной выше строки. Итак, следующее делает то, что вам нужно:

\newlength \douglaslength
\setlength \douglaslength { \skip_use:N \c__douglas_par_skip }

Полная МВЭ:

\documentclass{article}

\ExplSyntaxOn
\skip_const:Nn \c__douglas_par_skip {1ex plus 0.2ex minus 0.1ex}
\newlength \douglaslength
\setlength \douglaslength { \skip_use:N \c__douglas_par_skip }
\showthe \douglaslength
\stop

отпечатки

> 4.30554pt plus 0.86108pt minus 0.43057pt.
l.7 \showthe \douglaslength

к терминалу.

решение2

Пропуск — этоупорядоченная тройка значений, обычно вводится как

<length1> plus <length2> minus <length2>

Первая длина указывается в одной из стандартных единиц ( pt, mm, cmи т. д.); две другие могут указываться в стандартной единице или в

fil    fill    filll

что соответствует «порядку бесконечного клея». При суммировании пропусков сложение происходит покомпонентно, где бесконечные клеи побеждают конечные, а тот, у которого больше l', побеждает тот, у которого меньше l'. Если один из них plusили minusотсутствует (или оба), присвоенное значение в тройке неявно равно 0pt. Длины должны быть указаны в точном порядке.

Ключевые слова plusи minusпросто напоминают стандартные названия сложения и вычитания, но они никоим образом не обозначают сложение или вычитание.

Поэтому неправильно вводить пропуск, как вы думаете: 1ex +0.2ex -0.1exэто было бы неуместно в спецификации пропуска с примитивным назначением

\skip0=1ex +0.2ex -0.1ex

потому что как только TeX не видит plusследующего, <length1>он останавливает назначение.

С expl3заданием

\skip_const:Nn \c__par_skip { 1ex +0.2ex -0.1ex}

используется другой подход, поскольку expl3присваивания допускают «выражения». Но пропуски в любом случае должны быть введены стандартным общепринятым способом. С этим выражением вы просто получаете эквивалент

\skip0=1.1ex

Как работает «пропуск выражений»? Предположим, у вас есть

\skip_new:N \l_dmt_a_skip
\skip_new:N \l_dmt_b_skip
\skip_new:N \l_dmt_c_skip

\skip_set:Nn \l_dmt_a_skip { 12pt plus 6pt minus 3pt }
\skip_set:Nn \l_dmt_b_skip { 24pt plus 1fil }
\skip_set:Nn \l_dmt_c_skip { \l_dmt_a_skip + \l_dmt_b_skip }

\skip_show:N \l_dmt_c_skip

тогда вы получаете

\l_dmt_c_skip=36.0pt plus 1.0fil minus 3.0pt

из-за того, как работает покомпонентное сложениеипо правилам бесконечного клея.

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