课程 八

其他导言区内容

由于课程没有涵盖所有可用的导言区标记,这里用示例解释了其他一些标记。你可能想重新查看课程开始时的表格,以了解可用内容的概览。那里提供的简短描述应该足以让你在理解了lcrp之后理解不同的列类型mbwW的作用。如果不明白,你可以尝试做些实验。还缺少的是其他有用的导言区标记><@!|

设置列的样式

由于><可以用来在列的单元格内容前后添加内容,你可以使用它们来添加影响列外观的命令。例如,如果你想要将第一列设为斜体并在其后添加冒号,可以这样做:

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage{array}
\usepackage{booktabs}

\begin{document}
\begin{tabular}{>{\itshape}l<{:} *{2}{l}}
  \toprule
  动物 & 食物  & 大小   \\
  \midrule
  狗    & 肉    & 中等   \\
  马    & 干草  & 大     \\
  青蛙  & 苍蝇  & 小     \\
  \bottomrule
\end{tabular}
\end{document}

\itshape使所有后续文本变为斜体,但其效果被”限制”在表格单元格内。我们将在几节课后学习手动字体格式设置。

你可能不希望第一个单元格受到影响,因为它是表头。这里可以使用\multicolumn。记住它可以用来改变单个单元格的对齐方式,如下所示。

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage{array}
\usepackage{booktabs}

\begin{document}
\begin{tabular}{>{\itshape}l<{:} *{2}{l}}
  \toprule
  \multicolumn{1}{l}{动物} & 食物  & 大小   \\
  \midrule
  狗    & 肉    & 中等   \\
  马    & 干草  & 大     \\
  青蛙  & 苍蝇  & 小     \\
  \bottomrule
\end{tabular}
\end{document}

操作列间距

通常 LaTeX 会在每列两侧添加一些空白以使其看起来平衡并分隔它们。这个空白的大小由长度\tabcolsep定义。由于每列两侧都有填充,你在表格两端各得到一个\tabcolsep,在两列之间得到2\tabcolsep — 每列各贡献一个。你可以使用\setlength调整这个空白到任何长度:

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage{array}

\setlength\tabcolsep{1cm}

\begin{document}
\begin{tabular}{lll}
  动物 & 食物  & 大小   \\
  狗   & 肉    & 中等   \\
  马   & 干草  & 大     \\
  青蛙 & 苍蝇  & 小     \\
\end{tabular}
\end{document}

你可以使用@将这个空白改为任意内容。这将移除两列之间或表格两端的填充,并在你指定为参数的列之间放置任何内容:

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage{array}

\begin{document}
\begin{tabular}{l@{ : }l@{\hspace{2cm}}l}
  动物 & 食物  & 大小   \\
  狗   & 肉    & 中等   \\
  马   & 干草  & 大     \\
  青蛙 & 苍蝇  & 小     \\
\end{tabular}
\end{document}

(我们很快就会再次看到\hspace;你可能猜到它添加了一个水平空白。)

!导言区标记做的事情很相似。不同的是,它将其参数 添加 到两列之间空白的中心。

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage{array}

\begin{document}
\begin{tabular}{l!{:}ll}
  动物 & 食物  & 大小   \\
  狗   & 肉    & 中等   \\
  马   & 干草  & 大     \\
  青蛙 & 苍蝇  & 小     \\
\end{tabular}
\end{document}

竖线

有时你不得不使用竖线。

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage{array}

\begin{document}
\begin{tabular}{l|ll}
  动物 & 食物  & 大小   \\[2pt]
  狗   & 肉    & 中等   \\
  马   & 干草  & 大     \\
  青蛙 & 苍蝇  & 小     \\
\end{tabular}
\end{document}

你可能注意到|的行为很像!{decl};它在保持填充不变的情况下在两列之间添加竖线。但这有一个很大的缺点:竖线与booktabs提供的水平线不兼容。你可以使用 LaTeX 提供的水平线;这些是\hline(对应于\toprule\midrule\bottomrule)和\cline(其行为类似于\cmidrule)。如上所示,竖线会跨越\\可选参数中指定的任何空白。

自定义booktabs线

所有booktabs线和\addlinespace都支持一个可选参数,用于指定线的粗细。此外,\cmidrule提供的修剪可以通过在rl后的花括号中指定长度来自定义。

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage{array}
\usepackage{booktabs}

\begin{document}
\begin{tabular}{@{} lll@{}} \toprule[2pt]
  动物 & 食物  & 大小   \\ \midrule[1pt]
  狗   & 肉    & 中等   \\
  \cmidrule[0.5pt](r{1pt}l{1cm}){1-2}
  马   & 干草  & 大     \\
  青蛙 & 苍蝇  & 小     \\ \bottomrule[2pt]
