From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/tabulary/README | 5 + macros/latex/contrib/tabulary/tabulary.dtx | 1007 ++++++++++++++++++++++++++++ macros/latex/contrib/tabulary/tabulary.ins | 8 + macros/latex/contrib/tabulary/tabulary.pdf | Bin 0 -> 256360 bytes 4 files changed, 1020 insertions(+) create mode 100644 macros/latex/contrib/tabulary/README create mode 100644 macros/latex/contrib/tabulary/tabulary.dtx create mode 100644 macros/latex/contrib/tabulary/tabulary.ins create mode 100644 macros/latex/contrib/tabulary/tabulary.pdf (limited to 'macros/latex/contrib/tabulary') diff --git a/macros/latex/contrib/tabulary/README b/macros/latex/contrib/tabulary/README new file mode 100644 index 0000000000..ed7423902f --- /dev/null +++ b/macros/latex/contrib/tabulary/README @@ -0,0 +1,5 @@ +The tabulary package: + + The tabulary environment is similar to tabularx (tools) and tabular* + (LaTeX kernel) but uses a different column width allocation + algorithm. diff --git a/macros/latex/contrib/tabulary/tabulary.dtx b/macros/latex/contrib/tabulary/tabulary.dtx new file mode 100644 index 0000000000..b455cf0382 --- /dev/null +++ b/macros/latex/contrib/tabulary/tabulary.dtx @@ -0,0 +1,1007 @@ +% \iffalse +%% +%% File `tabulary.dtx'. +%% Copyright (C) 1995 1996 2003 2008 David Carlisle +%% This file may be distributed under the terms of the LPPL. +%% See 00readme.txt for details. +%% +% +%<*dtx> + \ProvidesFile{tabulary.dtx} +% +%\NeedsTeXFormat{LaTeX2e} +%\ProvidesPackage{tabulary} +% \fi +% \ProvidesFile{tabulary.dtx} + [2014/06/11 v0.10 tabulary package (DPC)] +% +% \iffalse +%<*driver> +\documentclass{ltxdoc} +\usepackage{tabulary} +\EnableCrossrefs +\CodelineIndex +\GetFileInfo{tabulary.dtx} +\title{The \textsf{tabulary} package\thanks{This file + has version number \fileversion, last + revised \filedate.}} +\author{David Carlisle} +\date{\filedate} +\RecordChanges +\begin{document} +\maketitle +\DocInput{tabulary.dtx} +\PrintChanges +\end{document} +% +% \fi +% \CheckSum{1346} +% +% \changes{v0.1}{1995/10/08} +% {Initial version} +% \changes{v0.2}{1995/11/05} +% {Changed everything except the name} +% \changes{v0.3}{1995/12/21} +% {Changed everything except the name: s and CLRS added} +% \changes{v0.5}{1998/12/08} +% {Further SPQR modifications to multi pass table env} +% \changes{v0.6}{2003/02/26} +% {Remove multi pass table env and unboxed star form} +% \changes{v0.8}{2003/09/14} +% {Rename S to J and `hide' s (until it works)} +% \changes{v0.10}{2014/06/21} +% {support \cs{cellcolor} see http://tex.stackexchange.com/a/185851/1090} +% +% \section{User Documentation} +% +% +% |\begin{tabulary}|^^A +% \marg{length}\marg{pream}| |\ \ldots\ |\end{tabulary}| +% +% The rather daft name may change in a later release but it is a pun +% on |tabularx|, which itself was a pun on |tabular*|\ldots +% +% These environments work pretty much like the standard tabular +% environment (or more correctly, the enhanced version from the array +% package) except that there are more possibilities for the column +% types. +% \begin{description} +% \iffalse +% \item[s] An `|s|' column relates to a `|c|' column the way the |[s]| +% |\makebox| option relates to |[c]|. The entries are set to the +% widest width in the column, but no centering is done, any `glue' in +% the entry will be used to `stretch' the text across the column. This +% package adds the |s| column type to \emph{all} array and tabular +% environments. +% \fi +% \item[LCRJ] These new `uppercase' column types are only activated in +% the |tabulary| environment. +% In order to make the total table width equal to \meta{length} the +% |LCRJ| columns are converted to |p| columns (with |\raggedright|, +% |\centering|, or |\raggedleft| or normal justification respectively +% applied). The width of these converted columns is proportional to +% the natural width of the longest entry in each column. +% \end{description} +% +% To stop very narrow columns being too `squeezed' by this process any +% columns that are narrower than |\tymin| are set to their natural +% width. This length may be set with |\setlength| and is +% arbitrarily initialised to 10\,pt. (If you know that a column will +% be narrow, it may be preferable to use, say, |c| rather than |C| so +% that the \textsf{tabulary} mechanism is never invoked on that column.) +% +% Similarly one very large entry can force its column to be too wide. +% So to prevent this, all columns with natural length greater than +% |\tymax| are set to the same width (with the proportion being taken +% as if the natuaral length was \emph{equal} to |\tymax|). This is +% initially set to twice the text width.. +% +% Narrow |p| columns are sometimes quite hard to set, and so +% you may redefine the command |\tyformat| to be any declarations +% to make just after the |\centering| or |\ragged|\ldots\ declaration. +% By default it redefines |\everypar| to insert a zero space at the +% start of every paragraph, so the first word may be hyphenated. (See +% DogBook). +% +% +% As the environment makes a standard \LaTeX\ box, it will be indented +% by the paragraph indent at the start of a paragraph, and so will not +% fit on a line if given argument |\textwidth| unless it is preceded by +% |\noindent| or is in a |center| environment or some other +% environment with zero paragraph indent. +% +% \section{Features} +% +% +% You can use |\multicolumn| but if the multicolumn text turns out to +% be longer than the final calculated widths of the columns that it +% spans, then the final table will be too wide. +% +% |\verb| doesnt work. (except in restricted version as in tabularx) +% +% The whole table is evaluated twice, so take care with some +% \TeX\ constructions that may have side effects like writing to files. +% +% +% \section{Options} +% The following package option is defined: +% \begin{description} +% \item[debugshow] Causes a lot of stuff to appear on the terminal. +% I find this invaluable, you may find it less so. +% \end{description} +% +% \clearpage +% \section{Examples} +% +% \begin{center} +% +% With C columns\\ +%\begin{tabulary}{\linewidth}{C|C@{ (an @ expr.) }C} +% 1&the rain in spain falls mainly on the plain& +% the rain in spain falls mainly on the plain +% the rain in spain falls mainly on the plain\\ +% a&b&c\\ +% a a&b b&c c +% \end{tabulary} +% +% \bigskip +% +% With J columns\\ +%\begin{tabulary}{\linewidth}{J|J@{ (an @ expr.) }J} +% 1&the rain in spain falls mainly on the plain& +% the rain in spain falls mainly on the plain +% the rain in spain falls mainly on the plain\\ +% a&b&c\\ +% a a&b b&c c +% \end{tabulary} +% +% \bigskip +% +% With L, R and C columns, and a |\multicolumn|\\ +% \begin{tabulary}{\linewidth}{LR|LC} +% 1&the rain in spain falls mainly on the plain& +% the rain in spain falls mainly on the plain +% the rain in spain falls mainly on the plain& +% and now for something completely different\\ +% x&\multicolumn{3}{c} +% {some multicolumn text across columns 2--4}\\ +% a&b&c&d\\ +% a a&b b&c c&d d +% \end{tabulary} +% \end{center} +% +% \newcommand\test[3]{^^A +% \begin{center} +% \setlength\tymin{#1}^^A +% \setlength\tymax{#2}^^A +% \parbox{200pt} +% {\texttt{\string\tymin=#1\\ \string\tymax=\string#2}\\#3}\par +% \fbox{\tiny\begin{tabulary}{200pt}{|C|C|C|C|} +% a&b b b b& +% c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c& +% d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d +% d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d +% d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d +% d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d +% \end{tabulary}} +% \end{center}} +% +% \clearpage +% +% The following examples attempt to show the effect of the |\tymin| and +% |\tymax| parameters. One should also perhaps note that |\tymax| +% refers to the total column width (inluding any inter-column space, +% rules etc) but |\tymin| just refers to the width of the column entry +% (like the argument to the standard |p| column). +% +% \test{0pt}{\maxdimen}{Note how the first column is `squeezed'. +% In fact it is in such a narrow column that even `a' produces an +% overfull box warning!} +% +% \test{20pt}{\maxdimen}{Here increase \texttt{\string\tymin} so that +% columns b and a are not so narrow. `a' is set to its natural width, +% and `b' is set to \texttt{\string\tymin}.} +% +% \test{20pt}{200pt}{In the previous example, the large d column +% dominated the table, being a lot wider than the c column. By +% reducing \texttt{\string\tymax} can limit the width of column d +% producing more even column widths, but now producing an entry for d +% that is longer than that for c.} +% +% +% \StopEventually{} +% +% \clearpage +% \section{The Code} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \begin{macrocode} +\RequirePackage{array} +% \end{macrocode} +% +% \begin{macrocode} +\catcode`\Z=14 +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{debugshow}{\catcode`\Z=9\relax} +% \end{macrocode} +% +% \begin{macrocode} +\ProcessOptions +% \end{macrocode} +% \begin{macro}{\arraybackslash} +% Borrowed from tabularx. +% \begin{macrocode} +\def\arraybackslash{\let\\=\@arraycr} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@finalstrut} +% Bug fixed version from December 1995 \LaTeX\ release. +% Old bug going back to \LaTeX2.09\ldots +% \begin{macrocode} +\def\@finalstrut#1{% + \unskip\ifhmode\nobreak\fi\vrule\@width\z@\@height\z@\@depth\dp#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@count} +% Counter so that we know what column we are hacking around in. +% \begin{macrocode} +\newcount\TY@count +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tabulary} +% Top level macro for standard form. +% \begin{macrocode} +\def\tabulary{% + \let\TY@final\tabular + \let\endTY@final\endtabular + \TY@tabular} +% \end{macrocode} +% \end{macro} +% +%^^A% \begin{macro}{\tabulary*} +%^^A% Top level macro for star form, unboxes everything so it will break +%^^A% over a page. +%^^A% \begin{macrocode} +%^^A\@namedef{tabulary*}{% +%^^A \def\TY@final{\def\@arrayleft{\let\@arrayleft\relax +%^^A \global\setbox\@ne}\tabular[t]}% +%^^A \def\endTY@final{\endtabular\endgraf\unvbox\@ne}% +%^^A \TY@tabular} +%^^A\@namedef{endtabulary*}{\endtabulary} +%^^A% \end{macrocode} +%^^A% \end{macro} +% +% \begin{macro}{\TY@tabular} +% Looks a lot like tabularx at this stage. Grab everything into a +% token register. +% \begin{macrocode} +\def\TY@tabular#1{% + \edef\TY@{\@currenvir}% + {\ifnum0=`}\fi +% \end{macrocode} +% At this point need to save locally things that \textsf{tabulary} +% will globally mess up. These are restored at the end of the +% environment. +% \changes{v0.4}{1996/03/29} +% {Locally preserve global commands} +% \begin{macrocode} + \@ovxx\TY@linewidth + \@ovyy\TY@tablewidth + \count@\z@ + \@tempswatrue + \@whilesw\if@tempswa\fi{% + \advance\count@\@ne + \expandafter\ifx\csname TY@F\the\count@\endcsname\relax + \@tempswafalse + \else + \expandafter\let\csname TY@SF\the\count@\expandafter\endcsname + \csname TY@F\the\count@\endcsname + \global\expandafter\let\csname TY@F\the\count@\endcsname\relax + \expandafter\let\csname TY@S\the\count@\expandafter\endcsname + \csname TY@\the\count@\endcsname + \fi}% +% \end{macrocode} +% +% \begin{macrocode} + \global\TY@count\@ne + \TY@width\xdef{0pt}% + \global\TY@tablewidth\z@ + \global\TY@linewidth#1\relax +Z\message{^^J^^JTable^^J% +Z Target Width: \the\TY@linewidth^^J% +Z \string\tabcolsep: \the\tabcolsep\space +Z \string\arrayrulewidth: \the\arrayrulewidth\space +Z \string\doublerulesep: \the\doublerulesep^^J% +Z \string\tymin: \the\tymin\space +Z \string\tymax: \the\tymax^^J}% +% \end{macrocode} +% Placing this here means that nested tabulars will get this +% definition but that's probably OK, the extra code for LCR etc +% shouldn't do any harm +% \begin{macrocode} + \let\@classz\TY@classz +% \end{macrocode} +% +% \begin{macrocode} + \let\verb\TX@verb +% \end{macrocode} +% +% \begin{macrocode} + \toks@{}\TY@get@body} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@@mkpream} +% Saved version. +% \begin{macrocode} +\let\TY@@mkpream\@mkpream +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@mkpream} +% TY version. +% \begin{macrocode} +\def\TY@mkpream{% + \def\@addamp{% + \if@firstamp \@firstampfalse \else + \global\advance\TY@count\@ne + \edef\@preamble{\@preamble &}\fi + \TY@width\xdef{0pt}}% +% \end{macrocode} +% +% \begin{macrocode} + \def\@acol{% + \TY@subwidth\col@sep + \@addtopreamble{\hskip\col@sep}}% +% \end{macrocode} +% +% \begin{macrocode} + \let\@arrayrule\TY@arrayrule +% \end{macrocode} +% +% \begin{macrocode} + \let\@classvi\TY@classvi +% \end{macrocode} +% +% \begin{macrocode} + \def\@classv{\save@decl + \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@ + \sbox\z@{\d@llarbegin\@nextchar\d@llarend}% + \TY@subwidth{\wd\z@}% + \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}% + \prepnext@tok}% +% \end{macrocode} +% +% \begin{macrocode} + \global\let\@mkpream\TY@@mkpream +% \end{macrocode} +% +% \begin{macrocode} + \TY@@mkpream} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@arrayrule} +% \changes{v0.6}{2003/02/26}{macro added} +% Pull this out so the colortbl support below can redefine +% \begin{macrocode} +\def\TY@arrayrule{% + \TY@subwidth\arrayrulewidth + \@addtopreamble \vline} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@classvi} +% \changes{v0.6}{2003/02/26}{macro added} +% Pull this out so the colortbl support below can redefine +% \begin{macrocode} +\def\TY@classvi{\ifcase \@lastchclass + \@acol \or + \TY@subwidth\doublerulesep + \@addtopreamble{\hskip \doublerulesep}\or + \@acol \or + \@classvii + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@tab} +% First run a tabular with all the column types fudged +% so that the widths of any rules or @-expresions are noted. +% \begin{macrocode} +\def\TY@tab{% + \setbox\z@\hbox\bgroup +% \end{macrocode} +% Support displaymath by making it non-display in the first pass. +% (Other display environments defined in terms of |$$| would need +% to be added here by packages that define them.) +% \begin{macrocode} + \let\[$\let\]$% + \let\equation$\let\endequation$% +% \end{macrocode} +% +% \begin{macrocode} + \col@sep\tabcolsep + \let\d@llarbegin\begingroup\let\d@llarend\endgroup +% \end{macrocode} +% +% \begin{macrocode} + \let\@mkpream\TY@mkpream +% \end{macrocode} +% +% \begin{macrocode} + \def\multicolumn##1##2##3{\multispan##1\relax}% + \CT@start\TY@tabarray} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@tabarray} +% \changes{v0.7}{2003/09/07} +% {new macro to support [t] optional arg} +% \begin{macrocode} +\def\TY@tabarray{\@ifnextchar[{\TY@array}{\@array[t]}} +\def\TY@array[#1]{\@array[t]} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@width} +% Just a shorthand to access a column width macro. +% \begin{macrocode} +\def\TY@width#1{% + \expandafter#1\csname TY@\the\TY@count\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@subwidth} +% Subtract a width from the current column width and also +% The total line table width and the target line width. +% \begin{macrocode} +\def\TY@subwidth#1{% + \TY@width\dimen@ + \advance\dimen@-#1\relax + \TY@width\xdef{\the\dimen@}% + \global\advance\TY@linewidth-#1\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\endtabulary} +% First run one modified tabular, making sure to add a +% blank row (cf longtable) to the end in case the user supplied last +% row is hidden by an hline or something. +% \begin{macrocode} +\def\endtabulary{% + \gdef\@halignto{}% + \expandafter\TY@tab\the\toks@ + \crcr\omit + {\xdef\TY@save@row{}% + \loop + \advance\TY@count\m@ne + \ifnum\TY@count>\z@ + \xdef\TY@save@row{\TY@save@row&\omit}% + \repeat}\TY@save@row + \endarray\global\setbox1=\lastbox\setbox0=\vbox{\unvbox1 + \unskip\global\setbox1=\lastbox}\egroup +% \end{macrocode} +% Check that |\tymin| is not too large. +% \begin{macrocode} + \dimen@\TY@linewidth + \divide\dimen@\TY@count + \ifdim\dimen@<\tymin + \TY@warn{tymin too large (\the\tymin), resetting to \the\dimen@}% + \tymin\dimen@ + \fi +% \end{macrocode} +% Now take the last row apart, cf longtable or appendix D. +% \begin{macrocode} + \setbox\tw@=\hbox{\unhbox\@ne + \loop +\@tempdima=\lastskip +\ifdim\@tempdima>\z@ +Z \message{ecs=\the\@tempdima^^J}% + \global\advance\TY@linewidth-\@tempdima +\fi + \unskip + \setbox\tw@=\lastbox + \ifhbox\tw@ +Z \message{Col \the\TY@count: Initial=\the\wd\tw@\space}% + \ifdim\wd\tw@>\tymax + \wd\tw@\tymax +Z \message{> max\space}% +Z \else +Z \message{ \@spaces\space}% + \fi + \TY@width\dimen@ +Z \message{\the\dimen@\space}% + \advance\dimen@\wd\tw@ +Z \message{Final=\the\dimen@\space}% + \TY@width\xdef{\the\dimen@}% + \ifdim\dimen@<\tymin +Z \message{< tymin}% + \global\advance\TY@linewidth-\dimen@ + \expandafter\xdef\csname TY@F\the\TY@count\endcsname + {\the\dimen@}% + \else + \expandafter\ifx\csname TY@F\the\TY@count\endcsname\z@ +Z \message{***}% + \global\advance\TY@linewidth-\dimen@ + \expandafter\xdef\csname TY@F\the\TY@count\endcsname + {\the\dimen@}% + \else +Z \message{> tymin}% + \global\advance\TY@tablewidth\dimen@ + \global\expandafter\let\csname TY@F\the\TY@count\endcsname + \maxdimen + \fi\fi + \advance\TY@count\m@ne + \repeat}% +% \end{macrocode} +% +% A bit cheap just doing this four times, but prevents any +% possibilities of looping\ldots. +% \begin{macrocode} + \TY@checkmin + \TY@checkmin + \TY@checkmin + \TY@checkmin +% \end{macrocode} +% Reset the counter. +% \begin{macrocode} + \TY@count\z@ +% \end{macrocode} +% +% Reset the LCRJ column definition to set paragraphs to the calculated +% widths. +% \begin{macrocode} + \let\TY@box\TY@box@v +% \end{macrocode} +% +% Run a second tabular, and for the star form, unbox it. +% \begin{macrocode} + {\expandafter\TY@final\the\toks@\endTY@final}% +% \end{macrocode} +% +% Finish off by restoring global commands. +% \begin{macrocode} + \count@\z@ + \@tempswatrue + \@whilesw\if@tempswa\fi{% + \advance\count@\@ne + \expandafter\ifx\csname TY@SF\the\count@\endcsname\relax + \@tempswafalse + \else + \global\expandafter\let\csname TY@F\the\count@\expandafter\endcsname + \csname TY@SF\the\count@\endcsname + \global\expandafter\let\csname TY@\the\count@\expandafter\endcsname + \csname TY@S\the\count@\endcsname + \fi}% + \TY@linewidth\@ovxx + \TY@tablewidth\@ovyy +% \end{macrocode} +% +% \begin{macrocode} + \ifnum0=`{\fi}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@checkmin} +% Check that no column is squeezed below |\tymin|. If it is, fix the +% width of that column to |\tymin| and try again re-computing the +% ratio. (The new ratio will be smaller, and may squeeze yet more +% rows, so need to iterate this, currently just do it four times.) +% \begin{macrocode} +\def\TY@checkmin{% + \let\TY@checkmin\relax +\ifdim\TY@tablewidth>\z@ + \Gscale@div\TY@ratio\TY@linewidth\TY@tablewidth +% \changes{v0.9}{2008/12/01} +% {\cs{TY@linewidth}} + \ifdim\TY@tablewidth <\TY@linewidth + \def\TY@ratio{1}% + \fi +\else + \TY@warn{No suitable columns!}% + \def\TY@ratio{1}% +\fi +\count@\z@ +Z \message{^^JLine Width: \the\TY@linewidth, +Z Natural Width: \the\TY@tablewidth, +Z Ratio: \TY@ratio^^J}% +\@tempdima\z@ +\loop +\ifnum\count@<\TY@count +\advance\count@\@ne + \ifdim\csname TY@F\the\count@\endcsname>\tymin + \dimen@\csname TY@\the\count@\endcsname + \dimen@\TY@ratio\dimen@ + \ifdim\dimen@<\tymin +Z \message{Column \the\count@\space ->}% +% \end{macrocode} +% +% \changes{v0.4}{1996/03/29} +% {\cs{global} added} +% \begin{macrocode} + \global\expandafter\let\csname TY@F\the\count@\endcsname\tymin + \global\advance\TY@linewidth-\tymin + \global\advance\TY@tablewidth-\csname TY@\the\count@\endcsname + \let\TY@checkmin\TY@@checkmin + \else +% \end{macrocode} +% +% \changes{v0.4}{1996/03/29} +% {\cs{xdef} not \cs{edef}} +% \begin{macrocode} + \expandafter\xdef\csname TY@F\the\count@\endcsname{\the\dimen@}% + \advance\@tempdima\csname TY@F\the\count@\endcsname + \fi + \fi +Z \dimen@\csname TY@F\the\count@\endcsname\message{\the\dimen@, }% +\repeat +Z \message{^^JTotal:\the\@tempdima^^J}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@@checkmin} +% Saved value +% \begin{macrocode} +\let\TY@@checkmin\TY@checkmin +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{TY@linewidth} +% Stores the target width. +% \begin{macrocode} +\newdimen\TY@linewidth +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tyformat} +% What to do with columns +% \begin{macrocode} +\def\tyformat{\everypar{{\nobreak\hskip\z@skip}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{tymin} +% Columns narrower than this are not fudged. +% \begin{macrocode} +\newdimen\tymin +\tymin=10pt +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{tymin} +% Columns wider than this are all treated alike and set to the same +% width, to stop one particularly long entry hijacking the entire +% table. +% \begin{macrocode} +\newdimen\tymax +\tymax=2\textwidth +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@testpatch} +% \iffalse +% Add |s| possibility. This works for \emph{all} |array| and |tabular| +% environments. +% \fi +% Also add |LCRJ| although these don't do anything useful +% except in |tabulary|. +% \begin{macrocode} +\def\@testpach{\@chclass + \ifnum \@lastchclass=6 \@ne \@chnum \@ne \else + \ifnum \@lastchclass=7 5 \else + \ifnum \@lastchclass=8 \tw@ \else + \ifnum \@lastchclass=9 \thr@@ + \else \z@ + \ifnum \@lastchclass = 10 \else + \edef\@nextchar{\expandafter\string\@nextchar}% + \@chnum + \if \@nextchar c\z@ \else + \if \@nextchar l\@ne \else + \if \@nextchar r\tw@ \else +% \if \@nextchar s6 \else + \if \@nextchar C7 \else + \if \@nextchar L8 \else + \if \@nextchar R9 \else + \if \@nextchar J10 \else + \z@ \@chclass + \if\@nextchar |\@ne \else + \if \@nextchar !6 \else + \if \@nextchar @7 \else + \if \@nextchar <8 \else + \if \@nextchar >9 \else + 10 + \@chnum + \if \@nextchar m\thr@@\else + \if \@nextchar p4 \else + \if \@nextchar b5 \else + \z@ \@chclass \z@ \@preamerr \z@ \fi \fi \fi \fi\fi \fi \fi\fi \fi +% \fi + \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@classz} +% Here hacked around without the respect Frank's code deserves\ldots +% \begin{macrocode} +\def\TY@classz{% + \@classx + \@tempcnta\count@ + \ifx\TY@box\TY@box@v + \global\advance\TY@count\@ne + \fi + \let\centering c% + \let\raggedright\noindent + \let\raggedleft\indent + \let\arraybackslash\relax + \prepnext@tok + \ifnum\@chnum<4 + \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@ + \fi + \ifnum\@chnum=6 + \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@ + \fi + \@addtopreamble{% + \ifcase\@chnum + \hfil \d@llarbegin\insert@column\d@llarend \hfil \or + \kern\z@ + \d@llarbegin \insert@column \d@llarend \hfil \or + \hfil\kern\z@ \d@llarbegin \insert@column \d@llarend \or + $\vcenter\@startpbox{\@nextchar}\insert@column \@endpbox $\or + \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or + \vbox \@startpbox{\@nextchar}\insert@column \@endpbox \or + \d@llarbegin \insert@column \d@llarend \or% dubious "s" case + \TY@box\centering\or + \TY@box\raggedright\or + \TY@box\raggedleft\or + \TY@box\relax + \fi}\prepnext@tok} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@box} +% The argument is |\centering| etc depending on whether LCRJ is used. +% However in this version the entries are set in horizontal mode with +% definitions mimicing the standard lcr columns. Later |\TY@box| will +% be redefined to |\TY@box@v| which really sets the entries in +% vertical mode. +% \begin{macrocode} +\def\TY@box#1{% + \ifx\centering#1% + \hfil \d@llarbegin\insert@column\d@llarend \hfil \else + \ifx\raggedright#1% + \kern\z@%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + \d@llarbegin \insert@column \d@llarend \hfil \else + \ifx\raggedleft#1% + \hfil\kern\z@ \d@llarbegin \insert@column \d@llarend \else + \ifx\relax#1% + \d@llarbegin \insert@column \d@llarend + \fi \fi \fi \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@box@v} +% The version to use in a final run, set the |CLRJ| columns in a +% parbox of the appropriate width. +% \begin{macrocode} +\def\TY@box@v#1{% + \vtop \@startpbox{\csname TY@F\the\TY@count\endcsname}% + #1\arraybackslash\tyformat + \insert@column\@endpbox} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@tablewidth} +% The natural width of the table on the first run. +% \begin{macrocode} +\newdimen\TY@tablewidth +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Gscale@div} +% Stolen from graphics package. +% \begin{macrocode} +\def\Gscale@div#1#2#3{% + \setlength\dimen@{#3}% + \ifdim\dimen@=\z@ + \PackageError{graphics}{Division by 0}\@eha + \dimen@#2% + \fi + \edef\@tempd{\the\dimen@}% + \setlength\dimen@{#2}% + \count@65536\relax + \ifdim\dimen@<\z@ + \dimen@-\dimen@ + \count@-\count@ + \fi + \loop + \ifdim\dimen@<8192\p@ + \dimen@\tw@\dimen@ + \divide\count@\tw@ + \repeat + \dimen@ii=\@tempd\relax + \divide\dimen@ii\count@ + \divide\dimen@\dimen@ii + \edef#1{\strip@pt\dimen@}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@get@body} +% Place all tokens as far as the first |\end| into a token register. +% Then call |\TY@find@end| to see if we are at |\end{tabulary}|. +% \begin{macrocode} +\long\def\TY@get@body#1\end + {\toks@\expandafter{\the\toks@#1}\TY@find@end} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@find@end} +% If we are at |\end{tabulary}|, call |\end{tabulary}|, otherwise +% add |\end{...}| to the register, and call |\TY@get@body| again. +% \begin{macrocode} +\def\TY@find@end#1{% + \def\@tempa{#1}% + \ifx\@tempa\TY@\def\@tempa{\end{#1}}\expandafter\@tempa + \else\toks@\expandafter + {\the\toks@\end{#1}}\expandafter\TY@get@body\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TY@warn} +% Warning messages. +% \begin{macrocode} +\def\TY@warn{% + \PackageWarning{tabulary}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +\catcode`\Z=11 +% \end{macrocode} +% +% \textsf{colortbl} support. +% \begin{macrocode} +\AtBeginDocument{ +\@ifpackageloaded{colortbl}{% +\expandafter\def\expandafter\@mkpream\expandafter#\expandafter1% + \expandafter{% + \expandafter\let\expandafter\CT@setup\expandafter\relax + \expandafter\let\expandafter\CT@color\expandafter\relax + \expandafter\let\expandafter\CT@do@color\expandafter\relax + \expandafter\let\expandafter\color\expandafter\relax + \expandafter\let\expandafter\CT@column@color\expandafter\relax + \expandafter\let\expandafter\CT@row@color\expandafter\relax + \expandafter\let\expandafter\CT@cell@color\expandafter\relax + \@mkpream{#1}} +\let\TY@@mkpream\@mkpream +\def\TY@classz{% + \@classx + \@tempcnta\count@ + \ifx\TY@box\TY@box@v + \global\advance\TY@count\@ne + \fi + \let\centering c% + \let\raggedright\noindent + \let\raggedleft\indent + \let\arraybackslash\relax + \prepnext@tok +\expandafter\CT@extract\the\toks\@tempcnta\columncolor!\@nil + \ifnum\@chnum<4 + \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@ + \fi + \ifnum\@chnum=6 + \global\expandafter\let\csname TY@F\the\TY@count\endcsname\z@ + \fi + \@addtopreamble{% + \setbox\z@\hbox\bgroup\bgroup + \ifcase\@chnum + \hskip\stretch{.5}\kern\z@ + \d@llarbegin\insert@column\d@llarend\hskip\stretch{.5}\or + \kern\z@%<<<<<<<<<<<<<<<<<<<<<<<<<<< + \d@llarbegin \insert@column \d@llarend \hfill \or + \hfill\kern\z@ \d@llarbegin \insert@column \d@llarend \or + $\vcenter\@startpbox{\@nextchar}\insert@column \@endpbox $\or + \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or + \vbox \@startpbox{\@nextchar}\insert@column \@endpbox \or + \d@llarbegin \insert@column \d@llarend \or% dubious s case + \TY@box\centering\or + \TY@box\raggedright\or + \TY@box\raggedleft\or + \TY@box\relax + \fi + \egroup\egroup +\begingroup + \CT@setup + \CT@column@color + \CT@row@color + \CT@cell@color + \CT@do@color +\endgroup + \@tempdima\ht\z@ + \advance\@tempdima\minrowclearance + \vrule\@height\@tempdima\@width\z@ +\unhbox\z@ +}\prepnext@tok}% +% \end{macrocode} +% +% \begin{macrocode} + \def\TY@arrayrule{% + \TY@subwidth\arrayrulewidth + \@addtopreamble{{\CT@arc@\vline}}}% +% \end{macrocode} +% +% \begin{macrocode} + \def\TY@classvi{\ifcase \@lastchclass + \@acol \or + \TY@subwidth\doublerulesep + \ifx\CT@drsc@\relax + \@addtopreamble{\hskip\doublerulesep}% + \else + \@addtopreamble{{\CT@drsc@\vrule\@width\doublerulesep}}% + \fi\or + \@acol \or + \@classvii + \fi}% +% \end{macrocode} +% +% \begin{macrocode} +}{% +\let\CT@start\relax +} +% \end{macrocode} +% end of at begin document +% \begin{macrocode} +} +% \end{macrocode} +% +% \begin{macro}{\TX@warn} +% \changes{v0.6}{2003/02/26}{macro added} +% |\verb| support, uses same csnames as in TX so they share code if +% both loaded (this version names tabulary in the warning though). +% See tabularx for documentation. +% \begin{macrocode} +{\uccode`\*=`\ % +\uppercase{\gdef\TX@verb{% + \leavevmode\null\TX@vwarn + {\ifnum0=`}\fi\ttfamily\let\\\ignorespaces + \@ifstar{\let~*\TX@vb}{\TX@vb}}}} +\def\TX@vb#1{\def\@tempa##1#1{\toks@{##1}\edef\@tempa{\the\toks@}% + \expandafter\TX@v\meaning\@tempa\\ \\\ifnum0=`{\fi}}\@tempa!} +\def\TX@v#1!{\afterassignment\TX@vfirst\let\@tempa= } +\begingroup +\catcode`\*=\catcode`\# +\catcode`\#=12 +\gdef\TX@vfirst{% + \if\@tempa#% + \def\@tempb{\TX@v@#}% + \else + \let\@tempb\TX@v@ + \if\@tempa\space~\else\@tempa\fi + \fi + \@tempb} +\gdef\TX@v@*1 *2{% + \TX@v@hash*1##\relax\if*2\\\else~\expandafter\TX@v@\fi*2} +\gdef\TX@v@hash*1##*2{*1\ifx*2\relax\else#\expandafter\TX@v@hash\fi*2} +\endgroup +\def\TX@vwarn{% + \@warning{\noexpand\verb may be unreliable inside tabularx/y}% + \global\let\TX@vwarn\@empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +% +% \end{macrocode} +% \PrintIndex +% \Finale +% diff --git a/macros/latex/contrib/tabulary/tabulary.ins b/macros/latex/contrib/tabulary/tabulary.ins new file mode 100644 index 0000000000..be9e1c160d --- /dev/null +++ b/macros/latex/contrib/tabulary/tabulary.ins @@ -0,0 +1,8 @@ +\def\batchfile{tabulary.ins} +\input docstrip +\preamble +DRAFT VERSION +\endpreamble + +\keepsilent +\generateFile{tabulary.sty}{f}{\from{tabulary.dtx}{package}} diff --git a/macros/latex/contrib/tabulary/tabulary.pdf b/macros/latex/contrib/tabulary/tabulary.pdf new file mode 100644 index 0000000000..c5a8ed2e61 Binary files /dev/null and b/macros/latex/contrib/tabulary/tabulary.pdf differ -- cgit v1.2.3