Zuordnung/Abfrage von Variablen

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Zuordnung/Abfrage von Variablen

von iTob » Mi 8. Mär 2017, 15:41

Ah … ja klar! Brett vorm’m Kopf … danke :-)

von u_fischer » Mi 8. Mär 2017, 13:42

Du definierst doch zu jeder Person eine g_ionas_person_with_ID_#1_prop, auf deren Existenz kannst du doch testen.

von iTob » Mi 8. Mär 2017, 13:40

Halt … an der stelle kann man \prop_if_exist:NTF doch gar nicht nehmen … an der stelle schaue ich ja, ob ein neu Person bereits vorhanden ist und die Personen werden in einer Sequenz gespeichert. Die kann ich ja nicht als Property-List speichern. Es gibt dann nur für jede einzelnen Person eine Property-List, die die Eigenschaften der Person speichert.

von iTob » Mi 8. Mär 2017, 13:38

Dass stimmt. Ist halt wie gesagt nur schnell zusammengeschustert. Und irgendwann zwischendrin hatte ich auch überlegt, den von dir genannten Befehl zu nutzen, ihn dann als ich an der Stelle angekommen bin aber wieder vergessen und meinen einfach als erstes gefunden …

von u_fischer » Mi 8. Mär 2017, 13:34

 % neue Person in der Liste aller Personen registrieren, wenn ID nicht vorhanden 
   \seq_if_in:NnTF \g_ionas_persons_seq { #1 } { 
 
Ich würde ja eher \prop_if_exist:NTF benutzen, ist bestimmt schneller als dauernd Listen zu durchsuchen.

von iTob » Mi 8. Mär 2017, 10:15

Gerne ;-) bedenke aber das das eher als Skizze zu verstehen ist, so wirklich bis zu ende gedacht ist das noch nicht, beispielsweise findet ja nur eine minimale Fehlerbehandlung statt …

von ionas-1 » Mi 8. Mär 2017, 07:31

Vielen Dank! Das ist so tatsächlich viel übersichtlicher! Vielen Dank, dass du dir trotz des Zeitmangels die Zeit für diesen Code genommen hast! Das hat mir sehr weitergeholfen! :-)

von iTob » Mo 6. Mär 2017, 18:08

Hi ionas,

genau über diese Variante kann man (im Prinzip) nur neun Argumente verarbeiten. Mit ein paar Tricks gehen auch mehr, siehe z.B. http://tex.stackexchange.com/q/2132/4918

