改进的 \rowstyle,以单元格内容作为参数

改进的 \rowstyle,以单元格内容作为参数

可以使用环境tabular以参数样式格式化列条目lrbox

  1. 将列单元格存储在一个盒子里(比如说)\mybox;并且
  2. 作为参数提供\mybox给其他宏。

这是一个简短的例子来说明这个事实*

\documentclass{article}
\usepackage{array}% http://ctan.org/pkg/array
\begin{document}
\newsavebox{\mybox}
\begin{tabular}{c>{\begin{lrbox}{\mybox}}c<{\end{lrbox}\fbox{\usebox{\mybox}}}c}
  One & Two & Three \\ \hline
  1 & 2 & 3 \\
  4 & 5 & 6 \\
  7 & 8 & 9 \\ \hline
\end{tabular}
\end{document}

在此处输入图片描述

上面的例子使用了array包裹以实现此列特定的格式。更具体地说,列中的每个单元格都作为参数提供给\fbox。是否存在等效的自动化,可以产生

在此处输入图片描述

\documentclass{article}
\begin{document}
\begin{tabular}{ccc}
  One & Two & Three \\ \hline
  1 & 2 & 3 \\
  \fbox{4} & \fbox{5} & \fbox{6} \\
  7 & 8 & 9 \\ \hline
\end{tabular}
\end{document}

而不必\fbox为行中的每个条目指定?

首先,我知道tabu包裹提供\rowfont[<alignment>]{<font specification>}。但是,这只会将宏应用于<font specification>一行中的每个单元格,并且这些宏不能将单元格内容作为参数。此外,您需要使用tabu才能使用它。所以这有点限制。此外,尝试破译colortbl包裹tabular用于对一行或多行进行着色的宏array很令人困惑。

TeX FAQ 条目如何更改表格的整行通过列规范修改行条目,因此需要添加“微妙”的标识符,如

\begin{tabular}{|$l|^l|^l|}

启动$和传播^定义的任何行样式。有没有办法解决这个问题,或者至少有一个更干净的替代方案,不使用列来格式化行中的条目?特别是,解决方案应该提供 -stylelrbox灵活性,因为要设置样式的行中的单元格内容可以是任何东西,甚至是一个段落(比如说)。

*还有其他选择,如帖子所示如何将宏应用于表格的每一列

答案1

\documentclass{article}
\usepackage{array}
\newsavebox\TBox
\newif\iffbox \fboxfalse
\newcommand\FB[1][true]{\global\csname fbox#1\endcsname}
\newcolumntype{C}{%
  >{\begin{lrbox}{\TBox}} 
  c 
  <{\end{lrbox}\iffbox\fbox{\usebox\TBox}\else\usebox\TBox\fi}}
\begin{document}
\begin{tabular}{*3C}
  One & Two & Three \\ \hline
  1 & 2 & 3 \\
  \fbox{4} & \fbox{5} & \fbox{6} \\
  4 & 5 & 6 \\\FB
  7 & 8 & 9 \\ \FB[false]
  1 & 2 & 3 
\end{tabular}
\end{document}

在此处输入图片描述

答案2

这是对代码的破解tabu。我重新定义了内部,\rowfont以便您可以指定>前导码构造的等效项相当于<前导结构(这是新的)。不确定它是否完全可靠。

\documentclass{standalone}
\usepackage{tabu}
\makeatletter
\renewcommand*\tabu@row@font[3][]{%
  \ifnum7=\currentgrouptype
    \global\let\tabu@@cellleft    \tabu@cellleft
    \global\let\tabu@@cellright   \tabu@cellright
    \global\let\tabu@@celllalign  \tabu@celllalign
    \global\let\tabu@@cellralign  \tabu@cellralign
    \global\let\tabu@@rowfontreset\tabu@rowfontreset
  \fi
  \global\let\tabu@rowfontreset \tabu@rowfont@reset
  \expandafter\gdef\expandafter\tabu@cellleft\expandafter{\tabu@cellleft #2}%
  \expandafter\gdef\expandafter\tabu@cellright\expandafter{\tabu@cellright #3}%
  \ifcsname tabu@cell@#1\endcsname       % row alignment
        \csname tabu@cell@#1\endcsname \fi
  \ifnum0=`{\fi}% end of group / noalign group
}% \rowfont
\begin{document}
\newsavebox{\mybox}
\begin{tabu}{ccc}
  One & Two & Three \\ \hline
  1 & 2 & 3 \\
  \rowfont{\begin{lrbox}{\mybox}}{\end{lrbox}\fbox{\usebox{\mybox}}} 4 & 5 & 6 \\
  7 & 8 & 9 \\ \hline
\end{tabu}
\end{document}

答案3

tblr利用新 LaTeX 包环境轻松解决tabularray

\documentclass{article}

\usepackage{tabularray}

\begin{document}

\begin{tblr}{
  colspec = {ccc},
  row{3} = {cmd=\fbox},
}
  One & Two & Three \\ \hline
  1 & 2 & 3 \\
  4 & 5 & 6 \\
  7 & 8 & 9 \\ \hline
\end{tblr}

\end{document}

在此处输入图片描述

相关内容