siunitx Dezimalstellen nur für Zahlen unter 1

siunitx Dezimalstellen nur für Zahlen unter 1

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 pgfplotstabledie Zahlen verwenden und vorverarbeiten. Im Folgenden definiere ich einen neuen Schlüssel round int, der die Vorverarbeitung bereitstellt.

Beispielausgabe

\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/exprLeider enthält der mitgelieferte Standard pgfplotstableeinige Einstellungen, die für Ihre Daten nicht geeignet sind. Der obige Code basiert auf der preproc/exprImplementierung in diesem Paket.

Wenn Sie die Zahlen in der Spalte rechtsbündig haben möchten, ersetzen Sie einfach das table-formatArgument für die SSpalte durch table-parse-only:

Rechtsbündiges Beispiel

\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, pgfmathum 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 collcellPaket, um einen benutzerdefinierten Spaltentyp zu definieren Rund diesen zu verwenden:

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

wobei dies rdie gewünschte Spaltenausrichtung ist.

Die folgenden vom MWE erstellten Tabellen entsprechen den Wünschen:

Bildbeschreibung hier eingeben

Anmerkungen:

  • Die Verwendung des RSpaltentyps 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}

verwandte Informationen