取消定义/取消设置 newcolumntype 以使用带有表格样式的 tabulary

取消定义/取消设置 newcolumntype 以使用带有表格样式的 tabulary

在我正在开展的一个项目中,我使用 latex 包 Tablestyles 来设置表格样式。到目前为止,我一直在使用 tabularx 来设置表格。但是,现在我需要 tabulary 来根据表格的目标宽度自动设置列宽。当我简单地将 tabulary 与 tablestyles 一起包含时,我收到错误。

文件内容:

\documentclass{article}
\usepackage{tablestyles}
\usepackage{tabularx} % tablestyles requires tabularx
\usepackage{tabulary}

\begin{document}
\begin{tabulary}{\textwidth}{|L|L|}
    \theadstart
    \thead a & \thead b \\
    \tbody
    1 & One\\
    2 & Two\\
    \tend
\end{tabulary}
\end{document}

错误:

(/usr/local/texlive/2021/texmf-dist/tex/latex/everysel/everysel-2011-10-28.sty)
))

Package array Warning: Column W is already defined on input line 264.

) (/usr/local/texlive/2021/texmf-dist/tex/latex/tools/tabularx.sty)
(/usr/local/texlive/2021/texmf-dist/tex/latex/tabulary/tabulary.sty)
(/usr/local/texlive/2021/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def)
(./main.aux)
(/usr/local/texlive/2021/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).]
) ABD: EverySelectfont initializing macros
! Missing number, treated as zero.
<to be read again> 
                   |
l.28 \end{tabulary}

我进行了一些调试,并编辑了 tablestyles 的本地副本。我在 tablestyles.dtx 中注释了以下 columntype 定义,因为我在项目中不使用它们:

tablestyles.dtx 第 1619 至 1630 行

%% centered (X):
\newcolumntype{Z}{>{\centering\arraybackslash\hspace{0pt}}X}
%% right (X):
\newcolumntype{Y}{>{\RaggedLeft\arraybackslash\hspace{0pt}}X}
%% left (X):
\newcolumntype{W}{>{\RaggedRight\arraybackslash\hspace{0pt}}X}
%% left (p):
\newcolumntype{L}[1]{>{\RaggedRight\arraybackslash\hspace{0pt}}p{#1}}
%% right (p):
\newcolumntype{R}[1]{>{\RaggedLeft\arraybackslash\hspace{0pt}}p{#1}}
%% centered (p):
\newcolumntype{C}[1]{>{\Centering\arraybackslash\hspace{0pt}}p{#1}}

然后我可以成功编译我的程序,并且表格可以与表格样式一起工作:

在此处输入图片描述

我不会使用自己的表格样式副本,而是想在加载表格之前取消定义表格样式中的列类型,如下所示:

\documentclass{article}
\usepackage{tablestyles}
\removecolumntype{Z}
\removecolumntype{Y}
\removecolumntype{W}
\removecolumntype{L}
\removecolumntype{R}
\removecolumntype{C}
\usepackage{tabularx}
\usepackage{tabulary}

但据我所知,不存在这样的函数,我也无法从包的来源确定array如何逆转的效果\newcolumntype。也许有人可以帮助我实现这一点,或者提供另一种使用 tabulary 和 tablestyles 的方法。如果能提供 tabulary 的替代方法以自动确定正确的列宽,也值得赞赏。

答案1

该错误实际上并不是由于tabularyarray定义的包\newcolumntype已定义了一个W列几年(自 2017 年以来)tablestyles确实应该更新以免覆盖它。

tablestyles似乎是一些或多或少不相关的表格快捷命令的集合,所以我很想简单地不加载它,而是从该包中复制您使用的命令,但如果您宁愿加载它,因为所有的违规行为\newcolumnype都在最后,您可以在本地强制\newcolumntype停止此时的包加载。

\documentclass{article}

\usepackage{tabularx,tabulary}

\let\oldnewcolumntype\newcolumntype
\def\newcolumntype#1#2{\endinput}
\usepackage{tablestyles}
\let\newcolumntype\oldnewcolumntype


\begin{document}
\begin{tabulary}{\textwidth}{|L|L|}
    \theadstart
    \thead a & \thead b \\
    \tbody
    1 & One\\
    2 & Two\\
    \tend
\end{tabulary}
\end{document}

通常,您不需要任何类似的东西,\removecolumntype因为\newcolumntype实际上不必是新的:如果现有列是通过 定义的,则可以重新定义它\newcolumnype。但是,您不能定义与内置array包列名同名的列(因为这会产生无限循环),并且自 2017 年以来已包含,W因此这基本上是包中的一个错误,应报告给维护者。

相关内容