我如何恢复发送 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
会被求值作为这样的计算,结果是(由 TeX1.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 }
完成 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>
第一个长度用标准单位之一指定(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
因为组件加法的工作原理和按照无限胶合规则。