\end{tabular}
\end{document}

列中的数字对齐

表格中数字的对齐可以通过siunitx宏包提供的列类型S来处理。

一个带有两个对齐数字列的简单示例是:

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage{booktabs}
\usepackage{siunitx}
\begin{document}
\begin{tabular}{SS}
\toprule
{值} &  {更多值} \\
\midrule
1        &   2.3456 \\
1.2      &   34.2345 \\
-2.3     &   90.473 \\
40       &   5642.5 \\
5.3      &   1.2e3 \\
0.2      &    1e4 \\
\bottomrule
\end{tabular}
\end{document}

注意任何非数字的单元格必须用花括号”保护”。

siunitx宏包提供了许多用于以不同方式格式化数字的可能性;请参见宏包文档

指定表格总宽度

tabular环境的宽度是根据表格内容自动确定的。有两种常用的机制来指定不同的总宽度。

注意,几乎总是最好按照下面的方式将表格格式化为指定宽度(如果需要,可能使用\small等字体大小),而不是使用\resizebox等命令来缩放表格,因为后者会产生不一致的字体大小和线宽。

tabular*

tabular*环境需要一个额外的 宽度 参数,用于指定表格的总宽度。必须使用\extracolsep命令向表格添加可伸缩空白。这个空白会从该点开始添加到所有列之间。它几乎总是与\fill一起使用,这是一个特殊的空白,会伸缩到所需的大小。

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage{array}
\begin{document}

\begin{center}
\begin{tabular}{cc}
\hline
A & B\\
C & D\\
\hline
\end{tabular}
\end{center}

\begin{center}  
\begin{tabular*}{.5\textwidth}{@{\extracolsep{\fill}}cc@{}}
\hline
A & B\\
C & D\\
\hline
\end{tabular*}
\end{center}

\begin{center}  
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}cc@{}}
\hline
A & B\\
C & D\\
\hline
\end{tabular*}
\end{center}

\end{document}

tabularx

tabularx环境(由同名宏包提供)的语法与tabular*类似,但不是调整列间空白,而是调整由新列类型X指定的列的宽度。这相当于为自动确定的宽度指定p{...}

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage{tabularx}
\begin{document}

\begin{center}
\begin{tabular}{lp{2cm}}
\hline
A & B B B B B B B B B B B B B B B B B B B B B B B B\\
C & D D D D D D D\\
\hline
\end{tabular}
\end{center}

\begin{center}  
\begin{tabularx}{.5\textwidth}{lX}
\hline
A & B B B B B B B B B B B B B B B B B B B B B B B B\\
C & D D D D D D D\\
\hline
\end{tabularx}
\end{center}

\begin{center}  
\begin{tabularx}{\textwidth}{lX}
\hline
A & B B B B B B B B B B B B B B B B B B B B B B B B\\
C & D D D D D D D\\
\hline
\end{tabularx}
\end{center}

\end{document}

与这些课程中讨论的其他形式不同,tabularx需要多次排版表格来确定最终的设置。这意味着在使用该环境时有一些限制;请参见宏包文档

多页表格

tabular形成一个不可分割的盒子,因此它必须足够小以适合一页,而且通常放在浮动的table环境中。

有几个宏包提供了类似语法的可以分页的变体。这里我们展示longtable宏包:

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage[paperheight=8cm,paperwidth=8cm]{geometry}
\usepackage{array}
\usepackage{longtable}
\begin{document}
\begin{longtable}{cc}
\multicolumn{2}{c}{一个长表格}\\
左边 & 右边\\
\hline
\endhead
\hline
\endfoot
aa & bb\\  
条目 & b\\  
a & b\\  
a & b\\  
a & b\\  
a & b\\  
a & bbb\\  
a & b\\  
a & b\\  
a & b\\  
a & b\\  
a & b\\  
a & b\\  
a & b b b b b b\\  
a & b b b b b\\  
a & b b\\  
一个更宽的条目 & b\\  
\end{longtable}

\end{document}

longtable的显著特点是它在所有页面上保持列宽一致;然而,为了实现这一点,它可能需要运行 LaTeX 多次,这样后面遇到的宽条目就可以影响前面页面上的列宽。

表格注释

在表格中需要脚注样的标记来引用表格下方的注释是很常见的。threeparttable宏包简化了这种表格的标记,它会将注释设置在与表格相同宽度的块中。有关完整细节,请参见宏包文档,但这里我们给出一个简单的示例。

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage{array}
\usepackage{threeparttable}
\begin{document}

