Verweis einer Zahl im Text

Tabellen und Grafiken erstellen und anordnen


Spreelu
Forum-Anfänger
Forum-Anfänger
Beiträge: 11
Registriert: Mo 30. Sep 2013, 18:45

Verweis einer Zahl im Text

Beitrag von Spreelu »

Hallo an Alle,

ich habe folgendes Problem:

Ich möchte innerhalb eines Textes Zahlen aufrufen die sich in einer Tabelle befinden. Die Zahlen in der Tabelle selbst sollen zusammengezählt werden.

Das mit der Addition funktioniert auch. Jedoch der Verweis auf die Zahlen innerhalb eines Textes die sich in der Tabelle befinden geht nicht.

Ich dachte erst das ich mit dem Befehl \label{1.Zahl} z.B eine Zahl markieren kann und dann durch den Befehl \ref{1.Zahl} im Text diese Zahl aufrufen kann jedoch geht das nicht.


Daher meine verzweifelte Frage ob mir hier jemand weiter helfen kann.


Hier nun mein Min.Bsp.

\documentclass{scrartcl}
\usepackage[german]{babel} 
\usepackage[utf8]{inputenc}
\usepackage{eurosym}
\usepackage{fp}
\usepackage{numprint}
\usepackage{booktabs}
\usepackage{libertine}
 
