Eigenes Verzeichnis mit mehreren Informationen

Inhalt, Abbildungen, Tabellen, Quellcodes und andere Verzeichnisse


abon
Forum-Newbie
Forum-Newbie
Beiträge: 5
Registriert: Mi 11. Okt 2017, 15:00

Eigenes Verzeichnis mit mehreren Informationen

Beitrag von abon »

Hallo zusammen!

Ich habe folgendes Problem: Ich erstelle mit einem Macro (mit 5 Parametern) immer gleiche Elemente (enthält jeweils mehrere Tabellen und Text). Nun möchte ich zu Beginn des Kapitels ein Verzeichnis (in Form einer Tabelle) einfügen, das den Text von 2 der Parameter + die Seitenzahl anzeigt (Das Verzeichnis selbst muss nicht automatisch sein, ich will nur die Texte darin aktualisieren lassen, wenn das jeweilige macro geändert wird).

Was ich bisher hinbekommen habe: Die Seitenzahl wird über ein Label für die erste Tabelle im Macro ermittlt:
\newcommand*{\apidoc}[6]
{
	\protect\stepcounter{apicounter}
	\begin{table}[H]
		\setlength\arrayrulewidth{1pt}
		\begin{tabularx}{\textwidth}{|X|r|}
			\hline
			\rowcolor{lightgray}
			\textbf{\large #1} & #2\\
			\hline
			\multicolumn{2}{|l|}{#3}\\
			\hline					
		\end{tabularx}
		\expandafter\label{api:\theapicounter}
	\end{table}

% hier kommt der Rest des command ...

}
Und der Refernzierung (z.B. für die erste Verwendung):
\pageref{api:1}
Was nicht funktioniert: Den Inhalt von Parameter #1 und #2 ins Verzeichnis zu bekommen. Ich habe es bereits mit verschiedensten Varianten versucht (def / newenvironment / newcommand / ...) aber bislang ohne Erfolg.

markusv
Forum-Meister
Forum-Meister
Beiträge: 947
Registriert: Do 3. Sep 2015, 17:20
Wohnort: Leipzig

Beitrag von markusv »

Hallo und willkommen im Forum. Poste bitte, wann immer möglich, ein lauffähiges Minimalbeispiel.

Mein Vorschlag basiert auf dem [d]KOMA-Script[/d] und dem dort mitgelieferten \DeclareNewTOC. Die kapitelweise Einteilung habe ich leider nicht hinbekommen, evtl. kann man das mit minitoc realisieren (ich bin aber gescheitert).
\documentclass[a4paper,10pt]{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage{tabularx}
\usepackage[table]{xcolor}

\DeclareNewTOC[%
type=api,%
types=apis,%
float,%
floattype=5,%
name=Api,%
floatpos=ht,%
listname={Verzeichnis der Apis}%
]{loa}

\newcommand*{\apiumgebung}[4]
{\begin{api}
      \setlength\arrayrulewidth{1pt}
      \begin{tabularx}{\textwidth}{|X|r|}
         \hline
         \rowcolor{lightgray}
         \textbf{\large #1} & #2\\
         \hline
         \multicolumn{2}{|l|}{#3}\\
         \hline              
      \end{tabularx}
      \caption{#4}
      \label{api:\theapi}
   \end{api}
% hier kommt der Rest des command ...
}


\begin{document}
\listofapis
\chapter{Kapitel eins}
\section{Abschnitt}
\subsection{Unterabschnitt}
\apiumgebung{was}{auch}{immer}{erste Beschriftung}
\chapter{Kapitel zwei}
\apiumgebung{das}{werden}{soll}{zweite Beschriftung}

Siehe Api~\ref{api:1} bzw. Seite~\pageref{api:2}


\end{document}
Wäre Microsoft Word für das Schreiben von Büchern entwickelt worden,
würde es Microsoft Book heißen.

Unkomplizierte und schnelle LaTeX-Hilfe, bspw. Erstellung von Vorlagen und Bewerbungen:
Help-LaTeX@web.de

abon
Forum-Newbie
Forum-Newbie
Beiträge: 5
Registriert: Mi 11. Okt 2017, 15:00

Beitrag von abon »

Danke, aber das löst mein Problem noch nicht ganz, da ich zwei Parameter (also z.B. #1 und #2) im Verzeichnis verwenden will:
\nameref{api:par1:1} % hier soll "was" erscheinen
\nameref{api:par2:1} % hier soll "auch" erscheinen
\pageref{api:par1:1} % hier soll die Seitenzahl erscheinen

% ... sonstiger Code

\apiumgebung{was}{auch}{immer}{erste Beschriftung}

Gast

Beitrag von Gast »

Also für mich ist Deine Frage extrem unklar. Vielleicht machst Du mal ein Minimalbeispiel wie von Markus bereits angemahnt und machst daran auch sehr deutlich an, was genau Du wo wie ausgegeben haben willst.

abon
Forum-Newbie
Forum-Newbie
Beiträge: 5
Registriert: Mi 11. Okt 2017, 15:00

Beitrag von abon »

Ich hab mir mal erlaubt den Code von Markus entsprechend anzupassen:
\documentclass[a4paper,10pt]{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage{tabularx}
\usepackage[table]{xcolor}
\usepackage{nameref}

\DeclareNewTOC[%
   type=api,%
   types=apis,%
   float,%
   floattype=5,%
   name=Api,%
   floatpos=ht,%
   listname={Verzeichnis der Apis}%
]{loa}

\newcommand*{\apiumgebung}[4]
{
   \begin{api}
      \setlength\arrayrulewidth{1pt}
      \begin{tabularx}{\textwidth}{|X|r|}
         \hline
         \rowcolor{lightgray}
         \textbf{\large #1} & #2\\
         \hline
         \multicolumn{2}{|l|}{#3}\\
         \hline              
      \end{tabularx}
      \caption{#4}
      \label{api:\theapi}
   \end{api}
   % Hier soll #1 so gespeichert werden, dass man unten mit \nameref{api:par1:\theapi} den Text von #1 auslesen kann
   % Hier soll #2 so gespeichert werden, dass man unten mit \nameref{api:par2:\theapi} den Text von #2 auslesen kann
   
   % hier kommt der Rest des command ...
}


\begin{document}
   \chapter{Kapitel eins}
   \section{Übersicht}

   \begin{table}[h!]
      \begin{tabularx}{\textwidth}{|X|c|c|}
         \hline
         \textbf{Parameter1}&\textbf{Parameter2}&\textbf{Seite}\\
         \hline
         \hline
         \nameref{api:par1:1}&\nameref{api:par2:1}&\pageref{api:1}\\ % hier soll ausgegeben werden: | was | auch | 1 |
         \nameref{api:par1:2}&\nameref{api:par2:2}&\pageref{api:2}\\ % hier soll ausgegeben werden: | das | werden | 2 |
        % hier dann alle weiteren apis auflisten
         \hline
      \end{tabularx}
   \end{table}

   \section{Abschnitt}
   \subsection{Unterabschnitt}

   \apiumgebung{was}{auch}{immer}{erste Beschriftung}

   \chapter{Kapitel zwei}

   \apiumgebung{das}{werden}{soll}{zweite Beschriftung}

\end{document}

Gast

Beitrag von Gast »

\documentclass[a4paper,10pt]{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage{tabularx}
\usepackage[table]{xcolor}
\usepackage{nameref}

\DeclareNewTOC[%
   type=api,%
   types=apis,%
   float,%
   floattype=5,%
   name=Api,%
   floatpos=ht,%
   listname={Verzeichnis der Apis}%
]{loa}

\makeatletter
\newcommand*{\apiumgebung}[4]
{
   \begin{api}
      \setlength\arrayrulewidth{1pt}
      \begin{tabularx}{\textwidth}{|X|r|}
         \hline
         \rowcolor{lightgray}
         \textbf{\large #1} & #2\\
         \hline
         \multicolumn{2}{|l|}{#3}\\
         \hline              
      \end{tabularx}
      \caption{#4}
      \label{api:\theapi}
      \def\@currentlabelname{#1}\label{api:par1:\theapi}% zusätzliches Label für das erste Argument
      \def\@currentlabelname{#2}\label{api:par2:\theapi}% zusätzliches Label für das zweite Argument
   \end{api}
}
\makeatother


\begin{document}
   \chapter{Kapitel eins}
   \section{Übersicht}

   \begin{table}[h!]
      \begin{tabularx}{\textwidth}{|X|c|c|}
         \hline
         \textbf{Parameter1}&\textbf{Parameter2}&\textbf{Seite}\\
         \hline
         \hline
         \nameref{api:par1:1}&\nameref{api:par2:1}&\pageref{api:1}\\ % hier soll ausgegeben werden: | was | auch | 1 |
         \nameref{api:par1:2}&\nameref{api:par2:2}&\pageref{api:2}\\ % hier soll ausgegeben werden: | das | werden | 2 |
        % hier dann alle weiteren apis auflisten
         \hline
      \end{tabularx}
   \end{table}

   \section{Abschnitt}
   \subsection{Unterabschnitt}

   \apiumgebung{was}{auch}{immer}{erste Beschriftung}

   \chapter{Kapitel zwei}

   \apiumgebung{das}{werden}{soll}{zweite Beschriftung}

\end{document}

abon
Forum-Newbie
Forum-Newbie
Beiträge: 5
Registriert: Mi 11. Okt 2017, 15:00

Beitrag von abon »

Tausend Dank!!! Jetzt klappt es!

Gast

Beitrag von Gast »

War oben nicht die Rede davon, dass das kapitelweise erfolgen soll, also so:
\documentclass[a4paper,10pt]{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage{tabularx}
\usepackage[table]{xcolor}
\usepackage{nameref}

\DeclareNewTOC[%
   type=api,%
   types=apis,%
   float,%
   floattype=5,%
   name=Api,%
   floatpos=ht,%
   listname={Verzeichnis der Apis}%
]{loa}

\addtotoclist[api]{api}
\makeatletter
\newwrite\@apifile
\newif\if@apifilewritten
\renewcommand*{\@apifilewrittentrue}{\global\let\if@apifilewritten\iftrue}
\renewcommand*{\@apifilewrittenfalse}{\global\let\if@apifilewritten\iffalse}
\newcommand*{\apioverview}{%
  \closeapioverview
  \InputIfFileExists{\jobname-\thechapter.api}{}{%
    \typeout{No file `\jobname-\thechapter.api' found.}%
  }%
}
\newcommand*{\startapioverview}{%
  \if@apifilewritten\else
    \if@filesw
      \typeout{Open new api file `\jobname-\thechapter.api'}%
      \@apifilewrittentrue
      \openout\@apifile \jobname-\thechapter.api
      \protected@write\@apifile{}{%
        \string\section*{\string\apioverviewname}^^J%
        \string\begin{tabularx}{\string\textwidth}{|X|c|c|}^^J
        \string\hline^^J
        \string\textbf{Parameter1}&
        \string\textbf{Parameter2}&
        \string\textbf{Seite}\string\\^^J
        \string\hline^^J
        \string\hline
      }%
    \fi
  \fi
}
\newcommand*{\closeapioverview}{%
  \if@apifilewritten
    \protected@write\@apifile{}{%
      \string\end{tabularx}%
    }%
    \closeout\@apifile
    \@apifilewrittenfalse
  \fi
}
\newcommand*{\setapientry}[2]{%
  \startapioverview
  \protected@write\@apifile{}{ \detokenize{#1}&\detokenize{#2}&\thepage\string\\^^J \string\hline}%
}
\makeatletter
\AtEndDocument{\closeapioverview}

\newcommand*{\apiumgebung}[4]
{
   \begin{api}
      \setlength\arrayrulewidth{1pt}
      \begin{tabularx}{\textwidth}{|X|r|}
         \hline
         \rowcolor{lightgray}
         \textbf{\large #1} & #2\\
         \hline
         \multicolumn{2}{|l|}{#3}\\
         \hline              
      \end{tabularx}
      \caption{#4}
      \label{api:\theapi}
      \setapientry{#1}{#2}%
   \end{api}
}
\makeatother
\newcommand*{\apioverviewname}{Übersicht}


\begin{document}
   \chapter{Kapitel eins}
   \apioverview

   \section{Abschnitt}
   \subsection{Unterabschnitt}

   \apiumgebung{was}{auch}{immer}{erste Beschriftung}
   \apiumgebung{das}{auch}{immer}{erste Beschriftung}
   

   \chapter{Kapitel zwei}
   \apioverview

   \apiumgebung{das}{werden}{soll}{zweite Beschriftung}


   \chapter{Kapitel drei}
   \apioverview
   Und hier sehen wir, was mit \verb|\apioverview| passiert, wenn gar keine
   APIs in dem Kapitel definiert sind.

\end{document}
Statt so:
\documentclass[a4paper,10pt]{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage{tabularx}
\usepackage[table]{xcolor}
\usepackage{nameref}

\DeclareNewTOC[%
   type=api,%
   types=apis,%
   float,%
   floattype=5,%
   name=Api,%
   floatpos=ht,%
   listname={Verzeichnis der Apis}%
]{loa}

\addtotoclist[api]{api}
\makeatletter
\newwrite\@apifile
\newif\if@apifilewritten
\renewcommand*{\@apifilewrittentrue}{\global\let\if@apifilewritten\iftrue}
\renewcommand*{\@apifilewrittenfalse}{\global\let\if@apifilewritten\iffalse}
\newcommand*{\apioverview}{%
  \closeapioverview
  \InputIfFileExists{\jobname-\thechapter.api}{}{%
    \typeout{No file `\jobname-\thechapter.api' found.}%
  }%
}
\newcommand*{\startapioverview}{%
  \if@apifilewritten\else
    \if@filesw
      \typeout{Open new api file `\jobname-\thechapter.api'}%
      \@apifilewrittentrue
      \openout\@apifile \jobname-\thechapter.api
      \protected@write\@apifile{}{%
        \string\section*{\string\apioverviewname}^^J%
        \string\begin{tabularx}{\string\textwidth}{|X|c|c|}^^J
        \string\hline^^J
        \string\textbf{Parameter1}&
        \string\textbf{Parameter2}&
        \string\textbf{Seite}\string\\^^J
        \string\hline^^J
        \string\hline
      }%
    \fi
  \fi
}
\newcommand*{\closeapioverview}{%
  \if@apifilewritten
    \protected@write\@apifile{}{%
      \string\end{tabularx}%
    }%
    \closeout\@apifile
    \@apifilewrittenfalse
  \fi
}
\newcommand*{\setapientry}[2]{%
  \startapioverview
  \protected@write\@apifile{}{ \detokenize{#1}&\detokenize{#2}&\thepage\string\\^^J \string\hline}%
}
\makeatletter
\AtEndDocument{\closeapioverview}

\newcommand*{\apiumgebung}[4]
{
   \begin{api}
      \setlength\arrayrulewidth{1pt}
      \begin{tabularx}{\textwidth}{|X|r|}
         \hline
         \rowcolor{lightgray}
         \textbf{\large #1} & #2\\
         \hline
         \multicolumn{2}{|l|}{#3}\\
         \hline              
      \end{tabularx}
      \caption{#4}
      \label{api:\theapi}
      \setapientry{#1}{#2}%
   \end{api}
}
\makeatother
\newcommand*{\apioverviewname}{Übersicht}


\begin{document}
   \chapter{Kapitel eins}
   \apioverview

   \section{Abschnitt}
   \subsection{Unterabschnitt}

   \apiumgebung{was}{auch}{immer}{erste Beschriftung}

   \chapter{Kapitel zwei}
   \apiumgebung{das}{werden}{soll}{zweite Beschriftung}

\end{document}
Anders gesagt: Mit dieser Lösung kann man eine oder mehrere Übersichten automatisch erstellen lassen, wobei jeweils die api-Umgebungen ab dem \apioverview aufgesammelt werden. Die Verwendung von \thechapter in der Zeile
      \openout\@apifile \jobname-\thechapter.api
ist also eher willkürlich. Man könnte stattdessen auch (außerhalb des Makros) einen eigenen Zähler apioverviews definieren und dann obige Zeile durch
    \stepcounter{apioverviews}\openout \@apifile \jobname-\theapioverviews.api
ersetzen.

abon
Forum-Newbie
Forum-Newbie
Beiträge: 5
Registriert: Mi 11. Okt 2017, 15:00

Beitrag von abon »

Das ist jetzt natürlich die beste Variante wenn sogar die Erstellung der Verzeichnis automatisch geht! Tausend Dank!!!

Antworten