PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tabellengebastel- Ideen gesucht



ctansearch
23-05-2013, 00:35
Hallo
Ich habe mir eine Tabellendarstellung gebastelt, die es ermöglicht, eine Tabelle fortlaufend zeilenweise als Teiltabelle auszugeben. Sie kann dabei unterbrochen werden und an beliebiger Stelle fortgeführt werden..

Dazu brauche ich derzeit eine Tabellenpräamble, welche die Daten im Befehl \def\cell{...} auflistet, um sie später im Text abzurufen.

Den dazu verwendeten Befehl

\cb[1,1,0]{\thetable,\thetabcols,\thetablines}
(Die Zahlenwerte sind hier nur Platzhalter) würde ich gerne vereinfachen, sodaß man nicht immer die Werte [1,1,0] selbst eingeben muß. Hat jemand dazu eine Idee?

Weiterführend soll es möglich sein, mehrere Tabellen vorzudefinieren und später im Text abzurufen, zum Beispiel, um Teilabschnitte und Auszüge verschiedener Tabellen miteinander zu vergleichen.

tablenumbers.sty

\RequirePackage{longtable}
\newcounter{tablines}%
\newcounter{tabcols}%
\newcounter{tabpage}%
\newcounter{maxcols}%
\setcounter{maxcols}{3}
\newdimen\colwidth \colwidth=1em%
\newcommand{\thehead}{}%
\newcommand{\tabend}{ \end{longtable}}
\parindent=0pt%
\def\cb[#1,#2,#3]#4{\ifnum\thetable=#1\ifnum\thetabcols=#2\ifnum\th etablines=#3
{#4}\else \fi\fi\fi}%
\def\cell{}%
\def\numbercol{r}
\newcommand{\tabhead}{\begin{longtable}[l]{{\numbercol}*{\themaxcols}{p{\colwidth}}}\setcoun ter{table}{1}\\\caption{Fortlaufende
Tabelle }\\\thehead \endfirsthead \thehead\endhead \setcounter{tabcols}{0}%
}%
\def\tabline{\thetablines
&\cell&\cell&\cell&\cell
\setcounter{tabcols}{0}\stepcounter{tablines}\\}
\def\tabliner[#1]{
\ifnum #1>0 \tabline \else \fi
\ifnum #1>1 \tabline \else \fi
\ifnum #1>2 \tabline \else \fi
\ifnum #1>3 \tabline \else \fi
\ifnum #1>4 \tabline \else \fi
\ifnum #1>5 \tabline \else \fi
\ifnum #1>6 \tabline \else \fi
\ifnum #1>7 \tabline \else \fi
\ifnum #1>8 \tabline \else \fi
\ifnum #1>9 \tabline \else \fi
\ifnum #1>10 \tabline \else \fi
\ifnum #1>11 \tabline \else \fi
\ifnum #1>12 \tabline \else \fi
\ifnum #1>13 \tabline \else \fi}
%

tablenumbers.tex

\documentclass[a4paper]{article}%
\usepackage[utf8]{inputenc}%
\usepackage[ngerman]{babel}%
\usepackage{tablenumbers,longtable,blindtext}%
\setcounter{maxcols}{4}
\colwidth=2cm
\def\cell{%
\cb[1,1,0]{\thetable,\thetabcols,\thetablines}\cb[1,2,0]{\thetable,\thetabcols,\thetablines}\cb[1,3,0]{\thetable,\thetabcols,\thetablines}%
\cb[1,1,1]{\thetable,\thetabcols,\thetablines}\cb[1,2,1]{\thetable,\thetabcols,\thetablines}%
\cb[1,1,2]{\thetable,\thetabcols,\thetablines}\cb[1,2,2]{\thetable,\thetabcols,\thetablines}%
\cb[1,1,3]{\thetable,\thetabcols,\thetablines}\cb[1,2,3]{\thetable,\thetabcols,\thetablines}%
\cb[1,1,4]{\thetable,\thetabcols,\thetablines}\cb[1,2,4]{\thetable,\thetabcols,\thetablines}%
\cb[1,1,5]{\thetable,\thetabcols,\thetablines}\cb[1,2,5]{\thetable,\thetabcols,\thetablines}%
\stepcounter{tabcols}}
\begin{document}%
\blindtext
\tabhead%
\tabliner[2]
\tabend
\blindtext
\tabhead%
\tabliner[2]
\tabend
\tabhead%
\tabliner[2]
\tabend
\listoftables
\end{document}%

rais
27-05-2013, 11:11
Moin moin,


Dazu brauche ich derzeit eine Tabellenpräamble, welche die Daten im Befehl \def\cell{...} auflistet, um sie später im Text abzurufen.

wie wär's ohne Tabellenpräambel? Etwa


\documentclass[a4paper]{article}%
\usepackage[utf8]{inputenc}%
\usepackage[ngerman]{babel}%
\usepackage{tablenumbers2,blindtext}%
\usepackage{filecontents}
\begin{filecontents*}{tablenumbers2.sty}
\NeedsTeXFormat{LaTeX2e}[1995/06/01]
\ProvidesPackage{tablenumbers2}[2013/05/27 v0.0 alpha Tabellengebastel (ctansearch/rais)]
\newcommand*\tn@warn[1]{\PackageWarning{tablenumbers2}{#1}}% damit man den Paketnamen nicht für jede Warnung mitzuschleppen braucht
\newcommand*\tn@info[1]{\PackageInfo{tablenumbers2}{#1}}
\newcommand*\tn@table@align{}
\DeclareOption{c}{\renewcommand*\tn@table@align{ce nter}}
\DeclareOption{l}{\renewcommand*\tn@table@align{fl ushleft}}
\DeclareOption{r}{\renewcommand*\tn@table@align{fl ushright}}
\DeclareOption*{\tn@warn{Unknown option `\CurrentOption' (ignored)}}
\ExecuteOptions{l}
\ProcessOptions\relax

\newif\iftnresume
\newcommand*\tn@tmpa{}% wird andernorts überschrieben
\newcommand*\tn@tmpb{}% wird andernorts überschrieben
\newcommand*\tn@captiontext{}% wird andernorts überschrieben
\newcounter{tn@tabline}
\newcounter{tn@tabcol}[tn@tabline]
\newcounter{tn@table}
\newcounter{tn@tmp}
\let\thetn@table\thetable
\newcounter{tn@effective@columns}% Anzahl effektiver Spalten
\setcounter{tn@effective@columns}{3}
\newcounter{tn@max@columns}% max. Anzahl effektiver Spalten
\setcounter{tn@max@columns}{12}% oder was weiß ich
\newlength\colwidth %die LaTeX-Variante, um eine Länge zu deklarieren
\setlength\colwidth{1em}% und festzulegen
%Wobei zu überlegen wäre, ob man nicht analog dazu die Nummernspalte ebenfalls
%in eine p-Spalte stecken sollte -- sonst hat man wohlmöglich unterschiedlich breite
%Tabellen, die zusammen gehören sollen (A endet bei Zeile 9, B wird zweistellig o.ä.)
\newlength\numbercolwidth
\newcommand\cell[1]{\tn@warn{`\string\cell' out of proper environment}}%
\newcommand*\seteffectivecolumns[1]{%
\ifnum#1>\value{tn@max@columns}\relax
\tn@warn{Restricting number of columns to \arabic{tn@max@columns} (you wanted #1)}%
\setcounter{tn@effective@columns}{\value{tn@max@co lumns}}%
\else
\tn@info{Accepting `#1' as number of columns}%
\setcounter{tn@effective@columns}{#1}%
\fi
}
\newenvironment{tntable}[2][]{%
\renewcommand\cell[1]{%
\ifnum\value{tn@tabcol}=0\relax
\thetn@tabline
\else
\iftnresume
\ldots
\setcounter{tn@tmp}{0}%
\edef\tn@tmpa{}%
\loop \stepcounter{tn@tmp}\edef\tn@tmpa{\tn@tmpa&}%
\ifnum\c@tn@tmp<\c@tn@tabcol\relax\repeat
\tn@tmpa
\global\tnresumefalse
\fi
\fi
\stepcounter{tn@tabcol}%
\ifnum\value{tn@tabcol}>\value{tn@effective@columns}\relax
\stepcounter{tn@tabline}% starte neue Zeile
\stepcounter{tn@tabcol}%
\tabularnewline
\thetn@tabline
\fi
&##1
}%
\renewcommand*\thetable{\thetn@table-\alph{tn@table}}%
\ifx\relax#1\relax%neue Tabelle
\setcounter{tn@table}{0}%
\setcounter{tn@tabcol}{0}%
\setcounter{tn@tabline}{0}%
\else %Test auf `resume':
\edef\tn@tmpa{#1}%
\edef\tn@tmpb{resume}%
\ifx\tn@tmpa\tn@tmpb\relax %bisherige Tabelle soll fortgesetzt werden
\tnresumetrue
\addtocounter{table}{-1}%
\else % weder leer noch `resume:
\seteffectivecolumns{#1}% neue Anzahl (eff.) Spalten
\setcounter{tn@table}{0}%
\setcounter{tn@tabcol}{0}%
\setcounter{tn@tabline}{0}%
\fi
\fi
\refstepcounter{tn@table}%
\expandafter\begin{\tn@table@align}
\ifx\relax#2\relax
\iftnresume\relax
\else
\tn@warn{Empty caption text for tntable \thetable}%
\xdef\tn@captiontext{#2}%
\fi
\else
\xdef\tn@captiontext{#2}%
\fi
\def\@captype{table}% damit \caption `weiß', daß es hier um eine Tabelle geht
\caption{\tn@captiontext}
\begin{tabular}{@{}r*{\arabic{tn@effective@columns }}{p{\colwidth}}@{}}
}{%
\end{tabular}
\expandafter\end{\tn@table@align}
}
\endinput
\end{filecontents*}
\colwidth=2cm
\begin{document}%
\blindtext
\begin{tntable}[4]{Test}
\cell{a}\cell{b}\cell{c}\cell{d}\cell{e}\cell{f}
\end{tntable}
\blindtext
\begin{tntable}[resume]{}
\cell{g}\cell{h}\cell{i}\cell{j}\cell{k}\cell{l}\c ell{m}\cell{n}\cell{o}\cell{p}\cell{q}
\end{tntable}
\setlength\colwidth{4cm}
\begin{tntable}[3]{Noch'n Test}
\cell{a}\cell{b}\cell{c}\cell{d}\cell{e}
\end{tntable}
\begin{tntable}[resume]{}
\cell{f}\cell{g}\cell{h}\cell{i}\cell{j}\cell{k}\c ell{l}\cell{m}\cell{n}\cell{o}\cell{p}\cell{q}
\end{tntable}
\listoftables
\end{document}

PS) Nicht von der Fehlermeldung im ersten Lauf erschrecken lassen. Ich Dösbaddel versuche, erst die neue Datei zu laden, bevor ich sie erstelle. Mea Culpa...

MfG

ctansearch
27-05-2013, 21:33
Sieht sehr gut aus, besonders die Möglichkeit, eine Tabelle mitten in der Zeile zu unterbrechen und dann fortzusetzen. Nehme mir später Zeit, es zu testen und nachzuvollziehen.

Warum hast Du tabular und nicht longtable genommen?

PS: Ich denke, das wäre es wert, als Paket auf CTAN zu landen, auch ohne Maintainer

ctansearch
27-05-2013, 23:08
@rais

Hallo rais,
wenn ich es richtig verstehe, hast Du eine Möglichkeit definiert, die Anzahl der Spalten dynamisch festzulegen und die Daten jeweils für ein Teiltabelle einzugeben. Damit kann man fortlaufende Daten in unterschiedlich breiten Tabellen sehr bequem darstellen. Sowas gibt es, glaube ich, noch nicht. Das ist beeindruckend und nützlich, es ist aber nicht das, was ich beabsichtigte. Vielleicht habe ich aber auch was in Deiner Lösung übersehen.

Was ich möchte ist, Tabellen zeilenweise an beliebiger Stelle darzustellen und jeweils die Anzahl der Zeilen festzulegen, die ausgegeben werden. Beim jeweils nächsten Aufruf sollen die jeweils folgenden Zeilen ausgegeben werden. Dabei ist die dynamische Spaltenbreite eventl. sehr nützlich, da man die Tabelle sowohl vertika ,. als auch horizontal anpassen könnte.
Eine Verbindung beider Ansätze wäre super.

Gruß

rais
28-05-2013, 02:59
Moin moin,

Sieht sehr gut aus, besonders die Möglichkeit, eine Tabelle mitten in der Zeile zu unterbrechen und dann fortzusetzen.

das ist aus einem Fehler entstanden: ich hatte vergessen, beim Start einer Folge-Teiltabelle den Spaltenzähler zurückzusetzen. Dann hab ich mich gefragt, wie es wohl aussieht, wenn man entsprechende Leerspalten davor setzt (darauf ist die Sache mit dem \loop...\repeat entstanden).


Warum hast Du tabular und nicht longtable genommen?

Kein besonderer Grund, außer vielleicht, daß es sich um Teiltabellen handeln soll (dafür schien mir longtable übertrieben). Davon abgesehen, wollte ich nur testen, ob's auch ohne geht.;)

wenn ich es richtig verstehe, hast Du eine Möglichkeit definiert, die Anzahl der Spalten dynamisch festzulegen und die Daten jeweils für ein Teiltabelle einzugeben.

dynamisch? Eher im Gegenteil: für mich sind hier nur Teile mit gleicher Spaltenanzahl zusammengehörend. Wobei man theoretisch zwischen zwei Teiltabellen \seteffectivecolums aufrufen und damit die Anzahl Spalten für Folgetabellen beeinflussen kann (nichts anderes hast Du vorher mit \setcounter{maxcols} gemacht).
Wenn im optionalen Parameter `resume' angegeben ist, gehört das Teil zur vorherigen Tabelle (Spaltenanzahl bleibt gleich, und wenn kein anderer Text angegeben ist, auch der Text in der \caption).
Wenn gar nichts im optionalen Argument angegeben ist, gehe ich von einer neuen Tabelle aus (bei bisher gleicher Spaltenanzahl).
Ansonsten interpretiere ich den im optionalen Parameter angegebenen Wert als neue Spaltenanzahl (und gehe damit auch davon aus, daß hier eine neue Tabelle erstellt werden soll, vgl. ``Noch'n Test'' im Test).
Aber ich hab mich sowieso gefragt, wie bei Deinem Einsatz zwischen mehreren Tabellen unterschieden werden soll (zumal Du den Tabellenzähler in \tabhead auf 1 fixiert hast). Die Angabe der Spaltenanzahl schien mir dafür ein geeigneter Ansatz.


Was ich möchte ist, Tabellen zeilenweise an beliebiger Stelle darzustellen und jeweils die Anzahl der Zeilen festzulegen, die ausgegeben werden.

Das versteh ich nicht: wozu die Anzahl Zeilen festlegen, wenn man es -- imho bequemer -- direkt über den zur Verfügung gestellten Inhalt realisieren kann?

MfG

ctansearch
28-05-2013, 15:43
Das versteh ich nicht: wozu die Anzahl Zeilen festlegen, wenn man es -- imho bequemer -- direkt über den zur Verfügung gestellten Inhalt realisieren kann?

Ursprünglich ging die Idee davon aus, Tabellen aus Calculationsprogrammen zu übernehmen und die Zelleninhalte zwischen möglichst wenig Latex-Code zu kapseln und die gesamte Tabelle in einer externen Datei abzulegen, aus dem man dann Zeilen nach Bedarf abruft. (Die ursprüngliche
\def\cell{} Sequenz.)

Die Unterscheidung zwischen mehreren Tabellen hatte ich noch nicht hingekriegt, deshalb hatte ich den counter{table} absolut gesetzt.

ctansearch
29-05-2013, 02:32
Sorry, Beitrag zurückgezogen. Ich schrieb:

....aber im Moment sehe ich besonders den Effekt, Daten zeilenweise darzustellen und einen Umbruch automatisch nach der vorgegebenen Spaltenzahl zu setzen. (siehe Beispiel). Das ist nützlich, aber es ist im eigentlichen Sinne keine Tabelle, da die Daten nicht spaltenweise nach Kategorie (Spaltenkopf) geordnet werden. "

Natürlich entsteht eine korrekte Tablelle, wenn man die Daten entsprechend so anordnet wie es die Spaltenzahll vorgibt..

rais
01-06-2013, 11:05
Eine Verbindung beider Ansätze wäre super.

Versuch macht kluch


\documentclass[a4paper]{article}%
\usepackage[utf8]{inputenc}%
\usepackage[ngerman]{babel}%
\usepackage{filecontents}
\begin{filecontents*}{tablenumbers2.sty}
\NeedsTeXFormat{LaTeX2e}[1995/06/01]
\ProvidesPackage{tablenumbers2}[2013/06/01 v0.0 beta Tabellengebastel (ctansearch/rais)]
\newcommand*\tn@warn[1]{\PackageWarning{tablenumbers2}{#1}}% damit man den Paketnamen nicht für jede Warnung mitzuschleppen braucht
\newcommand*\tn@info[1]{\PackageInfo{tablenumbers2}{#1}}
\newcommand*\tn@table@align{}
\DeclareOption{c}{\renewcommand*\tn@table@align{ce nter}}
\DeclareOption{l}{\renewcommand*\tn@table@align{fl ushleft}}
\DeclareOption{r}{\renewcommand*\tn@table@align{fl ushright}}
\DeclareOption*{\tn@warn{Unknown option `\CurrentOption' (ignored)}}
\ExecuteOptions{l}
\ProcessOptions\relax

\RequirePackage{array}

\newif\iftnresume
\newtoks\tn@currenttab
\newcommand*\tn@tmpa{}% wird andernorts überschrieben
\newcommand*\tn@tmpb{}% wird andernorts überschrieben
\newcommand*\tn@currentelement{}%
\newcommand*\tn@addcell{}
\newcommand*\tn@captiontext{}% wird andernorts überschrieben
\newcommand*\tn@lintab{}% Platzhalter für die lineare Tabelle
\newcounter{tn@element}% aktuelles Element
\newcounter{tn@elements}% bisher abgearbeitete Elemente
\newcounter{tn@lastelement}% das letzte aktuell zu bearbeitende Element
\newcounter{tn@tabline}
\newcounter{tn@tabcol}[tn@tabline]
\newcounter{tn@table}
\newcounter{tn@tmp}
\newcommand\deflintab[1]{\def\tn@lintab{#1}\setcounter{tn@elements}{0}}
\let\thetn@table\thetable
\newcounter{tn@effective@columns}% Anzahl effektiver Spalten
\setcounter{tn@effective@columns}{3}
\newcounter{tn@max@columns}% max. Anzahl effektiver Spalten
\setcounter{tn@max@columns}{12}% oder was weiß ich
\newlength\colwidth %die LaTeX-Variante, um eine Länge zu deklarieren
\setlength\colwidth{1em}% und festzulegen
\newlength\numbercolwidth
\settowidth\numbercolwidth{\ldots}
\newcommand\cell[1]{\tn@warn{`\string\cell' out of proper environment}}
\newcommand*\seteffectivecolumns[1]{%
\ifnum#1>\value{tn@max@columns}\relax
\tn@warn{Restricting number of columns to \arabic{tn@max@columns} (you wanted #1)}%
\setcounter{tn@effective@columns}{\value{tn@max@co lumns}}%
\else
\tn@info{Accepting `#1' as number of columns}%
\setcounter{tn@effective@columns}{#1}%
\fi
}
\newenvironment{tntable}[2][]{%
\renewcommand\cell[1]{%
\ifnum\value{tn@tabcol}=0\relax
\thetn@tabline
\else
\iftnresume
\ldots
\setcounter{tn@tmp}{0}%
\edef\tn@tmpa{}%
\loop \stepcounter{tn@tmp}\edef\tn@tmpa{\tn@tmpa&}%
\ifnum\c@tn@tmp<\c@tn@tabcol\relax\repeat
\tn@tmpa
\global\tnresumefalse
\fi
\fi
\stepcounter{tn@tabcol}%
\ifnum\value{tn@tabcol}>\value{tn@effective@columns}\relax
\stepcounter{tn@tabline}% starte neue Zeile
\stepcounter{tn@tabcol}%
\tabularnewline
\thetn@tabline
\fi
&##1
}%
\renewcommand*\thetable{\thetn@table-\alph{tn@table}}%
\ifx\relax#1\relax%neue Tabelle
\setcounter{tn@table}{0}%
\setcounter{tn@tabcol}{0}%
\setcounter{tn@tabline}{0}%
\else %Test auf `resume':
\edef\tn@tmpa{#1}%
\edef\tn@tmpb{resume}%
\ifx\tn@tmpa\tn@tmpb\relax %bisherige Tabelle soll fortgesetzt werden
\tnresumetrue
\addtocounter{table}{-1}%
\else % weder leer noch `resume:
\seteffectivecolumns{#1}% neue Anzahl (eff.) Spalten
\setcounter{tn@table}{0}%
\setcounter{tn@tabcol}{0}%
\setcounter{tn@tabline}{0}%
\fi
\fi
\refstepcounter{tn@table}%
\ifhmode\par\fi\noindent\minipage{\linewidth}% damit die Tabellenüberschrift nicht vom Körper getrennt werden kann
\expandafter\begin{\tn@table@align}
\ifx\relax#2\relax
\iftnresume\relax
\else
\tn@warn{Empty caption text for tntable \thetable}%
\xdef\tn@captiontext{#2}%
\fi
\else
\xdef\tn@captiontext{#2}%
\fi
\def\@captype{table}% damit \caption `weiß', daß es hier um eine Tabelle geht
\caption{\tn@captiontext}
\begin{tabular}{@{}>{\raggedleft}p{\numbercolwidth}*{\arabic{tn@effect ive@columns}}{p{\colwidth}}@{}}
}{%
\end{tabular}
\expandafter\end{\tn@table@align}
\endminipage
}
\newcommand*\tntab[3][]{%
\setcounter{tn@lastelement}{\value{tn@elements}}%
\addtocounter{tn@lastelement}{#2}%
\setcounter{tn@element}{0}%Schleifenzähler
\tn@currenttab={}% und Tabelleninhalt initialisieren
\begin{tntable}[#1]{#3}
\@for\tn@currentelement:=\tn@lintab\do{%
\stepcounter{tn@element}%
\ifnum\value{tn@element}>\value{tn@elements}\relax
\ifnum\value{tn@element}>\value{tn@lastelement}\relax
\else
\edef\tn@addcell{\noexpand\tn@currenttab={\the\tn@ currenttab\noexpand\cell{\tn@currentelement}}}%
\tn@addcell
\fi
\fi
}%
\the\tn@currenttab
\end{tntable}
\ifnum\value{tn@element}<\value{tn@lastelement}\relax
\tn@warn{Current element list exhausted!^^J
You wanted to get \arabic{tn@lastelement}, but only \arabic{tn@element} were present}
\fi
\setcounter{tn@elements}{\value{tn@lastelement}}% Start für Folgetabelle festlegen
}%\tntab[Anzahl Spalten]{Anzahl Elemente}{Überschrift}
\endinput
\end{filecontents*}
\usepackage{tablenumbers2,blindtext}%
\colwidth=2cm
\deflintab{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t ,u,v,w,x,y,z}
\begin{document}%
\blindtext
\tntab[4]{6}{Test}
\blindtext
\tntab[resume]{7}{}
\tntab[resume]{19}{}
\setlength\colwidth{3cm}
\deflintab{A,{B,C},D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S ,T,U,V,W,X,Y,Z}
\tntab[3]{5}{Noch'n Test}
\tntab[resume]{11}{}

\listoftables
\end{document}

hier über Anzahl Elemente statt Zeilen.

MfG

ctansearch
01-06-2013, 22:23
Genauso hätte ich es auch gemacht
--wenn ich es könnte.

Wunderbar gelöst, jetzt bastle ich noch ein bißchen weiter , aber ich verrate besser nicht woran...

rais
03-06-2013, 01:52
Moin moin,

Genauso hätte ich es auch gemacht
--wenn ich es könnte.

ich musste mich auch erstmal schlau machen, wie ich die \cell-Befehle einsammeln kann (in der \@for-Schleife), ohne daß sie expandiert werden. Ein einfaches \protect oder \noexpand vorm \cell in einem \edef wäre zwar im ersten Durchlauf gutgegangen, im nächsten (also bereits beim nächsen Element) nicht mehr.
TeXbyTopic wusste Rat: ein Tokenregister wird innerhalb eines \edef nur in seine Elemente (hier die \cell{}-Einträge), aber eben nicht bis zum geht-nicht-mehr expandiert.


Wunderbar gelöst,
Wie Axel einst so schön schrieb:


LaTeX-Regel Nr. 1: An jedem LaTeX-Code gibt es noch was zu verbessern! ;)

Hier wäre z. B. eine Überlegung wert, die bereits gesetzten Elemente aus der Liste zu streichen, damit in den Folgetabellen nicht unnötig die komplette Liste abgearbeitet werden muss ...

MfG

ctansearch
03-06-2013, 14:48
So,
ich habe das ganze nun auf longtable umgestellt und ein paar Dinge ergänzt.
(steht jeweils im Kommentar)
1. Man kann nun eine Tabelle unter longtable mit \raggedright,\raggedleft oder \centering setzen (command \cellflush}

2.Einen Text kann man bequem über mehrere Tabellen, Spalten und Zeilen setzen. Problem ist, daß das Komma in \deflintab ein Trenner ist, also im Text ene Funktion übernimmt. Das kann man zwar durch \catcode`\,=11 abstellen, dann fehlt aber wiederum der Spaltenumbruch. & hat seine Funktion schon in der Tabelle, kann also nicht benutzt werden. Sehr prakisch wäre, wenn man den catcode mitten im Text umschalten könnte, ich weiß aber nicht wie das geht und welchen catcode das Komma ursprünglich hat. Sonst könnte man ja hin-und herschalten.

Vielleicht hilft dabei http://de.comp.text.tex.narkive.com/CYGRNnqA/lokal-dezimalpunkt-durch-komma-ersetzen

3. Wenn man nur mit Zahlen arbeitet, sind die Funktionen der Tabellen genial, man kann sehr bequem lange Datenreihen verarbeiten.

\documentclass[a4paper]{article}%
\usepackage[utf8]{inputenc}%
\usepackage[ngerman]{babel}%
\usepackage{filecontents}
\begin{filecontents*}{tablenumbers3.sty}
\NeedsTeXFormat{LaTeX2e}[1995/06/01]
\ProvidesPackage{tablenumbers3}[2013/06/01 v0.0 beta Tabellengebastel (ctansearch/rais)]
\newcommand*\tn@warn[1]{\PackageWarning{tablenumbers3}{#1}}% damit man den Paketnamen nicht für jede Warnung mitzuschleppen braucht
\newcommand*\tn@info[1]{\PackageInfo{tablenumbers3}{#1}}
\newcommand*\tn@table@align{}
\DeclareOption{c}{\renewcommand*\tn@table@align{ce nter}}
\DeclareOption{l}{\renewcommand*\tn@table@align{fl ushleft}}
\DeclareOption{r}{\renewcommand*\tn@table@align{fl ushright}}
\DeclareOption*{\tn@warn{Unknown option `\CurrentOption' (ignored)}}
\ExecuteOptions{l}
\ProcessOptions\relax

\RequirePackage{array}

\newif\iftnresume
\newtoks\tn@currenttab
\newcommand*\tn@tmpa{}% wird andernorts überschrieben
\newcommand*\tn@tmpb{}% wird andernorts überschrieben
\newcommand*\tn@currentelement{}%
\newcommand*\tn@addcell{}
\newcommand*\tn@captiontext{}% wird andernorts überschrieben
\newcommand*\tn@lintab{}% Platzhalter für die lineare Tabelle
\newcounter{tn@element}% aktuelles Element
\newcounter{tn@elements}% bisher abgearbeitete Elemente
\newcounter{tn@lastelement}% das letzte aktuell zu bearbeitende Element
\newcounter{tn@tabline}
\newcounter{tn@tabcol}[tn@tabline]
\newcounter{tn@table}
\newcounter{tn@tmp}
\newcommand\deflintab[1]{\def\tn@lintab{#1}\setcounter{tn@elements}{0}}
\let\thetn@table\thetable
\newcounter{tn@effective@columns}% Anzahl effektiver Spalten
\setcounter{tn@effective@columns}{3}
\newcounter{tn@max@columns}% max. Anzahl effektiver Spalten
\setcounter{tn@max@columns}{12}% oder was weiß ich
\newlength\colwidth %die LaTeX-Variante, um eine Länge zu deklarieren
\setlength\colwidth{1em}% und festzulegen
\newlength\numbercolwidth
\settowidth\numbercolwidth{\ldots}
\newcommand{\cellflush}{\raggedright}%\raggedleft, \centering added by ctansearch
\newcommand\cell[1]{\tn@warn{`\string\cell' out of proper environment}}
\newcommand*\seteffectivecolumns[1]{%
\ifnum#1>\value{tn@max@columns}\relax
\tn@warn{Restricting number of columns to \arabic{tn@max@columns} (you wanted #1)}%
\setcounter{tn@effective@columns}{\value{tn@max@co lumns}}%
\else
\tn@info{Accepting `#1' as number of columns}%
\setcounter{tn@effective@columns}{#1}%
\fi
}
\newenvironment{tntable}[2][]{%
\renewcommand\cell[1]{%
\ifnum\value{tn@tabcol}=0\relax
\thetn@tabline
\else
\iftnresume
\ldots
\setcounter{tn@tmp}{0}%
\edef\tn@tmpa{}%
\loop \stepcounter{tn@tmp}\edef\tn@tmpa{\tn@tmpa&}%
\ifnum\c@tn@tmp<\c@tn@tabcol\relax\repeat
\tn@tmpa
\global\tnresumefalse
\fi
\fi
\stepcounter{tn@tabcol}%
\ifnum\value{tn@tabcol}>\value{tn@effective@columns}\relax
\stepcounter{tn@tabline}% starte neue Zeile
\stepcounter{tn@tabcol}%
\tabularnewline
\thetn@tabline
\fi
&\cellflush{##1}%\cellflush{} added by ctansearch
}%
\renewcommand*\thetable{\thetn@table-\alph{tn@table}}%
\ifx\relax#1\relax%neue Tabelle
\setcounter{tn@table}{0}%
\setcounter{tn@tabcol}{0}%
\setcounter{tn@tabline}{0}%
\else %Test auf `resume':
\edef\tn@tmpa{#1}%
\edef\tn@tmpb{resume}%
\ifx\tn@tmpa\tn@tmpb\relax %bisherige Tabelle soll fortgesetzt werden
\tnresumetrue
\addtocounter{table}{-1}%
\else % weder leer noch `resume:
\seteffectivecolumns{#1}% neue Anzahl (eff.) Spalten
\setcounter{tn@table}{0}%
\setcounter{tn@tabcol}{0}%
\setcounter{tn@tabline}{0}%
\fi
\fi
\refstepcounter{tn@table}%
\ifhmode\par\fi\noindent\minipage{\linewidth}% damit die Tabellenüberschrift nicht vom Körper getrennt werden kann
\expandafter\begin{\tn@table@align}
\ifx\relax#2\relax
\iftnresume\relax
\else
\tn@warn{Empty caption text for tntable \thetable}%

\xdef\tn@captiontext{#2}%
\fi
\else
\xdef\tn@captiontext{#2}%
\fi
\def\@captype{table}% damit \caption `weiß', daß es hier um eine Tabelle geht
\caption{\tn@captiontext}
\begin{longtable}{@{}>{\raggedleft}p{\numbercolwidth}*{\arabic{tn@effect ive@columns}}{p{\colwidth}}@{}}
}{%
\addtocounter{table}{-1}%rücksetzen tablezähler longatble addedbyctans
\end{longtable}
\expandafter\end{\tn@table@align}
\endminipage
}
\newcommand*\tntab[3][]{%
\setcounter{tn@lastelement}{\value{tn@elements}}%
\addtocounter{tn@lastelement}{#2}%
\setcounter{tn@element}{0}%Schleifenzähler
\tn@currenttab={}% und Tabelleninhalt initialisieren
\begin{tntable}[#1]{#3}
\@for\tn@currentelement:=\tn@lintab\do{%
\stepcounter{tn@element}%
\ifnum\value{tn@element}>\value{tn@elements}\relax
\ifnum\value{tn@element}>\value{tn@lastelement}\relax
\else
\edef\tn@addcell{\noexpand\tn@currenttab={\the\tn@ currenttab\noexpand\cell{\tn@currentelement}}}%
\tn@addcell
\fi
\fi
}%
\the\tn@currenttab
\end{tntable}
\ifnum\value{tn@element}<\value{tn@lastelement}\relax
\tn@warn{Current element list exhausted!^^J
You wanted to get \arabic{tn@lastelement}, but only \arabic{tn@element} were present}
\fi
\setcounter{tn@elements}{\value{tn@lastelement}}% Start für Folgetabelle festlegen
}%\tntab[Anzahl Spalten]{Anzahl Elemente}{Überschrift}
\endinput
\end{filecontents*}
\usepackage{tablenumbers3,blindtext,longtable}%
\colwidth=2cm
\deflintab{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t ,u,v,w,x,y,z}
\begin{document}%
\renewcommand{\cellflush}{\raggedleft}

\tntab[4]{6}{Test}
\tntab[resume]{7}{}
\tntab[resume]{19}{}
\setlength\colwidth{3cm}
\deflintab{Vor einem großen Walde wohnte ein armer Holzhacker mit seiner Frau und seinen zwei Kindern; das Bübchen hieß Hänsel und das Mädchen Gretel. Er hatte wenig zu beißen und zu brechen, und einmal, als große Teuerung ins Land kam, konnte er das tägliche Brot nicht mehr schaffen. Wie er sich nun abends im Bette Gedanken machte und sich vor Sorgen herumwälzte, seufzte er und sprach zu seiner Frau:" Was soll aus uns werden? Wie können wir unsere armen Kinder ernähren da wir für uns selbst nichts mehr haben?" Weißt du was, Mann, antwortete die Frau, wir wollen morgen in aller Frühe die Kinder hinaus in den Wald führen, wo er am dicksten ist. }
\tntab[3]{5}{Hänsel und Gretel}
\tntab[resume]{11}{}
\listoftables
\end{document}

rais
03-06-2013, 15:11
Moin moin,
ich kann das auf dieser Kiste derzeit nicht testen, aber


ich habe das ganze nun auf longtable umgestellt und ein paar Dinge ergänzt.

vllt hättest Du dazu die minipage-Umgebung innerhalb tntable auskommentieren sollen, sonst kann die longtable nicht über Seitengrenzen hinaus ... dazu vllt den \caption-Befehl (wieder) innerhalb der longtable-Umgebung aufrufen, dann erübrigt sich vllt auch das Erniedrigen des Tabellenzählers.


1. Man kann nun eine Tabelle unter longtable mit \raggedright,\raggedleft oder \centering setzen (command \cellflush}

statt \cellflush im Tabellenkörper hätte es vllt auch ein >{\cellflush} in der Spaltendeklaration getan.


2.Einen Text kann man bequem über mehrere Tabellen, Spalten und Zeilen setzen. Problem ist, daß das Komma in \deflintab ein Trenner ist, also im Text ene Funktion übernimmt. Das kann man zwar durch \catcode`\,=11 abstellen, dann fehlt aber wiederum der Spaltenumbruch. & hat seine Funktion schon in der Tabelle, kann also nicht benutzt werden. Sehr prakisch wäre, wenn man den catcode mitten im Text umschalten könnte, ich weiß aber nicht wie das geht und welchen catcode das Komma ursprünglich hat. Sonst könnte man ja hin-und herschalten.

hast Du es schon mit Gruppieren versucht? Vgl. \deflintab{A,{B,C}, ...} in Beitrag #8: `B,C' landet dort innerhalb einer Zelle.

MfG

ctansearch
03-06-2013, 21:17
Ja, das Gruppieren funktioniert natürlich, und man kann den Text damit gut strukturieren. Trotzdem habe ich den Ehrgeiz, das Problem "automatisch" zu lösen. Es ist ziemlich schwierig, in einem langen Text die Gruppierungen zu erkennen und man hat zeimlich viele Korrekturen, wenn die Zellen nicht mehr optimal gefüllt werden.
Die minipage habe ich rausgenommen, funktioniert, das Verschieben der \caption führt zu einer Fehlermeldung.
\cellflush habe ich in die Spaltendefinition verschoben, funktioniert .
Später kommt noch ein Zellenzähler hinzu, damit man auf einzelne Zellen referenzieren kann.
Ich stelle hier aber noch keinen neuen Code ein, das lohnt nicht, bei so kleinen Änderungen.

ctansearch
05-06-2013, 02:38
So, nun habe ich ein paar neue Funktionen eingefügt, die jeweils im Kommentar durch

%addbyctans{5.6.13} kenntlich gemacht sind.

\colwidth habe ich durch \cellwidth und \basecolskip ersetzt, wodurch eine Standardspaltenbreite gesetzt wird, die durch Multiplikation vergrößert werden kann. \setlength\cellwidth(x\basecolskip)
Eine \newdimen\cellheight gibt mit Hilfe eines \vtop to \dimen eine Zellenhöhe vor, die auch multipliziert werden kann. Somit sind Spaltenbreite und Zeilenhöhe definierbar.
Bei Zahlenwerten sollen diese gleich 1\baselineskip und [Stellen]\basecolskip sein, bei Texten sind sie frei wählbar. Die wählbaren Zellenhöhen(=Zeilenhöhen) werden durch \vfill aufgefüllt. Man erhält also immer gleiche Zeilenhöhen.
Durch Verschiebung der trennenden Kommas kann die Füllung der Zeilen angepasst werden, besser jedoch durch Gruppierung, da sonst die Kommas als Zeichen verschwinden.
Wenn man jetzt noch den Wert des \vfill in eine Anzahl Zeichen übersetzen könnte, könnte man den leergefüllten Raum durch Verschiebung der Gruppierung um n-Zeichen auffüllen. Zu diese Zeitpunkt bleibt nicht anderes übrig, als diese tatsächlich zu zählen und die Klammer {} entsprechend zu setzen.

Hilfreich wäre die Defintion einer "Verschiebeklammer" die die Zeichen
},{ in \deflintab einfügt, ohne sie zu expandieren.


\documentclass[a4paper]{article}%
\usepackage[utf8]{inputenc}%
\usepackage[ngerman]{babel}%
\usepackage{filecontents}
\begin{filecontents*}{tablenumbers3.sty}
\NeedsTeXFormat{LaTeX2e}[1995/06/01]
\ProvidesPackage{tablenumbers3}[2013/06/01 v0.3 beta Tabellengebastel (ctansearch/rais)]
\newcommand*\tn@warn[1]{\PackageWarning{tablenumbers3}{#1}}% damit man den Paketnamen nicht für jede Warnung mitzuschleppen braucht
\newcommand*\tn@info[1]{\PackageInfo{tablenumbers3}{#1}}
\newcommand*\tn@table@align{}
\DeclareOption{c}{\renewcommand*\tn@table@align{ce nter}}
\DeclareOption{l}{\renewcommand*\tn@table@align{fl ushleft}}
\DeclareOption{r}{\renewcommand*\tn@table@align{fl ushright}}
\DeclareOption*{\tn@warn{Unknown option `\CurrentOption' (ignored)}}
\ExecuteOptions{l}
\ProcessOptions\relax
\RequirePackage{array}
\newif\iftnresume
\newtoks\tn@currenttab
\newcommand*\tn@tmpa{}% wird andernorts überschrieben
\newcommand*\tn@tmpb{}% wird andernorts überschrieben
\newcommand*\tn@currentelement{}%
\newcommand*\tn@addcell{}
\newcommand*\tn@captiontext{}% wird andernorts überschrieben
\newcommand*\tn@lintab{}% Platzhalter für die lineare Tabelle
\newcounter{tn@element}% aktuelles Element
\newcounter{tn@elements}% bisher abgearbeitete Elemente
\newcounter{tn@lastelement}% das letzte aktuell zu bearbeitende Element
\newcounter{tn@tabline}
\newcounter{tn@tabcol}[tn@tabline]
\newcounter{tn@table}
\newcounter{tn@tmp}
\newcommand\deflintab[1]{\def\tn@lintab{#1}\setcounter{tn@elements}{0}}
\let\thetn@table\thetable
\newcounter{tn@effective@columns}% Anzahl effektiver Spalten
\setcounter{tn@effective@columns}{3}
\newcounter{tn@max@columns}% max. Anzahl effektiver Spalten
\setcounter{tn@max@columns}{12}% oder was weiß ich
\newlength\numbercolwidth
\settowidth\numbercolwidth{\ldots}
\newcommand{\cellflush}{\raggedright}%\raggedleft, \centering addbyctans{5.6.13}
\newdimen\cellheight%addbyctans{5.6.13}
\setlength\cellheight{1\baselineskip}%addbyctans{5 .6.13}
\newdimen\basecolskip%addbyctans{5.6.13}
\setlength\basecolskip{10pt}
\newdimen\cellwidth%addbyctans{5.6.13}
\setlength\cellwidth{1\basecolskip}%addbyctans{5.6 .13}
\newcommand{\linenoformat}{\textsuperscript}%addby ctans{5.6.13}
\newcommand\cell[1]{\tn@warn{`\string\cell' out of proper environment}}
\newcommand*\seteffectivecolumns[1]{%
\ifnum#1>\value{tn@max@columns}\relax
\tn@warn{Restricting number of columns to \arabic{tn@max@columns} (you wanted #1)}%
\setcounter{tn@effective@columns}{\value{tn@max@co lumns}}%
\else
\tn@info{Accepting `#1' as number of columns}%
\setcounter{tn@effective@columns}{#1}%
\fi
}
\newenvironment{tntable}[2][]{%
\renewcommand\cell[1]{%
\ifnum\value{tn@tabcol}=0\relax
\linenoformat{\thetn@tabline}%format of tabline addbyctans{5.6.13}
\else
\iftnresume
\ldots
\setcounter{tn@tmp}{0}%
\edef\tn@tmpa{}%
\loop \stepcounter{tn@tmp}\edef\tn@tmpa{\tn@tmpa&}%
\ifnum\c@tn@tmp<\c@tn@tabcol\relax\repeat
\tn@tmpa
\global\tnresumefalse
\fi
\fi
\stepcounter{tn@tabcol}%
\ifnum\value{tn@tabcol}>\value{tn@effective@columns}\relax
\stepcounter{tn@tabline}% starte neue Zeile
\stepcounter{tn@tabcol}%
\tabularnewline
\linenoformat{\thetn@tabline}%format of tabline addbyctans{5.6.13}
\fi
&\vtop to \cellheight{##1}%added vtop to scale the cellheight(the height of a line) addbyctans {5.6.13}
}%
\renewcommand*\thetable{\thetn@table-\alph{tn@table}}%
\ifx\relax#1\relax%neue Tabelle
\setcounter{tn@table}{0}%
\setcounter{tn@tabcol}{0}%
\setcounter{tn@tabline}{0}%
\else %Test auf `resume':
\edef\tn@tmpa{#1}%
\edef\tn@tmpb{resume}%
\ifx\tn@tmpa\tn@tmpb\relax %bisherige Tabelle soll fortgesetzt werden
\tnresumetrue
\addtocounter{table}{-1}%
\else % weder leer noch `resume:
\seteffectivecolumns{#1}% neue Anzahl (eff.) Spalten
\setcounter{tn@table}{0}%
\setcounter{tn@tabcol}{0}%
\setcounter{tn@tabline}{0}%
\fi
\fi
\refstepcounter{tn@table}%
\ifhmode\par\fi\noindent %\minipage{\linewidth}% damit die
%Tabellenüberschrift nicht vom Körper getrennt
%werden kann,deaktiviert für longtable{5.6.13}
\expandafter\begin{\tn@table@align}
\ifx\relax#2\relax
\iftnresume\relax
\else
\tn@warn{Empty caption text for tntable \thetable}%
\xdef\tn@captiontext{#2}%
\fi
\else
\xdef\tn@captiontext{#2}%
\fi
\def\@captype{table}% damit \caption `weiß', daß es hier um eine Tabelle geht
\caption{\tn@captiontext}
\begin{longtable}{@{}>{\raggedleft}p{\numbercolwidth}*{\arabic{tn@effect ive@columns}}{>{\cellflush}p{\cellwidth}}@{}}%\cellflush addbyctans
}{%
\addtocounter{table}{-1}%decrease counter{table}of longtable addbyctans{5.6.13}
\end{longtable}
\expandafter\end{\tn@table@align}
%\endminipage deaktiviert für longtable{5.6.13}
}
\newcommand*\tntab[3][]{%
\setcounter{tn@lastelement}{\value{tn@elements}}%
\addtocounter{tn@lastelement}{#2}%
\setcounter{tn@element}{0}%Schleifenzähler
\tn@currenttab={}% und Tabelleninhalt initialisieren
\begin{tntable}[#1]{#3}
\@for\tn@currentelement:=\tn@lintab\do{%
\stepcounter{tn@element}%
\ifnum\value{tn@element}>\value{tn@elements}\relax
\ifnum\value{tn@element}>\value{tn@lastelement}\relax
\else
\edef\tn@addcell{\noexpand\tn@currenttab={\the\tn@ currenttab\noexpand\cell{\tn@currentelement}}}%
\tn@addcell
\fi
\fi
}%
\the\tn@currenttab
\end{tntable}
\ifnum\value{tn@element}<\value{tn@lastelement}\relax
\tn@warn{Current element list exhausted!^^J
You wanted to get \arabic{tn@lastelement}, but only \arabic{tn@element} were present}
\fi
\setcounter{tn@elements}{\value{tn@lastelement}}% Start für Folgetabelle festlegen
}%\tntab[Anzahl Spalten]{Anzahl Elemente}{Überschrift}
\endinput
\end{filecontents*}
\usepackage{tablenumbers3,longtable}
\begin{document}%
\renewcommand{\cellflush}{\raggedright}
\setlength\cellheight{1\baselineskip}%addbyctans{5 .6.13}
\setlength\cellwidth{1\basecolskip}%addbyctans{5.6 .13}
\deflintab{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, 17,18,19,20}
\tntab[4]{6}{6 elemente in 4 spalten}
\tntab[4]{6}{6 elemente in 5 spalten}
\setlength\cellheight{8\baselineskip}%addbyctans{5 .6.13}
\setlength\cellwidth{9\basecolskip}%addbyctans{5.6 .13}
\deflintab{{Eine Menge Worte die in einer,Tabelle dargestellt werden und eine
Menge Text in die Spalten setzen, },{und die durch Kommata getrennt sind}}
\tntab[4]{4}{}
\listoftables
\end{document}

ctansearch
09-06-2013, 00:22
@rais

Hallo rais, liest Du noch mit?

Ich habe die Tabelle um einige Funktionen erweitert, sodaß man in \deflintab eine Menge von Befehlen und Umgebungen einbringen kann. Ich würde das gerne als Paket bei CTAN hochladen., wenn Du einverstanden bist.
Bei Interesse stelle ich den aktuellen Stand hier ein.

rais
09-06-2013, 08:41
Hallo rais, liest Du noch mit?

sicher, ich bin derzeit nur ein wenig -- hmm -- asynchron zur MET.


Ich würde das gerne als Paket bei CTAN hochladen., wenn Du einverstanden bist.

Nur zu (unser Ideenaustausch war ja auch schon nicht gerade privat).


Bei Interesse stelle ich den aktuellen Stand hier ein.

An Interesse mangelt es nicht. OTOH kann ich warten, bis es auf CTAN zur Verfügung steht.

Es ist ziemlich schwierig, in einem langen Text die Gruppierungen zu erkennen und man hat zeimlich viele Korrekturen, wenn die Zellen nicht mehr optimal gefüllt werden.

Wann wurde aus `Tabelle' ein `langer Text'?:confused:

das Verschieben der \caption führt zu einer Fehlermeldung.

Die Anzahl an Fehlermeldungen ist nicht entscheidend, vielmehr die Fehlermeldung selbst.
BTW, Du hast schon daran gedacht, daß \caption innerhalb einer longtable mit \\ abgeschlossen werden muss?

Ein paar Gedanken hab ich mir nochmal zu der Frage gemacht, wann genau der Tabellenzähler erhöht werden sollte (und dabei auch gleich das Verhalten konfigurierbar gemacht, ob eine neue Spaltenanzahl eine neue Tabelle anlegen soll, oder nicht).
Zwar finde ich die Verwendung von longtable immer noch übertrieben, aber wenn sie denn verwendet werden soll, vereinfacht das ein paar andere Dinge gleich mit:


\documentclass[a4paper]{article}%
\usepackage[utf8]{inputenc}%
\usepackage[ngerman]{babel}%
\usepackage{filecontents}
\begin{filecontents*}{tablenumbers3.sty}
\NeedsTeXFormat{LaTeX2e}[1995/06/01]
\ProvidesPackage{tablenumbers3}[2013/06/09 v0.3.1 Tabellengebastel (ctansearch/rais)]
\newcommand*\tn@warn[1]{\PackageWarning{tablenumbers3}{#1}}% damit man den Paketnamen nicht für jede Warnung mitzuschleppen braucht
\newcommand*\tn@info[1]{\PackageInfo{tablenumbers3}{#1}}
\newcommand*\tn@table@align{}
\newif\iftn@cstreset
\DeclareOption{c}{\renewcommand*\tn@table@align{c} }% Optionen an longtable angepasst 2013-06-09-rais
\DeclareOption{l}{\renewcommand*\tn@table@align{l} }
\DeclareOption{r}{\renewcommand*\tn@table@align{r} }
\DeclareOption{colspecresetstable}{\tn@cstresettru e}% ++ 2013-06-09-rais
\DeclareOption{colspecstaysintable}{\tn@cstresetfa lse}% ++ 2013-06-09-rais
\DeclareOption*{\tn@warn{Unknown option `\CurrentOption' (ignored)}}
\ExecuteOptions{l,colspecresetstable}% wg. neuer Option 2013-06-09-rais
\ProcessOptions\relax
\RequirePackage{array}
\RequirePackage{longtable}% wenn schon longtable verwendet wird, dann hier laden und nicht erst im Dokument 2013-06-09-rais
\newif\iftnresume
\newtoks\tn@currenttab
\newcommand*\tn@tmpa{}% wird andernorts überschrieben
\newcommand*\tn@tmpb{}% wird andernorts überschrieben
\newcommand*\tn@currentelement{}%
\newcommand*\tn@addcell{}
\newcommand*\tn@captiontext{}% wird andernorts überschrieben
\newcommand*\tn@lintab{}% Platzhalter für die lineare Tabelle
\newcounter{tn@element}% aktuelles Element
\newcounter{tn@elements}% bisher abgearbeitete Elemente
\newcounter{tn@lastelement}% das letzte aktuell zu bearbeitende Element
\newcounter{tn@tabline}
\newcounter{tn@tabcol}[tn@tabline]
\newcounter{tn@table}
\newcounter{tn@tmp}
\newcommand\deflintab[1]{%
\ifnum\value{tn@elements}<\value{tn@element}\relax % Test und Warnung ergänzt,
% sollten in der bisherigen Tabelle noch unbearbeitete Elemente anstehen
% (das Gegenstück zu `Current element list exhausted') 2013-06-09-rais
\addtocounter{tn@element}{-\value{tn@elements}}%
\tn@warn{\arabic{tn@element} elements lost!^^J
You may have used `\string\deflintab' a little too soon}%
\fi
\def\tn@lintab{#1}%
\iftn@cstreset\relax\else %wenn eine Neudefinition der Spaltenanzahl keine neue Tabelle beginnen soll,
\stepcounter{table}% beginnt mit einer neuen Tabellendefinition auch eine neue Tabelle 2013-06-09-rais
\fi
\setcounter{tn@elements}{0}%
\setcounter{tn@table}{0}% eigentlich weiss man mit dem \deflintab schon, dass hier
% eine neue Tabelle beginnt, da kann man die Zähler hier auch schon zurücksetzen 2013-06-09-rais
\setcounter{tn@tabline}{0}%
\setcounter{tn@tabcol}{0}%
}
\let\thetn@table\thetable
\newcounter{tn@effective@columns}% Anzahl effektiver Spalten
\setcounter{tn@effective@columns}{3}
\newcounter{tn@max@columns}% max. Anzahl effektiver Spalten
\setcounter{tn@max@columns}{12}% oder was weiß ich
\newlength\numbercolwidth
\settowidth\numbercolwidth{\ldots}
\newcommand{\cellflush}{\raggedright}%\raggedleft, \centering addbyctans{5.6.13}
\newdimen\cellheight%addbyctans{5.6.13}
\setlength\cellheight{1\baselineskip}%addbyctans{5 .6.13}
\newdimen\basecolskip%addbyctans{5.6.13}
\setlength\basecolskip{10pt}
\newdimen\cellwidth%addbyctans{5.6.13}
\setlength\cellwidth{1\basecolskip}%addbyctans{5.6 .13}
\newcommand{\linenoformat}{\textsuperscript}%addby ctans{5.6.13}
\newcommand\cell[1]{\tn@warn{`\string\cell' out of proper environment}}
\newcommand*\seteffectivecolumns[1]{%
\ifnum#1>\value{tn@max@columns}\relax
\tn@warn{Restricting number of columns to \arabic{tn@max@columns} (you wanted #1)}%
\setcounter{tn@effective@columns}{\value{tn@max@co lumns}}%
\else
\tn@info{Accepting `#1' as number of columns}%
\setcounter{tn@effective@columns}{#1}%
\fi
\setcounter{tn@tabcol}{0}% den Spaltenzähler zurücksetzen:
% Nach Neudefinition der Spaltenanzahl ist es IMHO unlogisch, die nächste erste Tabellenzeile
% an die letzte der vorherigen Teiltabelle anschliessen lassen zu wollen 2013-06-09-rais
}
\newenvironment{tntable}[2][]{%
\renewcommand\cell[1]{%
\ifnum\value{tn@tabcol}=0\relax
\linenoformat{\thetn@tabline}%format of tabline addbyctans{5.6.13}
\else
\iftnresume
\ldots
\setcounter{tn@tmp}{0}%
\edef\tn@tmpa{}%
\loop \stepcounter{tn@tmp}\edef\tn@tmpa{\tn@tmpa&}%
\ifnum\c@tn@tmp<\c@tn@tabcol\relax\repeat
\tn@tmpa
\global\tnresumefalse
\fi
\fi
\stepcounter{tn@tabcol}%
\ifnum\value{tn@tabcol}>\value{tn@effective@columns}\relax
\stepcounter{tn@tabline}% starte neue Zeile
\stepcounter{tn@tabcol}%
\tabularnewline
\linenoformat{\thetn@tabline}%format of tabline addbyctans{5.6.13}
\fi
&\vtop to \cellheight{##1}%added vtop to scale the cellheight(the height of a line) addbyctans {5.6.13}
}%
\renewcommand*\thetable{\thetn@table-\alph{tn@table}}%
\ifx\relax#1\relax %optionelles Argument leer oder nicht angegeben
\iftn@cstreset %konfigurierbar gemacht 2013-06-09-rais
\setcounter{tn@table}{0}%
\setcounter{tn@tabcol}{0}%
\setcounter{tn@tabline}%
\fi
\else %Test auf `resume':
\edef\tn@tmpa{#1}%
\edef\tn@tmpb{resume}%
\ifx\tn@tmpa\tn@tmpb\relax %bisherige Tabelle soll fortgesetzt werden
\tnresumetrue
\addtocounter{table}{-1}%
\else % weder leer noch `resume:
\seteffectivecolumns{#1}% neue Anzahl (eff.) Spalten
\iftn@cstreset %++ über Option konfigurierbar gemacht 2013-06-09-rais
\setcounter{tn@table}{0}%
% \setcounter{tn@tabcol}{0}%<-- in \seteffectivecolumns verschoben 2013-06-09-rais
\setcounter{tn@tabline}{0}%
\else
\addtocounter{table}{-1}% neue Spaltenanzahl soll für bisherige Tabelle gelten
\fi
\fi
\fi
\refstepcounter{tn@table}%
% \ifhmode\par\fi\noindent <-- das ist bei longtable auch nicht mehr notwendig 2013-06-09-rais
%\minipage{\linewidth}% damit die
%Tabellenüberschrift nicht vom Körper getrennt
%werden kann,deaktiviert für longtable{5.6.13}
% \expandafter\begin{\tn@table@align} auskommentiert und Option an longtable übergeben 2013-06-09-rais
\ifx\relax#2\relax
\iftnresume\relax
\else
\tn@warn{Empty caption text for tntable \thetable}%
\xdef\tn@captiontext{#2}%
\fi
\else
\xdef\tn@captiontext{#2}%
\fi
% \def\@captype{table}% damit \caption `weiß', daß es hier um eine Tabelle geht -- auskommentiert, \caption in longtable verschoben 2013-06-09-rais
\begin{longtable}[\tn@table@align]{@{}>{\raggedleft}p{\numbercolwidth}*{\arabic{tn@effect ive@columns}}{>{\cellflush}p{\cellwidth}}@{}}%\cellflush addbyctans

\caption{\tn@captiontext}\\% innerhalb longtable ist \caption mit \\ abzuschliessen 2013-06-09-rais
}{%
%\addtocounter{table}{-1}%decrease counter{table}of longtable addbyctans{5.6.13}
% ^^^ mit der Verschiebung der \caption obsolet geworden 2013-06-09-rais
\end{longtable}
% \expandafter\end{\tn@table@align} deaktiviert für longtable 2013-06-09-rais
%\endminipage deaktiviert für longtable{5.6.13}
}
\newcommand*\tntab[3][]{%
\setcounter{tn@lastelement}{\value{tn@elements}}%
\addtocounter{tn@lastelement}{#2}%
\setcounter{tn@element}{0}%Schleifenzähler
\tn@currenttab={}% und Tabelleninhalt initialisieren
\begin{tntable}[#1]{#3}
\@for\tn@currentelement:=\tn@lintab\do{%
\stepcounter{tn@element}%
\ifnum\value{tn@element}>\value{tn@elements}\relax
\ifnum\value{tn@element}>\value{tn@lastelement}\relax
\else
\edef\tn@addcell{\noexpand\tn@currenttab={\the\tn@ currenttab\noexpand\cell{\tn@currentelement}}}%
\tn@addcell
\fi
\fi
}%
\the\tn@currenttab
\end{tntable}
\ifnum\value{tn@element}<\value{tn@lastelement}\relax
\tn@warn{Current element list exhausted!^^J
You wanted to get \arabic{tn@lastelement}, but only \arabic{tn@element} were present}
\fi
\setcounter{tn@elements}{\value{tn@lastelement}}% Start für Folgetabelle festlegen
}%\tntab[Anzahl Spalten]{Anzahl Elemente}{Überschrift}
\endinput
\end{filecontents*}
\usepackage[colspecstaysintable,c]{tablenumbers3}
\begin{document}%
\renewcommand{\cellflush}{\raggedright}
\setlength\cellheight{1\baselineskip}%addbyctans{5 .6.13}
\setlength\cellwidth{1\basecolskip}%addbyctans{5.6 .13}
\deflintab{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, 17,18,19,20}
\tntab[4]{6}{6 elemente in 4 spalten}
\tntab[5]{6}{6 elemente in 5 spalten}% optionalen Parameter von 4 auf 5 geändert, damit die Tabellenüberschrift passt 2013-06-09-rais
\setlength\cellheight{8\baselineskip}%addbyctans{5 .6.13}
\setlength\cellwidth{9\basecolskip}%addbyctans{5.6 .13}
\deflintab{{Eine Menge Worte die in einer,Tabelle dargestellt werden und eine
Menge Text in die Spalten setzen, },{und die durch Kommata getrennt sind}}
\tntab[4]{4}{}
\listoftables
\end{document}

MfG aus dem Land der aufgehenden Sonne :)

ctansearch
12-06-2013, 00:07
@rais

Hallo rais, habe nun das Tabellengebastel unter dem Namen "NOX" nach CTAN hochgeladen. Es hat noch eine Masse Erweiterungen erfahren und funktioniert sehr gut.
Schau mal rein.

ctansearch
12-06-2013, 20:47
Sorry. hochladen hat nicht geklappt.
Aktuelle (und noch nicht fertige) Version jetzt unter
http://biocoen.org
(nox)
zu finden.

ctansearch
15-06-2013, 00:52
@rais
Hallo rais, hier eine Möglichkeit zum Umgang mit Registern, die auch für die Manipulation des Arrays \deflintab von Nutzen sein könnte.(bezgl. Vermeidung der mehrfachen Abarbeitung der \deflintab-Parameter.) Vielleicht kannst Du damit was anfangen. Unbefriedigend ist noch die \collectregisters - Abteilung, die durch eine while Schleife besser formuliert werden könnte. Alles ist reiner TeX-Code.
Gruß ctansearch



{\bf \TeX-Code}
\parindent=0pt
\vskip2\baselineskip
\newcount\newregister%
\def\testtext{Das ist nur ein Text, um die Zeilen zu fuellen.}
\newcount\lastregister%
\def\writetonewregister#1{\setbox0=\hbox{{\bf Anmerkungen}} \advance\newregister
by 1 \expandafter\setbox\the\newregister=\hbox{#1}\kern-4pt$^{\the\newregister}$}%
\def\collectregisters{
\lastregister=\the\newregister%
\advance\lastregister by 1
\expandafter\setbox\the\lastregister=\vbox{
\vskip2\baselineskip%
\box0
\ifnum\lastregister=0 \box0 \fi
\ifnum\lastregister>0 \box1 \fi
\ifnum\lastregister>1 \box2 \fi
\ifnum\lastregister>2 \box3 \fi
\ifnum\lastregister>3 \box4 \fi
\ifnum\lastregister>4 \box5 \fi
\ifnum\lastregister>5 \box6 \fi
\ifnum\lastregister>6 \box7 \fi
\ifnum\lastregister>7 \box8 \fi
\ifnum\lastregister>8 \box9 \fi
\ifnum\lastregister>9 \box10 \fi
\ifnum\lastregister>10 \box11 \fi
\ifnum\lastregister>11 \box12 \fi
\ifnum\lastregister>12 \box13 \fi
\ifnum\lastregister>13 \box14 \fi
\ifnum\lastregister>14 \box15 \fi
\ifnum\lastregister>15 \box16 \fi
\ifnum\lastregister>16 \box17 \fi
\ifnum\lastregister>17 \box18 \fi
\ifnum\lastregister>18 \box19 \fi
\ifnum\lastregister>19 \box20 \fi
\ifnum\lastregister>20 \box21 \fi
\ifnum\lastregister>21 \box22 \fi
\ifnum\lastregister>22 \box23 \fi
\ifnum\lastregister>23 \box24 \fi
\ifnum\lastregister>24 \box25 \fi
\ifnum\lastregister>25 \box26 \fi
}}%

\def\writenewregister{\collectregisters \vskip1\baselineskip\vbox{\box\the\lastregister
\message{\the\lastregister boxes are freed }\hfill}}%
%endofdefintion
\testtext \writetonewregister{Anmerkung 1}
\testtext \writetonewregister{Anmerkung 2}
\testtext \writetonewregister{Anmerkung 3}
\testtext \writetonewregister{Anmerkung 4}
\testtext \writetonewregister{Anmerkung 5}
\testtext \writetonewregister{Anmerkung 6}
\writenewregister
\testtext \writetonewregister{Anmerkung 7}
\testtext \writetonewregister{Anmerkung 8}
\testtext \writetonewregister{Anmerkung 9}
\testtext \writetonewregister{Anmerkung 10}
\testtext \writetonewregister{Anmerkung 11}
\testtext \writetonewregister{Anmerkung 12}
\testtext \writetonewregister{Anmerkung 13}
\writenewregister
\bye
%

rais
17-06-2013, 22:21
Moin ctansearch,

@rais
Hallo rais, hier eine Möglichkeit zum Umgang mit Registern, die auch für die Manipulation des Arrays \deflintab von Nutzen sein könnte.(bezgl. Vermeidung der mehrfachen Abarbeitung der \deflintab-Parameter.)
ich glaube nicht, daß Boxregister hier gewinnbringend angewendet werden können. Was würdest Du in so ein Register packen wollen? Einzelne Elemente?
Wie viele Elemente soll eine Tabelle haben dürfen?
Zwar ist mit den e-TeX-Erweiterungen die alte Grenze von 256 Boxregistern nicht mehr gegeben, aber selbst bei einer ausreichenden Anzahl an verfügbaren Boxregistern sehe ich erstmal einen ziemlichen Aufwand, das ganze umzusetzen.
- Um nicht mit anderen Paketen in Konflikt zu geraten, die ebenfalls Boxregister verwenden, müssten alle verwendeten Boxregister per \newbox bzw. \newsavebox agefordert werden (wobei mir nicht klar ist, ob eine Reihe von Boxregistern zwingend aufsteigende und lückenlose Nummern erhalten).
- Da die Tabelle definiert wird, bevor die Spaltenbreite bekannt ist, müsste jede dieser Boxen bei der eigentlichen Tabellenerstellung wieder auseinandergenommen werden (etwa mit \unhbox), sonst kümmert sich eine bereits gesetzte Box herzlich wenig um solche Dinge wie `Spaltenbreite'.

OTOH kann man die Tabellenreste nicht einfach in einem \edef einsammeln: dann geht eine etwaige Gruppierung innerhalb eines Elements flöten.
Also hab ich etwas mit Tokenregistern gespielt:


\documentclass[a4paper]{article}%
\usepackage[utf8]{inputenc}%
\usepackage[ngerman]{babel}%
\usepackage{filecontents}
\begin{filecontents*}{tablenumbers3.sty}
\NeedsTeXFormat{LaTeX2e}[1995/06/01]
\ProvidesPackage{tablenumbers3}[2013/06/17 v0.3.2 Tabellengebastel (ctansearch/rais)]
\newcommand*\tn@warn[1]{\PackageWarning{tablenumbers3}{#1}}% damit man den Paketnamen nicht für jede Warnung mitzuschleppen braucht
\newcommand*\tn@info[1]{\PackageInfo{tablenumbers3}{#1}}
\newcommand*\tn@table@align{}
\newif\iftn@cstreset
\DeclareOption{c}{\renewcommand*\tn@table@align{c} }% Optionen an longtable angepasst 2013-06-09-rais
\DeclareOption{l}{\renewcommand*\tn@table@align{l} }
\DeclareOption{r}{\renewcommand*\tn@table@align{r} }
\DeclareOption{colspecresetstable}{\tn@cstresettru e}% ++ 2013-06-09-rais
\DeclareOption{colspecstaysintable}{\tn@cstresetfa lse}% ++ 2013-06-09-rais
\DeclareOption*{\tn@warn{Unknown option `\CurrentOption' (ignored)}}
\ExecuteOptions{l,colspecresetstable}% wg. neuer Option 2013-06-09-rais
\ProcessOptions\relax
\RequirePackage{array}
\RequirePackage{longtable}% wenn schon longtable verwendet wird, dann hier laden und nicht erst im Dokument 2013-06-09-rais
\newif\iftnresume
\newif\iftncheckelements % Gesamtanzahl nur im ersten tntab-Aufruf setzen 2013-06-17-rais
\newtoks\tn@currenttab
\newtoks\tn@lintab % Platzhalter für die lineare Tabelle auf Tokenregister geändert 2013-06-17-rais
\newtoks\tn@tmplintab % Platzhalter für gekürzte Tabelle 2013-06-17-rais
\newcommand*\tn@tmpa{}% wird andernorts überschrieben
\newcommand*\tn@tmpb{}% wird andernorts überschrieben
\newcommand*\tn@empty{}%
\newcommand*\tn@currentelement{}%
\newcommand*\tn@addcell{}
\newcommand*\tn@captiontext{}% wird andernorts überschrieben
\newcounter{tn@element}% aktuelles Element
\newcounter{tn@elements}% bisher abgearbeitete Elemente
\newcounter{tn@lastelement}% das letzte aktuell zu bearbeitende Element
\newcounter{tn@totalelements}% Gesamtanzahl Elemente 2013-06-17-rais
\newcounter{tn@tabline}
\newcounter{tn@tabcol}[tn@tabline]
\newcounter{tn@table}
\newcounter{tn@tmp}
\newcommand\deflintab[1]{%
\ifnum\value{tn@totalelements}=0\relax %Test/Warnung ergänzt 2013-06-17-rais
\iftncheckelements
\tn@warn{Unknown number of elements lost!^^J
You may have used `\string\deflintab' before, without^^J
using any of its elements}%
\fi
\else
\ifnum\value{tn@totalelements}<\value{tn@element}\relax % Test und Warnung ergänzt,
% sollten in der bisherigen Tabelle noch unbearbeitete Elemente anstehen
% (das Gegenstück zu `Current element list exhausted') 2013-06-09-rais
% Test auf tn@totalelements geändert 2013-06-17-rais
\addtocounter{tn@element}{-\value{tn@totalelements}}%
\tn@warn{\arabic{tn@element} elements lost!^^J
You may have used `\string\deflintab' a little too soon}%
\fi
\fi
\tn@lintab={#1}% token! 2013-06-17-rais
\iftn@cstreset\relax\else %wenn eine Neudefinition der Spaltenanzahl keine neue Tabelle beginnen soll,
\stepcounter{table}% beginnt mit einer neuen Tabellendefinition auch keine neue Tabelle 2013-06-09-rais
\fi
\setcounter{tn@elements}{0}%
\setcounter{tn@table}{0}% eigentlich weiss man mit dem \deflintab schon, dass hier
% eine neue Tabelle beginnt, da kann man die Zähler hier auch schon zurücksetzen 2013-06-09-rais
\setcounter{tn@tabline}{0}%
\setcounter{tn@tabcol}{0}%
\tncheckelementstrue% nächster \tntab soll Gesamtanzahl Elemente feststellen 2013-06-17-rais
}
\let\thetn@table\thetable
\newcounter{tn@effective@columns}% Anzahl effektiver Spalten
\setcounter{tn@effective@columns}{3}
\newcounter{tn@max@columns}% max. Anzahl effektiver Spalten
\setcounter{tn@max@columns}{12}% oder was weiß ich
\newlength\numbercolwidth
\settowidth\numbercolwidth{\ldots}
\newcommand{\cellflush}{\raggedright}%\raggedleft, \centering addbyctans{5.6.13}
\newdimen\cellheight%addbyctans{5.6.13}
\setlength\cellheight{1\baselineskip}%addbyctans{5 .6.13}
\newdimen\basecolskip%addbyctans{5.6.13}
\setlength\basecolskip{10pt}
\newdimen\cellwidth%addbyctans{5.6.13}
\setlength\cellwidth{1\basecolskip}%addbyctans{5.6 .13}
\newcommand{\linenoformat}{\textsuperscript}%addby ctans{5.6.13}
\newcommand\cell[1]{\tn@warn{`\string\cell' out of proper environment}}
\newcommand*\seteffectivecolumns[1]{%
\ifnum#1>\value{tn@max@columns}\relax
\tn@warn{Restricting number of columns to \arabic{tn@max@columns} (you wanted #1)}%
\setcounter{tn@effective@columns}{\value{tn@max@co lumns}}%
\else
\tn@info{Accepting `#1' as number of columns}%
\setcounter{tn@effective@columns}{#1}%
\fi
\setcounter{tn@tabcol}{0}% den Spaltenzähler zurücksetzen:
% Nach Neudefinition der Spaltenanzahl ist es IMHO unlogisch, die nächste erste Tabellenzeile
% an die letzte der vorherigen Teiltabelle anschliessen lassen zu wollen 2013-06-09-rais
}
\newenvironment{tntable}[2][]{%
\renewcommand\cell[1]{%
\ifnum\value{tn@tabcol}=0\relax
\linenoformat{\thetn@tabline}%format of tabline addbyctans{5.6.13}
\else
\iftnresume
\ldots
\setcounter{tn@tmp}{0}%
\edef\tn@tmpa{}%
\loop \stepcounter{tn@tmp}\edef\tn@tmpa{\tn@tmpa&}%
\ifnum\c@tn@tmp<\c@tn@tabcol\relax\repeat
\tn@tmpa
\global\tnresumefalse
\fi
\fi
\stepcounter{tn@tabcol}%
\ifnum\value{tn@tabcol}>\value{tn@effective@columns}\relax
\stepcounter{tn@tabline}% starte neue Zeile
\stepcounter{tn@tabcol}%
\tabularnewline
\linenoformat{\thetn@tabline}%format of tabline addbyctans{5.6.13}
\fi
&\vtop to \cellheight{##1}%added vtop to scale the cellheight(the height of a line) addbyctans {5.6.13}
}%
\renewcommand*\thetable{\thetn@table-\alph{tn@table}}%
\ifx\relax#1\relax %optionelles Argument leer oder nicht angegeben
\iftn@cstreset %konfigurierbar gemacht 2013-06-09-rais
\setcounter{tn@table}{0}%
\setcounter{tn@tabcol}{0}%
\setcounter{tn@tabline}%
\fi
\else %Test auf `resume':
\edef\tn@tmpa{#1}%
\edef\tn@tmpb{resume}%
\ifx\tn@tmpa\tn@tmpb\relax %bisherige Tabelle soll fortgesetzt werden
\tnresumetrue
\addtocounter{table}{-1}%
\else % weder leer noch `resume:
\seteffectivecolumns{#1}% neue Anzahl (eff.) Spalten
\iftn@cstreset %++ über Option konfigurierbar gemacht 2013-06-09-rais
\setcounter{tn@table}{0}%
% \setcounter{tn@tabcol}{0}%<-- in \seteffectivecolumns verschoben 2013-06-09-rais
\setcounter{tn@tabline}{0}%
\else
\addtocounter{table}{-1}% neue Spaltenanzahl soll für bisherige Tabelle gelten
\fi
\fi
\fi
\refstepcounter{tn@table}%
% \ifhmode\par\fi\noindent <-- das ist bei longtable auch nicht mehr notwendig 2013-06-09-rais
%\minipage{\linewidth}% damit die
%Tabellenüberschrift nicht vom Körper getrennt
%werden kann,deaktiviert für longtable{5.6.13}
% \expandafter\begin{\tn@table@align} auskommentiert und Option an longtable übergeben 2013-06-09-rais
\ifx\relax#2\relax
\iftnresume\relax
\else
\tn@warn{Empty caption text for tntable \thetable}%
\xdef\tn@captiontext{#2}%
\fi
\else
\xdef\tn@captiontext{#2}%
\fi
% \def\@captype{table}% damit \caption `weiß', daß es hier um eine Tabelle geht -- auskommentiert, \caption in longtable verschoben 2013-06-09-rais
\begin{longtable}[\tn@table@align]{@{}>{\raggedleft}p{\numbercolwidth}*{\arabic{tn@effect ive@columns}}{>{\cellflush}p{\cellwidth}}@{}}%\cellflush addbyctans

\caption{\tn@captiontext}\\% innerhalb longtable ist \caption mit \\ abzuschliessen 2013-06-09-rais
}{%
%\addtocounter{table}{-1}%decrease counter{table}of longtable addbyctans{5.6.13}
% ^^^ mit der Verschiebung der \caption obsolet geworden 2013-06-09-rais
\end{longtable}
% \expandafter\end{\tn@table@align} deaktiviert für longtable 2013-06-09-rais
%\endminipage deaktiviert für longtable{5.6.13}
}
\newcommand*\showtab[1]{% zum Debuggen 2013-06-17-rais
\begingroup
\message{+-+-+ #1:}%
\c@tn@element=0\relax
\@for\tn@currentelement:=\the\tn@lintab\do{%
\advance\c@tn@element by 1
\tn@info{element \thetn@element: `\tn@currentelement'}%
}%
\endgroup
}
\newcommand*\tn@nop[1]{#1}
\newcommand*\tntab[3][]{%
% \setcounter{tn@lastelement}{\value{tn@elements}}%
% \addtocounter{tn@lastelement}{#2}%
\setcounter{tn@lastelement}{#2}% an gekürzten Tabelleninhalt angepasst 2013-06-17-rais
\setcounter{tn@element}{0}%Schleifenzähler
\tn@currenttab={}% und Tabelleninhalt initialisieren
\tn@tmplintab={}% Sammelstelle für Tabellenrest
\edef\tn@empty{\the\tn@tmplintab}% f.Vergleich
\begin{tntable}[#1]{#3}
\@for\tn@currentelement:=\the\tn@lintab\do{%
\stepcounter{tn@element}%
% \ifnum\value{tn@element}>\value{tn@elements}\relax% obsolet 2013-06-17-rais
\ifnum\value{tn@element}>\value{tn@lastelement}\relax
% Alles, was nach tn@lastelement steht, wandert in die gekürzte Tabelle 2013-06-17-rais
\edef\tn@tmpb{\the\tn@tmplintab}%
\ifx\tn@empty\tn@tmpb\relax
\edef\tn@addcell{\noexpand\tn@tmplintab={\noexpand \tn@nop{\tn@currentelement}}}% erstes Element in Resttabelle
\else
\edef\tn@addcell{\noexpand\tn@tmplintab={\the\tn@t mplintab,\noexpand\tn@nop{\tn@currentelement}}}% alle Folgeelemente
\fi
\tn@addcell
\else
\edef\tn@addcell{\noexpand\tn@currenttab={\the\tn@ currenttab\noexpand\cell{\tn@currentelement}}}%
\tn@addcell
\fi
% \fi
}%
\edef\tn@addcell{\noexpand\global\noexpand\tn@lint ab={\the\tn@tmplintab}}%
\tn@addcell% neuer Tabelleninhalt = Rest
\iftncheckelements %Gesamtanzahl Elemente (nur im ersten Aufruf gültig) 2013-06-17-rais
\setcounter{tn@totalelements}{\value{tn@element}}%
\global\tncheckelementsfalse %erst nach nächstem \deflintab wieder aktiv
\fi
\the\tn@currenttab
\end{tntable}
\ifnum\value{tn@element}<\value{tn@lastelement}\relax
\tn@warn{Current element list exhausted!^^J
You wanted to get \arabic{tn@lastelement}, but only \arabic{tn@element} were present}
\fi
\setcounter{tn@elements}{\value{tn@lastelement}}% Start für Folgetabelle festlegen
}%\tntab[Anzahl Spalten]{Anzahl Elemente}{Überschrift}
\endinput
\end{filecontents*}
\usepackage[colspecstaysintable,c]{tablenumbers3}
\begin{document}%
\renewcommand{\cellflush}{\raggedright}
\setlength\cellheight{1\baselineskip}%addbyctans{5 .6.13}
\setlength\cellwidth{1\basecolskip}%addbyctans{5.6 .13}
\deflintab{1,2,3,4,5,6,7,8,{9,10},11,12,13,14,15,1 6,17,18,19,20}
\showtab{Nach Definiton}%
\tntab[4]{6}{6 elemente in 4 spalten}
\showtab{Nach erster Teiltabelle}%
\tntab[5]{6}{6 elemente in 5 spalten}% optionalen Parameter von 4 auf 5 geändert, damit die Tabellenüberschrift passt 2013-06-09-rais
\showtab{Nach zweiter Teiltabelle}%
\setlength\cellheight{8\baselineskip}%addbyctans{5 .6.13}
\setlength\cellwidth{9\basecolskip}%addbyctans{5.6 .13}
\deflintab{{Eine Menge Worte die in einer,Tabelle dargestellt werden und eine
Menge Text in die Spalten setzen, },{und die durch Kommata getrennt sind}}
\tntab[4]{4}{}
\listoftables
\end{document}

Im log kannst Du sehen, wie die Tabelle schrumpft.;-)

MfG

ctansearch
18-06-2013, 11:52
@rais

Ja, der Aufwand mit den Boxen ist extrem hoch und bringt wenig Effekt.
Ich denke, wir können das Gebastel so stehen lassen, es ergeben sich ohnehin schon eine Masse richtig guter Gestaltungsmöglichkeiten.
Falls es tatsächlich einmal dazu kommt, daß die \deflintab-Definition zu groß wird, kann man diese ja wiederum aufspalten und "von Hand" eine neue Tabelle anfangen.

Der letzte Test kompiliert mit 9999 Werten auf 98 Seiten ohne Problem.
Was will man mehr..
Nun als Paket zu finden unter
http://ctan.org/pkg/nox

ctansearch
23-06-2013, 00:30
Genau für eine solche Anwendung wie NOX http://ctan.org/pkg/nox hatte ich mal das Paket micropage geschrieben, um in Tabellen fortlaufende kleine Micropages unterzubringen. Unbefriedigend ist nun die \tntabledimen-Funktion, vielleicht sollte man die aufgeben. Auch gelingt es mir nicht, die \micropages(Seitenzahlen) vernünftig einzufügen. Hast Du eine Idee?


\documentclass[10pt,a4paper]{article}%
\usepackage[utf8]{inputenc}%
\usepackage[ngerman]{babel}%
\usepackage[colspecstaysintable,c]{nox}
\usepackage{amsmath,graphicx,tabularx,micropage}
\author{ctansearch,rais}
\title{Nox v.1.0}
\begin{document}%
\maketitle
\abstract{Dieses Paket ist aus einer kleinen Onlinezusammenarbeit entstanden. Es
ermöglicht, Daten, Texte und \TeX/\LaTeX - Befehle und Umgebungen in einem Array
unterzubringen und später in frei definierbaren und fortlaufenden Tabellen
abzurufen. Ursprünglich hieß der Versuch \texttt{tablenumbers} Der häufige
Gebrauch des \textbackslash noexpand-Befehls hat diesem Paket den Namen \texttt{Nox}
gegeben.}\par
\section{Allgemeines}

Werte können in beliebiger Anzahl in den Array
eingegeben werden.
Dann legt man die Ausrichtung innerhalb der Tabelle fest
\begin{verbatim}
\renewcommand{\cellflush}{\raggedright}
\renewcommand{\cellflush}{\raggedleft}
\renewcommand{\cellflush}{\centering}
\renewcommand{\cellflush}{} %ergibt Blocksatz
\end{verbatim}
Man definiert mit \begin{verbatim}\tntabledimen{x}{y}\end{verbatim} die
Spaltenbreite x und Zeilenhöhe y.
Durch \begin{verbatim}\tntab[x]{y}{y Elemente in x Spalten}\end{verbatim} legt man fest, in wievielen Spalten
wieviele Elemente des Array dargestellt werden sollen. Wenn die Anzahl der
abgerufenen Elemente (y*x) kleiner ist, als die im Array verfügbaren Elemente, können
diese durch weitere, anschließende Tabellen abgerufen werden. Wenn sie größer
ist, erscheint ein Fehlermeldung.

\section{Anwendung mit Zahlen}
\renewcommand{\cellflush}{}
\begin{verbatim}
\deflintab{1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17}
\renewcommand{\cellflush}{\raggedright}
\tntabledimen{1}{1} %Zeilenhöhe 1\baselineskip Zellenbreite 1\basecolskip
\tntab[4]{8}{2x4}
\tntab[4]{8}{4x8}
\tntab[4]{8}{4x8}
\end{verbatim} ergibt
\deflintab{1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17}
\tntabledimen{1}{7}
\tntab[4]{8}{2x4}
Zwischen den Tabellen kann man ohne weiteres einen Text einbringen, die
Tabelle wird einfach weitergeführt.
\tntab[4]{8}{2x4}
\subsection{Verschachtelungen}
Mit Verschachtelungen kann man auch mehrere Tabellen nebeneinander
setzen. Wieviele Elemente und Befehle solche Teiltabellen aufnehmen können muß
noch getestet werden.
\def\TabA{%Tabelle in einem Befehl zusammenfassen addbyctans 11.06.13
\deflintab{
\celllabel{A}
{\nox\begin{tabular}{cccc}\nox\caption{}\nox\\
1\amp 2\amp \nox\\
1\amp 2\amp 3 \nox\\
1\amp 2\amp 3 $\nox\rightarrow$\nox\\
\nox\end{tabular}},
\celltitle{B}
{\nox\begin{tabular}{cccc}\nox\caption{B}\nox\\
1\amp 2\amp 3 \nox\\
1\amp 2\amp 3 \nox\\
1\amp 2\amp 3 $\nox\rightarrow$\nox\\
\nox\end{tabular}},
\celltitle{C}
{\nox\begin{tabular}{cccc}\nox\caption{C}\nox\\
1\amp 2\amp 3 \nox\\
1\amp 2\amp 3 \nox\\
1\amp 2\amp 3 $\nox\rightarrow$\nox\\
\nox\end{tabular}},
\celltitle{D}
{\nox\begin{tabular}{cccc}\nox\caption{D}\nox\\
1\amp 2\amp 3 \nox\\
1\amp 2\amp 3 \nox\\
1\amp 2\amp 3 $\nox\rightarrow$\nox\\
\nox\end{tabular}},
\celltitle{E}
{\nox\begin{tabular}{cccc}\nox\caption{E}\nox\\
1\amp 2\amp 3 \nox\\
1\amp 2\amp 3 \nox\\
1\amp 2\amp 3 $\nox\rightarrow$\nox\\
\nox\end{tabular}},
\celltitle{F}
{\nox\begin{tabular}{cccc}\nox\caption{F}\nox\\
1\amp 2\amp 3 \nox\\
1\amp 2\amp 3 \nox\\
1\amp 2\amp 3 $\nox\rightarrow$\nox\\
\nox\end{tabular}}
}
\tntabledimen{9}{8}
\tntab[3]{6}{Zwei mal drei}}
\TabA%Zusammengefasste Tabelle abrufen.addbyctans 11.06.13

Wenn man möchte, kann man die Konstruktionen jeweils als eigenen Befehl
definieren und dort abrufen, wo man sie braucht. So ist zum Beispiel die
Tabellenkette [\ref{A}] im Befehl \texttt{$\backslash$TabA} gespeichert.
Man kann solche Tabellen in einer externen Datei speichern und bei Bedarf
einbinden oder zum Beispiel Tabellenvorlagen erarbeiten, in die man nur noch
die Daten einfügt.
Für den Befehl \texttt{$\backslash$tntabledimen} ist zu erwähnen, daß er für alle
folgenden Tabellen gilt, solange er nicht neu definiert wird. Man kann also
alle Tabellen eines Dokumentes leicht auf ein Format bringen.
\section{Anwendung mit Texten}
Eine Anwendung mit Texten macht es möglich, Spalten mit fortlaufenden Texten
zu füllen, die bei einem Zeilenwechsel immer mit der ersten Spalte neu beginnen.
Automatische Spaltenwechsel sind nach wie vor nicht möglich, sie müssen im
Array durch geschweifte Klammern(Gruppieren) und Kommata definiert werden.
Die Zeilenhöhe wird dabei explizit festgelegt, die Zeilenhöhen passen sich
\textbf{nicht} automatisch an. Es gibt derzeit keine Möglichkeit, die Anzahl
der Zeichen mit der Spaltenbreite und Zeilenhöhe in Beziehung zu setzen um so
einen automatischen Spaltenumbruch zu erzeugen. Übervolle Spalten führen
deshalb zu einem Überlauf, der durch veränderte Gruppierung , breitere Spalten
oder größere Zeilenhöhen ausgeglichen werden muß. Die Anpassung durch
\texttt{$\backslash$tntabledimen} macht eine sehr genaue Dimensionierung der
Tabellen möglich, worauf man nicht ohne weiteres verzichten
sollte.
\begin{verbatim}
\deflintab{{...},{...},{...},{...},{...}}
\tntabledimen{12}{7}%Zeilenhöhe Spaltenbreite
\tntab[4]{12}{Worte}
\end{verbatim} ergibt
\tntabledimen{5}{7.5}%Zeilenhöhe Spaltenbreite
\renewcommand{\cellflush}{\raggedright}
\deflintab{{Hier wird ein Text dargestellt, der in einer Spalte ausgegeben
wird.},{In der zweiten Spalte wird er fortgeführt, so wie er},{in der
dritten Spalte beendet wird.},{Der nächste Text wird in die folgende
Spalte oder Zeile verschoben.},{Dies
hängt von der Gestaltung der Tabelle(der Spaltenanzahl, Spaltenhöhe und der
Gruppierung) ab.}}

\tntab[4]{8}{Worte}
\section{Anwendung mit Umgebungen und Befehlen}
In dem Array \texttt{$\backslash$deflintab} können auch Befehle oder Umgebungen untergebracht werden, was
eine große Zahl von Gestaltungsmöglichkeiten in Tabellenzellen erlaubt. Hier
kommt der Befehl \texttt{$\backslash$noexpand} zum Tragen, der durch
\texttt{$\backslash$nox} abgekürzt wird. Wenn man allen
\texttt{$\backslash$} ein
\texttt{$\backslash$nox} voranstellt, werden die Befehle nicht expandiert und
kommen erst später zur Anwendung. Für viele Befehle und Umgebungen
funktioniert dies, im Einzelnen muß man es ausprobieren. Manche Umgebungen muß
man zusätzlich gruppieren \{...\}.
\tntabledimen{5}{8}
\deflintab{
\celllabel{List}\nox\begin{list}{\nox\dots}{\nox\i temsep \nox\labelsep \nox\labelwidth \nox\leftmargin\nox\listparindent\nox\parsep\nox\p arskip\nox\partopsep\nox\rightmargin \nox\topsep }
\nox\item First item \nox\item Second item \nox\end{list},
\celllabel{Equation } \nox\begin{equation}\nox\sqrt{15}=3.87\nox\end{equ ation},
\celllabel{Itemize } \nox\begin{itemize}\nox\item Aufzählung \nox\item Aufzählung \nox\end{itemize},
\celllabel{Math} Text ist immer dabei \nox\begin{math}x=f(y^2+2)
\nox\end{math},
\celllabel{MathA} Text ist immer dabei \nox\begin{math}x=f(y^2+2) \nox\end{math},
\celllabel{frac}$\nox\frac{\nox\pi}{180^\nox\circ} =1$,
}
\tntab[3]{8}{Umgebungen und Befehle}
\section{Cellnotes}
Aus dem Paket \textsl{mbenotes.sty} habe ich den Code entliehen, der Anmerkungen in jeder
Zelle möglich macht. Diese werden am Ende der jeweiligen Teiltabelle
ausgegeben, sofern sie vorhanden sind. \texttt{$\backslash$cellnote{}} muß mit
\texttt{$\backslash$noexpand} oder \
texttt{$\backslash$nox}
eingeleitet werden, wenn sie im Array \texttt{$\backslash$deflintab{...}}genutzt wird.
\begin{verbatim}
\deflintab{1,2\nox\cellnote{$\nox\sqrt{4}$},3,4,5}
\tntabledimen{1}{1}
\tntab[3]{5}{Cellnotes}
\end{verbatim} ergibt
\deflintab{1,2\nox\cellnote{$\nox\sqrt{4}$},3,4,5}
\tntabledimen{6}{1}
\tntab[3]{5}{Cellnotes}

\section{Micropages}
\tntabledimen{14}{10}
\deflintab{\nox\begin{micropage}\nox\microsection{ Section of micropage}Dies ist eine Micropage die in NOX eingebettet
ist. Man muß bei der Textgestaltung darauf achten die micropage nicht zu überfüllen.\nox\end{micropage},\nox\begin{micropag e}\nox\microsection{Section of
micropage} \nox\submicrosection{Submicrosection}\nox\end{micr opage},\nox\begin{micropage}\nox\microsection{Micr osection}\nox\subsubmicrosection{Subsubmicrosectio n}\nox\end{micropage},\nox\begin{micropage}\nox\mi crosection{Microsection}\nox\subsubmicrosection{Su bsubmicrosection}\nox\end{micropage},\nox\begin{mi cropage}\nox\microsection{Microsection}\nox\subsub microsection{Subsubmicrosection}\nox\end{micropage }}

\tntab[3]{9}{Micropages}
\vskip2cm
\section{Referenzen}
Im laufenden Text kann man auf jeden Zellentitel(jede Zelle der Tabelle) referenzieren, da die Labels
bereits beim Erstellen der Titel erzeugt
werden\texttt{$\backslash$celllabel\{x\}} erzeugt einen Titel und ein Label, \texttt{$\backslash$celltitle\{x\}} erzeugt nur einen
Titel, ohne ein Label zu erzeugen. Die üblichen \texttt{$\backslash$label\{x\}}
funktionieren weiterhin.

\section{Erweiterungen}
Der Grund, für die Tabellen \texttt{longtable} zu wählen ist, daß man die
\texttt{$\backslash$tabular}-Umgebung in diese einbringen kann. Umgekehrt wäre
dies schwieriger.
Wünschenswert wäre noch eine \texttt{$\backslash$subtable}-Funktion für das
Tabellenverzeichnis, um die Tabellen, die in der Longtable-Umgebung definiert
werden, der Haupttabelle zu untergliedern.
\listoftables
\twocolumn
\tableofcontents
\end{document}

unter Verwendung von micropage.sty



\newcounter{micropages}
\newcounter{micropart}
\newcounter{microchapter}
\newcounter{microsection}
\newcounter{submicrosection}
\newcounter{subsubmicrosection}
\newcounter{microparagraph}
\newcounter{submicroparagraph}
\renewcommand\themicropart{\@arabic\c@micropart}
\renewcommand\themicrochapter{\@arabic\c@microchap ter}
\renewcommand\themicrosection{\@arabic\c@microsect ion}
\renewcommand\thesubmicrosection{\themicrosection. \@arabic\c@submicrosection}
\renewcommand\thesubsubmicrosection{\thesubmicrose ction.\@arabic\c@subsubmicrosection}
\renewcommand\themicroparagraph{\thesubsubmicrosec tion.\@arabic\c@microparagraph}
\renewcommand\thesubmicroparagraph{\themicroparagr aph.\@arabic\c@submicroparagraph}
\newwrite\@microtoc
\immediate\openout\@microtoc=\jobname.moc

\newcommand\micropart[1]{
\setcounter{microchapter}{0}
\setcounter{microsection}{0}
\setcounter{submicrosection}{0}
\setcounter{subsubmicrosection}{0}
\refstepcounter{micropart}
\vskip0.5\baselineskip
\textbf{\Huge{#1 \themicropart}}
\vskip0.5\baselineskip
\immediate\write\@microtoc{#1 \themicropart
\hfill\thepage.\themicropages \vskip\baselineskip } }
\newcommand\microchapter[1]{
\setcounter{microsection}{0}
\setcounter{submicrosection}{0}
\setcounter{subsubmicrosection}{0}
\refstepcounter{microchapter}
\vskip0.5\baselineskip \Large{\textbf{#1 \themicrochapter}}
\vskip0.5\baselineskip

\immediate\write\@microtoc{ #1 \themicrochapter \hfill \thepage.\themicropages \vskip0.5\baselineskip}\normalsize }
\newcommand\microsection[1]{
\setcounter{submicrosection}{0}
\setcounter{subsubmicrosection}{0}
\refstepcounter{microsection}
\vskip0.5\baselineskip\Large{\textbf{\themicrosect ion. #1}}
\vskip0.5\baselineskip
\immediate\write\@microtoc{\themicrosection. #1 \hfill\thepage.\themicropages \vskip0.5\baselineskip }\normalsize }
\newcommand\submicrosection[1]{
\refstepcounter{submicrosection}

\vskip0.5\baselineskip\large{\textbf{\thesubmicros ection. #1}}
\vskip0.5\baselineskip
\immediate\write\@microtoc{\thesubmicrosection. #1 \hfill \thepage.\themicropages \vskip0.5\baselineskip }\normalsize}
\newcommand\subsubmicrosection[1]{
\refstepcounter{subsubmicrosection}
\vskip0.5\baselineskip\normalsize{\textbf{\thesubs ubmicrosection. #1}}
\vskip0.5\baselineskip
\immediate\write\@microtoc{\thesubsubmicrosection. #1\hfill\thepage.\themicropages \vskip0.5\baselineskip }\normalsize}
\newcommand\microparagraph[1]{
\vskip\baselineskip\normalsize{\textbf{#1}}
\vskip0.5\baselineskip \immediate\write\@microtoc{ #1 \hfill\thepage.\themicropages \vskip0.5\baselineskip}\normalsize}
\newcommand\submicroparagraph[1]{
\vskip0.5\baselineskip\normalsize{\textbf{#1}}
\vskip0.5\baselineskip
\immediate\write\@microtoc{#1 \hfill \thepage.\themicropages \vskip0.5\baselineskip}\normalsize}
\newcommand{\micropagesize}{0.5\textwidth}
\newenvironment{micropage}
%BEGIN Bereich
{%
\renewcommand{\micropagesize}{\cellwidth}
\let\Huge\huge
\let\huge\Large
\let\Large\large
\let\large\normalsize
\let\normalsize\small
\let\small\scriptsize
\let\scriptsize\tiny
\hsize=\micropagesize
\parindent=0pt
\refstepcounter{micropages}
}%
{%END Bereich

}%

rais
24-06-2013, 06:55
Moin ctansearch,

Genau für eine solche Anwendung wie NOX http://ctan.org/pkg/nox hatte ich mal das Paket micropage geschrieben, um in Tabellen fortlaufende kleine Micropages unterzubringen. Unbefriedigend ist nun die \tntabledimen-Funktion, vielleicht sollte man die aufgeben.

evtl. hilft hier, das aktuelle Element in eine Box mit Spaltenbreite zu packen, dann könntest Du zumindest drauf reagieren, wenn ein Element hier zu hoch ist.

Auch gelingt es mir nicht, die \micropages(Seitenzahlen) vernünftig einzufügen. Hast Du eine Idee?

Mir ist nicht ganz klar, was Du mit `vernünftig einfügen' meinst.
Was mir etwas seltsam vorkommt, sind die \thepage-Aufrufe innerhalb der \immediate\write-Anweisungen. Bekommst Du hier nicht das Problem, dass die in der .moc eingtragene Seitenzahl nicht zwingend synchron zu der Seite ist, auf der der dazugehörige \micro*-Abschnitt aufgerufen wird?
Bei der Ausgabe kann Materal auch auf der nächsten Seite landen ...
Eine mögliche Alternative wäre, zwischen \refstepcounter und \immediate\write ein \label zu setzen und dann im \immediate\write nicht \thepage, sondern \pageref zu verwenden (muss ggf. geschützt werden).
Vllt wäre es auch überlegenswert, micropage an tocbasic anzupassen (die Doku zu tocbasic ist mit im scrguide).

BTW: Du weißt, daß Du Dir mit


\newcommand\foo{
irgendwas
}

vor `irgendwas' (hier auch danach) ein Leerzeichen einfängst?

MfG

ctansearch
24-06-2013, 22:00
@rais

Was mir etwas seltsam vorkommt, sind die \thepage-Aufrufe innerhalb der \immediate\write-Anweisungen
Danke für den Hinweis. Das war ein Relikt (Micropage x auf Seite y).
Ein solcher Verweis ist überflüssig und überlädt die Sache. Auf Wunsch kann ja \pageref eingesetzt werden.
Die Seitenzahlen der Micropages (\themicropages) am Ende der Umgebung abrufen genügt ja.
Ich kann sie jetzt auch richtig ausrichten, ich hatte übersehen, daß die Ausrichtung der übergeordneten Ausrichtung der Tabellenzellen folgt und deshalb nochmals eine Ausrichtung erfolgen muss.

Siehe auch http://biocoen.org