\begin{table}
\begin{threeparttable}
   \caption{一个示例}
   \begin{tabular}{ll}
   \hline
    一个条目 & 42\tnote{1}\\
    另一个条目 & 24\tnote{2}\\
    \hline
   \end{tabular}
   \begin{tablenotes}
   \item [1] 第一个注释。
   \item [2] 第二个注释。
   \end{tablenotes}
\end{threeparttable}
\end{table}

\end{document}

在窄列中排版

默认的断行设置假设相对较长的行,以在选择断行位置时提供一些灵活性。以下示例展示了一些可能的方法。第一个表格显示了词间距被拉伸,TeX 警告Underfull 行。使用\raggedright通常可以避免这个问题,但可能会让一些行”太参差不齐”。ragged2e宏包中的\RaggedRight命令是一个折衷方案;它允许一些行长的参差不齐,但也会在必要时进行连字,如第三个表格所示。

注意这里使用了\arraybackslash,它重置了\\的定义,使其结束表格行。

另一种技术,如第四个表格所示,是使用较小的字体,这样列相对于文本大小就不那么窄了。

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage{array}
\usepackage{ragged2e}
\begin{document}

\begin{table}

\begin{tabular}[t]{lp{3cm}}
一 & 在窄段落中设置的长文本,还有一些示例文本。\\
二 & 在窄段落中设置的不同长文本,还有一些难以连字的词。
\end{tabular}%
\begin{tabular}[t]{l>{\raggedright\arraybackslash}p{3cm}}
一 & 在窄段落中设置的长文本,还有一些示例文本。\\
二 & 在窄段落中设置的不同长文本,还有一些难以连字的词。
\end{tabular}%
\begin{tabular}[t]{l>{\RaggedRight}p{3cm}}
一 & 在窄段落中设置的长文本,还有一些示例文本。\\
二 & 在窄段落中设置的不同长文本,还有一些难以连字的词。
\end{tabular}

\footnotesize
\begin{tabular}[t]{lp{3cm}}
一 & 在窄段落中设置的长文本,还有一些示例文本。\\
二 & 在窄段落中设置的不同长文本,还有一些难以连字的词。
\end{tabular}

\end{table}

\end{document}

定义新的列类型

主课程中所示,array宏包允许像>{\bfseries}c这样的结构来表示粗体居中列。定义一个新的列类型来封装这种用法通常很方便,例如

\newcolumntype{B}{>{\bfseries}c}

这样就可以在表格导言区中使用B来指定一个粗体居中列。

垂直技巧

通常,与其让一个单元格跨越多行,不如在一个单元格中使用嵌套的tabular环境来垂直分割一些单元格。

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage{array}
\usepackage{booktabs}

\begin{document}
\begin{tabular}{lcc}
  \toprule
  测试 & \begin{tabular}{@{}c@{}}A\\a\end{tabular} & \begin{tabular}{@{}c@{}}B\\b\end{tabular} \\
  \midrule
  内容 & 在 & 这里 \\
  内容 & 在 & 这里 \\
  内容 & 在 & 这里 \\
  \bottomrule
\end{tabular}
\end{document}

注意你可以通过tabular的可选参数控制垂直对齐;它支持使用tcb分别表示顶部、居中或底部对齐,使用方式如下:

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage{array}
\usepackage{booktabs}

\begin{document}
\begin{tabular}{lcc}
  \toprule
  测试 & \begin{tabular}[b]{@{}c@{}}A\\a\end{tabular} & \begin{tabular}[t]{@{}c@{}}B\\b\end{tabular} \\
  \midrule
  内容 & 在 & 这里 \\
  内容 & 在 & 这里 \\
  内容 & 在 & 这里 \\
  \bottomrule
\end{tabular}
\end{document}

表格中的行间距

在主课程中我们演示了\addlinespacebooktabs宏包,它对于在特定行之间添加额外空间很有用。

有两个一般参数控制行间距,\arraystretch\extrarowheight(后者来自array宏包)。

\renewcommand\arraystretch{1.5}

将增加基线间距50%。

通常,尤其是在使用\hline时,最好只是增加行的高度,而不增加它们在基线以下的深度。以下示例演示了\extrarowheight参数。

% !TEX program=lualatex

\documentclass{ctexart}

\usepackage{array}
\begin{document}


\begin{center}
\begin{tabular}{cc}
\hline
Square& $x^2$\\
\hline
Cube& $x^3$\\
\hline
\end{tabular}
\end{center}


\begin{center}
\setlength\extrarowheight{2pt}
\begin{tabular}{cc}
\hline
Square& $x^2$\\
\hline
Cube& $x^3$\\
\hline
\end{tabular}
\end{center}
\end{document}