我读到的第一反应pgfplotstable 手册曾是:
为什么任何有理智的人都会使用表格环境来生成表格?
pgfplotstable 的优点
- 无需指定列数
- 全局格式设置
- 本地格式设置可以在必要时覆盖全局设置(例如
longtable
需要更改单元格对齐方式等)
在我使用 pgfplotstable 进行实验时,我遇到了一些问题:
- 合并多列
- 向标题行中的文本添加格式命令
问题
columns/<name>/.style
是问题所在。格式化命令和新命令不能用作列标识符(在 中称为“名称”pgfplotstable
)。我需要找到一种方法来将文本名称保留在标题行中(用于 pdf 输出),但告诉pgfplotstable
使用列索引(例如 0、1、2 等)来唯一标识列。- 我
\texttt{}
在我的命令中使用了,但文件排版失败。 - 我还使用
\texttt{}
内部\newcommand
来演示这两种情况。
问题示例
鉴于:
\newcommand\test{\texttt{hello}.bye}
\pgfplotstabletypeset{%
col1 & \test{} & col3\\
here & more & stuff\\
}%
结果是:
columns/col1/.style={}
columns/\texttt{hello}.bye/.style={} % Not a valid column name!
columns/col3/.style={}
显然,第二列(索引 1)不起作用,正如 Percusse 在评论中提到的那样。
这让我得出这样的结论:解决方案可能涉及自动从列名中删除格式或强制pgfplotstable
使用索引(0、1、2 等)代替名称。无论哪种情况,列都必须成为pgfplotstable
引用的有效键:**
columns/col1/.style={}
columns/hello.bye/.style={}
columns/col3/.style={}
或者
columns/0/.style={}
columns/1/.style={}
columns/2/.style={}
有效示例
期望结果:用 \test{} 替换一个单元格。
\documentclass{article}
\usepackage{fontspec}
\usepackage{booktabs}
\usepackage{pgfplotstable}
\pgfplotstableset{% Global config
every head row/.style={before row=\toprule,after row=\midrule},
every last row/.style={after row=\bottomrule},
col sep=&,
row sep=\\,
column type=l,
column type={>{\fontseries{bx}\selectfont\color{orange}}l}, %see sec 2.6 for defining column types
string type,
postproc cell content/.append style={ % see sec 3.2
/pgfplots/table/@cell content/.add={\fontseries{\seriesdefault}\selectfont\color{black}}{}}
}%
\newcommand\test{\texttt{test}.bye}
\begin{document}
\pgfplotstabletypeset{%
col1 & col2 & col3\\ % <-- I want to replace a cell with \test{} in a header row
here & more & stuff\\
for & good & looks\\
}%
\end{document}
示例不是工作
期望结果:用 \test{} 替换一个单元格。
\documentclass{article}
\usepackage{fontspec}
\usepackage{booktabs}
\usepackage{pgfplotstable}
\pgfplotstableset{% Global config
every head row/.style={before row=\toprule,after row=\midrule},
every last row/.style={after row=\bottomrule},
col sep=&,
row sep=\\,
column type=l,
column type={>{\fontseries{bx}\selectfont\color{orange}}l}, %see sec 2.6 for defining column types
string type,
postproc cell content/.append style={ % see sec 3.2
/pgfplots/table/@cell content/.add={\fontseries{\seriesdefault}\selectfont\color{black}}{}}
}%
\newcommand\test{\texttt{test}.bye}
\begin{document}
\pgfplotstabletypeset{%
col1 & \test{} & col3\\ % <-- I want to replace a cell with \test{} in a header row
here & more & stuff\\
for & good & looks\\
}%
\end{document}
非常感谢 Symbol 1 和 Guuk 使之成为可能:
的能力:
- 全局格式化特定行(参见Pgfplotstable 一行以粗体显示)
- 使用标准 latex 格式覆盖全局格式(重要细节:也可以在标题行中作弊——参见符号 1 的答案)
- 在标题行中包含命令(再次作弊 - 参见 Symbol 的答案)
示范
\documentclass{article}
\usepackage{booktabs}
\usepackage{pgfplotstable}
\usepgflibrary{decorations.fractals}
\pgfplotstableset{
string type,col sep=&,row sep=\\,
header=false,
every head row/.style={output empty row},
every row no 0/.style={before row=\toprule,after row=\midrule},
every last row/.style={after row=\bottomrule},
highlightrow/.style={
postproc cell content/.append code={
\count0=\pgfplotstablerow
\advance\count0 by1
\ifnum\count0=#1
\pgfkeysalso{@cell content/.add={\bfseries\color{red}}{}}
\fi
},
},
highlightrow={1}
}%
\begin{document}
\pgfplotstabletypeset{
\LaTeX & \textit{italic} & \textcolor{orange}{orange} & \reflectbox{reflect} & $e^{i\pi}+1=0$ & \tikz\draw[decoration=Koch snowflake]decorate{decorate{decorate{decorate{(0,0)--(1,0)}}}}; \\
Lorem & ipsum & dolor & sit & amet & consectetur \\
adipisicing & elit & sed & do & eiusmod & tempor \\
}
\end{document}
答案1
告诉我解决方案
这是“一个办法用作row no 0
标题。(通常标题为row no -1
)。因此 PgfplotsTable 将不再将条目放入其中。请注意,如果您为某些列分配某种样式,则\csname
需要重置样式。row no 0
\documentclass{article}
\usepackage{booktabs}
\usepackage{pgfplotstable}
\usepgflibrary{decorations.fractals}
\begin{document}
\pgfplotstabletypeset[
string type,col sep=&,row sep=\\,
header=false,
every head row/.style={output empty row},
every row no 0/.style={before row=\toprule,after row=\midrule},
every last row/.style={after row=\bottomrule},
]{
\LaTeX & \textit{italic} & \textcolor{orange}{orange} & \reflectbox{reflect} & $e^{i\pi}+1=0$ & \tikz\draw[decoration=Koch snowflake]decorate{decorate{decorate{decorate{(0,0)--(1,0)}}}}; \\
Lorem & ipsum & dolor & sit & amet & consectetur \\
adipisicing & elit & sed & do & eiusmod & tempor \\
}
\end{document}
与细胞处理相结合(更新)
细胞处理有≥3个阶段。也许typeset cell
是最新的一个。(现在进行处理已经太晚了,因为那时与文字内容无关。)无论如何,这些键可能仍会正常工作。
\pgfplotstabletypeset[
string type,col sep=&,row sep=\\,
header=false,
every head row/.style={output empty row},
every row no 0/.style={before row=\toprule,after row=\midrule},
every last row/.style={after row=\bottomrule},
/pgfplots/table/typeset cell/.code={
\ifnum\pgfplotstablerow=0
\ifnum\pgfplotstablecol=\pgfplotstablecols
\pgfkeyssetvalue{/pgfplots/table/@cell content}{\bfseries\color{orange}#1\\}
\else
\pgfkeyssetvalue{/pgfplots/table/@cell content}{\bfseries\color{orange}#1&}
\fi
\else
\ifnum\pgfplotstablecol=\pgfplotstablecols
\pgfkeyssetvalue{/pgfplots/table/@cell content}{#1\\}
\else
\pgfkeyssetvalue{/pgfplots/table/@cell content}{#1&}
\fi
\fi
},
]{
\LaTeX & \textit{italic} & \textcolor{red}{R}\textcolor{green}{G}\textcolor{blue}{B} & \reflectbox{reflect} & $e^{i\pi}+1=0$ & \tikz\draw[decoration=Koch snowflake]decorate{decorate{decorate{decorate{(0,0)--(1,0)}}}}; \\
Lorem & ipsum & dolor & sit & amet & consectetur \\
adipisicing & elit & sed & do & eiusmod & tempor \\
}
向我展示官方解决方案
与之前相同的输出
\pgfplotstabletypeset[
string type,col sep=&,row sep=\\,
every head row/.style={before row=\toprule,after row=\midrule},
every last row/.style={after row=\bottomrule},
columns/LaTeX/.style ={column name=\LaTeX},
columns/italic/.style ={column name=\textit{italic}},
columns/orange/.style ={column name=\textcolor{orange}{orange}},
columns/reflect/.style ={column name=\reflectbox{reflect}},
columns/eipi+1/.style ={column name={$e^{i\pi}+1=0$}},
columns/Koch snowflake/.style={column name={\tikz\draw[decoration=Koch snowflake]decorate{decorate{decorate{decorate{(0,0)--(1,0)}}}};}},
]{
LaTeX & itslic & orange & reflect & eipi+1 & Koch snowflake \\
Lorem & ipsum & dolor & sit & amet & consectetur \\
adipisicing & elit & sed & do & eiusmod & tempor \\
}
告诉我原因
事实证明,这是一个基本的 TeX 现象,完全合理,但没有人会从逻辑上去思考它。在下面的例子中,我尝试将其打包\ttfamily
成一个控制序列的名称。
\documentclass{minimal}
\begin{document}
\expandafter\let\csname\ttfamily test\endcsname\relax
\end{document}
然后
\ttfamily
被扩大;- a
\protect
被揭开; - TeX
\protect
之前读过\endcsname
并且抱怨。
./236210 copy.tex:7: Missing \endcsname inserted. <to be read again> \protect l.7 \expandafter\let\csname\ttfamily test\endcsname\relax ?
(\protect
是的\relax
,它不能是csname的一部分。否则在逻辑上是矛盾的,对吗?)
回到pgfplotstable
。这个包做了很多神奇的事情,不可避免地将条目放在了 csname 中。然后 BOOM:由于\test
导致 到\texttt
和\ttfamily
到\protect
,TeX 抱怨!
那么下一个问题可能是我是否可以\newcommand
用? 代替\edef
?例如
\xdef\test{{\ttfamily test}}
答案依然是不但原因不同。事实上,由于字体开关的设计,内部存在类似
\xdef \font@name {\curr@fontshape}
但由于还有另一个\edef
外部,因此执行以下行
\xdef \OT1/cmr/m/n/10 {\OT1/cmr/m/n/10 }
因此,一旦你申请\test
...BOOM。
下列释义甚至会出现另一个错误。
\xdef\test{\textit{test}}
结论:永远不要依赖任何特定的包,尤其是表格。
答案2
我认为你对 的期望太高了pgfplotstable
。虽然它确实能做很多了不起的事情,但它仍然只是典型 TeX 表格和表机制的包装器。所以最终你得到的是自动生成的表格代码。你必须按照这种思路使用该包。
例如,在这里,您要两次更改所有内容的颜色,因为这是通常的 colortbl 等包实践中要采用的方法。此包的理念是自动化表格的某些属性,而不是提供替代语法,因此您必须真正注意何时何地设置了哪个属性。您可以在一个地方截取表格的值,但必须在其他地方更改格式。这需要一些时间来适应。
\documentclass{article}
\usepackage{booktabs,pgfplotstable}
\pgfplotsset{compat=1.12}
\makeatletter
\pgfplotstableset{
paint row/.style={
/pgfplots/table/typeset cell/.code={%
\ifnum\c@pgfplotstable@colindex=\c@pgfplotstable@numcols\relax%
\pgfkeyssetvalue{/pgfplots/table/@cell content}{\textcolor{#1}{##1}\\}%
\else\pgfkeyssetvalue{/pgfplots/table/@cell content}{\textcolor{#1}{##1}&}%
\fi%
},
}
}
\makeatother
\newcommand\test{\texttt{test}}
\begin{document}
\pgfplotstabletypeset[
string type,
every head row/.style={before row=\toprule,after row=\midrule,paint row=orange},
every last row/.style={after row=\bottomrule},
every row 1 column 1/.style={postproc cell content/.style={@cell content=\Large\test}},
]{
col1 col2 col3
here more stuff
for good looks
}
\end{document}