
Angenommen, ich habe die folgende Tabelle
\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}
und ich möchte die Zahlen so runden, dass Zahlen über 1 auf ganze Zahlen und Zahlen unter 1 auf die erste Dezimalstelle gerundet werden. Das Ergebnis wäre hier 11111, 11, 0.1
.
Ich habe die folgenden Kombinationen ausprobiert, die zu unerwünschten Ergebnissen führten
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
aber ich kann nicht die richtigen Einstellungen herausfinden, um das zu bekommen, was ich brauche (und hoffe, dass es allgemein genug ist, dass es in möglich ist siunitx
).
Antwort1
Wenn dies nur für die Verwendung in Tabellen gedacht ist, können Sie pgfplotstable
die Zahlen verwenden und vorverarbeiten. Im Folgenden definiere ich einen neuen Schlüssel round int
, der die Vorverarbeitung bereitstellt.
\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}
preproc/expr
Leider enthält der mitgelieferte Standard pgfplotstable
einige Einstellungen, die für Ihre Daten nicht geeignet sind. Der obige Code basiert auf der preproc/expr
Implementierung in diesem Paket.
Wenn Sie die Zahlen in der Spalte rechtsbündig haben möchten, ersetzen Sie einfach das table-format
Argument für die S
Spalte durch 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}
Antwort2
Wenn Sie eine solche Funktion sowohl in einer Tabelle als auch außerhalb des Texts verwenden müssen, können Sie die mathematischen Funktionen in verwenden, pgfmath
um Folgendes zu definieren \MyRoundMacro
:
\newcommand*{\MyRound}[1]{%
\pgfmathtruncatemacro{\@IntegerComponent}{abs(#1)}%
\ifnum\@IntegerComponent=0
\num[round-mode=places, round-precision=1]{#1}%
\else
\num{\@IntegerComponent}%
\fi
}%
Sie können dies entweder direkt verwenden fürjedeEintrag in der Tabelle oder verwenden Sie das collcell
Paket, um einen benutzerdefinierten Spaltentyp zu definieren R
und diesen zu verwenden:
\newcolumntype{R}{>{\collectcell\MyRound}r<{\endcollectcell}}
wobei dies r
die gewünschte Spaltenausrichtung ist.
Die folgenden vom MWE erstellten Tabellen entsprechen den Wünschen:
Anmerkungen:
- Die Verwendung des
R
Spaltentyps erfordert, dass Siebeliebignicht numerischer Inhalt (wie etwa die Titelzeilen) innerhalb einer\multicolumn{1}{c}{}
.
Code:
\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}