Eigene Umgebung mit Tabelle Thema ist als GELÖST markiert

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


Burny

Eigene Umgebung mit Tabelle

Beitrag von Burny »

Hallo,

ich hoffe auf Hilfe hier aus dem Forum. Ich möchte eine Tabellenvorlage erstellen in der ich dann später einzelne Zellinhalte ändern kann.
\newenvironment{\tabelle1}[4]{
\begin{table}[h] 
\centering
\begin{tabular}{|m{0.3cm}|m{16cm}|}
\hline
 & \textbf{Allgemeine Infos} \\
 & Text 1 \\
\hline
\begin{turn}{90}
\textcolor{red}{Gefahren}
\end{turn}
 & #1\\
\hline
\begin{turn}{90}
Plan
\end{turn} & #2\\
\hline
\begin{turn}{90}
Maßnahmen
\end{turn}  & #3\\
\hline
\begin{turn}{90}
\textcolor{green}{Hinweise}
\end{turn} & 
\begin{liste1}
\item 1test
\item 2test
\end{liste1}\\
\hline
\begin{turn}{90}
Organisation
\end{turn} & #4\\
\hline
 & \textbf{Verweise} \pr \pageref{tab:test}\\
\hline
\end{tabular}
\label{tab:test}
\end{table}}
Hat jemand eine Idee wie ich das Problem lösen kann? Ich muss die Tabelle ca. 200 mal verwenden, und dann die Möglichkeit haben diese später noch zu ändern.

Tx 4 support
Burny

Nerd 032F

Beitrag von Nerd 032F »

