固定表格宽度,均匀对齐

固定表格宽度,均匀对齐

我喜欢使用表格布局,其中表格的宽度固定为 7cm。我可以使用以下方法实现此目的:

\documentclass{book}
\usepackage{array,tabularx}
\newcolumntype{+}{>{\global\let\currentrowstyle\relax}}
\newcolumntype{^}{>{\currentrowstyle}}
\newcommand{\rowstyle}[1]{\gdef\currentrowstyle{#1}%
  #1\ignorespaces}

\makeatletter
\g@addto@macro\@floatboxreset{\centering\sffamily\small}
\makeatother


\begin{document}

\begin{table}

\begin{tabular*}{7cm}{@{\extracolsep{\fill}}|>{\bfseries}+l|^c|^c|}
\hline\rowstyle{\bfseries}%
            & property  & number    \\ \hline
Something   & yes       & 1554      \\
Item        & no        & 2         \\ \hline
\end{tabular*}\\
\vspace{.5cm}

\newcolumntype{;}{l@{}}% dummy column
\begin{tabular*}{7cm}{@{\extracolsep{\fill}}|;>{\bfseries}+l;|^c;|^c;|}
\hline\rowstyle{\bfseries}%
&            && property  && number  &  \\ \hline
&Something   && yes       && 1554    &  \\
&Item        && no        && 2       &  \\ \hline
\end{tabular*}\\
\vspace{.5cm}

\newcolumntype{;}{X@{}}% dummy column
\begin{tabularx}{7cm}{|+;>{\bfseries}l;|;^c;|;^c;|}
\hline\rowstyle{\bfseries}%
&            &&& property  &&& number   & \\ \hline
&Something   &&& yes       &&& 1554     & \\
&Item        &&& no        &&& 2        & \\ \hline
\end{tabularx}\\
\vspace{.5cm}

\setlength{\tabcolsep}{.52cm}
\begin{tabular}{|>{\bfseries}+l|^c|^c|}
\hline\rowstyle{\bfseries}%
            & property  & number    \\ \hline
Something   & yes       & 1554      \\
Item        & no        & 2         \\ \hline
\end{tabular}


\end{table}

\end{document} 

在代码中,第一个表格对齐不太好。第二个和第三个表格需要使用复杂的代码来格式化文档中的表格。我宁愿将格式与内容分开。第四个示例运行良好,但需要手动调整 tabcolsep。

我应该如何定义一个表格环境,以动态增加单元格边距以获得所需的表格宽度?

答案1

通常 LaTeX 不使用 TeX\tabskip来设置列之间的空间,而是使用 dimen 寄存器\tabcolsep。后者也插入在列之间,与之相对的垂直线\tabskip仅插入在列之间。\extracolsep问题中的示例包含一个包含三列、六列和两列\tabcolsep的表格。\tabcolsep\tabskip

因此,一种解决方法是使用虚拟列:

\documentclass[a5paper]{article}

\usepackage{array}
\newcolumntype{;}{l@{}}% dummy column

\begin{document}

\noindent
\begin{tabular*}{\linewidth}{@{\extracolsep{\fill}}|;l;|c;|c;|}
\hline
&     && 1   && 2  &\\ \hline
& a   && x   && 15 &\\
& b   && y   && 2  &\\ \hline
\end{tabular*}

\end{document}

结果表格*

变体为\rowstyle

\documentclass[a5paper]{article}

\usepackage{array}
\newcolumntype{;}{l@{}}% dummy column

\newcolumntype{+}{>{\global\let\currentrowstyle\relax}}
\newcolumntype{^}{>{\currentrowstyle}}
\newcommand*{\rowstyle}[1]{%
  \gdef\currentrowstyle{#1}%
  #1\ignorespaces
}

\begin{document}

\noindent
\begin{tabular*}{\linewidth}{@{\extracolsep{\fill}}|+;>{\bfseries}l;|^c;|^c;|}
\hline
\rowstyle{\bfseries}%
&     && 1   && 2  &\\ \hline
& a   && x   && 15 &\\
& b   && y   && 2  &\\ \hline
\end{tabular*}

\end{document}

结果表格*带有 \rowstyle

另一个解决方法是tabularx使用虚拟X列。这些列是均匀分布的空间应该放的地方:

\documentclass[a5paper]{article}

\usepackage{tabularx}
\usepackage{array}
\newcolumntype{;}{X@{}}% dummy column

\begin{document}

\noindent
\begin{tabularx}{\linewidth}{|;l;|;c;|;c;|}
\hline
&     &&& 1   &&& 2  &\\ \hline
& a   &&& x   &&& 15 &\\
& b   &&& y   &&& 2  &\\ \hline
\end{tabularx}

\end{document}

结果 tabularx

变体为\rowstyle

\documentclass[a5paper]{article}

\usepackage{tabularx}
\usepackage{array}
\newcolumntype{;}{X@{}}% dummy column

\newcolumntype{+}{>{\global\let\currentrowstyle\relax}}
\newcolumntype{^}{>{\currentrowstyle}}
\newcommand*{\rowstyle}[1]{%
  \gdef\currentrowstyle{#1}%
  #1\ignorespaces
}

\begin{document}

\noindent
\begin{tabularx}{\linewidth}{|+;>{\bfseries}l;|;^c;|;^c;|}
\hline
\rowstyle{\bfseries}%
&     &&& 1   &&& 2  &\\ \hline
& a   &&& x   &&& 15 &\\
& b   &&& y   &&& 2  &\\ \hline
\end{tabularx}

\end{document}

结果 tabularx 与 \rowstyle

答案2

通过 添加的空间\extracolsep在列之间均匀添加,但垂直线不位于该空间的中心,而是位于其之前,因此一种选择就是不要使用垂直线。或者txty可能会帮到你:

是否可以制作一个未完全展开的表格?

用于 TY 补丁。

在此处输入图片描述

\documentclass{book}
\usepackage{array,tabularx,tabulary}
\newcolumntype{+}{>{\global\let\currentrowstyle\relax}}
\newcolumntype{^}{>{\currentrowstyle}}
\newcommand{\rowstyle}[1]{\gdef\currentrowstyle{#1}%
  #1\ignorespaces} 
\tymin0pt
\makeatletter


\def\foo#1\def\TY@ratio#2#3!!{
\def\TY@checkmin{#1%
 \@tempdima\TY@ratio\TY@tablewidth
 \ifdim\@tempdima>\TY@linewidth
  \advance\@tempdima-\TY@linewidth
  \Gscale@div\@tempb\@tempdima\TY@tablewidth
  \@tempdimb\TY@ratio\p@
  \advance\@tempdimb-\@tempb\p@
  \edef\TY@ratio{\strip@pt\@tempdimb}%
\fi
#3}}
\expandafter\foo\TY@checkmin!!



\makeatother

\makeatother

\makeatletter
\g@addto@macro\@floatboxreset{\centering\sffamily\small}
\makeatother

\begin{document}

\begin{table}
\begin{tabular*}{.95\textwidth}{@{\extracolsep{\fill}}|>{\bfseries}+l|^c|^c|}
\hline\rowstyle{\bfseries}%
    & 1   & 2 \\ \hline
a   & x   & 15\\
b   & y   & 2 \\ \hline
\end{tabular*}

\bigskip
\begin{tabular*}{.95\textwidth}{@{\extracolsep{\fill}}>{\bfseries}+l^c^c@{}}
\hline\rowstyle{\bfseries}%
    & 1   & 2 \\ \hline
a   & x   & 15\\
b   & y   & 2 \\ \hline
\end{tabular*}

\bigskip

\begin{tabularx}{.95\textwidth}{@{}|>{\bfseries}+l|^>{\centering\arraybackslash}X|^>{\centering\arraybackslash}X|@{}}
\hline\rowstyle{\bfseries}%
    & 1   & 2 \\ \hline
a   & x   & 15\\
b   & y   & 2 \\ \hline
\end{tabularx}

\bigskip

\begin{tabulary}{.95\textwidth}{|>{\bfseries}+L|^C|+C|}
\hline\rowstyle{\bfseries}%
    & 1   & 2 \\ \hline
a   & x   & 15\\
b   & y   & 2 \\ \hline
\end{tabulary}
\end{table}

\end{document} 

相关内容