newcommand 的问题

newcommand 的问题

在下面的代码中

\documentclass{article}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{tcolorbox}
\usepackage{tabularx}
\usepackage{array}
\usepackage{colortbl}
\tcbuselibrary{skins}

%table
\newcolumntype{Y}{>{\centering\arraybackslash}X}
\tcbset{tab2/.style={enhanced,fonttitle=\bfseries,fontupper=\normalsize\sffamily‍‍,
colback=white!10!white,colframe=red!50!black,colbacktitle=Salmon!40!white,
coltitle=black,center title}}

\newcommand{\btable}[2]{\begin{table}
\refstepcounter{table}\label{#2}
\begin{tcolorbox}[tab2,tabularx*={\renewcommand{\arraystretch}{1.7}}{#1},title=Table \ref{#2},boxrule=0.8pt]}

\newcommand{\ntable}{\end{tcolorbox} \end{table}}
%end ot table commands


\begin{document}

\btable{Y|Y|Y|Y|Y|Y}{kk}
group & one     & two     & three    & four     & sum      \\\hline
red   & 1000.00 & 2000.00 &  3000.00 &  4000.00 & 10000.00 \\\hline
green & 2000.00 & 3000.00 &  4000.00 &  5000.00 & 14000.00 \\\hline
blue  & 3000.00 & 4000.00 &  5000.00 &  6000.00 & 18000.00 \\\hline
sum   & 6000.00 & 9000.00 & 12000.00 & 15000.00 & 42000.00
%\end{tcolorbox}
%\end{table}
\ntable

\end{document}

产生\ntable错误

! File ended while scanning use of \TX@get@body.

我该如何修复它?

答案1

我最简单的解决方案是加载environ包并定义一个新环境

\usepackage{environ}
\NewEnviron{mytable}[2]%
{%
 \begin{table}%
 \refstepcounter{table}\label{#2}%
 \begin{tcolorbox}[tab2,tabularx*={\renewcommand{\arraystretch}{1.7}}{#1},title=Table \ref{#2},boxrule=0.8pt]%
 \BODY%
 \end{tcolorbox}%
 \end{table}%
}

这样你就可以把你的桌子称为

\begin{mytable}{Y|Y|Y|Y|Y|Y}{kk}
... whatever ...
\end{mytable}

您也可以使用普通的方法来做到这一点\newenvironment,但这会比较棘手......

只是为了完整性:如果你真的想坚持语法,\btable{Y|Y|Y|Y|Y|Y}{kk} ... \ntable你可以使用\def,如

\def\btable#1#2#3\ntable{%
\begin{table}%
\refstepcounter{table}\label{#2}%
\begin{tcolorbox}[tab2,tabularx*={\renewcommand{\arraystretch}{1.7}}{#1},title=Table \ref{#2},boxrule=0.8pt]%
#3%
\end{tcolorbox}%
\end{table}%
}

但我不太鼓励采用这种解决方案。

答案2

不需要使用其他包。它tcolorbox本身就可以完成。

\newtcolorbox{mytable}[3][]{
  tab2,
  tabularx*={\renewcommand{\arraystretch}{1.7}}{#2},
  title=Table \ref{#3},
  boxrule=0.8pt,
  before={\begin{table}[htb]\refstepcounter{table}\label{#3}},
  after={\end{table}},
  #1
}

然后mytable环境就会完成这项工作。

\documentclass{article}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{tcolorbox}
\usepackage{tabularx}
\usepackage{array}
\usepackage{colortbl}
\tcbuselibrary{skins}

%table
\newcolumntype{Y}{>{\centering\arraybackslash}X}
\tcbset{tab2/.style={enhanced,fonttitle=\bfseries,fontupper=\normalsize\sffamily‍‍,
colback=white!10!white,colframe=red!50!black,colbacktitle=Salmon!40!white,
coltitle=black,center title}}

\newtcolorbox{mytable}[3][]{
  tab2,
  tabularx*={\renewcommand{\arraystretch}{1.7}}{#2},
  title=Table \ref{#3},
  boxrule=0.8pt,
  before={\begin{table}[htb]\refstepcounter{table}\label{#3}},
  after={\end{table}},
  #1
}

\begin{document}

\begin{mytable}{Y|Y|Y|Y|Y|Y}{kk}
group & one     & two     & three    & four     & sum      \\\hline
red   & 1000.00 & 2000.00 &  3000.00 &  4000.00 & 10000.00 \\\hline
green & 2000.00 & 3000.00 &  4000.00 &  5000.00 & 14000.00 \\\hline
blue  & 3000.00 & 4000.00 &  5000.00 &  6000.00 & 18000.00 \\\hline
sum   & 6000.00 & 9000.00 & 12000.00 & 15000.00 & 42000.00
\end{mytable}

\end{document}

在此处输入图片描述

相关内容