Tabelle in Abhängigkeit der Anzahl von Sections/Subsections

Tabellen und Grafiken erstellen und anordnen


rimesime
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Sa 18. Apr 2009, 15:51
Wohnort: Berlin

Tabelle in Abhängigkeit der Anzahl von Sections/Subsections

Beitrag von rimesime »

Hallo,

ich habe bisher leider überhaupt nichts finden können zu meinem Problem. Ich gebe zu es ist etwas eher Exotisches.

Ich bin gerade dabei eine Vorlage zu erstellen. Auf dem Dokument sollen mehrere Sections und Subsections zu finden sein. Ich möchte auf der ersten Seite oben eine Tabelle bauen, die mir alle Sections/Subsections horizontal Auflistet. Darunter kommt dann noch jeweils ein leeres Kästchen.

Zur Veranschaulichung:

---------------
|1 |2a|2b |3 |
---------------
| _| _ | _ | _|


Section 1
Section 2
Subsection a
Subsection b
Section 3

Ein weiteres Problem ist, dass ich Section 2 natürlich nicht erwähnt haben möchte, da diese Section Untersections besitzt, und nur diese relevant sind.

Btw, ich benutze Latex noch nicht allzu lange. Habe zwar schon einige Dokumente geschrieben, aber bei manchen Feinheiten haperts eben manchmal. Bin aber jeglicher Art von Tipps dankbar...

MfG
Simon

phi
Moderator
Moderator
Beiträge: 420
Registriert: Fr 6. Feb 2009, 21:28

Beitrag von phi »

Hallo,

hier ist ein Ansatz.

Code: Alles auswählen

\documentclass{article}

