pgfplotstable: Đánh dấu các hàng của một dãy số

Sep 20 2020

Tôi muốn đánh dấu các hàng n*(n+3)/2 = 0, 2, 5, 9, 14, 20, 27, 35,...
Làm cách nào để tự động hóa cách tốt nhất đó bằng cách sử dụng thuật ngữ 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}

Trả lời

4 ZhiyuanLck Sep 21 2020 at 00:28

handlers/.listsử dụng \foreachđể mở danh sách:

\foreach \pgf@keys@key in{#1}%

trong khi pgfforxử lý danh sách theo các cách khác nhau bằng cách kiểm tra xem có phần đầu \bgroup:

\def\pgffor@@vars@end in{%
  \pgfutil@ifnextchar\bgroup{\pgffor@normal@list}{\pgffor@macro@list}%
}

Như bạn thấy danh sách macro (không được đánh dấu ) được mở rộng thành danh sách bình thường ( có dấu ) trước tiên:

\def\pgffor@macro@list#1{%
  \expandafter\pgffor@normal@list\expandafter{#1}}

Vì vậy, khi bạn viết highlightrow=\Listvà mong đợi nó được xử lý như một danh sách macro , nhưng thực tế lại \Listđược giằng và được xử lý như một danh sách bình thường và sau đó lỗi xảy ra.

Cách nhanh chóng để khắc phục sự cố là những gì Ulrike Fischer đã đề cập trong nhận xét của cô ấy: sử dụng highlightrow/.list/.expand once=\List.

Tôi cung cấp một cách khác để có thể sử dụng một hàm để lấy chỉ mục hàng 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 cis Sep 21 2020 at 01:07

Với mẹo highlightrow/.list/.expand once=\List
tôi sử dụng pgfmath-solution:

\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