我正在编写一个文档类。我希望表格环境能够使用 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 方法解决所有可能的情况是非常困难的,或者是不可能的,也就是说,人们总会找到这种方法失效的地方。
这并不是说人们无法很好地重新定义这些事物。我只是认为人们无法做到完美。如果你真的想这样做,这里有一个原则上可行的原型,它展示了一个可能的方向。