decimales siunitx solo para números menores de 1

decimales siunitx solo para números menores de 1

Supongamos que tengo la siguiente tabla

\documentclass{article}
\usepackage{siunitx}
\begin{document}

\begin{table}
\begin{tabular}{S[table-alignment=right, 
                  round-mode=places, 
                  round-precision=1, 
                  table-format=5.3,
                  zero-decimal-to-integer]}
{title}  \\
11111    \\
11.11    \\
0.11     \\
\end{tabular}
\end{table}

\end{document}

y me gustaría redondear los números de manera que los números superiores a 1 se redondeen a números enteros y los números inferiores a 1 se redondeen al primer decimal. El resultado aquí sería 11111, 11, 0.1.

Probé las siguientes combinaciones, que arrojaron resultados no deseados.

round-mode=figures and round-precision=1: 10000, 10, 0.1
round-mode=figures and round-precision=5: 11111, 11.110, 0.11000
round-mode=places  and round-precision=1: 11111, 11.1, 0.1

pero no puedo encontrar la configuración correcta para obtener lo que necesito (y espero que sea lo suficientemente común como para que sea posible en siunitx).

Respuesta1

Si esto es solo para usar en tablas, entonces puede usar pgfplotstabley preprocesar los números. A continuación defino una nueva clave round intque proporciona el preprocesamiento.

Salida de muestra

\documentclass{article}

\usepackage{siunitx,pgfplotstable}
\pgfplotsset{compat=1.17}

\begin{document}

\makeatletter
\pgfplotsset{table/round int/.style={%
  /pgfplots/table/preproc cell content/.append code={%
    \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult
    \ifx\pgfmathresult\pgfutil@empty
    \else
    \pgfmathparse{abs(\pgfmathresult) > 1 ? round(\pgfmathresult) : \pgfmathresult}%
    \pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult
    \fi}}}
    \makeatother

\pgfplotstabletypeset[multicolumn names,
  columns/0/.style={column name={title},
    string type,
    column type={S[table-alignment=right,
                  round-mode=places,
                  round-precision=1,
                  table-format=-5.1,
                  zero-decimal-to-integer]},
    round int
}
  ]{
11111
11.11
11.85
0.11
0.19
-10.2
-10.8
}

\end{document}

Lamentablemente, el estándar preproc/exprincluido pgfplotstabletiene algunas configuraciones que no son apropiadas para sus datos. El código anterior se basa en cómo preproc/exprse implementa en ese paquete.

Si desea que los números estén alineados a la derecha en la columna, simplemente reemplace el table-formatargumento de la Scolumna con table-parse-only:

Muestra alineada a la derecha

\documentclass{article}

\usepackage{siunitx,pgfplotstable}
\pgfplotsset{compat=1.17}

\begin{document}

\makeatletter
\pgfplotsset{table/round int/.style={%
  /pgfplots/table/preproc cell content/.append code={%
    \pgfkeysgetvalue{/pgfplots/table/@cell content}\pgfmathresult
    \ifx\pgfmathresult\pgfutil@empty
    \else
    \pgfmathparse{abs(\pgfmathresult) > 1 ? round(\pgfmathresult) : \pgfmathresult}%
    \pgfkeyslet{/pgfplots/table/@cell content}\pgfmathresult
    \fi}}}
    \makeatother

\pgfplotstabletypeset[multicolumn names,
  columns/0/.style={column name={title},
    string type,
    column type={S[table-alignment=right,
                  round-mode=places,
                  round-precision=1,
                  zero-decimal-to-integer,
                  table-parse-only]},
    round int
}
  ]{
11111
11.11
11.85
0.11
0.19
-10.2
-10.8
}

\end{document}

Respuesta2

Si necesita poder utilizar dicha función tanto en una tabla como fuera del texto, puede utilizar las funciones matemáticas pgfmathpara definir \MyRoundMacro:

\newcommand*{\MyRound}[1]{%
    \pgfmathtruncatemacro{\@IntegerComponent}{abs(#1)}%
    \ifnum\@IntegerComponent=0
        \num[round-mode=places, round-precision=1]{#1}%
    \else
        \num{\@IntegerComponent}%
    \fi
}%

Puedes usar esto directamente paracadaentrada en la tabla o use el collcellpaquete para definir un tipo de columna personalizada Ry use eso:

\newcolumntype{R}{>{\collectcell\MyRound}r<{\endcollectcell}}

donde res la alineación de columna deseada.

Las tablas producidas por el MWE a continuación son las deseadas:

ingrese la descripción de la imagen aquí

Notas:

  • El uso del Rtipo de columna requiere que ajustecualquierno contenido numérico (como las líneas de título) dentro de un archivo \multicolumn{1}{c}{}.

Código:

\documentclass{article}
\usepackage{siunitx}
\usepackage{collcell}% Needed only if desire to use the `R` column type defined below
\usepackage{pgfmath}

\begin{document}

\makeatletter
\newcommand*{\MyRound}[1]{%
    \pgfmathtruncatemacro{\@IntegerComponent}{abs(#1)}%
    \ifnum\@IntegerComponent=0
        \num[round-mode=places, round-precision=1]{#1}%
    \else
        \num{\@IntegerComponent}%
    \fi
}%
\makeatother

\newcolumntype{R}{>{\collectcell\MyRound}r<{\endcollectcell}}

In a table the \verb|R| column type (requires non data entries to be wrapped in a \verb|\multicolumn|):

\begin{tabular}{R}
    \multicolumn{1}{c}{\bfseries title}  \\
    11111    \\
    11.11    \\
    0.11     \\
\end{tabular}

Can use the \verb|\MyRound| macro directly in a table and
outside of a table:

\begin{tabular}{r}
    {\bfseries title}  \\
    \MyRound{11111}    \\
    \MyRound{11.11}    \\
    \MyRound{0.11}     \\
\end{tabular}

Outside of a table:

\MyRound{11111}\par
\MyRound{11.11}\par
\MyRound{0.11}\par

\end{document}

información relacionada