pgfplotstable: 数値シーケンスの行を強調表示する

pgfplotstable: 数値シーケンスの行を強調表示する

行を強調表示したいのですが、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}%

while は、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

関連情報