Tabelle in Abhängigkeit der Anzahl von Sections/Subsections

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Tabelle in Abhängigkeit der Anzahl von Sections/Subsections

von rimesime » Mi 22. Apr 2009, 11:35

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:
\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

von KOMA » Mo 20. Apr 2009, 10:01

phi hat geschrieben:Ersetze dazu \input durch \@input.
Ich würde eher zu
\InputIfFileExists{\jobname.toc}{}{}
raten. Wenn schon eine Anwenderanweisung existiert, würde ich die auch verwenden.

von KOMA » Mo 20. Apr 2009, 09:58

Wenn Du tatsächlich kein Inhaltsverzeichnis haben willst, dann geht das ganze eigentlich noch viel einfacher:
\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.

von phi » Mo 20. Apr 2009, 09:40

Ersetze dazu \input durch \@input.

von rimesime » Mo 20. Apr 2009, 06:39

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?

von phi » So 19. Apr 2009, 23:26

Wenn du kein Inhaltsverzeichnis haben willst, füge am Ende von \tabulartoc folgendes ein (ungetestet):
\if@filesw
  \newwrite\tf@toc
  \immediate\openout\tf@toc\jobname.toc\relax
\fi
\@nobreakfalse

von rimesime » So 19. Apr 2009, 22:43

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!

von phi » So 19. Apr 2009, 20:59

Hallo,

hier ist ein Ansatz.
\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}

Tabelle in Abhängigkeit der Anzahl von Sections/Subsections

von rimesime » Sa 18. Apr 2009, 16:09

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

Nach oben