问题

问题

表格是我文档的最后边界。到目前为止,我已经设法使用单一、共享的序言标准化了 20 多份文档(数百页)。

问题

我仍然无法从表格内容中抽象出格式。

我把表格限制为两种主要类型和一种次要类型。

表格列表

  • 表格
  • 长桌
  • tabularx(为了一致性而被淘汰。但它仍然是一个不错的选择)

我使用 LaTeX 是因为它能够将格式与内容分开。表格似乎集成了两大堆非内容代码

  • \hline
  • \toprule、\midrule、\bottomrule 来自booktabs
  • 手动设置单元格、行和列的对齐每个表(很烦人,应该是全局的,可以选择本地覆盖)
  • 必须设置颜色和其他标题单元格、行和列的格式每个表(应为全局的,可选择本地覆盖)
  • 必须设置颜色和其他本地格式化数据单元格、行和列每个表(应为全局的,可选择本地覆盖)
  • 尽管可能无法避免,multirowmulticolumn必须在数据内部。

完成此列表

为表格列表中的所有表格提供全局条件的事项:

  • pgfplotstable

在理想世界中,我可以做类似以下的事情,它们将按照序言中指定的方式运行(无需任何局部调整):

\begin{mycustomtabular}
col1 & col2 & col3 \\
dat1 & dat2 & dat3 \\
dat4 & dat5 & dat6 \\
\end{mycustomtabular}

\begin{mycustomtabular}
col1 & col2 & col3 & col4 \\
dat1 & dat2 & dat3 & dat4 \\
dat5 & dat6 & dat7 & dat8 \\
\end{mycustomtabular}

\begin{mycustomtabular}[longtable] % set to use longtable
col1 & col2 & col3 & col4 \\
dat1 & dat2 & dat3 & dat4 \\
dat5 & dat6 & dat7 & dat8 \\
\end{mycustomtabular}

更新 2015-04-13

我能够使用以下代码格式化一列,但还不能全局格式化。

