Seite 1 von 1

Eigenes Verzeichnis mit mehreren Informationen

Verfasst: Mi 11. Okt 2017, 15:14
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.

Verfasst: Mi 11. Okt 2017, 18:03
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}

Verfasst: Mi 11. Okt 2017, 18:29
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}

Verfasst: Do 12. Okt 2017, 08:43
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.

Verfasst: Do 12. Okt 2017, 09:04
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}

Verfasst: Do 12. Okt 2017, 09:53
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}

Verfasst: Do 12. Okt 2017, 10:24
von abon
Tausend Dank!!! Jetzt klappt es!

Verfasst: Do 12. Okt 2017, 10:37
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.

Verfasst: Do 12. Okt 2017, 13:44
von abon
Das ist jetzt natürlich die beste Variante wenn sogar die Erstellung der Verzeichnis automatisch geht! Tausend Dank!!!