\makeatletter
\newcommand*{\tabulartoc@contentsline}[3]{\tabulartoc@parse{#1}#2\@nil}
\newcommand*{\tabulartoc@parse}{}
\def\tabulartoc@parse#1#2#3#4\@nil{\csname tabulartoc@#1\endcsname{#3}}
\newcommand*{\tabulartoc@lastsection}{}
\newcommand*{\tabulartoc@section}[1]{%
  \ifx\tabulartoc@lastsection\@empty\else
  \tabulartoc@cell{\tabulartoc@lastsection}%
  \tabulartoc@separator
  \fi
  \renewcommand*{\tabulartoc@lastsection}{#1}%
}
\newcommand*{\tabulartoc@subsection}[1]{%
  \tabulartoc@cell{#1}%
  \tabulartoc@separator
  \renewcommand*{\tabulartoc@lastsection}{}%
}
\newcommand*{\tabulartoc@subsubsection}[1]{}
\newlength{\tabulartoc@cellwidth}
\setlength{\tabulartoc@cellwidth}{8mm}
\newlength{\tabulartoc@cellheight}
\setlength{\tabulartoc@cellheight}{12pt}
\newlength{\tabulartoc@celldepth}
\setlength{\tabulartoc@celldepth}{3pt}
\newcommand*{\tabulartoc@cell}[1]{\makebox[\tabulartoc@cellwidth]{#1}}
\newcommand*{\tabulartoc@separator}{%
  \@tempdima\tabulartoc@cellheight
  \advance\@tempdima2\tabulartoc@celldepth
  \vrule\@height\tabulartoc@cellheight\@depth\@tempdima
}
\newsavebox{\tabulartoc@box}
\newcommand*{\tabulartoc}{%
  \begingroup
  \makeatletter
  \catcode`\^^M=9 %
  \let\contentsline\tabulartoc@contentsline
  \begin{lrbox}{\tabulartoc@box}%
    \input{\jobname.toc}%
    \ifx\tabulartoc@lastsection\@empty\else
    \tabulartoc@cell{\tabulartoc@lastsection}%
    \fi
    \kern\z@
  \end{lrbox}%
  \setlength{\fboxsep}{0pt}%
  \fbox{%
    \vbox{%
      \hbox{\usebox{\tabulartoc@box}}
      \@tempdima\tabulartoc@cellheight
      \advance\@tempdima\tabulartoc@celldepth
      \vskip-\@tempdima
      \hrule
      \advance\@tempdima-0.4pt %
      \vskip\@tempdima
    }%
  }%
  \endgroup
}
\makeatother


\begin{document}

\tabulartoc
\tableofcontents

\section{}
\section{}
\subsection{}
\subsection{}
\section{}

\end{document}

rimesime
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Sa 18. Apr 2009, 15:51
Wohnort: Berlin

Beitrag von rimesime »

hallo,

wow, das sieht schon mal vielversprechend aus, versteh zwar höchstens die hälfte, bin aber dabei mich durchzukämpfen, wills ja auch verstehn...

also dein vorschlag funktioniert soweit super, bis auf die tatsache, dass die toc datei wohl erst erzeugt wird wenn man das inhaltsverzeichnis anzeigt. da es sich bei meiner vorlage jedoch um ein übungsblatt für die uni handelt, brauche ich hier natürlich kein inhaltsverzeichnis. gibt es vlt eine möglichkeit die toc datei zu erzeugen, ohne das inhaltsverzeichnis auch anzuzeigen?

soweit aber schon mal einen großen dank!

phi
Moderator
Moderator
Beiträge: 420
Registriert: Fr 6. Feb 2009, 21:28

Beitrag von phi »

Wenn du kein Inhaltsverzeichnis haben willst, füge am Ende von \tabulartoc folgendes ein (ungetestet):

Code: Alles auswählen

\if@filesw
  \newwrite\tf@toc
  \immediate\openout\tf@toc\jobname.toc\relax
\fi
\@nobreakfalse

rimesime
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Sa 18. Apr 2009, 15:51
Wohnort: Berlin

Beitrag von rimesime »

hey,

funktioniert super, genauso wie ich es haben möchte!

allerdings gibts noch ein klitzekleines manko, nämlich dass ein fehler beim ersten durchlaufen geschmissen wird da noch keine toc datei vorhanden ist. benutze led (für mich als quasi noch neuling eben vorteilhaft), falls das von bedeutung ist.

Fehler:
! LaTeX Error: File ´test.toc´ not found. Type X to quit or <RETURN> to proceed, or enter new name. (Default extension: toc)
wenn man enter drückt läufts auch dementsprechend richtig durch sodass nach nochmaligem durchlauf auch die gewünschte tabelle erscheint.

könnte man latex irgendwie sagen dass dieser error gleich übersprungen werden soll?

phi
Moderator
Moderator
Beiträge: 420
Registriert: Fr 6. Feb 2009, 21:28

Beitrag von phi »

Ersetze dazu \input durch \@input.

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2650
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Wenn Du tatsächlich kein Inhaltsverzeichnis haben willst, dann geht das ganze eigentlich noch viel einfacher:

Code: Alles auswählen

\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{blindtext}

\makeatletter
\renewcommand*{\tableofcontents}{%
  \begingroup
    \raggedright\@starttoc{toc}%
    \par
  \endgroup
}
\newcommand*{\tab@entry}{}
\renewcommand*{\l@section}[2]{%
    \renewcommand{\numberline}[1]{\xdef\tab@entry{##1}}%
    \sbox\@tempboxa{#1}%
    \begin{tabular}{|c|}\hline \tab@entry\\\hline \\\hline\end{tabular}%
    \kern-.5\arrayrulewidth\hskip 0pt
}
% Falls nicht alle Ebenen aufgeführt werden sollen,
% kann bei den folgenden Zeilen \l@section ab
% dem entsprechenden Eintrag einfach durch 
% \@gobbletwo ersetzt werden:
\let\l@subsection\l@section
\let\l@subsubsection\l@section
\let\l@paragraph\l@section
\let\l@subparagraph\l@section
\makeatother

\begin{document}
\tableofcontents
\blinddocument
\blinddocument
\end{document}
Wie man am Beispiel sieht, funktioniert dabei sogar der Umbruch, falls die Tabelle zu breit wird.

Der eigentliche Trick bei der Sache ist, dass man das erste Argument \l@section etc. gar nicht komplett haben will, sondern nur die Nummer. Die Nummer wird üblicherweise per \numberline gesetzt. Also wird diese Anweisung so umdefiniert, dass sie ihr Argument expandiert und zur (globalen) Definition von \tab@entry verwendet. Damit das Argument von \l@section überhaupt verarbeitet wird, wird es zur Definition einer Box verwendet. Diese Box wird jedoch selbst gar nicht verwendet, sie muss nur gefüllt aber nicht genutzt werden.
Zuletzt geändert von KOMA am Mo 20. Apr 2009, 10:11, insgesamt 6-mal geändert.

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2650
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

phi hat geschrieben:Ersetze dazu \input durch \@input.
Ich würde eher zu

Code: Alles auswählen

\InputIfFileExists{\jobname.toc}{}{}
raten. Wenn schon eine Anwenderanweisung existiert, würde ich die auch verwenden.

rimesime
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Sa 18. Apr 2009, 15:51
Wohnort: Berlin

Beitrag von rimesime »

So,

wollte mich nochmal bedanken für die schönen und ziemlich flotten (Komplett-)Lösungen...

Habe mich für Phi's Variante entschieden, weil ich da mehr meine kleinen Wünsche reineditieren konnte.

Hier mal der (Minimal-)Code den ich jetzt benutze, vielleicht interessiert es ja noch andere:

Code: Alles auswählen

\documentclass{article}

%%%%%%%%%%%%%%%%%%% ANFANG CODE FÜR PACKAGES %%%%%%%%%%%%%%%%%%
\usepackage[ngerman]{babel}

%%%%%%%%%%%%%%%%% ANFANG CODE FÜR EIGENE BEFEHLE %%%%%%%%%%%%%%
\renewcommand{\thesection}{\arabic{section}.}
\renewcommand{\thesubsection}{\alph{subsection})}
\newcommand{\aufgabe}{\section{\hspace{-0.4cm}Aufgabe}}
\newcommand{\teil}{\subsection{}}
\newcommand{\teilohnetoc}{
			\stepcounter{subsection}
			\subsection*{\thesubsection}
}

%%%%%%%%%%%%%%%%%%% ANFANG CODE FÜR TABLETOC %%%%%%%%%%%%%%%%%%
\makeatletter 
\newcommand*{\tabulartoc@contentsline}[3]{\tabulartoc@parse{#1}#2\@nil} 
\newcommand*{\tabulartoc@parse}{} 
\def\tabulartoc@parse#1#2#3#4\@nil{\csname tabulartoc@#1\endcsname{#3}} 
\newcommand*{\tabulartoc@lastsection}{} 
\newcommand*{\tabulartoc@section}[1]{% 
  \renewcommand*{\tabulartoc@lastsection}{#1}% 
  
  \ifx\tabulartoc@lastsection\@empty\else  
  \tabulartoc@separator 
  \tabulartoc@separator 
  \tabulartoc@separator 
  \tabulartoc@cell{\tabulartoc@lastsection}%
  \tabulartoc@separator 
  \fi 

  \renewcommand*{\tabulartoc@lastsection}{}% 
} 
\newcommand*{\tabulartoc@subsection}[1]{% 
  \tabulartoc@cell{#1}% 
  \tabulartoc@separator 
} 
\newcommand*{\tabulartoc@subsubsection}[1]{} 
\newlength{\tabulartoc@cellwidth} 
\setlength{\tabulartoc@cellwidth}{15mm} 
\newlength{\tabulartoc@cellheight} 
\setlength{\tabulartoc@cellheight}{7mm} 
\newlength{\tabulartoc@celldepth} 
\setlength{\tabulartoc@celldepth}{10pt} 
\newcommand*{\tabulartoc@cell}[1]{\makebox[\tabulartoc@cellwidth]{#1}} 
\newcommand*{\tabulartoc@separator}{% 
  \@tempdima\tabulartoc@cellheight 
  \advance\@tempdima2\tabulartoc@celldepth 
  \vrule\@height\tabulartoc@cellheight\@depth\@tempdima 
} 
\newsavebox{\tabulartoc@box} 
\newcommand*{\tabulartoc}{% 
  \begingroup 
  \makeatletter 
  \catcode`\^^M=9 % 
  \let\contentsline\tabulartoc@contentsline 
  \begin{lrbox}{\tabulartoc@box}% 
    \InputIfFileExists{\jobname.toc}{}{}% 
    \ifx\tabulartoc@lastsection\@empty\else 
    \tabulartoc@cell{\tabulartoc@lastsection}% 
    \fi 
\tabulartoc@separator
\tabulartoc@separator
\tabulartoc@separator
\tabulartoc@cell{$\sum$}
    \kern\z@ 
  \end{lrbox}% 
  \setlength{\fboxsep}{-0.7pt}% 
  \fbox{% 
    \vbox{% 
      \hbox{\usebox{\tabulartoc@box}} 
      \@tempdima\tabulartoc@cellheight 
      \advance\@tempdima\tabulartoc@celldepth 
      \vskip-\@tempdima 
      \hrule
\hrule
\hrule
\hrule
\hrule
      \advance\@tempdima-0.4pt % 
      \vskip\@tempdima 
    }% 
  }% 
\		\if@filesw 
		  \newwrite\tf@toc 
		  \immediate\openout\tf@toc\jobname.toc\relax 
		\fi 
		\@nobreakfalse
  \endgroup 
} 
\makeatother 

\begin{document}

%%%%%%%%%%%%%%%%%%%%%%%% TableToc bauen %%%%%%%%%%%%%%%%%%%%%%%
\begin{center}
    \tabulartoc
\end{center}

%%%%%%%%%%%%%%%%%%%%%%%%%%% Dokument %%%%%%%%%%%%%%%%%%%%%%%%%%
\aufgabe
\teil
\teil
\aufgabe
\teilohnetoc
\teilohnetoc
\aufgabe

\end{document}
MfG Simon

Antworten