**朝着正确的方向迈出了一步,但仍然缺少在全球范围内添加两件事的能力:

  • \rowstyle{\bfseries\Large\color{green!25!gray}}(这与NewEnviron+配合使用tabularx
  • \midrule
  • (暂时忽略引用单元格的问题)

代码

\documentclass{article}
\usepackage{fontspec}
\usepackage{booktabs} % Adds support for \toprule, \midrule, \bottomrule
\usepackage{xcolor} % Adds support for coloring blocks of text: \color{green!25!black} or \textcolor{green!25!black){text}
  \usepackage{tabularx}
 \usepackage{environ} % Use for tabular environment when using booktabs
\usepackage{array} % https://tex.stackexchange.com/a/4816/13552
\newcolumntype{$}{>{\global\let\currentrowstyle\relax}}
\newcolumntype{^}{>{\currentrowstyle}}
\newcommand{\rowstyle}[1]{\gdef\currentrowstyle{#1}%
  #1\ignorespaces
}

\newenvironment{mytab}[1][$l*{50}{^l}]{% <-- tabular WORKS!
  \begin{tabular}{#1}\toprule}{%
  \rowstyle{\bfseries\color{green}} %<-- Global \rowstyle
  \\\bottomrule\end{tabular}}


  \newenvironment{mytabx}[1][$l*{50}{^l}]{% <-- tabularx WORKS!
    \tabularx{\linewidth}{#1}\toprule}{%
  \\\bottomrule\endtabularx}


\NewEnviron{mysupertabx}[1][$l*{50}{^l}]{% <-- tabularx with NewEnviron
  \tabularx{\linewidth}{#1}\toprule\rowstyle{\bfseries\color{green!25!gray}}\BODY\bottomrule}{% <-- Global formatting on first row WORKS!
 \endtabularx}

\begin{document}
\begin{table}
\begin{mytab}
\rowstyle{\bfseries\Large\color{green!25!gray}} %<--- Commenting this line out should make global \rowstyle apply
col1 & col2 & col3 & col4 \\ \midrule
dat1 & dat2 & dat3 & dat4 \\
dat5 & dat6 & dat7 & dat8 \\
\end{mytab}
\caption{Tabular without working global row style or global centering}
\end{table}
\begin{table}
\begin{mytabx}[$l^X^l^l] % <-- tabularx with local override WORKS but with an issue (see output)!
\rowstyle{\bfseries\color{green!25!gray}} %<--- Commenting this line out should make global \rowstyle apply
col1 & col2 & col3 & col4 \\ \midrule
dat1 & dat2 & dat3 & dat4 \\
dat5 & dat6 & dat7 & dat8 \\
\end{mytabx}
\caption{Tabularx with messed up first row}
\end{table}
\def\tabularxcolumn#1{m{#1}} % Redefines tabularx X row to vertically center text
\begin{table}
\begin{mytabx}[$l^X^l^l] % <-- tabularx with local override WORKS but with an issue (see output)!
\rowstyle{\bfseries\color{green!25!gray}} %<--- Commenting this line out should make global \rowstyle apply
col1 & col2 & col3 & col4 \\ \midrule
dat1 & dat2 & dat3 & dat4 \\
dat5 & dat6 & dat7 & dat8 \\
\end{mytabx}
\caption{Tabularx inside newenvironment with fixed first row (column redefinition) but broken bottomrule.}
\end{table}
\begin{table}
\begin{mysupertabx}[$l^X^l^l] % <-- tabularx with local override WORKS but with an issue (see output)!
%\rowstyle{\bfseries\color{green!25!gray}} %<--- Commenting this line out should make global \rowstyle apply and in this case it WORKS!
col1 & col2 & col3 & col4 \\ \midrule
dat1 & dat2 & dat3 & dat4 \\
dat5 & dat6 & dat7 & dat8 \\
\end{mysupertabx}
\caption{Tabularx inside NewEnviron from environ package with working global formatting for first row. Midrule must still be explicitly inputted into the tabular data :(}
\end{table}


\end{document}

表格输出

在此处输入图片描述

具有本地覆盖输出的 Tabularx

这个问题的修复方法在这里: https://tex.stackexchange.com/a/105671/13552 在此处输入图片描述

全输出

在此处输入图片描述

免责声明:我意识到这个问题并不针对特定的问题(而是表格问题),但如果没问题的话,我认为它比我最喜欢的问题更有用:我该如何向我的奶奶解释 LaTeX 的含义?

答案1

尚不清楚是否真的存在需要解决的问题,如果您认为表格存在问题,那么这只是表格的问题。您提出的大多数观点也可以针对“段落”或“列表”提出,在某些时候,您必须拥有一些结构信息以及单词。

很容易有一个默认列规范的环境,例如考虑 amsmath matrix,它或多或少只是array带有默认提供的前导码,*{20}{c}因此您可以定义

\newenvironment{mytab}[1][*{50}{c}]{%
  \begin{tabular}{#1}}{%
  \end{tabular}}

这使得列规范成为可选项,默认为全部居中。与矩阵不同,矩阵通常使用全局默认值,而根据我的经验,全局表默认值几乎从来都无用,表通常具有不同的列类型,一些是文本,一些是数字,需要按小数点对齐,等等。但是,如果在特定文档中,您有许多表格都采用相同的格式,则可以使用上述定义,替换为,*{50}{c}假设>{\bfseries}l *{2}{D..{3.2}} p{3cm} 所有表格都有一个粗体左对齐列、两个数字列和一个注释段落的最后一列。

很难猜测如何自动化规则,如果你总是想要一个顶部和底部的规则,你可以将你的定义更改为

\newenvironment{mytab}[1][*{50}{c}]{%
  \begin{tabular}{#1}\toprule}{%
  \\\bottomrule\end{tabular}}

但是的位置\midrule就像表格中单词和数字的位置一样,实际上它是每次都必须输入的数据。也许你只想\midrule在标题之后,在这种情况下你可以使用

\newcommand\endhead{\\\midrule}

所以你的表格看起来就像

\begin{mytab}
\hd{type}&\hd{A}&\hd{B}&\hd{Notes}\endhead
zzz&1.2&3.4& zz zz zzzzz\\
zzz&1.2&3.4& zz zz zzzzz\\
\end{tab}

\hd使用可以定义为的标题命令

\newcommand\hd[1]{%
 \multicolumn{1}{c}{\bfseries\begin{tabular}{@{}c@{}}#1\end{tabular}}

提供粗体、居中、可能有多行的表格标题。如果您想要彩色表格,也可以将颜色添加到此命令中,表格中不需要明确的颜色。

相关内容