1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422
|
\documentclass{article}
\usepackage{tabstackengine}
\usepackage{verbatimbox}
\usepackage{xcolor}
\parindent 0in\parskip 1em \newlength\dotscale
% FOR CLOSE-BOXING ARGUMENTS \fboxsep=0pt\fboxrule=.6pt
\def\rl{\rule[-.3pt]{2ex}{.6pt}} \def\tst{\textsf{tabstackengine}}
\def\ste{\textsf{stackengine}} \def\bs{\texttt{\char'134}} \let\vb\verb
\reversemarginpar \marginparwidth 1.6in
\newcommand\margtt[1]{\marginpar{\hfill\ttfamily#1}}
\newcommand\margcmd[1]{\marginpar{\hfill\ttfamily\char'134#1}}
\newcommand\cmd[1]{\texttt{\char'134#1}}
\begin{document}
\begin{center} \LARGE The {\tst} Package\\ \rule{0em}{.7em}\small
Front-end to the {\ste} package, allowing tabbed stacking\\ \rule{0em}{2.7em}\large
Steven B. Segletes\\ steven.b.segletes.civ@mail.mil\\
\rule{0em}{1.7em}\today\\ \tabstackengineversionnumber \end{center}
\tableofcontents
\section{Introduction}
The {\tst} package provides a front end to the {\ste} package that
allows for the use of tabbing characters within the stacking arguments.
\textbf{Familiarity with the syntax of the {\ste} package is assumed.}
When invoked, {\tst} loads the {\ste} package with the
\texttt{[usestackEOL]} option set, so that the end-of-line (EOL)
character in certain stacking arguments will be taken, by default,
as \vb|\\|, rather
than a space (which is the default EOL separator in \ste).
With \tst, command variations are introduced to allow several variants
of tabbing within the macro arguments. The default tabbing character is
the ampersand (\vb|&|); however, the tabbing character can be reset to
other values.
In most cases (where it makes sense), a {\ste} macro name may be
prepended with the word \texttt{tabbed}, \texttt{align}, or
\texttt{tabular} to create a new {\tst} macro that allows for tabbed
arguments.
\section{Tabbing Variations within \tst}
The {\tst} package syntax allows three types of tabbing variation
denoted by the words \texttt{tabbed}, \texttt{align}, and
\texttt{tabular} in the macro name itself. In the case of
\texttt{tabbed} macros, the tabbed columns all share the same alignment,
as dictated by the \vb|\stackalignment| setting or perhaps provided as
an optional argument in some macro forms.
In the case of \texttt{align} macros, the alignment in columns is
alternately specified as right, then left, \textit{etc.}, in the manner
of the \texttt{align} environment of the \textsf{amsmath} package.
Finally, in the case of \texttt{tabular} macros, an extra argument is
passed to the macro that specifies the left-center-right alignment for
each individual column, in the manner of \vb|{lccr}|.
\section{Column Spacing within \tst}
Intercolumn space can be introduced to {\tst} output in one of two ways.
\margcmd{fixTABwidth}First, there is a macro setting to force all columns to be the same
width (namely, the width of the widest entry in the stack), using the
syntax
\vb|\fixTABwidth{T| \textit{or} \vb|F}|.
When set true, column space will be introduced to all but the widest
column of a stack, so as to make all columns of a width equal to that
of the widest column.
Secondly,\margcmd{setstacktabbedgap}
each of the tabbing variations has the means to introduce a
fixed amount of space between columns. By default, the \texttt{tabbed}
stacking macros add no space (\texttt{0pt}) between adjacent columns,
but this value can be reset with the macro
\vb|\setstacktabbedgap{|\textit{length}\vb|}|.
In\margcmd{setstackaligngap}
the case of the \texttt{align} stacking macros, there is never any
gap introduced after the right-aligned columns. However, the default
gap introduced after the left-aligned columns is, by default,
\texttt{1em} (the same gap as \cmd{quad}). It can be reset with the
macro \vb|\setstackaligngap{|\textit{length}\vb|}|.
For\margcmd{setstacktabulargap}
the \texttt{tabular} stacks, the default intercolumn gap is the
value of \cmd{tabcolsep}. The default value may be reset with the macro
\vb|\setstacktabulargap{|\textit{length}\vb|}|.
Note that these \cmd{setstack...gap} macros are for setting horizontal
gaps between columns of a stack. They should not be confused with
the \cmd{setstackgap} macro of {\ste} that sets the vertical gap
for long and short stacks.
\section{Command Summary}
Below are the new commands introduced by this package. When there are
multiple commands delimited by braces, any one of the commands within the
brace may be selected.
\ttfamily\footnotesize
\(\left.\Centerstack[r]{%
\textcolor{red}{\cmd tabbed}\\\\
\textcolor{teal}{\cmd align}\\\\
\textcolor{blue}{\cmd tabular}
}\right\}%
\left\{
\Centerstack[c]{Shortstack\\Shortunderstack\\Longstack\\
Longunderstack\\Centerstack\\Vectorstack}
\right\}%
\left\{\Centerstack[c]{
\textcolor{red}{[alignment]}\\\\
\\\\
\textcolor{blue}{\{column alignments\}}
}\right\}\)\{tabbed EOL-separated string\}
\(\displaystyle\$\left\{\Centerstack[r]{\cmd paren\\\cmd brace\\\cmd bracket\\\cmd vert}\right\}\)%
\textcolor{red}{Matrix}stack[alignment]\{tabbed EOL-separated string\}\$
\(\left.\Centerstack[r]{
\textcolor{red}{\cmd tabbed}\\\\
\textcolor{teal}{\cmd align}\\\\
\textcolor{blue}{\cmd tabular}}\right\}%
\left\{
\Centerstack[c]{stackon\\stackunder\\stackanchor}
\right\}%
\mathtt{[stack gap]}\left\{\Centerstack[l]{
\\\\
\\\\
\textcolor{blue}{\{col.\ alignments\}}
}\right\}\)\{tabbed anchor\}\{tabbbed~argument\}
\cmd setstack\(\left\{\Centerstack{
\textcolor{red}{tabbed}\\\\
\textcolor{teal}{align}\\\\
\textcolor{blue}{tabular}
}\right\}\)gap\{length\}
\hspace{3em}Initial Defaults:\(\left\{\Centerstack{
\textcolor{red}{0pt}\\\\
\textcolor{teal}{1em}\\\\
\textcolor{blue}{\cmd tabcolsep}
}\right\}\)
\rmfamily\normalsize
\begin{verbnobox}[\footnotesize]
\fixTABwidth{T or F}
\setstackTAB{tabbing character}
\TABunaryLeft (\TABbinaryRight)
\TABunaryRight (\TABbinaryLeft)
\TABbinary
\end{verbnobox}
The following macros are macros that can be used for parsing tabbed data outside of a
TABstack.
\begin{verbnobox}[\footnotesize]
\readTABrow{row ID}{tab-separated string}
\TABcell{row ID}{column number}
\TABcells{row ID}
\TABstrut{row ID}
\TABstackMath
\TABstackText
\ensureTABstackMath{}
\end{verbnobox}
\subsection{Command Examples}
Below we give examples of the various types of commands made available through
the \textsf{stackengine} package.
\subsection*{Tabbed End-of-Line (EOL)-delimited Stacks}
Here, the optional argument \verb|[l]| defines the alignment of \textit{all} the
columns. The default alignment is \verb|[c]|.
\verb|\tabbedShortunderstack[l]{A&B&CCC\\aaa&bbb&c\\1111&2&3}|
{\small\tabbedShortunderstack[l]{A&B&CCC\\aaa&bbb&c\\1111&2&3}}
\subsection*{Align End-of-Line (EOL)-delimited Stacks}
In an \texttt{align}-stack, the column alignments will always be \verb|rlrl...|
The gap following the left-aligned columns is set by \verb|\setstackaligngap|.
\verb|\stackMath$Z:\left\{\alignCenterstack{%|\\
\verb| y=&mx+b,&0=&Ax+By+C\\y_1=&W_1,&y_2=&W_2}\right.$|
{\small\stackMath$Z:\left\{\alignCenterstack{y=&mx+b,&0=&Ax+By+C\\y_1=&W_1,&y_2=&W_2}\right.$}
\subsection*{Tabular End-of-Line (EOL)-delimited Stacks}
In a \texttt{tabular}-stack, the alignment of each column is specified in a separate
leading argument.
\verb|\stackText\tabularLongstack{rllc}{%|\\
\verb| 9)& $y_1=mx+b$ &linear&*\\10)& $y_2=e^x$ &exponential&[23]}|
{\small\stackText\tabularLongstack{rllc}{9)& $y_1=mx+b$ &linear&*\\10)& $y_2=e^x$ &exponential&[23]}}
\subsection*{Matrix Stack}
The \texttt{Matrix}-stacks are a tabbed variant of \textsf{stackengine}'s \texttt{Vector}-stacks.
\verb|\setstacktabbedgap{1.5ex}|\\
\verb|$I = \bracketMatrixstack{1&0&0\\0&1&0\\0&0&1}$|
{\small\setstacktabbedgap{1.5ex} $I = \bracketMatrixstack{1&0&0\\0&1&0\\0&0&1}$}
\subsection*{Tabbed Stack}
This variant of a \texttt{tabbed}-stack stacks exactly two items.
Its arguments don't need to be protected. The optional argument is a stacking gap,
as in the syntax of the \textsf{stackengine} package.
\verb|\setstacktabbedgap{1ex}|\\
\verb|\tabbedstackon[4pt]{Jack&drove&the car&home.}{SN&V&DO&IO}|
{\small\stackText\setstacktabbedgap{1ex}\tabbedstackon[4pt]{Jack&drove&the car&home.}{SN&V&DO&IO}}
\subsection*{Align Stack}
This is for stacking two items with \texttt{rlrl...} alignment pattern.
\verb|\stackMath\setstackaligngap{3em}|\\
\verb|\alignstackunder[10pt]{y=&mx+b,&0=&Ax+By+C}{y_1=&W_1,&y_2=&W_2}|
{\small\stackMath\setstackaligngap{3em}
\alignstackunder[10pt]{y=&mx+b,&0=&Ax+By+C}{y_1=&W_1,&y_2=&W_2}}
\clearpage
\subsection*{Tabular Stack}
This is for stacking two items with specifiable alignment pattern.
\verb|\stackMath\setstacktabulargap{1ex}\tabularstackanchor[4pt]{rcl}%|\\
\verb| {\bullet\bullet\bullet\bullet&\belowbaseline[-2pt]{\triangle}%|\\
\verb| &\bullet\bullet\bullet\bullet}%|\\
\verb| {1 + 3(4-3) & = & 7 - 6/2}|\vspace{1ex}
{\small\stackMath\setstacktabulargap{1ex}
\tabularstackanchor[4pt]{rcl}{\bullet\bullet\bullet&\belowbaseline[-2pt]{%
\triangle}&\bullet\bullet\bullet}{1 + 2(4-3) & = & 6 - 6/2}}
\subsection*{Fixed Tab Width (equal width columns, based on largest)}
With this mode set, the stack will have fixed-width columns, based on the overall
widest entry.
\verb|\fixTABwidth{T}\setstacktabbedgap{1ex}%|\\
\verb|$\left(\tabbedCenterstack[r]{1&34&544\\4324329&0&8\\89&123&1}\right)$|
{\small\setstacktabbedgap{1ex}\fixTABwidth{T}$\left(\tabbedCenterstack[r]{1&34&544\\4324329&0&8\\89&123&1}\right)$}
\subsection*{Setting the Stack Tabbing Character}
By default, for the parsing of columns within a row, this package employs the \verb|&| character to delimit the
columns. This value can be changed via \verb|\setstackTAB{}|, where the argument is the
newly desired tabbing character. It can be any of various characters, including a space token,
if one wishes to use a space-separated
list to parse the columns. Generally, it may need to be changed if you are building a TABstack
inside of an environment that already uses the \verb|&| character as a tab, such as the
\verb|tabular| environment for text or the various math environments in the \textsf{amsmath}
package.
\subsection*{Unary versus Binary Operators/Relations at Cell Ends}
There are two things to keep in mind regarding TABstacked content. First, a TABstack cell has
no precise understanding up what content precedes it in the cell to the immediate left, nor what
content follows it in the cell to the immediate right. It does, however know the overall height/depth
of the content across the whole row and creates a vertical ``strut'' of that height and depth, which must,
in some way, be applied to every cell in the row.
This vertical strut can be applied to the cell immediately
prior to or immediately following the cell content, as we shall see. However, such an action will
have an effect on math operators and relations found at the leading or trailing ends of the cell
content.
Math operators and relations can be categorized as unary or binary; some
may be both, depending on their usage context, such as the minus sign. When used as $a-b$, the
relation is binary, because it connects $a$ and $b$ in a mathematical relationship. Note how space
appears both before and after the minus sign. Alternatively, when used as $-\pi$, the minus sign
operates only upon what follows, in this case $\pi$, to produce a negative. Note how no space is
introduced between the minus sign and $\pi$.
Because a TABstack cell has no intimate knowledge of the adjacent cell content, it is up to
the user to employ his tabbing seperators in a way that produces the desired result. By default,
\textsf{tabstackengine} will place the strut after the cell content. This means that any trailing
math operator in a cell will present itself in its binary form (regardless of what comes in the
cell to the right), because the strut will appear as trailing data against which the operator can
be set. Similarly, any leading math operator will present itself as unary (regardless of what
content appears in the cell to the left).
Thus, \verb|\tabbedLongstack{y =&-mx +& b}| will present as
{\tabbedLongstack{y =&-mx +& b}}, by default,
with the trailing equal and plus signs as binary, and the leading minus sign as unary. The package
can reverse the default with the following declarative modes:
\verb|\TABunaryRight| (identical to \verb|\TABbinaryLeft|); as well
as \verb|\TABbinary|, which will present both leading \textit{and} trailing operators in
their binary form. The default can be restored with
\verb|\TABunaryLeft| (identical to \verb|\TABbinaryRight|).
Without changing any of the package strut modes, an operator, such as minus, can be
forced into its unary mode
by enclosing it in braces: \verb|{-}|. Likewise, it can be forced into its binary mode by
placing empty braces on both sides of it: \verb|{}-{}|.
\subsection*{The Macros \texttt{\textbackslash readTABrow}, \texttt{\textbackslash TABcell(s)},
and \texttt{\textbackslash TABstrut}}
One of the nice features of \textsf{tabstackengine} is that it gives you access to its parser,
which can be used for tasks unrelated to building stacks.
It provides several macros, including
{\itshape\verb|\readTABrow{|ident\verb|}{|tab-separated-string\verb|}|} for
digesting a list and assigning it a global ID, in this case, ``{\itshape ident}''. It also provides
{\itshape\verb|\TABcells{|ident\verb|}|} to tell you how many items are in the list named
``{\itshape ident}'', as well as the macro {\itshape\verb|\TABcell{|ident\verb|}{|column number\verb|}|} to
provide the value of the specified column from the ID'ed row. For example,
\begin{verbatim}
\setstackTAB{,}
\TABstackMath
\readTABrow{myident}{1,2, 3x , 4, 5,x^2,,g,\textbf{bold 9}}
\TABcells{myident} items in dataset ``myident''\\
The 6th data item is \TABcell{myident}{6}\\
The 9th data item is \TABcell{myident}{9}
\end{verbatim}
will yield the following result:
\TABstackMath
{\setstackTAB{,}
\readTABrow{myident}{1,2, 3x , 4, 5,x^2,,g,\textbf{bold 9}}
\TABcells{myident} items in dataset ``myident''\\
The 6th data item is \TABcell{myident}{6}\\
The 9th data item is \TABcell{myident}{9}}
{\fboxsep=1pt%
The result provided by {\itshape\verb|\TABcell{|ident\verb|}{|column number\verb|}|} has
been processed in the following way: 1) leading and trailing spaces have been removed
from the column's data, and 2) the column will have been processed in math mode if
\verb|\TABstackMath| (see below) had been in force. Thus, placing the cell contents in
a box, \verb|\fbox{\TABcell{myident}{3}}|
is \fbox{\TABcell{myident}{3}}.
If one, however, wished to access the raw
data, with leading/trailing spaces still intact (and ignoring the \verb|\TABstackMath| setting),
one can compose the macro,
{\itshape\verb|\csname TABX|ident\verb|X\romannumeral| column number\verb|\endcsname|},
such that \verb|\fbox{\csname TABXmyidentX\romannumeral 3\endcsname}|, using the above example,
would give \fbox{\csname TABXmyidentX\romannumeral 3\endcsname}.%
}
Finally, the macro \verb|\TABstrut{myident}| provides a strut that spans the vertical height of the
complete row content.
Here is \verb|\TABstrut{myident}| (that has been boxed with \verb|\fboxsep=0pt|)
compared to the boxed content of the row itself:\\
{\TABstackMath\fboxsep=0pt\fboxrule=.2pt\fbox{\TABstrut{myident}}
\fbox{$12 3x 4 5x^2g\textbf{bold 9}$}}. As you can see, the \verb|\TABstrut{myident}|
captures the vertical extent of the complete row data, including the descending $g$ and
the superscript of the $x^2$. The \verb|\TABstrut{}|, when paired with the column content,
is useful when one wishes to make all column entries of a row display with equal height and depth,
even when their native height varies from column to column.
\TABstackText
\subsection*{\texttt{\textbackslash TABstackMath}, \texttt{\textbackslash ensureTABstackMath}, and
\texttt{\textbackslash TABstackText}}
These macros are \textit{not} needed when building stacks in \textsf{tabstackengine}.
When constructing TABstacks, their presence is superfluous
because their companion macros, \verb|\stackMath|, \verb|\ensurestackMath|,
and \verb|\stackText|, will
carry over from the \textsf{stackengine} package.
However, there is one application where their use is required. And that is when you
use the facilities of this package \textit{not} to build TABstacks, but \textit{instead} use it to parse
data with \verb|\readTABrow{}{}| and present it with \verb|\TABcell{}{}|, respectively.
Notably \verb|\TABcell{}{}| does not access the \textsf{stackengine} setting for
the status of \verb|\stackMath| and therefore pays attention only to the current setting
specified by \verb|\TABstackMath|.
One should note, however, that TABstacks pay attention to both settings. Therefore,
\bfseries if EITHER \verb|\stackMath| or \verb|\TABstackMath| have been
invoked, the TABstack argument will be processed by \verb|\TABcell| in math
mode\mdseries. This is a good reason to avoid the ``TAB'' versions of these
macros, unless employing them to parse data (and then, reset to
\verb|\TABstackText| when you are done with parsing).
\section{Known Bugs/Missing Features}
\begin{enumerate}
\item \textbf{No Horizontal Equivalent of \textbackslash TABstrut}
Currently, there is no macro that provides the width of a
column's content. I hope to remedy this deficiency in a future release.
\item \textbf{Nothing Equivalent to} \verb|\hline|
This is not a bug, so much as a notation of a missing feature. Currently
there is nothing equivalent to \verb|\hline| available for use in
\textsf{tabstackengine} arguments.
\end{enumerate}
\section*{Acknowledgements}
I would like to thank Prof. Enrico Gregorio of \textsf{tex.stackexchange.com} for
his considerable assistance rendered. Many of the improvements he offered towards
my \textsf{stackengine} package were carried over directly into this package, as
well, resulting in a more robust implementation.
\clearpage
\section{Code Listing}
\verbfilenobox[\footnotesize]{tabstackengine.sty}
\end{document}
|