问题

问题

我读到的第一反应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}

在此处输入图片描述

相关内容