表格是我文档的最后边界。到目前为止,我已经设法使用单一、共享的序言标准化了 20 多份文档(数百页)。
问题
我仍然无法从表格内容中抽象出格式。
我把表格限制为两种主要类型和一种次要类型。
表格列表
- 表格
- 长桌
- tabularx(为了一致性而被淘汰。但它仍然是一个不错的选择)
我使用 LaTeX 是因为它能够将格式与内容分开。表格似乎集成了两大堆非内容代码
- \hline
- \toprule、\midrule、\bottomrule 来自
booktabs
- 手动设置单元格、行和列的对齐每个表(很烦人,应该是全局的,可以选择本地覆盖)
- 必须设置颜色和其他标题单元格、行和列的格式每个表(应为全局的,可选择本地覆盖)
- 必须设置颜色和其他本地格式化数据单元格、行和列每个表(应为全局的,可选择本地覆盖)
- 尽管可能无法避免,
multirow
但multicolumn
必须在数据内部。
完成此列表
为表格列表中的所有表格提供全局条件的事项:
- 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}}
提供粗体、居中、可能有多行的表格标题。如果您想要彩色表格,也可以将颜色添加到此命令中,表格中不需要明确的颜色。