可以使用环境tabular
以参数样式格式化列条目lrbox
- 将列单元格存储在一个盒子里(比如说)
\mybox
;并且 - 作为参数提供
\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}