pgfmath: inteiros sem zeros, não inteiros com zerofill (e fixos)
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
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}