
基於這個問題,我知道如何顯示以任意單位表示的常規長度。但是,我需要對橡膠長度執行相同的操作(顯示正負),printlen
除了 pt 之外,該軟體包不支援該操作。是否有適用於橡膠長度的等效物?
答案1
etex 有額外的原語用於提取組件,以便您可以單獨列印它們:
\documentclass{article}
\usepackage{printlen}
\begin{document}
\the\parskip
The \verb|\parskip| is \printlength{\dimexpr\parskip\relax} which is also
\uselengthunit{in}\printlength{\dimexpr\parskip\relax} and
\uselengthunit{mm}\printlength{\dimexpr\parskip\relax}.
The \verb|\gluestretch\parskip| is \printlength{\gluestretch\parskip} which is also
\uselengthunit{in}\printlength{\gluestretch\parskip} and
\uselengthunit{mm}\printlength{\gluestretch\parskip}.
The \verb|\glueshrink\parskip| is \printlength{\glueshrink\parskip} which is also
\uselengthunit{in}\printlength{\glueshrink\parskip} and
\uselengthunit{mm}\printlength{\glueshrink\parskip}.
\end{document}
答案2
expl3
這是一個使用它也可以處理無限元件的版本。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\printglue}{O{pt}m}
{ % #1 = unit, #2 = glue
\rpspringuel_print_glue:nn { #1 } { #2 }
}
\cs_new_protected:Npn \rpspringuel_print_glue:nn #1 #2
{
\skip_set:Nn \l_rpspringuel_input_skip { #2 }
\dim_set:Nn \l_rpspringuel_natural_dim { \l_rpspringuel_input_skip }
\dim_set:Nn \l_rpspringuel_stretch_dim
{ \rpspringuel_gluestretch:n { \l_rpspringuel_input_skip } }
\dim_set:Nn \l_rpspringuel_shrink_dim
{ \rpspringuel_glueshrink:n { \l_rpspringuel_input_skip } }
\int_set:Nn \l_rpspringuel_stretch_order_int
{ \rpspringuel_gluestretchorder:n { \l_rpspringuel_input_skip } }
\int_set:Nn \l_rpspringuel_shrink_order_int
{ \rpspringuel_glueshrinkorder:n { \l_rpspringuel_input_skip } }
% print the components
\dim_to_decimal_in_unit:nn { \l_rpspringuel_natural_dim } { 1#1 }
\,#1
\c_space_tl
plus
\c_space_tl
\int_case:nn { \l_rpspringuel_stretch_order_int }
{
{ 0 } { \dim_to_decimal_in_unit:nn { \l_rpspringuel_stretch_dim } { 1#1 }\,#1 }
{ 1 } { \dim_to_decimal_in_unit:nn { \l_rpspringuel_stretch_dim } { 1pt }\,fil }
{ 2 } { \dim_to_decimal_in_unit:nn { \l_rpspringuel_stretch_dim } { 1pt }\,fill }
{ 3 } { \dim_to_decimal_in_unit:nn { \l_rpspringuel_stretch_dim } { 1pt }\,filll }
}
\c_space_tl
minus
\c_space_tl
\int_case:nn { \l_rpspringuel_shrink_order_int }
{
{ 0 } { \dim_to_decimal_in_unit:nn { \l_rpspringuel_shrink_dim } { 1#1 }\,#1 }
{ 1 } { \dim_to_decimal_in_unit:nn { \l_rpspringuel_shrink_dim } { 1pt }\,fil }
{ 2 } { \dim_to_decimal_in_unit:nn { \l_rpspringuel_shrink_dim } { 1pt }\,fill }
{ 3 } { \dim_to_decimal_in_unit:nn { \l_rpspringuel_shrink_dim } { 1pt }\,filll }
}
}
\skip_new:N \l_rpspringuel_input_skip
\dim_new:N \l_rpspringuel_natural_dim
\dim_new:N \l_rpspringuel_stretch_dim
\dim_new:N \l_rpspringuel_shrink_dim
\int_new:N \l_rpspringuel_stretch_order_int
\int_new:N \l_rpspringuel_shrink_order_int
\cs_new:Npn \rpspringuel_gluestretch:n #1
{
\etex_gluestretch:D \etex_glueexpr:D #1\scan_stop:
}
\cs_new:Npn \rpspringuel_glueshrink:n #1
{
\etex_glueshrink:D \etex_glueexpr:D #1\scan_stop:
}
\cs_new:Npn \rpspringuel_gluestretchorder:n #1
{
\etex_gluestretchorder:D \etex_glueexpr:D #1\scan_stop:
}
\cs_new:Npn \rpspringuel_glueshrinkorder:n #1
{
\etex_glueshrinkorder:D \etex_glueexpr:D #1\scan_stop:
}
\ExplSyntaxOff
\begin{document}
\printglue{\parskip}
\printglue{\fill}
\newlength\mylength
\setlength\mylength{10cm plus 1cm minus 1filll}
\printglue[cm]{\mylength}
\printglue[mm]{10cm plus 1cm minus 1filll}
\end{document}
\gluestretch
請注意,\gluestretchorder
、\glueshrink
和沒有公共接口\glueshrinkorder
,因此我定義了一個。
四捨五入可能會產生意想不到的結果;使用該模組可能會改善這一點fp
。