我喜欢使用表格布局,其中表格的宽度固定为 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}
另一个解决方法是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}
变体为\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}
答案2
通过 添加的空间\extracolsep
在列之间均匀添加,但垂直线不位于该空间的中心,而是位于其之前,因此一种选择就是不要使用垂直线。或者tx
或ty
可能会帮到你:
用于 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}