![使用 \renewenvironment 命令重新定义表格环境时出现问题](https://linux22.com/image/232055/%E4%BD%BF%E7%94%A8%20%5Crenewenvironment%20%E5%91%BD%E4%BB%A4%E9%87%8D%E6%96%B0%E5%AE%9A%E4%B9%89%E8%A1%A8%E6%A0%BC%E7%8E%AF%E5%A2%83%E6%97%B6%E5%87%BA%E7%8E%B0%E9%97%AE%E9%A2%98.png)
在我正在排版的一本书中,我希望表格环境采用脚注大小,而书的其他正文采用正常大小的字体。为此,我尝试了以下方法:
\renewenvironment{tabular}[1][t]{\footnotesize
\begin{tabular}
[#1]}{\end{tabular}\normalsize}
但我收到以下错误:
! TeX capacity exceeded, sorry [save size=50000].
<to be read again>
\relax
l.72 \centering\begin{tabular}{
cccccc}
顺便说一下,我使用如下表格:
\begin{table}[t]
\caption{Title}\label{tab1}
\centering\begin{tabular}{cccccc}
....
\end{tabular}
\end{table}
我在这里做错什么了吗?
12月28日编辑(另一个问题):
在下面的代码中,如果我还想添加一个\centering
命令,我应该把它放在哪里?我把它放在了前面和后面,\footnotesize
但是不起作用!
\let\oldtabular\tabular
\let\endoldtabular\endtabular
\renewenvironment{tabular}{\bgroup\footnotesize\oldtabular}%
{\endoldtabular\egroup}
答案1
更好的方法是使用你自己的自定义定义一个新的表格环境
\newenvironment{smalltabular}{\footnotesize\tabular}{\endtabular}
然后使用smalltabular
而不是tabular
。需要注意以下几点:
- 在定义新环境时,不用和,只需
\begin{tabular}
说\end{tabular}
和就足够\tabular
了\endtabular
。 - 您不需要为 注册任何参数
smalltabular
,因为其定义中的最后一个命令(即\tabular
)已经将查找并适当地处理任何参数。
如果出于某种原因你真的要重新定义表格环境,首先需要保存其旧定义,然后重新定义。例如:
\let\oldtabular\tabular
\let\endoldtabular\endtabular
\renewenvironment{tabular}{\footnotesize\oldtabular}{\endoldtabular}
答案2
在同一宏的重新定义中使用该\tabular
宏将产生无限循环。请尝试以下操作:
\makeatletter
\renewcommand{\tabular}{\let\@halignto\@empty\footnotesize\@tabular}
\makeatother
答案3
当您使用 \renewenvironment 时,它不会扩展新定义,直到使用时才扩展。因此,在您的情况下,当您调用它时,它会尝试扩展新的表格环境并替换您在其中包含的 \begin{tabular},从而导致另一个,依此类推,导致无限循环。
一般来说,你不能根据其自身来定义环境或命令,除非你非常小心地确保它是递归地有充分依据的。
(编辑:抱歉,我们重复了同样的步骤;我们同时回答了。)