%% BEGIN colortab.tex/colortab.sty %% \def\fileversion{1.0} \def\filedate{10/05/13} %% %% COPYRIGHT 1993/2010, by Timothy Van Zandt, tvz@Princeton.EDU %% %% DESCRIPTION: %% colortab.tex/colortab.sty lets you shade or color the cells in a %% alignment environments (e.g., \halign and \LaTeX's tabular and %% array environments). It is compatible with most TeX macro packages, %% including Plain TeX, LaTeX, AmSTeX, and Ams-LaTeX. You must be %% use in conjunction with other color commands. %% %% This program can be redistributed and/or modified under the terms %% of the LaTeX Project Public License Distributed from CTAN archives %% in directory macros/latex/base/lppl.txt. %% %% CODE: % % colortab.tex uses TeX primitives, plus the Plain TeX commands: % \newcount, \newtoks, \newbox, \newif and \z@. % % The LaTeX specific macros also use some LaTeX commands. % \csname ColortabLoaded\endcsname \let\ColortabLoaded\endinput \ifx\PSTricksLoaded\endinput\else \input pstricks.tex\fi % \message{\space\space v\fileversion\space\space\filedate\space\space } \edef\TheAtCode{\the\catcode`\@}\catcode`\@=11 % % These scratch registers are set globally: % \newcount\CT@cnt \newdimen\CT@dim \newbox\CT@box % % This flag is used to shut off colortab: % \newif\ifcolortab \colortabtrue % % To color row cells of unknown height we first have to put the rows in an % alignment and measure the resulting height, then put down a row of blobs % (with \hrule, and then move back up the page. % % For TeX's \halign primitive, \coloralign saves the preamble in the token % register \CT@preamble. This is used to calculate the height of the columns % that are to be colored in. % \newtoks\CT@preamble \def\coloralign{% \afterassignment\coloralign@ \setbox\CT@box=\hbox} \def\coloralign@#1\cr{% \egroup \CT@preamble{\halign\bgroup#1\cr}% \the\CT@preamble} % % \CC reads the next row, which should contain the color commands, and then % the rows to be colored. The height of the latter rows is calculated, and % then the row of colors is processed. \CT@columncolor uses \leaders to get % each color to fill the column horizontally, and it uses the previously % calculated height to fill the columns vertically. % \begin{macrocode} \def\CT@columncolor{% \ifx\next\@nil \def\next##1&\@nil{\gdef\CT@next{##1}}% \expandafter\next\CT@next\@nil \def\CT@temp\@nil{}% \else \ifx\next\CT@space \def\CT@temp{% \def\next{\futurelet\next\CT@columncolor}% \afterassignment\next\let\CT@temp= }% \else \def\CT@temp{\CT@@columncolor}% \fi \fi \CT@temp} \def\CT@@columncolor#1&{% \ifx\next&% \expandafter\gdef\expandafter\CT@next\expandafter{\CT@next\omit{}&}% \else \expandafter\gdef\expandafter\CT@next\expandafter{\CT@next \omit{{\ignorespaces#1{\leaders\hrule height\CT@dim\hfil}}}&}% \fi \futurelet\next\CT@columncolor} {\def\\{\global\let\CT@space= }\\ } \def\CC@#1#2#3{% \ifcolortab \noalign{% \setbox\CT@box=\vbox{#1#3\crcr\egroup}% \CT@dim=\ht\CT@box \global\advance\CT@dim by \dp\CT@box \def\CT@next{}% \futurelet\next\CT@columncolor#2&\@nil}% \CT@next\cr \noalign{\vskip-\CT@dim}% \fi #3} \def\CC#1\cr#2\ECC{\CC@{\the\CT@preamble}{#1}{#2}} % % With \LaTeX's alignment macros, the preamble is saved for us in \@preamble. % Otherwise, \LCC is the same as \CC. % \def\LCC#1\\#2\ECC{\CC@{\@preamble}{#1}{#2}} % % This unaligned color stuff only works with PSTricks: % \def\AC#1{% % \@ifundefined{color@#1}% % {\@pstrickserr{Color not defined: `#1'}\@ehpa}% {\pstVerb{\pst@usecolor{#1}}}} \def\EAC{\pstVerb{\pst@currentcolor}} \def\NAC#1{\noalign{\AC{#1}}} \def\ENAC{\noalign{\EAC}} % \def\SP{\noalign{\global\let\CT@savedpreamble\@preamble}} \def\RP{\noalign{\global\let\@preamble\CT@savedpreamble}} % \newcount\CT@LCnum \def\LColors#1\\{% \noalign{% \ifnum\CT@LCinitflag=\c@LT@tables\else\CT@LCinit\fi \ifnum\CT@LCflag=\z@ \global\CT@LCnum 1 \CT@LColors#1&\@nil \global\CT@LCnum\CT@LCmax \fi}} \def\CT@LColors#1&{% \global\@namedef{LColor@\the\CT@LCnum}{#1}% \@ifnextchar\@nil{\@gobble}{% \global\advance\CT@LCnum 1 \CT@LColors}} \def\CT@LCinit{% \ifcolortab \@ifundefined{LT@\romannumeral\c@LT@tables}% {\gdef\CT@LCflag{1}}{\gdef\CT@LCflag{\z@}}% \else \gdef{CT@LCflag{1}}% \fi \ifnum\CT@LCflag=\z@ \begingroup \def\omit\kern##1&{% \advance\CT@LCnum 1 \CT@dim=##1\relax \expandafter\xdef\csname LCdim@\the\CT@LCnum\endcsname{% \number\CT@dim sp}}% \CT@LCnum\z@ \@nameuse{LT@\romannumeral\c@LT@tables}&% \xdef\CT@LCmax{\the\CT@LCnum}% \endgroup \fi \xdef\CT@LCinitflag{\the\c@LT@tables}} \def\CT@LCinitflag{\z@} \def\LC@Cell{% \kern-\@tempdima \ifnum\CT@LCflag=\z@ \ifnum\CT@LCnum=\CT@LCmax\relax \global\CT@LCnum 1 \else \global\advance\CT@LCnum 1 \fi \CT@dim=\@nameuse{LCdim@\the\CT@LCnum}\relax \advance\CT@dim-\@tempdimb \expandafter\ifx\csname LColor@\the\CT@LCnum\endcsname\@empty\else \begingroup \@nameuse{LColor@\the\CT@LCnum}{% \vrule width\CT@dim}% \endgroup \kern-\CT@dim \fi \fi} \def\LC{\@tempdima=\z@\@tempdimb=\z@\LC@Cell} \def\LCi{\LCi@\LC@Cell} \def\LCi@{% \@tempdima=\doublerulesep \ifnum\CT@LCflag=\z@ \ifnum\CT@LCnum=\CT@LCmax\relax \@tempdimb=\arrayrulewidth \else \@tempdimb=\z@ \fi \fi} \def\LCii{% \@tempdima=\z@ \@tempdimb=\doublerulesep \advance\@tempdimb=\arrayrulewidth \LC@Cell} \def\LCiii{% \LCi@ \advance\@tempdimb\doublerulesep \advance\@tempdimb\arrayrulewidth \LC@Cell} \def\LCz#1#2{% \@tempdima=#1 \@tempdimb=#2 \LC@Cell} % \catcode`\@=\TheAtCode\relax \endinput %% END colortab.tex/colortab.sty %% BEGIN colortab.doc \def\FileVersion{0.9} \def\FileDate{93/01/11} %% %% Documentation for colortab.tex/colortab.sty. %% Run through LaTeX, with or without the NFSS. %% %% You need the file fancybox.sty, available from Princeton.EDU:/pub/tvz %% %% The color commands \gray and \lightgray must be defined if you %% want to see the examples. pstricks.tex will be loaded for this %% purpose if it is found. Otherwise, you must load your own %% color commands. %% %% Change these if using different size paper. You can also include the %% twosided style option, if desired: \def\paperwidth{8.5in} \def\paperheight{11in} \documentstyle[12pt,fancybox]{article} \makeatletter % Load pstricks.tex if it is found: \@input{pstricks.tex} % Input colortab.tex here to check file version: \input colortab.tex \ifx\FileVersion\fileversion\else \@latexerr{colortab input file and documentation do not have the same version}\@ehd \fi % DATES, VERSIONS AND TITLES: \def\expanddate#1/#2/#3/{\year=19#1 \month=#2 \day=#3} \begingroup \expandafter\expanddate\filedate/ \xdef\thefiledate{\today} \endgroup \title{Documentation for colortab.tex/colortab.sty:\\[5pt] Shading and coloring \TeX\ tables} \author{Timothy Van Zandt\\ tvz@Princeton.EDU} \date{Version \fileversion\\ \thefiledate} \def\@maketitle{% \begin{center} {\Large\bf \@title \par} \vskip 1.2em {\lineskip .5em \begin{tabular}[t]{c}\@author\end{tabular}\par} \vskip .8em {\@date}% \end{center} \par \vskip .5em} % PAGE STYLE: \pagestyle{myheadings} \if@twoside \markboth{Documentation for colortab.tex/.sty}% {Version \fileversion, \thefiledate}% \else \markright{colortab.tex, Version \fileversion} \fi % TABLE OF CONTENTS \newskip\myskip \def\tableofcontents{% \par\vfill \begin{quote} \begin{center} \Large\bf Contents \end{center} \def\numberline##1{\hbox to 0pt{\hss##1\hskip 1em}}% \let\oldaddvspace\addvspace \def\addvspace##1{% \myskip##1\relax \oldaddvspace{.5\myskip}} \@starttoc{toc}% \end{quote} \thispagestyle{empty} \vfill \clearpage} % PAGE PARAMETERS: % Paragraphs are marked by large space rather than indentation: \parindent 0pt \parskip 7pt plus 1pt minus 1pt \setlength{\topmargin}{0pt} \setlength{\headheight}{12pt} % height of running head \setlength{\headsep}{30pt} % distance between header and text \setlength{\textheight}{8.2in} % height of text on page % Adjust margins for different paper size: \@tempdima=\paperwidth \advance\@tempdima-8.5in \advance\oddsidemargin .5\@tempdima \advance\evensidemargin .5\@tempdima \@tempdima=\paperheight \advance\@tempdima-11in \advance\topmargin .5\@tempdima % VERBATIM HACKS: \VerbatimFootnotes % Short meta (works in verbatim. Can't use < for other purposes. \catcode`\<=13 \def<#1>{{\rm\it #1\/}} % (works in verbatim) % Short verbatim. " can appear in verbatim environments. \def\temp{\Verb"} \expandafter\def\expandafter\dospecials\expandafter{\dospecials\do\"} \catcode`\"=13 \let"\temp \def\n#1{{\tt\string#1}} % Verbatim item: \newcommand{\vitem}{\SaveVerb[{\def\bf{}\item[\UseVerb{\MyTemp}]}]{\MyTemp}} % Verbatim section" % EXAMPLES: % 1. Save example verbatim to \jobname.tmp, % 2. Input verbatim with \catcode`\"=14 (" is a comment). % 3. Input again with \catcode\`"=9 (" is ignored). \renewcommand{\EveryVerbatimLine}[2]{} \renewcommand{\EveryVerbOutLine}[2]{} \newcommand{\BeginExample}{% \VerbatimEnvironment\begin{VerbatimOut}{\jobname.tmp}} \newcommand{\EndExample}{% \end{VerbatimOut}%. \renewcommand{\EveryVerbatimLine}{}% \renewcommand{\EveryVerbatimCodes}{\catcode`\"=14}% \LVerbatimInput{\jobname.tmp}% \catcode`\"=9} \@ifundefined{lightgray}{\@testfalse}% {\@ifundefined{gray}{\@testfalse}{\@testtrue}} \if@test \newenvironment{example}{\BeginExample}{\EndExample \begin{center}\leavevmode\input{\jobname.tmp}\end{center}} \else \newenvironment{example}{\VerbatimEnvironment\LVerbatim}{\endLVerbatim} \fi % END PREAMBLE: \makeatother \begin{document} \maketitle \begin{quote} "colortab.tex/colortab.sty" contains macros that let you use your color commands for shading and coloring cells in tables and other alignment environments. It is compatible with most \TeX\ macro packages. \end{quote} \tableofcontents \section{Introduction} Adding color to tables is fraught with difficulties, but as the examples in this file indicate, it can be done. In any case, consider this an advanced topic, and be aware that the commands in "colortab.tex" are not robust. This is meant to supplement your own color commands. There are many macro files that implement color for the various "dvi" drivers that can support color. E.g., the PSTricks package works with a variety of DVI-to-PS drivers. For example, suppose you have a macro that defines the color command "\gray". "colortab.tex" requires that one of the following produce a gray line: \begin{LVerbatim} {\gray \hrule} \gray{\hrule} \end{LVerbatim} if you want to use this command to color the cells in tables. This is probably the case if the one of the following produces gray text: \begin{LVerbatim} {\gray I am gray!} \gray{I am gray!} \end{LVerbatim} "colortab.tex" contains macros for \TeX's "\halign" primitive. Incorporating color into high-level macros based on the "\halign" primitive requires a case-by-case treatment. "colortab.tex" also contains macros for coloring cells \LaTeX's various array environments, and for the \LaTeX\ "longtable" environment that is defined in the "longtable" (or "longtabl") style option. These can serve as examples that can be accommodated to other table macros. See the code itself for happy hacking. \section{\TeX's halign primitive} To shade cells in an alignment, use \begin{LVerbatim} \coloralign \end{LVerbatim} instead of "\halign". Then, to color the columns in one or more rows, type \begin{LVerbatim} \CC \cr \cr \ECC \end{LVerbatim} For example: \begin{example} \setbox\strutbox=\hbox{\vrule height11.5pt depth6.5pt width0pt}% \vbox{\offinterlineskip \coloralign{% \vrule\strut\quad\hfil#\hfil\quad &\vrule\quad\hfil#\quad\vrule\cr \noalign{\hrule}% \CC \gray &\cr Tamarind&Chiplote\cr \ECC\noalign{\hrule}% \CC \lightgray &\gray\cr Lulu&Serrano\cr\noalign{\hrule}% Guanabana&Larga\cr \ECC\noalign{\hrule}% }} \end{example} "\CC" and "\ECC" stand for ``ColorCells'' and ``EndColorCells'', respectively. You cannot change the name of "\ECC" with "\let" or "\def" (without redefining "\CC"), because it is really just a delimiter. This is also true of the first "\cr", which marks the end of the row of color commands. Remember that only complete rows can go between "\CC" and "\ECC". Where you include horizontal lines is generally inconsequential. You can have nested "\coloralign" environments, but the nested environment must be enclosed in brackets "{}". There is no "\coloralign to" or "\coloralign spread" because the space inserted by "\tabskip" won't be shaded. These macros are not very robust. You can make best use of them by knowing how they work. "\coloralign" just saves the preamble, and otherwise is identical to "\halign". "\CC" finds the height of the rows that have to be colored, and then "\CC" draws a rectangle using \TeX's line-drawing primitives in each cell, colored by the color commands included in the first line that follows "\CC". E.g., \begin{LVerbatim} \yellow &&\red \cr \end{LVerbatim} draws a yellow rectangle in column 1, nothing in column 2, and a red rectangle in column 3. Then "\CC" goes back up the height of the rectangle, so that \TeX's current point is back where it was when "\CC" started. At this point, "\CC" has finished its work. When the next rows of the alignment environment are processed by "\halign", they are put down on top of the rectangles, and hence have colored backgrounds. "\CC" finds the height of the rows to be colored by putting the rows into an "\halign" environment, using the preamble that was saved by "\coloralign", and then measuring the height of the resulting box. \section{\LaTeX\ array environments} Cells can be colored in a \LaTeX\ array without using a special array environment (i.e., there is no \LaTeX\ analog to "\coloralign"). Use "\LCC" instead of "\CC", and use "\\" to end the row of color commands instead of "\cr". For example: \begin{example} \def\arraystretch{1.5}% \begin{tabular}{|l|c|}\hline \LCC \gray & \\ Tamarind & Chiplote \\ \hline \ECC \LCC \lightgray & \gray\\ Lulu & Serrano\\ \hline Guanabana & Larga\\ \hline \ECC \end{tabular} \end{example} The same caveats apply as with the "\coloralign" environment. When \n\LCC\ and \n\ECC\ are used with Frank Mittelbach's "array.sty", nested array-type environments and "\multicolumn" commands wipe out information needed by \n\ECC\. Here is a workaround: Put "\SP" (``SavePreamble'') at the beginning of the array-type environment (right after the column declarations), and put "\RP" (``RestorePreamble'') at the end of each line containing a "\multicolumn" command or nested array-type environment (after the "\\", and before the \n\ECC). For example: \begin{LVerbatim} \begin{tabular}{|l|c|}\SP\hline \LCC \gray & \\ \multicolumn{2}{c}{Tamarind}\\ \RP \hline \ECC \end{tabular} \end{LVerbatim} Further nesting (e.g., an array within a "\multicolumn", or a "\multicolumn" or array within a nested array) sometimes works and sometimes doesn't. You will have to figure that one out for yourself. \section{longtable.sty} "longtable.sty", by David Carlisle, defines the "longtable" environment, for making multipage tables. "\LCC" will not work with "longtable". However, "colortab" contains other macros that will work, if you use "longtable.sty" in conjunction with Frank Mittelbach's "array.sty". These macros have been tested only briefly, with version 3.04 of "longtable.sty" and version 2.1b of "array.sty". Before every column identifier in the environment's argument (e.g., "c", "l", "r", "p", "m" or "b"), put \begin{description} \vitem"!{\LC}" If none of the below applies; \vitem"!{\LCi}" If the column is preceded by one or more vertical lines; \vitem"!{\LCii}" If the column is followed by two vertical lines; \vitem"!{\LCiii}" If the column is preceded by one or more vertical lines and followed by two vertical lines. \vitem"!{\LCz{}{}}" If "colortab" should back up by before drawing the background, and should draw the background shorter than the width of the column. \end{description} Remember that you have to do this for every column, not just the columns that you want to color. Then include \begin{LVerbatim} \LColors & & ... & \\ \end{LVerbatim} in the first row of the environment, and later on as well if you wish to change the colors. Here also you have to include every column, but you can leave an entry blank if you don't want any background color in that column. The color comes out right, or at all, only after you have run the file enough times for "longtable.sty" to set the alignment correctly. Here is an example. The output will appear in this documentation only if "longtable.sty" or "longtabl.sty" is installed on your system. \begingroup \makeatletter \catcode`\<=12 \@input{longtable.sty}% \@input{longtabl.sty}% \@input{array.sty}% \@testtrue \@ifundefined{c@LT@tables}{\@testfalse}{}% \@ifundefined{d@llarbegin}{\@testfalse}{}% \if@test\else \renewenvironment{example}{\VerbatimEnvironment\LVerbatim}{\endLVerbatim}% \fi \makeatother \begin{example} \LARGE \begin{longtable}{|!{\LCiii}l||!{\LCi}c|!{\LCi}c|}\hline \LColors \gray & & \\ Tamarind & Chiplote & Galanga\\ \hline \LColors \lightgray & & \gray\\ Lulu & & Serrano\\ \hline Guanabana & Larga &\\ \hline \end{longtable} \end{example} \endgroup \section{Coloring lines} Let's begin with the "\halign" environment. Changing the color of lines is easy, because if you write, say, "{\gray\hrule}", then the line comes out gray. For example: \begin{example} % Thicker lines and wider spacing give better view: \setbox\strutbox=\hbox{% \vrule height15.5pt depth8.5pt width0pt}% \def\Hrule{\hrule height 2.5pt}% \def\Vrule{\vrule width 2.5pt}% % Now the table: \vbox{\offinterlineskip \halign{% {\lightgray\Vrule}\strut\quad\hfil#\hfil\quad &{\gray\Vrule}\quad\hfil#\quad\Vrule\cr \noalign{\Hrule}% Tamarind& Chiplote\cr\noalign{{\darkgray\Hrule}}% Lulu& Serrano\cr\noalign{\Hrule}% Guanabana& Larga\cr\noalign{{\lightgray\Hrule}}% }} \end{example} With \LaTeX, you can add an entry like \begin{LVerbatim} @{\hspace{\tabcolsep}{\gray\vrule}\hspace{\tabcolsep}} \end{LVerbatim} to the argument of the alignment environment, instead of "|", if you want to color the vertical line that is drawn. If using "array.sty", you can try: \begin{LVerbatim} !{{\gray\vrule}} \end{LVerbatim} To color horizontal lines with \LaTeX, don't bother trying \begin{LVerbatim} {\gray\hline} \end{LVerbatim} because it won't work. You write your own version of "\hline" and "\cline", or use the non-aligned color commands described in the next section. \section{Non-aligned color with PSTricks} Here are a few other commands that can be useful for adding color to tables. {\bf They only work with PSTricks, v0.93 or later.} in this case is the name of the color, without the backslash. These fudge the color commands so that they do not have to be balanced with respect to \TeX\ grouping. You can achieve the same thing using "\special{}" and "\noalign", if you know what you are doing. These should work with just about any alignment macro, include "\halign" and \LaTeX's "tabular" environment. \begin{description} \vitem"\AC{} ... \EAC" \ These stand for "AlignColor" and "EndAlignColor", respectively. is the name of the color, without a backslash, rather than a color command. This can be used within a cell, but they do not have to be within the same cell, nor do they have to be properly nested with respect to \TeX\ grouping. Generally, "\AC{}" switches to , and \n\EAC\ restores the color that would be in effect if the first \n\AC\ command were missing. \vitem"\NAC{} ... \ENAC" \ These stand for "NoAlignColor" and "EndNoAlignColor", respectively. These are like \n\AC\ and \n\EAC, but the color commands are put inside a "\noalign". They can only appear at the end of a line, after "\\" or "\cr". \end{description} Actually, these do not even have to be used in pairs. Here is an example of how "\AC", etc., can be used. to color lines in \LaTeX\ arrays. The output will appear in this documentation only if PSTricks is installed on your system: \begingroup \ifx\PSTricksLoaded\endinput\else \renewenvironment{example}{\VerbatimEnvironment\LVerbatim}{\endLVerbatim} \fi \begin{example} \arrayrulewidth 1.5pt \begin{tabular}{|l|c|}\hline Tamarind& Chiplote\\ \NAC{gray}\hline\ENAC Lulu& Serrano\\ \cline{1-1} \NAC{lightgray}\cline{2-2}\ENAC Guanabana\AC{lightgray} & \EAC Larga\\ \hline \end{tabular} \end{example} \endgroup \end{document} %% END colortab.doc