使用表格环境时出错

使用表格环境时出错

我正在尝试创建一个简单的表,但它无法编译。以下是一段示例代码:

\documentclass[11pt]{article}
\usepackage{amsmath, amssymb}
\usepackage{calc}
\usepackage{array}
\usepackage{booktabs}

\newcommand\Q{\ensuremath{\mathbb{Q}}}

\begin{document}

\begin{table}
\begin{center}
\begin{tabular}{l@{\hspace{28pt}}l@{\hspace{28pt}}p{\widthof{$\Q^2$}}@{\hspace{5pt}}p{\widthof{$\Q^2$}}@{\hspace{5pt}}p{\widthof{$\Q^2$}}@{\hspace{5pt}}p{\widthof{$\Q^2$}}@{\hspace{5pt}}p{\widthof{$\Q^2$}}@{}}
$2$ & $1$  & $0$ &     &      &     &        \\
$3$ & $3$  & $0$ & $0$ & $0$  &     &        \\
$4$ & $6$  & $0$ & $0$ & $\Q$ & $0$ & $0$    \\
$5$ & $10$ & $0$ & $0$ & $0$  & $0$ & $\Q$   \\
$6$ & $15$ & $0$ & $0$ & $0$  & $0$ & $\Q^2$ \\
$7$ & $21$ & $0$ & $0$ & $0$  & $0$ & $\Q$   \\
\end{tabular}
\end{center}
\end{table}

\end{document}

当我尝试编译它时,我收到一系列如下所示的错误:

! Missing control sequence inserted.
<inserted text> 
                \inaccessible 
l.14 $2$ & $1$  & $
                   0$ &     &      &     &        \

我究竟做错了什么?

答案1

使用长度来存储给出的值\widthof;这是经过一些修改的代码:

\documentclass[11pt]{article}
\usepackage{amsmath, amssymb}
\usepackage{calc}
\usepackage{array}
\usepackage{booktabs}

\newcommand\Q{\mathbb{Q}}

\begin{document}

\newlength\mylen
\setlength\mylen{\widthof{$\Q^2$}}

\begin{table}
\centering
\begin{tabular}{%
  >{$}l<{$}@{\hspace{28pt}}%
  >{$}l<{$}@{\hspace{28pt}}%
  >{$}p{\mylen}<{$}@{\hspace{5pt}}%
  >{$}p{\mylen}<{$}@{\hspace{5pt}}%
  >{$}p{\mylen}<{$}@{\hspace{5pt}}%
  >{$}p{\mylen}<{$}@{\hspace{5pt}}%
  >{$}p{\mylen}<{$}@{}%
}
2 & 1  & 0 &     &      &     &        \\
3 & 3  & 0 & 0 & 0  &     &        \\
4 & 6  & 0 & 0 & \Q & 0 & 0    \\
5 & 10 & 0 & 0 & 0  & 0 & \Q   \\
6 & 15 & 0 & 0 & 0  & 0 & \Q^2 \\
7 & 21 & 0 & 0 & 0  & 0 & \Q   \\
\end{tabular}
\end{table}

\end{document}

在此处输入图片描述

  1. 我过去常常>{$}...<{$}在列格式中指示数学模式,因此您不必$...$在每个单元格中明确使用。

  2. 而不是使用center我曾经使用的环境\centering来防止添加不需要的垂直空间。

答案2

虽然包p{3cm-2\tabcolsep}所允许的语法不能在那里使用,因为它需要设置一个框,而这是 LaTeX 在构建对齐前言时不会执行的活动:它需要排版,但此时 LaTeX 仅积累标记以将规范转换为较低级别 TeX 指令所理解的内容。calc\widthoftabular

正确的方法是预先计算宽度并将其存储在寄存器中:

\newcommand{\Q}{\mathbb{Q}}
\newlength\qlen

(事实上​​,你什么也没得到\ensuremath。)

然后,您可以在想要构建的表格附近设置长度:

\begin{table}
\centering
\settowidth{\qlen}{$\Q^{2}$}

$\begin{array}{
  *{2}{l@{\hspace{28pt}}}
  *{4}{p{\qlen}@{\hspace{5pt}}
  p{\qlen}
}
2 & 1  & 0 &   &    &   &      \\
3 & 3  & 0 & 0 & 0  &   &      \\
4 & 6  & 0 & 0 & \Q & 0 & 0    \\
5 & 10 & 0 & 0 & 0  & 0 & \Q   \\
6 & 15 & 0 & 0 & 0  & 0 & \Q^2 \\
7 & 21 & 0 & 0 & 0  & 0 & \Q   \\
\end{array}$

\end{table}

使用array而不是tabular让你摆脱所有这些$符号。

为什么要设置\qlen在那里?很简单:您可能决定以不同的字体大小排版表格,因此固定大小\qlen不是您所需要的。

答案3

除了定义一个长度变量\Qlen来存储列宽的值之外,还可以通过以下方式进一步简化代码:(i)将默认的列间空白量设置为5pt(设置\tabcolsep为 2.5pt),(ii)对各个列定义进行分组,(iii)删除表中可能有大部分不需要的数学模式说明符,以及(iv)用单个宏替换\begin{center}...\end{center}指令对\centering

\documentclass[11pt]{article}
\usepackage{amsmath, amssymb, calc, array, booktabs}
\newcommand\Q{\ensuremath{\mathbb{Q}}}

\newlength\Qlen
\settowidth\Qlen{\ensuremath{\Q^2}}

\begin{document}

\begin{table}
\setlength\tabcolsep{2.5pt} % set default intercolumn whitespace width to 5pt
\centering
\begin{tabular}{*{2}{l@{\hspace{28pt}}} % override default width
                *{5}{p{\Qlen}} @{}}
2 & 1  & 0 \\
3 & 3  & 0 & 0 & 0  \\
4 & 6  & 0 & 0 & \Q & 0 & 0    \\
5 & 10 & 0 & 0 & 0  & 0 & \Q   \\
6 & 15 & 0 & 0 & 0  & 0 & $\Q^2$ \\
7 & 21 & 0 & 0 & 0  & 0 & \Q   \\
\end{tabular}
\end{table}
\end{document}

在此处输入图片描述

相关内容