
Как восстановить выражения 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.1ex
is оценивается как такое вычисление, и результат (который TeX 1.1ex
превращает в pt
/ , использует базовые регистры TeX).sp
l3skip
Вместо этого, если вы хотите ввести пропуск с клеем, вам все равно следует ввести 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
из-за того, как работает покомпонентное сложениеипо правилам бесконечного клея.