如何使用 pgfplotstable 的 iflessthan 键

如何使用 pgfplotstable 的 iflessthan 键

pgfplotstable提供iflessthan定义自定义比较函数的关键:

/pgfplots/iflessthan/.code args={##1##2##3##4}{<...>}

我只是不知道如何使用它,手册中没有示例。我想做的是按包含整数的列对表进行排序,但它们太大而无法sort cmp={int <}处理。这里有一个小例子,它生成了我想要的表,但没有所需的排序:

\documentclass[a4paper,10pt]{scrartcl}

\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{pgfplotstable}
\usepackage{etoolbox}

\begin{document}
  \pagestyle{empty}
  \pgfplotstableread[trim cells=true,col sep=semicolon,header=false]{
% column 3: index, column 6: value
;;;20730691;;;500
;;;20730690;;;450
;;;44569;;;400
;;;;;;345
;;;6366132;;;300
;;;6366133;;;300
;;;6366134;;;NER
}{\privateTable}
  \pgfplotstablesort[sort,sort key={[index]3},sort cmp={string <},sort ]{\publicTable}{\privateTable}
  \pgfplotstabletypeset[columns={3,6},
                        columns/3/.style={column name=index,string type},
                        columns/6/.style={column name=value,
                          assign cell content/.code={% convert NER to ner
                            \ifstrequal{##1}{NER}{%
                              \pgfkeyssetvalue{/pgfplots/table/@cell content}{ner}
                            }{%
                              \pgfkeyssetvalue{/pgfplots/table/@cell content}{\pgfmathprintnumber{##1}}
                            }%
                          }
                        },
                        row predicate/.code={% skip rows with empty index
                          \pgfplotstablegetelem{#1}{3}\of{\publicTable}
                          \ifnum\pdfstrcmp{\pgfplotsretval}{}=0
                            \pgfplotstableuserowfalse
                          \fi
                        },
                        ]\publicTable
\end{document}

当我sort cmp从更改int <为 时string <,我收到三个missing number, treated as zero错误。这就是为什么我想定义一个基于\ifnumless(来自etoolbox包)的比较函数。

我怎样才能做到这一点?


当我只是复制string <样式定义时pgfplotsutil.code.tex,我得到了无数

!Parameters must be numbered consecutively.  
<to be read again>;  
                   ##

错误:

\pgfplotstablesort[sort,
  sort key={index},
  iflessthan/.code args={##1##2##3##4}{%
    \t@pgfplots@toka=\expandafter{##1}%
    \t@pgfplots@tokb=\expandafter{##2}%
    \edef\pgfplots@loc@TMPa{{\the\t@pgfplots@toka}{\the\t@pgfplots@tokb}}%
    \expandafter\pgfplotsutilstrcmp\pgfplots@loc@TMPa
    \if1\pgfplotsretval ##3\else ##4\fi
  }
  ]{\publicTable}{\privateTable}

答案1

出现此问题是因为排序键为空。请注意,排序是在考虑行谓词之前很久就应用的。

因此,iflessthan代码需要知道空键(默认值为否)。

int <这就是为什么每当您尝试使用而不是 时,您都会看到“!缺失数字,视为零。”的原因string <:TeX 会尝试将空字符串与其他内容进行比较。并且它会“通知”您,它用零替换了空字符串。如果您在出现所有这些错误后按下 Enter 键查看输出,您将看到一个正确排序的表格。

一个可能的解决办法 - 按照需要,使用\ifnumless-,可能是

\pgfplotsset{
    my own </.style={%
        /pgfplots/iflessthan/.code args={##1##2##3##4}{%
            \edef\X{##1} \ifx\X\empty \def\X{-2000000} \fi%
            \edef\Y{##2} \ifx\Y\empty \def\Y{-2000000} \fi%
            \ifnumless{\X}{\Y}{##3}{##4}%
        },%
    },
}

您只需使用my own <而不是string <来激活它。

它的工作原理如下:它定义一个带有四个参数的代码键。然后,它将其定义\X为第一个参数的扩展定义,检查它是否为空字符串,如果是,则分配一些“巨大”的负值。对第二个参数执行相同操作后,它会比较这两个数字,##3如果比较结果为真,则执行,##4否则执行。

相关内容