(我知道已经存在其他关于居中表的问题,例如这。该问题特定于 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 设置为“可预测状态” ;特别是,它会发出设置文本对齐的命令。\parbox
minipage
采取更明智行动的可能地方是 调用的最后一个宏\@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}