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
否则执行。