Es wäre schön gewesen, wenn Du ein vollständiges Minimalbeispiel gemacht hättest, statt nur ein paar Zeilen Code zu posten. So kann ich das Ding leider nicht testen und nur theoretisch bestimmen, was Dein Problem sein könnte:
Burny hat geschrieben:
\newenvironment{\tabelle1}[4]{
Die Namen von Umgebungen haben keinen Backslash am Anfang wie Makronamen. Da Makronamen außerdem keine Ziffern, sondern nur Buchstaben enthalten können (Ausnahme wären Makronamen, die nur aus einer einzelnen Ziffer bestehen), versucht LaTeX hier das Makro \tabelle zu expandieren, um dessen Expansion dann ergänzt um die "1" als Umgebungsnamen zu verwenden. Wenn \tabelle nicht definiert ist, gibt das einen Fehler, wegen undefined control sequence.

Darüber hinaus sei darauf hingewiesen, dass Zeilenumbrüche für LaTeX Leerzeichen sind. Im konkreten Fall spielt das eventuell keine Rolle, weil das nachfolgende \begin{table} in den vertikalen Modus schaltet und Leerzeichen am Ende des horizontalen Modus von LaTeX entfernt werden. Aber häufig spielt das eine Rolle, weshalb man sich angewöhnen sollte, potentiell unerwünschte Leerzeichen durch auskommentieren des Zeilenendes zu entfernen.

Mit beiden Tipps ergibt sich also:
\newenvironment{tabelle1}[4]{%
Burny hat geschrieben:
\begin{table}[h]
\centering
...
\end{table}
Aus der Verwendung der Platzierungsoption "h", dem Fehlen einer \caption-Anweisung und dem Hinweis, dass Du die Tabelle 200 Mal benötigst, schließe ich, dass Du gar keine Gleitumgebung möchtest, sondern die Tabelle genau an der Stelle im Dokument landen soll, an der sie auch im Quellcode steht. Also solltest Du schlicht die table-Umgebung weg lassen. Damit die Tabelle dann nicht am umgebenden Text klebt (oder sogar im horizontalen Modus ausgegeben wird), kannst Du schlicht \centering durch die center-Umgebung ersetzen:
\begin{center}
...
\end{center}
Burny hat geschrieben:
\begin{liste1}
...
\end{liste1}
Dazu lässt sich schlicht nichts sagen, weil ich keine Ahnung habe, wie bei Dir liste1 definiert ist. Eine vollständiges Minimalbeispiel wäre hier also dringend notwendig gewesen.
Burny hat geschrieben:
& \textbf{Verweise} \pr \pageref{tab:test}\\
Dazu lässt sich schlicht nichts sagen, weil ich keine Ahnung habe, wie bei Dir \pr definiert ist. Eine vollständiges Minimalbeispiel wäre hier also dringend notwendig gewesen.
Burny hat geschrieben:
\label{tab:test}
Ein festes Label in der Definition der Umgebung einzufügen ist nicht sinnvoll. Dadurch würde ja bei jeder Verwendung der Umgebung tabelle1 dasselbe Label gesetzt. Nicht nur, dass LaTeX deshalb bei 199 der 200 Tabellen eine Warnung wegen Label ... multiple defined ausgeben würde, könnte man auch nicht mehr darauf verweisen, denn woher soll LaTeX wissen, auf welche der 200 Tabellen nun verwiesen werden soll? Stattdessen setzt man \label dann bei Verwendung der Umgebung oder definiert einen Parameter dafür:
\newenvironment{tabelle1}[5]{%
\begin{centering}
\label{#5}%
Es sei darauf hingewiesen, dass auf diese Tabelle sinnvoll nur per \pageref, nicht jedoch per \ref verwiesen werden kann, da ohne \caption keine Tabellennummer existiert. Wird das Paket hyperref verwendet, ist es außerdem sinnvoll ein \phantomsection vor dem \label einzufügen, damit bei der Referenzierung wirklich zur Tabelle und nicht beispielsweise zum Abschnitt mit der Tabelle gesprungen wird. Um das unabhängig von hyperref zu machen, kann man den \csname-Trick anwenden:
\newenvironment{tabelle1}[5]{%
\begin{center}
\csname phantomsection\endcsname\label{#5}%
Ist \phantomsection nicht definiert, führt TeX dann schlicht ein \relax aus, was nicht weiter stört.
Burny hat geschrieben:
\newenvironment{\tabelle1}[4]{
...
\end{table}}
Eine Umgebungsdefinition besteht immer aus dem Umgebungsname, der optionalen Anzahl der begin-Parameter, dem begin-Teil und dem End-Teil. Bei Deiner Definition fehlt der End-Teil, weshalb irgendwas, was nach der Definition kommt, als End-Teil gelesen wird. Es wäre also der End-Teil zu ergänzen:
\newenvironment{tabelle1}[5]{%
  \begin{center}
    \csname phantomsection\endcsname\label{#5}%
...
  \end{center}%
}{%
}
Nun drängt sich natürlich geradezu eine Frage auf: Wenn bei der Umgebung der gesamte Inhalt der Tabelle bereits durch die Argumente des begin-Teils festgelegt ist, was soll dann später eigentlich der Inhalt der Umgebung sein? Da mir kein sinnvoller Inhalt einfällt, außer dass man das Setzen des Labels aus der Definition entfernen und dann als Inhalt verwenden könnte, wobei allerdings \end{center} in den End-Teil der Umgebung verschoben werden sollte, also:
\newenvironment{tabelle1}[4]{%
  \begin{center}
...
}{%
  \end{center}%
}
dann mit der Verwendung, beispielsweise:
\begin{tabelle1}{Zelle1}{Zelle2}{Zelle3}{Zelle4}
\phantomsection\label{tab:Zelle1-4}
allerdings mit dem Nachteil, dass \pageref dann auf das Ende der Tabelle springen würde, schreit das ganze eigentlich danach, nicht als Umgebung, sondern als Anweisung definiert zu werden:
\newcommand{\tabelleA}[5]{%
  \begin{center}
    \csname phantomsection\endcsname\label{#5}%
...
  \end{center}
}
In dem Fall wäre es dann wie folgt anzuwenden:
\tabelleA{Zelle1}{Zelle2}{Zelle3}{Zelle4}{tab:Zelle1-4}
Mehr kann ich ohne vollständiges Minimalbeispiel und ohne konkrete Angabe, was bei Dir in wie fern nicht funktioniert, zur Lösung leider nicht beitragen.

Schweinebacke

Beitrag von Schweinebacke »


Burny

Klappt

Beitrag von Burny »

Hallo Nerd032F,

vielen Dank, damit hast DU mir schon sehr geholfen. Beim nächsten Mal setze ich das ganze Minimalbeispiel rein.

Velen Dank für die Mühe
B

Antworten