
Basierend auf dieser Frage,Ich weiß, wie man normale Längen in beliebigen Einheiten ausdrückt. Ich muss jedoch dasselbe für Gummilängen tun (Plus und Minus anzeigen) und das printlen
Paket unterstützt dies nur für pt. Gibt es ein Äquivalent, das für Gummilängen funktioniert?
Antwort1
etex verfügt über zusätzliche Primitive zum Extrahieren der Komponenten, sodass Sie sie separat ausdrucken können:
\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}
Antwort2
Hier ist eine Version expl3
, die auch unendliche Komponenten berücksichtigt.
\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
Beachten Sie, dass es für , \gluestretchorder
, \glueshrink
und keine öffentliche Schnittstelle gibt. \glueshrinkorder
Deshalb habe ich eine definiert.
Durch Runden kann es zu unerwarteten Ergebnissen kommen, dies kann unter Umständen durch den Einsatz des fp
Moduls verbessert werden.