如何使用 l3skip 作为 setlength 的参数?

如何使用 l3skip 作为 setlength 的参数?

我如何恢复发送 l3skip 表达式到setlength?或者:我如何转换length + stretch - shrinklength 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会被求值作为这样的计算,结果是(由 TeX1.1ex转换为pt/ ,使用 TeX 的底层寄存器)。spl3skip

相反,如果您想输入带有胶水的跳过,您仍然应该输入plusminus像这样:

\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 }

完成 MWE:

\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>

第一个长度用标准单位之一指定(ptmm等等cm);其他两个可以用标准单位或

fil    fill    filll

对应于“无限胶合顺序”。对跳过进行求和时,相加是按组件进行的,其中无限胶合胜过有限胶合,而 较多的胶l​​合胜过 较少的胶合l。如果 或plus缺失minus(或两者均缺失),则三元组中的指定值隐式为0pt。必须按精确顺序指定长度。

关键字plusminus只是类似于加法和减法的标准名称,但它们绝不表示加法或减法。

因此,按照你的想法输入跳过是错误的: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

因为组件加法的工作原理按照无限胶合规则。

相关内容