Aber ich gebe "Gast" recht, das in dem Fall eine andere Syntax sicher die bessere Variante wäre. Ich habe hier mal fix skizziert, wie man das mit LaTeX3 machen könnte:
\documentclass{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{xparse}

\ExplSyntaxOn

% Variable für Liste mit allen Personen
\seq_new:N \g_ionas_persons_seq

% Befehl zum Anlegen einer neuen Person
% - #1: ID (nur Buchstaben)
% - #2: Key-Value-Paare als Komma-getrennte Liste
\NewDocumentCommand { \newPerson } { m m } {
   % neue Person in der Liste aller Personen registrieren, wenn ID nicht vorhanden
   \seq_if_in:NnTF \g_ionas_persons_seq { #1 } {
      % TRUE: ID ist bereits vergeben
      \ERROR ID ~ bereits ~ vergeben!
   } {
      % FALSE: ID ist noch frei
      \seq_gput_right:Nn \g_ionas_persons_seq { #1 }
      % neue Property-Liste (basierend auf der ID)
      \prop_new:c { g_ionas_person_with_ID_#1_prop }
      % Liste der Schlüssel-Wert-Paare durchlaufen
      \clist_map_inline:nn { #2 } {
%         \#\#1 = ##1\\
         \ionas_parse_key_value:w ##1 \q_stop
         \prop_gput:cVV { g_ionas_person_with_ID_#1_prop }
            \l_ionas_current_key_tl
            \l_ionas_current_value_tl
      }
      % Prüfen ob alle nötigen Werte angeben wurden
      \clist_map_inline:nn { name, given-name, number } {
         \prop_if_in:cnF { g_ionas_person_with_ID_#1_prop } { ##1 } {
            \ERROR Wert ~ für ~ '##1' ~ fehlt.
         }
      }
   }
}

% Variablen und Befehle zum Einlesen von Schlüssel-Wert-Paaren
\tl_new:N \l_ionas_current_key_tl
\tl_new:N \l_ionas_current_value_tl
\cs_new:Npn \ionas_parse_key_value:w #1 = #2 \q_stop {
   \tl_set:Nn \l_ionas_current_key_tl { #1 }
   \tl_trim_spaces:N \l_ionas_current_key_tl
   \tl_set:Nn \l_ionas_current_value_tl { #2 }
   \tl_trim_spaces:N \l_ionas_current_value_tl
%   K = \l_ionas_current_key_tl \\
%   V = \l_ionas_current_value_tl \\
}

% Befehl zum Ausgeben aller Personen
\NewDocumentCommand { \getAllPersons } { } {
   \begin{itemize}
      \seq_map_inline:Nn \g_ionas_persons_seq {
         \item
            \getPersonInfo { ##1 } { given-name }
            \c_space_tl
            \getPersonInfo { ##1 } { name }
      }
   \end{itemize}
}

% Befehl zum Auslesen einer Bestimmten Eigenschaft
% - #1: ID
% - #2: Eigenschaft
\NewDocumentCommand { \getPersonInfo } { m m } {
   \prop_item:cn { g_ionas_person_with_ID_#1_prop } { #2 }
}

\ExplSyntaxOff

\begin{document}

\minisec{Neue Personen anlegen}
(führt nicht zu einer Text-Ausgabe)
\newPerson{mmustermann}{
   name = Mustermann,
   given-name = Max,
   number = 12345,
}
\newPerson{jdoe}{
   name = Doe,
   given-name = John,
   number = 555123,
   cuntry = USA,% Diese Angabe ist optional
}
\newPerson{jdoe2}{
   name = Doe,
   given-name = Jane,
   number = 555321,
   cuntry = USA,% Diese Angabe ist optional
}
% Das Folgende erzeugt einen Fehler, weil keine Nummer angeben ist
%\newPerson{ssorglos}{
%   name = Sorglos,
%   given-name = Susi,
%}
% Das Folgende erzeugt einen Fehler, weil die ID schon vergeben ist
%\newPerson{mmustermann}{
%   name = Mustermann,
%   given-name = Martin,
%   number = 54321,
%}

\minisec{Alle Personen ausgeben}
\getAllPersons

\minisec{Bestimmte Infos abfragen}
Name: \getPersonInfo{mmustermann}{name}\\
Matrikelnummer: \getPersonInfo{jdoe}{number}
\end{document}
Für ausführliche Erklärungen fehlt mir grad die Zeit aber für einen Einstig in LaTeX3 schau gern mal in meinem Blog vorbei: http://tobiw.de/tbdm/funktionssymbole

Viele Grüße
Tobi

von Gast » Mo 6. Mär 2017, 16:08

Mal 'ne blöde Frage: Wer soll sich denn die Reihenfolge von mehr als 9 Parametern merken? Ich kann man schon bei zwei oder drei oft nicht merken, in welcher Reihenfolge die anzugeben sind. Wäre da nicht eine key-value-Schnittstelle besser?

Ansonsten: Mach ein Minimalbeispiel. Bei unvollständigem Code mit auskommentierter (wichtigen) ersten Zeile kann kein Mensch wissen, was du wirklich gemacht hast.

von ionas-1 » Mo 6. Mär 2017, 15:44

Ich habe es so versucht, aber es funktioniert nicht:
%\newcommand{\NewTest}[9]{% 
    \csdef{var@TestIntNum@#1}	{#2}% 
    \csdef{var@TestName@#1}		{#3}% 
    \csdef{var@TestNorm@#1}		{#4}% 
    \csdef{var@TestBANV@#1}		{#5}% 
    \csdef{var@TestBAHV@#1}		{#6}% 
    \csdef{var@TestSPNV@#1}		{#7}% 
    \csdef{var@TestSPHV@#1}		{#8}% 

    \NewTestContinued
    }
    \newcommand{\NewTestContinued}[9]{%
    \csdef{var@TestTemp@#1}		{#2}% 
    \csdef{var@TestPM@#1}		{#3}% 
    \csdef{var@TestMon@#1}		{#4}% 
    \csdef{var@TestBed@#1}		{#5}% 
    \csdef{var@TestExec@#1}		{#6}% 
    \csdef{var@TestPic@#1}		{#7}% 
    \csdef{var@TestReq@#1}		{#8}% 
    \csdef{var@TestRes@#1}		{#9}% 
}

Nach oben