\begin{table}[htp] \centering ... \end{table}
如果全文使用大量的图表浮动体,每个浮动体内部写一句\centering也是比较繁琐的,如果再要求表格内容采用小一号的字号\small,每个环境里需要输入的内容就又多了一点,那么有没有什么方法可以在撰写文档的时候省去这一条命令而同时实现内容居中,字体小一号呢?作为最直接的思路,可以定义新环境Figure、Table环境如下:
\newenvironment{Table}[1][tbp]% {\begin{table}[#1]\centering\small}{\end{table}} \newenvironment{Figure}[1][tbp]% {\begin{figure}[#1]\centering\small}{\end{figure}}
这种方法的缺点是需要自定义环境,一旦需要复制文本内容到其他文档中,需要把导言区内相应的重定义内容也复制过去,而且重定义的环境容易与\LaTeX 基础环境混淆。因此可以考虑对figure 和table 环境进行修改,最容易想到的方法是利用etoolbox宏包在环境中施加一个钩子,添加\centering\small命令,于是容易想到使用(以下仅以table环境举例,figure 环境类似):
\usepackage{etoolbox} % in preamble \AtBeginEnvironment{table}{\centering\small}
但是尝试一下,我们会发现实际并没有起任何作用。这是因为在article.cls(其他基础文档类类似,仅以其为例)中对table 的定义是:
\newenvironment{table} {\@float{table}} {\end@float}
显然,在使用了\AtBeginEnvironment{table}{\centering\small}一句后,table的定义变成了:
\newenvironment{table} {\centering\small\@float{table}} {\end@float}
\centering 出现太早,导致不能在table 环境中起作用。如果重新定义table(导言区内需要把下面这一句放在\makeatletter 与\makeatother之间):
\renewenvironment{table}{\@float{table}\centering\small}{\end@float}
或者使用xpatch宏包中的命令:
\usepackage{xpatch} % in preamble \xapptocmd{\table}{\centering\small}{}{}
来得到同样的效果,则浮动体table 环境自身的可选参数将无法使用,因为\centering\small占据了可选参数的位置,导致\LaTeX 认为使用默认可选参数,并将其后的[hbtp]等认作环境中的文本内容。如果需要保留浮动体参数的作用,则需要对更深层的内部命令进行修改或打补丁,参阅 https://tex.stackexchange.com/questions/95992/centering-all-tables-in-a-document-with-etoolbox/ 后,考虑对内部命令\@floatboxreset 补充如下:
\usepackage{xpatch} % in preamble \makeatletter \xpatchcmd\@floatboxreset{\normalsize}{\centering\small}{}{} \makeatother
这样修改后,所有浮动体默认在环境中都是居中布置了,并且采用小一号的字号。
发表评论 取消回复