\FPset\Gesamtsumme{0}
\newcommand{\psum}[1]{%
\FPadd\0\Gesamtsumme{#1}\global\let\Gesamtsumme\0%
\numprint{#1}
}

 
\begin{document}
 
\begin{center}
\begin{LARGE}
Tabelle
\end{LARGE}

\begin{tabular}{@{}ccllr@{}}
\toprule
Test & Test1 & ~noch eine Spalte & \psum{10} \\
Test & Test1 & ~noch eine Spalte & \psum{50} \\
\midrule
Test & Test1 & ~noch eine Spalte & \psum{22} \\
\midrule
% Die Eins in der geschweiften Klammmer gibt die nachkommastelle an. Bei der Eingabe von 0 gibt es keine Nachkommastelle.
 &  & Summe &   \FPtrunc\Gesamtsumme\Gesamtsumme{1}\numprint{\FPprint\Gesamtsumme} \\
\midrule
\bottomrule
\end{tabular}
\end{center}
 
Hier - nach dem Doppelpunkt - soll der erste Verweis auf die zweite Zahl 50 kommen: Code????
\end{document}
Diese Frage habe ich in keinem anderen Forum gestellt.

Danke für Eure Hilfe!

rais
Forum-Guru
Forum-Guru
Beiträge: 413
Registriert: Di 21. Sep 2010, 00:37

Re: Verweis einer Zahl im Text

Beitrag von rais »

Spreelu hat geschrieben: Ich dachte erst das ich mit dem Befehl \label{1.Zahl} z.B eine Zahl markieren kann und dann durch den Befehl \ref{1.Zahl} im Text diese Zahl aufrufen kann jedoch geht das nicht.
\label/\ref ist für Zähler gedacht. Solange die Zahlen überschaubar bleiben, könntest Du einen Zähler setzen, diesen um 1 dekrementieren, dann \refstepcounter auf diesen Zähler loslassen, dann funktioniert es auch mit dem \label/\ref.
Eine Alternative wäre, die Zahl einfach in einem Makro zu speichern und dieses Makro dann wieder abrufen. Damit dieses Abrufen im Text auch vor der eigentlichen Zuweisung geschehen könnte (was Du noch nicht mal verlangt hast), könnte man diese Makrozuweisung über die .aux erledigen:
\documentclass{scrartcl}
\usepackage[german]{babel}
\usepackage[utf8]{inputenc}
\usepackage{eurosym}
\usepackage{fp}
\usepackage{numprint}
\usepackage{booktabs}
\usepackage{libertine}
 
\FPset\Gesamtsumme{0}
\makeatletter
\newcommand{\psum}[2][]{%
\FPadd\0\Gesamtsumme{#2}\global\let\Gesamtsumme\0%
\numprint{#2}%
\ifx\relax#1\relax\else
  \immediate\write\@auxout{\string\global\string\@namedef{psum@saved@#1}{#2}}%
\fi
}
\newcommand*\psumsaved[1]{%
  \@ifundefined{psum@saved@#1}{???}{%
    \expandafter\numprint{\@nameuse{psum@saved@#1}}%
  }%
}
\makeatother
 
\begin{document}
Test davor: \psumsaved{test}
\begin{center}
{\LARGE
Tabelle\par}

\begin{tabular}{@{}ccllr@{}}
\toprule
Test & Test1 & ~noch eine Spalte & \psum{10} \\
Test & Test1 & ~noch eine Spalte & \psum[test]{50} \\
\midrule
Test & Test1 & ~noch eine Spalte & \psum{22} \\
\midrule
% Die Eins in der geschweiften Klammmer gibt die nachkommastelle an. Bei der Eingabe von 0 gibt es keine Nachkommastelle.
 &  & Summe &   \FPtrunc\Gesamtsumme\Gesamtsumme{1}\numprint{\FPprint\Gesamtsumme} \\
\midrule
\bottomrule
\end{tabular}
\end{center}
 
Hier - nach dem Doppelpunkt - soll der erste Verweis auf die zweite Zahl 50 kommen: \psumsaved{test}
\end{document}
BTW: \LARGE & Co sind Schalter, keine Umgebungen.

MfG
Rainer
One of the joys of travel is visiting new towns and meeting new people---G.Khan (Robert Asprin, Another Fine Myth)

Spreelu
Forum-Anfänger
Forum-Anfänger
Beiträge: 11
Registriert: Mo 30. Sep 2013, 18:45

Beitrag von Spreelu »

Vielen danke für die schnelle Antwort Rainer,

leider konnte ich nicht so schnell antworten.
Das was Du geschrieben hast geht einwandfrei. Jedoch ist es mir nicht gelungen ganz zu verstehen wie es funktioniert.

Hier mal kurz was ich überhaupt nicht verstehel:
\fi %\fi verstehe ich nicht wofür steht das? Was für eine Bedeutung steckt dahinter? 
}
\newcommand*\psumsaved[1]{%		% \newcommand verstehe ich. Aber wie geht das mit dem Sternchen dahinter. Das kenne ich garnicht. 
  \@ifundefined{psum@saved@#1}{???}{%
    \expandafter\numprint{\@nameuse{psum@saved@#1}}% %\@nameuse{} nameuse verstehe ich aber wie geht das mit dem @ zwischen dem schrägstrich???
  }%
}
\makeatother 
Würde es eben gerne verstehen wollen.


Grüße,
Spreelu

rais
Forum-Guru
Forum-Guru
Beiträge: 413
Registriert: Di 21. Sep 2010, 00:37

Beitrag von rais »

Spreelu hat geschrieben:
\fi %\fi verstehe ich nicht wofür steht das? Was für eine Bedeutung steckt dahinter? 
}
der zuvor aufgerufene \ifx wird durch \fi beendet (\fi : umgekehrtes `if': Ende des zuvor gestellten `if'). Generell sieht das so aus
\if<Bedingung>
  %Code, der ausgeführt wird, wenn <Bedingung> zutrifft
\else
  %Code, der ausgeführt wird, wenn <Bedingung> nicht zutrifft
\fi
wobei es unterschiedliche \if-Abfragen gibt (\if, \ifdim, \ifx, ...) siehe dazu `texdoc TeXbyTopic'
Spreelu hat geschrieben:
\newcommand*\psumsaved[1]{%		% \newcommand verstehe ich. Aber wie geht das mit dem Sternchen dahinter. Das kenne ich garnicht. 
\newcommand\foo[1]{..} definiert einen Befehl `foo', worin ({..}) ein neuer Absatz möglich wäre.
\newcommand*\foo[1]{..} definiert einen Befehl `foo', worin ein neuer Absatz nicht möglich (und hier auch nicht notwendig) wäre.
Spreelu hat geschrieben:
  \@ifundefined{psum@saved@#1}{???}{%
    \expandafter\numprint{\@nameuse{psum@saved@#1}}% %\@nameuse{} nameuse verstehe ich aber wie geht das mit dem @ zwischen dem schrägstrich???
  }%
}
\makeatother 
\@nameuse (und auch \@namedef) sind im LaTeX-Kern so definiert.
Das `@' im Befehlsnamen ist `by design': ein normaler LaTeX-Anwender benötigt @-haltige Makros nicht. Deshalb sind innerhalb eines Dokuments nur A--Z und a--z (oder genau ein anderes Zeichen) für Befehlsnamen zulässig.
Deshalb auch \makeatletter / \makeatother drumherum: \makeatletter steht für `mach @ zu einem Buchstaben' (und damit zu einem Zeichen, das für Befehlsnamen zulässig ist).

Aber wie kannst Du `nameuse', nicht aber `\@nameuse' verstehen? Siehe vllt auch `texdoc source2e' und schau darin nach `nameuse'

MfG
Rainer
One of the joys of travel is visiting new towns and meeting new people---G.Khan (Robert Asprin, Another Fine Myth)

Antworten