Seite 1 von 2

dynamische Spaltenzahl

Verfasst: Di 4. Feb 2014, 19:14
von MoonKid
Ich möchte eine Tabelle mit variabler Zahl an Spalten haben.
In diesem Beispiel wird der Einfachheit wegen eine 5spaltige Tabelle aufgespannt.

Aber irgendwas haut da nicht hin.
\documentclass{scrartcl}

\usepackage{xltxtra}
\usepackage{polyglossia}
\setdefaultlanguage[spelling=new]{german}

\usepackage{ifthen}

\begin{document}
\newcounter{AskI}
\setcounter{AskI}{5}

    % tab
    \begin{tabular}{*{\value{AskI}}{c}}
        % first column
        \theAskI
        \addtocounter{AskI}{-1}
        % ..columns
        \whiledo{\value{AskI} > 1}
        {%
            &\theAskI
            \addtocounter{AskI}{-1}
        }%
        % last column
        &\theAskI
    \end{tabular}
\end{document}
Die Ausgabe im PDF sieht so aus
5 4 3 2 1
0 -1
Das ist das Ende des Logs
! Incomplete \iffalse; all text was ignored after line 23.
<inserted text>
\fi
l.23 }
%
! Missing } inserted.
<inserted text>
}
l.23 }
%
! Incomplete \iffalse; all text was ignored after line 23.
<inserted text>
\fi
l.23 }
%
! Missing } inserted.
<inserted text>
}
l.23 }
%
! Extra alignment tab has been changed to \cr.
<recently read> \endtemplate

l.23 }
%
! Extra \else.
\@iwhilesw ...i ->#1\expandafter \@iwhilesw \else
\@gobbletwo \fi {#1}\fi
l.23 }
%
! Extra \else.
\@iwhilesw ...i ->#1\expandafter \@iwhilesw \else
\@gobbletwo \fi {#1}\fi
l.23 }
%
! Extra \fi.
\@iwhilesw ...ilesw \else \@gobbletwo \fi {#1}\fi

l.23 }
%
! Extra \fi.
\@whilesw #1\fi #2->#1#2\@iwhilesw {#1#2}\fi \fi

l.23 }
%
! Missing } inserted.
<inserted text>
}
l.25 &
\theAskI
[1] (./it2.aux) )
Scheinbar werden doch mehr als 5 Spalten gebaut, was aber natürlich nicht zu den deklarierten Spaltentypen ("*{5}{c}") passt.
In der while-Logik sehe ich aber auch kein Problem.
while sollte 3 Mal laufen.

Verfasst: Di 4. Feb 2014, 20:27
von u_fischer
Tabellenzellen sind Gruppen (und ziemlich komplizierte Gebilde). Deine \while-Schleife beginnt in einer Zelle und endet in einer anderen, und zwischendurch endet die Gruppe und alles explodiert. Es ist besser, den Tabellenkörper erst außerhalb der Tabelle zusammenzubauen (in einem toks-Register) und später zu benutzen.

Verfasst: Di 4. Feb 2014, 22:11
von MoonKid
u_fischer hat geschrieben:Es ist besser, den Tabellenkörper erst außerhalb der Tabelle zusammenzubauen (in einem toks-Register) und später zu benutzen.
Der Begriff "toks" liefert nur diverse Forenbeiträge aber keine saubere Dokumentation. Meinst du "Token Register" (auf TeX-Ebene)?

Aber auch zu diesem Begriff finde ich keine CTAN-Doku oder etwas anderes als Forenbeiträge. Bei *TeX bin ich es mittlerweile irgendwie gewohnt offizielle Doku (von CTAN oder texdoc) zu nutzen. ;)

Sowas hier? Kapitel 12.8.
http://books.google.de/books?id=qVUS6mr ... er&f=false
oder Kapitel 8.13
http://www.ruhr-uni-bochum.de/schwarz/T ... in-tex.pdf

Also anhand dieser zwei Bücher hab ich n bisl experimentiert.
Mein Problem ist noch, wie ich zwei Tokens verbinde. Ich muss ja für das Tabellenproblem alles step-by-step zusammenbauen. Daher muss ich das Token Schritt für Schritt erweitern.
Adäquate Beispiele sind in der Doku auch nicht. \Union und \JoinToks läuft irgendwie gar nicht. Wie gesagt, keine Doku.

Beziehend auf dieses Post ein neuer Versucht, mit kleiner Schwäche.
\documentclass{scrartcl}

\usepackage{xltxtra}
\usepackage{polyglossia}
\setdefaultlanguage[spelling=new]{german}

