在我正在开展的一个项目中,我使用 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
该错误实际上并不是由于tabulary
:array
定义的包\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
因此这基本上是包中的一个错误,应报告给维护者。