如何获取 l3skip 的橡胶部件?

如何获取 l3skip 的橡胶部件?

与我的相关关于 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

相关内容