\newcommand{\appendToksOne}[1]{%
  \ToksOne\expandafter{\the\ToksOne#1}}

\newtoks\ToksOne
\ToksOne={\bfseries test}

\newtoks\ToksTwo
\ToksTwo={ZWEI}

\begin{document}

\showthe\ToksOne

\showthe\ToksTwo

\appendToksOne{\ToksTwo}

\showthe\ToksOne
\end{document}
Euch Profis ist sicherlich ganz logisch, dass in diesem Beispiel nur der String "\ToksTwo" angehängt wird. Wie würde ich es expandieren? Ein \the läuft auch nicht.

Ein anderes Beispiel, dass das Problem gut verdeutlicht. Hier wird der Wert des Counters nicht ins token eingebaut.
\documentclass{scrartcl}

\usepackage{xltxtra}
\usepackage{polyglossia}
\setdefaultlanguage[spelling=new]{german}

\begin{document}
\newcounter{c}
\setcounter{c}{5}

\newtoks\toksC
\toksC={X \thec X}

\showthe\toksC
\end{document}
Wie gesagt finde ich nirgends Doku dazu. \expandafter zum Beispiel. Auch ein ":help" im vim liefert nix.

Verfasst: Mi 5. Feb 2014, 16:54
von MoonKid
Vermutlich verzettle ich mich gerade und der Thread hier wird zu kompliziert?
Sollte ich evtl. für eine Teilfrage (letzter Code) einen eigenen kleinen Thread aufmachen?

Verfasst: Mi 5. Feb 2014, 16:57
von u_fischer
Such nach Code mit folgenden Begriffen:

inittoks addtoks heiko oberdiek

Verfasst: Mi 5. Feb 2014, 21:33
von MoonKid
u_fischer hat geschrieben:Such nach Code mit folgenden Begriffen:
inittoks addtoks heiko oberdiek
Meinst du das hier?

Ich versteh den Code dort genauso wenig, wie die diversen PDF-TeX-Bücher die man so findet. Es werden nirgendwo die Grundlagen vermittelt. Die Grundlagen sind auch nirgendswo abrufbar. \expandafter ist scheinbar niregends dokumentiert. \toks@ ? Was soll das @ da?

Sorry, ich werd einfach nicht schlau daraus. Ich würde ja gerne Doku lesen, aber da gibt es einfach keine Doku, so wie ich es von CTAN oder dem ":help" aus vim gewohnt bin.

So wie ich die token register und die Expansion bisher vestanden habe, müsste in meinem Beispiel eigentlich auch "3" in \toksC stehen und nicht "\thec". Offensichtlich vestehe ich aber was falsch.

Hab ein meiner Verzweiflung auch einfach mal Sachen ausprobiert, die ich in anderem Code gesehen habe, ohne zu wissen ob das taugt.
"\the\c" "{\thec}" "\expandafter{\thec}" etc

Verfasst: Do 6. Feb 2014, 08:49
von Johannes_B
Du kennst bisher die Dokumentation zu LaTeX-Paketen und Klassen, diese sind für bloße Anwender gedacht. Paketautoren greifen auf den LaTeX-Kern zu, unter all dem steckt aber auch noch TeX.

Als bloßer Anwender brauchst du keinen Dunst vom Kernel zu haben, und das ist auch gut so.

Wenn du die Interna wirklich begreifen willst, dann schau mal zu:
TeX by Topic oder
TeX Programming Notes oder
Where do I start LaTeX programming?.

Aber vorsicht: Das kann dich viel Zeit kosten.


Eventuell ist auch LuaTeX was für dich.

Verfasst: Do 6. Feb 2014, 09:41
von Felix
Noch ein paar TeX-Bücher/Docs, falls Du an den low level Sachen interessiert bist, dort sind auch 2 deutschsprachige verlinkt: plain TeX.

Mein Tipp allerdings: wenn Du im wesentlichen was fertigmachen willst, vielleicht machs manuell statt aufwändig zu automatisieren und viel Zeit zu verlieren. Wenn Du jedoch Interesse dran hast, und das spannend findest, super! Dann lohnt sich die Beschäftigung mit TeX um der Sache selbst willen.

Felix

Verfasst: Do 6. Feb 2014, 21:36
von MoonKid
Die genannten PDFs kenne ich alle schon. Ich verstehe sie nur nicht.

z.B. das Beispiel zu \expandafter hier ergibt für mich keinen Sinn.
\documentclass{scrartcl}

\usepackage{xltxtra}
\usepackage{polyglossia}
\setdefaultlanguage[spelling=new]{german}

\begin{document}
\def\nextbf#1{{\bf #1}}
\def\meintext{Das ist ein Beispielsatz!}

\nextbf\meintext

\expandafter\nextbf\meintext

\end{document}
Mit diesem Befehl wird die Reihenfolge, in der die einzelnen TEX-Befehle expandiert werden, verändert. Expandieren geschieht zum Beispiel bei Makros. Der nachfolgende Befehl wird erst nach dem übernächsten Befehl expandiert.
\def\nextbf#1{{\bf #1}}
\def\meintext{Das ist ein Beispielsatz!}
Warum wird in meinem Beispiel in der zweiten Zeile NUR das D fett?

Meinem Verständnis wäre es wie
\bf #1Dies ist ein Beispielsatz!
Das kann nicht funktionieren und müsste wegen dem #1 sogar zu einem Error führen.

Ich brauche ja auch eigentlich ein \expand. das gibt es scheinbar nicht für mein ursprüngliches Problem
\toksC={X \thec X}

Verfasst: Do 6. Feb 2014, 21:56
von Felix
MoonKid hat geschrieben:Warum wird in meinem Beispiel in der zweiten Zeile NUR das D fett?
Weil
\expandafter\nextbf\meintext
wie
\nextbf Das ist ein Beispielsatz!
wirkt, und da hier keine Klammern sind, ist nur das D ein Argument für \nextbf. Es ergibt sich
{\bf D}as ist ein Beispielsatz!
Felix