我有下表,可以完美编译
\documentclass{article}
\usepackage{booktabs}
\usepackage[margin=32mm]{geometry}
\usepackage{tabularx}
\usepackage{float}
\newcolumntype{Y}{>{\centering\arraybackslash}X}
\begin{document}
\begin{table}[H]\centering
\begin{tabularx}{\textwidth}{ccYYcYY@{}}
\toprule
&& \multicolumn{2}{c}{Next State} && \multicolumn{2}{c}{Output} \\
\cmidrule{3-4} \cmidrule{6-7}
Present State && $x = 0$ & $x = 1$ && $x = 0$ & $x = 1$\\
\midrule
000 && 010 & 011 && 0 & 0 \\
001 && 001 & 001 && 1 & 1 \\
010 && 110 & 011 && 0 & 0 \\
011 && 000 & 101 && 1 & 1 \\[0.5em]
100 && 111 & 101 && 0 & 0 \\
101 && 000 & 101 && 0 & 1 \\
110 && 000 & 001 && 1 & 0 \\
111 && 101 & 011 && 0 & 0 \\
\bottomrule
\end{tabularx}
\caption{State table for the sequential circuit discussed}
\end{table}
\end{document}
基于此,我想创建一个环境,以便我可以重复使用这个表(列数不必改变)。我尝试过这样定义它(我只是提取了表的begin
和end
部分并省略了内容):
\newenvironment{statetable}%
{\begin{table}[H]\centering
\begin{tabularx}{\textwidth}{ccYYcYY@{}}
\toprule
&& \multicolumn{2}{c}{Next State} && \multicolumn{2}{c}{Output} \\
\cmidrule{3-4} \cmidrule{6-7}
Present State && $x = 0$ & $x = 1$ && $x = 0$ & $x = 1$ \\
\midrule}%
{\bottomrule
\end{tabularx}
\caption{State table for the sequential circuit discussed}%
\end{table}}
所以我可以像这样使用它:
% \begin{statetable}
000 && 010 & 011 && 0 & 0 \\
001 && 001 & 001 && 1 & 1 \\
010 && 110 & 011 && 0 & 0 \\
011 && 000 & 101 && 1 & 1 \\[0.5em]
100 && 111 & 101 && 0 & 0 \\
101 && 000 & 101 && 0 & 1 \\
110 && 000 & 001 && 1 & 0 \\
111 && 101 & 011 && 0 & 0 \\
% \end{statetable}
但我收到以下错误:
ABD: EveryShipout initializing macros
! Misplaced alignment tab character &.
l.52 000 &
& 010 & 011 && 0 & 0 \\
?
答案1
\documentclass{article}
\usepackage{tabularx}
\usepackage{float}
\usepackage{booktabs}
\newcolumntype{Y}{>{\centering\arraybackslash}X}
\newenvironment{statetable}%
{\table
\tabularx{\textwidth}{cYYYY}
\toprule
& \multicolumn{2}{c}{Next State} & \multicolumn{2}{c}{Output} \\
\cmidrule(lr){2-3} \cmidrule(l){4-5}
Present State & $x = 0$ & $x = 1$ & $x = 0$ & $x = 1$ \\
\midrule
}%
{\bottomrule
\endtabularx
\caption{State table for the sequential circuit discussed}%
\endtable}
\newenvironment{altstatetable}%
{\table
\begin{tabular*}{\textwidth}{c@{\extracolsep{\fill}}cccc}
\toprule
& \multicolumn{2}{c}{Next State} & \multicolumn{2}{c}{Output} \\
\cmidrule(r){2-3} \cmidrule{4-5}
Present State & $x = 0$ & $x = 1$ & $x = 0$ & $x = 1$ \\
\midrule
}%
{\bottomrule
\end{tabular*}
\caption{State table for the sequential circuit discussed}%
\endtable}
\begin{document}
\begin{statetable}
000 & 010 & 011 & 0 & 0 \\
001 & 001 & 001 & 1 & 1 \\
010 & 110 & 011 & 0 & 0 \\
011 & 000 & 101 & 1 & 1 \\[0.5em]
100 & 111 & 101 & 0 & 0 \\
101 & 000 & 101 & 0 & 1 \\
110 & 000 & 001 & 1 & 0 \\
111 & 101 & 011 & 0 & 0 \\
\end{statetable}
\begin{altstatetable}
000 & 010 & 011 & 0 & 0 \\
001 & 001 & 001 & 1 & 1 \\
010 & 110 & 011 & 0 & 0 \\
011 & 000 & 101 & 1 & 1 \\[0.5em]
100 & 111 & 101 & 0 & 0 \\
101 & 000 & 101 & 0 & 1 \\
110 & 000 & 001 & 1 & 0 \\
111 & 101 & 011 & 0 & 0 \\
\end{altstatetable}
\end{document}
在 a 内部使用\begin{tabularx}
and不起作用。以下引用的文档中也对此进行了解释:\end{tabularx}
\newenvironment
tabularx
这种抓取环境主体的机制确实存在缺点(与 AMS 对齐环境相同),即您无法通过以下代码创建扩展环境
\newenvironment{foo}{\begin{tabularx}{XX}}{\end{tabularx}}
因为代码正在寻找一个文字字符串
\end{tabularx}
来停止扫描。从 2.02 版开始,可以通过 在定义中直接使用\tabularx
and来避免此问题:\endtabularx
\newenvironment{foo}{\tabularx{XX}}{\endtabularx}
table
我也对环境应用了同样的技术。
\cmidrule
此外,我还使用修剪选项删除了多余的空列并在相邻的命令中引入了间隙((l)
和(r)
,有关更多信息,请参阅booktabs
文档)。
由于您似乎不需要在列内使用换行符,因此我决定使用与 常规类型列tabular*
结合使用而不是的方法来添加表格的替代版本。\extracolsep{\fill}}
c
tabularx
答案2
\documentclass{article}
\usepackage{tabularx}
\usepackage{environ, booktabs}
\newcolumntype{Y}{>{\centering\arraybackslash}X}
\NewEnviron{note}{
\begin{tabularx}{\textwidth}{ccYYcYY@{}}
\toprule
Present State && $x = 0$ & $x = 1$ && $x = 0$ & $x = 1$\\
\midrule
000 && 010 & 011 && 0 & 0 \\
\bottomrule
\end{tabularx}
}
\begin{document}
\begin{note}
\end{note}
\end{document}