PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : renewcommand global ausführen



peethebee
02-02-2011, 23:09
Hallo,

mit dem eigens definierten Kommando \fa schreibe ich Einträge in eine Datenbank (package dataTool). Die zwei Spalten sind fa und section.

Am Ende möchte ich die Einträge sortiert nach fa ausgeben. Wenn fa allerdings zwei mal hintereinander 4 ist wie im Beispiel, soll allerdings nur beim ersten mal auch eine 4 in die Tabelle geschrieben werden.

Dafür hab ich das Kommando lastfaval erstellt, das mir den Wert der letzten Zeile speichern soll.
Mit dem ifthenelse Befehl wird dann geschaut ob \faval (der eintrag aus der aktuellen Zeile) mit dem letzten Eintrag \lastfaval übereinstimmt.

Allerdings klappt das nicht, da \renewcommand nur lokal ausgeführt wird.
\lastfaval hat den Wert von \faval nur innerhalb eines Schleifendurchlaufs der foreach schleife.

Springt die Schleife wieder in den Kopf, ist der Inhalt von \lastfaval wieder weg.


\documentclass[a4paper]{scrartcl}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{amsmath}
\usepackage{comment}
\usepackage[a4paper,text={160mm,245mm},centering,headsep=5mm,f ootskip=10mm]{geometry}
\usepackage[pdftex,pdfpagelabels=true]{hyperref}
\usepackage{graphicx}
\usepackage{textcomp}
\usepackage{booktabs}
\usepackage{datatool}
\usepackage{ifthen}
\usepackage{forloop}
\usepackage{booktabs}


\newcommand{\fa}[1]{
/FA#1/
\DTLnewrow{fa}
\DTLnewdbentry{fa}{section}{\thesection}
\DTLnewdbentry{fa}{fa}{#1}}
\newcommand{\lastfaval}{}



\DTLnewdb{fa}
\dtlexpandnewvalue



\begin{document}

\section{blub}
\fa{10}
\fa{4}

\section{bla2}
\fa{2}
\fa{4}


\DTLsort{fa=ascending}{fa}
\begin{tabular}{l|l}
\toprule
FA & Section \\
\midrule
\DTLforeach{fa}{\faval=fa,\sect=section}{
% first column
\ifthenelse{\equal{\faval}{\lastfaval}}{ %
% alt

}
{ % neu
\faval
\renewcommand{\lastfaval}{\faval}
}



%second column
& \sect \\}
\end{tabular}
\end{document}


Noch kurze Frage nebenbei, als Zusatz zu der Sectionnummer (\thesection) würde ich gerne den Titel der aktuellen Section mit in die Datenbank schreiben, gibts dafür einen LatexBefehl?

Schweinebacke
03-02-2011, 07:36
Du kannst \globaldefs kurzzeitig auf einen postiven Wert setzen. Dann sind alle \def (und damit auch \newcommand und \renewcommand) global. Allerdings nützt das in Deine Beispiel wohl ohnehin nichts, da Du mit
\renewcommand{\lastfaval}{\faval} nicht die aktuelle Definition von faval speicherst, sondern \lastfaval zukünftig zu (zukünftigen Werten von)\faval expandiert. Du suchst eher
\xdef\lastfaval{\faval} oder
\global\let\lastfaval\favalIch empfehle in TeX by Topic (http://www.eijkhout.net/tbt/) mal die Erklärungen zur Expansion und den Unterschieden zwischen \let, \def, \edef etc. nachzulesen.

Zu Deiner Ergänzungsfrage: nameref (http://ctan.org/pkg/nameref) dürfte in die Richtung gehen.