自动将表格变成彩盒

自动将表格变成彩盒

我正在编写一个文档类。我希望表格环境能够使用 tcolorboxes 自动转换。具体来说,我希望代码\begin{table} ... \end{table}生成的表格看起来像第二个表格(即使用 tcolorbox 的表格)。请注意,这需要恢复标题和标签。

在此处输入图片描述

\documentclass{article}

\usepackage{tcolorbox,xcolor}
\newtcolorbox[blend into=tables]{tablebox}[1][]{%
  float=htb,
  sharp corners,
  colback=blue!5,
  colframe=blue!50!darkgray,
  capture=hbox,every float=\centering,#1}

\begin{document}

Table \ref{temperatures} uses a tcolorbox.

\begin{table}
  \caption{My table}\label{temperatures}
  \begin{center}
    \begin{tabular}{ll}
      \hline
      Paris & 21 degrees\\
      Berlin & 19 degrees\\
      \hline
    \end{tabular}
  \end{center}    
\end{table}


\begin{tablebox}[title={My table}, label={temperatures},code={\par\medskip}]
  \begin{tabular}{ll}
    \hline
    Paris & 21 degrees\\
    Berlin & 19 degrees\\
    \hline
  \end{tabular}
\end{tablebox}

\end{document}

答案1

这是我试图说服你放弃这个想法的尝试。但让我先从一个原则上可行的原型示例开始。

\documentclass{article}
\usepackage{environ}
\usepackage{tcolorbox,xcolor}
\newtcolorbox[blend into=tables]{tablebox}[1][]{%
  float=htb,
  sharp corners,
  colback=blue!5,
  colframe=blue!50!darkgray,
  capture=hbox,every float=\centering,#1}
\makeatletter
\newsavebox\TabB@x
\newif\ifTab@hasTitle
\newif\ifTab@hasLabel
\tcbset{tab@title/.code={\ifTab@hasTitle
\tcbset{title=#1}%
\fi},tab@label/.code={\ifTab@hasLabel
\tcbset{label=#1}%
\fi}}
\NewEnviron{Table}[1][]{\begingroup
\gdef\@gtempa{\relax}%
\gdef\@gtempb{\relax}%
\global\Tab@hasTitlefalse
\global\Tab@hasLabelfalse
\renewcommand\caption[1]{\global\Tab@hasTitletrue\gdef\@gtempa{##1}}%
\renewcommand\label[1]{\global\Tab@hasLabeltrue\gdef\@gtempb{##1}}%
\begin{lrbox}\TabB@x
\BODY
\end{lrbox}%
\global\setbox\TabB@x\box\TabB@x
\endgroup
\begin{tablebox}[tab@title=\@gtempa, tab@label=\@gtempb,code={\par\medskip}]
\usebox\TabB@x
\end{tablebox}}
\makeatother

\begin{document}

Table \ref{temperatures} uses a tcolorbox.

\begin{Table}
  \caption{My table}
  \label{temperatures}
  %\begin{center}
    \begin{tabular}{ll}
      \hline
      Paris & 21 degrees\\
      Berlin & 19 degrees\\
      \hline
    \end{tabular}
  %\end{center}    
\end{Table}

Table \ref{lowtemperatures} has no title.

\begin{Table}
  \label{lowtemperatures}
    \begin{tabular}{ll}
      \hline
      Paris & 21 degrees\\
      Berlin & 19 degrees\\
      \hline
    \end{tabular}
\end{Table}

\begin{Table}
  \caption{Another table}
  \label{hightemperatures}
    \begin{tabular}{ll}
      \hline
      Paris & 21 degrees\\
      Berlin & 19 degrees\\
      \hline
    \end{tabular}
\end{Table}



% \begin{table}
%   \caption{My table}\label{temperatures}
%   \begin{center}
%     \begin{tabular}{ll}
%       \hline
%       Paris & 21 degrees\\
%       Berlin & 19 degrees\\
%       \hline
%     \end{tabular}
%   \end{center}    
% \end{table}
% 
% 
% \begin{tablebox}[title={My table}, label={temperatures},code={\par\medskip}]
%   \tcbset{title=pft}%
%   \begin{tabular}{ll}
%     \hline
%     Paris & 21 degrees\\
%     Berlin & 19 degrees\\
%     \hline
%   \end{tabular}
% \end{tablebox}
% 
\end{document}

在此处输入图片描述

所以从原则上来说,这是可行的。(显然,我没有足够的勇气去触摸 table环境中使用小写的t,但原则上可以。)人们\begin{center}...\end{center}也可以通过重新定义\center\endcenter,或者将东西放在合适的盒子里来完成工作。

我这样做的原因不是:为了表明有些东西在一个环境中工作得很好,但在另一个环境中却不那么好。试图用 LaTeX 方法解决所有可能的情况是非常困难的,或者是不可能的,也就是说,人们总会找到这种方法失效的地方。

这并不是说人们无法很好地重新定义这些事物。我只是认为人们无法做到完美。如果你真的想这样做,这里有一个原则上可行的原型,它展示了一个可能的方向。

相关内容