
如何恢復發送 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
andminus
只是類似加法和減法的標準名稱,但它們絕不表示加法或減法。
因此,按照您的想法輸入跳過是錯誤的: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
因為以分量加法的工作原理和根據無限膠水的規則。