我正在尝试创建一个简单的表,但它无法编译。以下是一段示例代码:
\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}
我过去常常
>{$}...<{$}
在列格式中指示数学模式,因此您不必$...$
在每个单元格中明确使用。而不是使用
center
我曾经使用的环境\centering
来防止添加不需要的垂直空间。
答案2
虽然包p{3cm-2\tabcolsep}
所允许的语法不能在那里使用,因为它需要设置一个框,而这是 LaTeX 在构建对齐前言时不会执行的活动:它需要排版,但此时 LaTeX 仅积累标记以将规范转换为较低级别 TeX 指令所理解的内容。calc
\widthof
tabular
正确的方法是预先计算宽度并将其存储在寄存器中:
\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}