使用 etoolbox 将文档中的所有表格置于中心

使用 etoolbox 将文档中的所有表格置于中心

(我知道已经存在其他关于居中表的问题,例如。该问题特定于 etoolbox。)

如何使用 etoolbox 将所有表格居中?我可以这样做

\documentclass[11pt]{article}
\makeatletter
\g@addto@macro{\table}{\centering}
\makeatother

\begin{document}
\begin{table}
\begin{tabular}{lr}
    cat & 123 \\
\end{tabular}
\end{table}
\end{document}

并且这样可行。但是为什么使用 etoolbox 时以下方法不行呢?

\documentclass[11pt]{article}
\usepackage{etoolbox}
\AtBeginEnvironment{table}{\centering}

\begin{document}

\begin{table}
\begin{tabular}{lr}
    cat & 123 \\
\end{tabular}
\end{table}

\end{document}

答案1

让我们看看table是如何定义的article.cls

\newenvironment{table}
  {\@float{table}}
  {\end@float}

你的两种方法有什么不同?第一种方法相当于定义了

\newenvironment{table}
  {\@float{table}\centering}
  {\end@float}

而第二个基本上相当于

\newenvironment{table}
  {\centering\@float{table}}
  {\end@float}

问题就出在这里: 的职责之一\@float是调用\@xfloat,而 又执行。此命令在启动或 时\@parboxrestore将 LaTeX 设置为“可预测状态” ;特别是,它会发出设置文本对齐的命令。\parboxminipage

采取更明智行动的可能地方是 调用的最后一个宏\@xfloat,即\@floatboxreset

\def\@floatboxreset{%
  \reset@font
  \normalsize
  \@setminipage}

如果你说

\addto\@floatboxreset{\centering}

所有浮动元素都将居中。如果你只想要表格而不是数字,那么

\addto\table{\centering}

很好。

注意:在使用\g@addto@macro或之前\addto,请确保要修改的宏没有参数;对于带有参数的宏,请使用\addtocmd(或类似命令)。更好的是,使用 提供的功能来xpatch执行“正确”的命令。

答案2

您可能会感到惊讶,但\AtEndEnvironment{table}{\centering}所有表格都可以工作并居中 - 只要它们不包含段落分隔符,但在使用tabular&Co时您通常不需要它们。

\documentclass[11pt]{article}
\usepackage{etoolbox}
\AtEndEnvironment{table}{\centering}

\begin{document}

\begin{table}
\begin{tabular}{lr}
    cat & 123 \\
\end{tabular}
\end{table}

\end{document}

相关内容