
Я хотел бы выделить строки. n*(n+3)/2 = 0, 2, 5, 9, 14, 20, 27, 35,...
Как я могу автоматизировать это наилучшим образом, используя термин 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}
решение1
handlers/.list
использует \foreach
для раскрытия списка:
\foreach \pgf@keys@key in{#1}%
при этом pgffor
обрабатывайте список разными способами, проверяя, есть ли начальный символ \bgroup
:
\def\pgffor@@vars@end in{%
\pgfutil@ifnextchar\bgroup{\pgffor@normal@list}{\pgffor@macro@list}%
}
Как вы видите список макросов (неподкрепленный) расширяется до обычного списка (укрепленный) первый:
\def\pgffor@macro@list#1{%
\expandafter\pgffor@normal@list\expandafter{#1}}
Поэтому, когда вы пишете highlightrow=\List
и ожидаете, что это будет обработано каксписок макросов, но на самом деле \List
этоукрепленныйи быть обработаны какобычный списоки тут возникает ошибка.
Самый быстрый способ решить проблему — это то, чтоУльрике Фишерупомянула в своем комментарии: используйте highlightrow/.list/.expand once=\List
.
Я предлагаю еще один способ сделать возможным использованиефункциячтобы получить индекс строки с помощью 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}
решение2
С помощью подсказки highlightrow/.list/.expand once=\List
я использую 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