
Me gustaría resaltar las filas. n*(n+3)/2 = 0, 2, 5, 9, 14, 20, 27, 35,...
¿Cómo podría automatizar la mejor manera usando el término n*(n+3)/2
?
\documentclass{standalone}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.17}
\begin{document}
\pgfplotstableset{
highlightrow/.style={
postproc cell content/.append code={
\count0=\pgfplotstablerow
\advance\count0 by0
\ifnum\count0=#1
% \pgfkeysalso{@cell content/.add={$\bf}{$}}
\pgfkeysalso{@cell content=\textbf{##1}}%
\fi}, }, }
%\def\List{7,9,10}
\pgfplotstabletypeset[string type,
highlightrow=0, % works
highlightrow/.list={2,5,9}, % works
%highlightrow/.list=\List, % works not
]{
A B C
0 x x
1 x x
2 x x
3 x x
4 x x
5 x x
6 x x
7 x x
8 x x
9 x x
10 x x
11 x x
}
\end{document}
Respuesta1
handlers/.list
utiliza \foreach
para desplegar la lista:
\foreach \pgf@keys@key in{#1}%
mientras pgffor
maneja la lista de diferentes maneras verificando si hay un encabezado \bgroup
:
\def\pgffor@@vars@end in{%
\pgfutil@ifnextchar\bgroup{\pgffor@normal@list}{\pgffor@macro@list}%
}
Como ves la lista de macros (sin apoyo) se expande a una lista normal (apuntalado) primero:
\def\pgffor@macro@list#1{%
\expandafter\pgffor@normal@list\expandafter{#1}}
Entonces, cuando escribes highlightrow=\List
y esperas que se procese como unlista de macros, pero en realidad \List
esapuntaladoy ser procesado comolista normaly luego ocurre el error.
La forma rápida de solucionar el problema es quéUlrike Fischerha mencionado en su comentario: use highlightrow/.list/.expand once=\List
.
Proporciono otra manera de hacer posible el uso de unfunciónpara obtener el índice de la fila con expl3
.
\documentclass[margin=1cm]{standalone}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.17}
\usepackage{xparse}
\pgfplotstableset{
highlightrow/.style 2 args={
postproc cell content/.append code={
\ifnum\pgfplotstablerow=#1
\pgfkeysalso{@cell content={#2##1}}%
\fi
},
},
}
\ExplSyntaxOn
\NewDocumentCommand { \rowstyle } { O{30} O{#1} m }
{
\row_style:nnn { #1 } { #2 } { #3 }
}
\int_new:N \l__i_int
\int_new:N \l__index_int
\cs_new_protected:Nn \row_style:nnn
{
\cs_set:Nn \__parse_expr:n
{
\fp_to_int:n { floor(#2) }
}
\fp_compare:nT { #1 >= 0 }
{
\int_zero:N \l__i_int
\fp_while_do:nn { \__parse_expr:n { \l__i_int } <= #1 }
{
\tl_set:Nx \l_tempa_tl {
\exp_not:N \pgfplotstableset{
highlightrow={\__parse_expr:n { \l__i_int }}{ \exp_not:n { #3 } }
}
}
\tl_use:N \l_tempa_tl
\int_incr:N \l__i_int
}
}
}
\ExplSyntaxOff
\begin{document}
\rowstyle[11][#1*(#1 + 3)/2]{\color{red}}
\rowstyle[11][(#1 + 1)*4]{\color{blue}\bfseries}
\pgfplotstabletypeset[string type]{
A B C
0 x x
1 x x
2 x x
3 x x
4 x x
5 x x
6 x x
7 x x
8 x x
9 x x
10 x x
11 x x
}
\end{document}
Respuesta2
Con el consejo highlightrow/.list/.expand once=\List
utilizo una solución pgfmath:
\documentclass{article}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.17}
\pgfplotstableread[]{
A B C
0 x x
1 x x
2 x x
3 x x
4 x x
5 x x
6 x x
7 x x
8 x x
9 x x
10 x x
11 x x
}{\mytable}
\begin{document}
\pgfplotstablegetrowsof{\mytable}
\pgfmathsetmacro\Rows{int(\pgfplotsretval-1)}
Rows: \Rows.
% Solution of Rows = n*(n+3)/2
\pgfmathsetmacro\N{int(floor(0.5*(sqrt(8*\Rows+9)-3)))}
Maximal n: \N=N
% List:
\let\List=\empty% create List
\foreach \n in {0,...,\N}
{%
\pgfmathparse{int(\n*(\n+3)/2}%
\ifx\empty\List{} \xdef\List{\pgfmathresult}%
\else \xdef\List{\List,\pgfmathresult}%
\fi
}
List: \List
\pgfplotstableset{
highlightrow/.style={
postproc cell content/.append code={
\count0=\pgfplotstablerow
\advance\count0 by0
\ifnum\count0=#1
% \pgfkeysalso{@cell content/.add={$\bf}{$}}
\pgfkeysalso{@cell content=\color{red}\textbf{##1}}%
\fi}, },
}
\pgfplotstabletypeset[string type,
%highlightrow=0,%
highlightrow/.list/.expand once=\List,
]{\mytable}
\end{document}a