与我的相关关于 l3skip 到 \setlength 的问题。
\ExplSyntaxOn
\skip_const:Nn \c__par_skip { 1ex plus 0.2ex plus 0.1ex }
\skip_gimme_the_stretch:NN \g__par_stretch_fp \c__par_skip % 0.2ex
\skip_gimme_the_shrink:NN \g__par_shrink_fp \c__par_skip % 0.1ex
我主要想通过这种方式来实现将跳过乘以一个保留橡胶成分的常数。
\ExplSyntaxOn
\skip_const:Nn \c__a_skip { 1ex plus 0.2ex plus 0.1ex }
\glue_add:NnN \c__a_skip {2} \l__tmpa_skip
\skip_vertical:N \l__tmpa_skip % 2ex plus 0.4ex minus 0.2ex
但也许已经有办法做到这一点了?
答案1
您的问题大致分为两部分,第一部分是 和 的实现\turnbull_skip_stretch:N
,分别\turnbull_skip_shrink:N
返回 skip 的拉伸和收缩组件。它们是可扩展的,因此您可以像这样使用它们:
\dim_set:Nn \l_tmpa_dim { \turnbull_skip_stretch:N \c_turnbull_par_skip }
例如,将 的拉伸分量存储\c_turnbull_par_skip
在 中\l_tmpa_dim
。代码如下:
\ExplSyntaxOn
% definition
\scan_new:N \s__turnbull_stop
\cs_new:Npn \turnbull_skip_space:N #1
{
\exp_after:wN \__turnbull_skip_space:w \dim_use:N #1 ~
\s__turnbull_stop
}
\cs_new:Npx \turnbull_skip_stretch:N #1
{
\exp_not:n { \exp_after:wN \__turnbull_skip_stretch:w \dim_use:N } #1
\tl_to_str:n {~minus~plus~0.0pt~minus~} \s__turnbull_stop
}
\cs_new:Npx \turnbull_skip_shrink:N #1
{
\exp_not:n { \exp_after:wN \__turnbull_skip_shrink:w \dim_use:N } #1
\tl_to_str:n {~plus~minus~0.0pt~plus~} \s__turnbull_stop
}
\use:e
{
\cs_new:Npn \exp_not:N \__turnbull_skip_stretch:w
#1 \tl_to_str:n {~plus~} #2 \tl_to_str:n {~minus~} #3 \s__turnbull_stop
{#2}
\cs_new:Npn \exp_not:N \__turnbull_skip_shrink:w
#1 \tl_to_str:n {~minus~} #2 \tl_to_str:n {~plus~} #3 \s__turnbull_stop
{#2}
\cs_new:Npn \exp_not:N \__turnbull_skip_space:w
#1 ~ #2 \s__turnbull_stop
{#1}
}
% example
\skip_const:Nn \c_turnbull_par_skip { 1pt plus 0.2pt minus 0.1pt }
\skip_show:N \c_turnbull_par_skip
\dim_set:Nn \l_tmpa_dim { \turnbull_skip_stretch:N \c_turnbull_par_skip }
\dim_show:N \l_tmpa_dim
\dim_set:Nn \l_tmpa_dim { \turnbull_skip_shrink:N \c_turnbull_par_skip }
\dim_show:N \l_tmpa_dim
\ExplSyntaxOff
对于第二部分,我认为你走的是一条困难的道路。很容易采用上述定义并写下:
\ExplSyntaxOn
\cs_new_protected:Npn \turnbull_skip_multiply:Nn #1 #2
{
\skip_set:Nn #1
{
\skip_eval:n { ( \turnbull_skip_space:N #1 ) * #2 }
plus \skip_eval:n { ( \turnbull_skip_stretch:N #1 ) * #2 }
minus \skip_eval:n { ( \turnbull_skip_shrink:N #1 ) * #2 }
}
}
\skip_const:Nn \c_turnbull_par_skip { 1pt plus 0.2pt minus 0.1pt }
\skip_set_eq:NN \l_tmpa_skip \c_turnbull_par_skip
\turnbull_skip_multiply:Nn \l_tmpa_skip { 2 }
\skip_show:N \l_tmpa_skip
\ExplSyntaxOff
但直接使用\multiply
原语要容易得多(尽管它要求您复制\tex_multiply:D
,但这并不符合最佳实践):
\ExplSyntaxOn
\cs_new_eq:NN \__turnbull_multiply:w \tex_multiply:D
\cs_new_protected:Npn \turnbull_skip_multiply:Nn #1 #2
{ \__turnbull_multiply:w #1 by \int_eval:n {#2} \scan_stop: }
\skip_const:Nn \c_turnbull_par_skip { 1pt plus 0.2pt minus 0.1pt }
\skip_set_eq:NN \l_tmpa_skip \c_turnbull_par_skip
\turnbull_skip_multiply:Nn \l_tmpa_skip { 2 }
\skip_show:N \l_tmpa_skip
\ExplSyntaxOff
\stop