
En base a esta pregunta,Sé cómo mostrar longitudes regulares expresadas en unidades arbitrarias. Sin embargo, necesito hacer lo mismo con las longitudes de goma (que muestran el más y el menos) y el printlen
paquete no lo admite excepto pt. ¿Existe algún equivalente que funcione para tramos de goma?
Respuesta1
etex tiene primitivas adicionales para extraer los componentes para que puedas imprimirlos por separado:
\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}
Respuesta2
Aquí hay una versión expl3
que también se ocupa de infinitos componentes.
\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}
Tenga en cuenta que no hay una interfaz pública para , y \gluestretch
, \gluestretchorder
así que definí una.\glueshrink
\glueshrinkorder
El redondeo puede dar resultados inesperados; esto podría mejorarse usando el fp
módulo.