
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 pgfplotstable
y preprocesar los números. A continuación defino una nueva clave round int
que proporciona el preprocesamiento.
\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/expr
incluido pgfplotstable
tiene algunas configuraciones que no son apropiadas para sus datos. El código anterior se basa en cómo preproc/expr
se implementa en ese paquete.
Si desea que los números estén alineados a la derecha en la columna, simplemente reemplace el table-format
argumento de la S
columna con table-parse-only
:
\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 pgfmath
para 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 collcell
paquete para definir un tipo de columna personalizada R
y use eso:
\newcolumntype{R}{>{\collectcell\MyRound}r<{\endcollectcell}}
donde r
es la alineación de columna deseada.
Las tablas producidas por el MWE a continuación son las deseadas:
Notas:
- El uso del
R
tipo 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}