Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

It is possible to format the column entries of a tabular in an argument-style fashion using the lrbox environment to

  1. store the column cell in a box (say) \mybox; and
  2. supply \mybox as an argument to some other macro.

Here is a short example illustrating this fact*:

\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}

enter image description here

The above example uses the array package to achieve this column-specific formatting. More specifically, each cell in the column is supplied as an argument to \fbox. Does there exist an equivalent automation that would yield

enter image description here

\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}

without having to specify \fbox for each entry in the row?

As a start, I know that the tabu package provides \rowfont[<alignment>]{<font specification>}. However, this only applies macros <font specification> to each cell in a row and these macros can't take the cell contents as an argument. Moreover, you need to use the tabu environment in order to use this. So that's a little restricting. Also, trying to decipher the colortbl package macros for colouring a tabular or array row is just confusing.

The UK TeX FAQ entry on How to change a whole row of a table modifies the row entries via column specifications and therefore requires the addition of "subtle" identifiers like

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

to initiate $ and propagate ^ whatever row style is defined. Is there a way around this or at least a cleaner alternative that doesn't use columns to format entries in a row? In particular, a solution should provide an lrbox-style flexibility, since the contents of the cell in the to-be-styled row could be anything, even a paragraph (say).

* There are other alternatives, as indicated by the post How to apply a macro to each column of a table.

share|improve this question
add comment

2 Answers

up vote 4 down vote accepted
\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}

enter image description here

share|improve this answer
add comment

This is a hack into tabu code. I'm redefining the internal of \rowfont so that you can specify the equivalent of the > preamble construction and the equivalent of the < preamble construction (this one is new). Not sure it is fully robust.

\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}
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.