pgfmath: inteiros sem zeros, não inteiros com zerofill (e fixos)

Oct 17 2020

Eu quero:
· inteiros sem zeros, por exemplo, -2 ---> -2 (não -2,0000)
· não inteiros com zerofill,
por exemplo , 1,23 ---> 1,2300,
por exemplo, 1,2345 -> 1,2345

Dicas:
· Uma pgfmathsolução seria boa (na diferença de siunitx etc.).
· E eu preciso disso em a pgfplotstable, mas não sei se este é um problema específico do pgfplotstable.

O que devo definir?

\documentclass{article}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.17}

\begin{document}
\pgfplotstableset{col sep=comma}
\section{Actual}
\pgfplotstabletypeset[
fixed relative,
zerofill,  precision=4,  % no effect
]{
0, 1,  -2,  1.23,  1.2345
}

\section{Target}
\pgfplotstabletypeset[string type]{
0, 1,  -2,  1.2300,  1.2345
}
\end{document}

Respostas

2 frougon Oct 17 2020 at 23:57

Você pode definir a chave /pgfplots/table/@cell contentdo gancho /pgfplots/table/assign cell contentpara definir a marcação de saída personalizada para cada célula. O argumento de assign cell contentsão os dados não formatados lidos da tabela de entrada. \pgfmathifisintpermite executar um código condicional que depende se os dados representam um número inteiro.

\documentclass{article}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.17}

\begin{document}
\pgfplotstableset{col sep=comma}

\pgfplotstabletypeset[
  every column/.style={
    assign cell content/.code={%
      \pgfmathifisint{##1}
        {\def\myOptions{}}%
        {\def\myOptions{fixed, zerofill, precision=4}}%
      \expandafter\pgfmathprintnumberto\expandafter[\myOptions]
        {\pgfretval}{\myFormattedValue}%
      \pgfplotstableset{@cell content/.expand once=\myFormattedValue}%
    },
  }]{
0, 1,  -2,  1.23,  1.2345
}

\end{document}

O gancho /pgfplots/table/assign cell contenté executado dentro de um grupo TeX, portanto, não há necessidade de limpar macros manualmente \myOptionse \myFormattedValuedepois: isso é automático.

O seguinte é equivalente e mais curto, mas tem um pouco mais de redundância:

\documentclass{article}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.17}

\begin{document}
\pgfplotstableset{col sep=comma}

\pgfplotstabletypeset[
  every column/.style={
    assign cell content/.code={%
      \pgfmathifisint{##1}
        {\pgfmathprintnumberto{\pgfretval}{\myFormattedValue}}
        {\pgfmathprintnumberto[fixed, zerofill, precision=4]
           {\pgfretval}{\myFormattedValue}}%
      \pgfplotstableset{@cell content/.expand once=\myFormattedValue}%
    },
  }]{
0, 1,  -2,  1.23,  1.2345
}

\end{document}

Também é possível, colocando toda a lógica dentro de cada um @cell content(o que pode usar um pouco mais de memória, talvez?):

\documentclass{article}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.17}

\begin{document}
\pgfplotstableset{col sep=comma}

\pgfplotstabletypeset[
  every column/.style={
    assign cell content/.style={
      @cell content={%
        \pgfmathifisint{##1}
          {\pgfmathprintnumber{\pgfretval}}
          {\pgfmathprintnumber[fixed, zerofill, precision=4]{\pgfretval}}%
      },
    },
  }]{
0, 1,  -2,  1.23,  1.2345
}

\end{document}