Sie sind hier

Dynamische Parameter für \setkomavar

Hallo,

ich habe ein Problem bei dem ich nach langem Suchen und Probieren nicht weiterkomme und deshalb um Hilfe biete.
Ich möchte aus einer Datei, z.B. aus meinbsp.dat Key-Werte-Paare lesen und als KOMA-Variablen in meinem Dokument einbinden. Das Erzeugen der KOMA-Variablen soll für beliebige und beliebig vielen Variablen, nach dem Muster Key=Wert, funktionieren.

Das Lesen und trennen von Key und Wert funktioniert, auch das trimmen der Leerzeichen am Anfang und am Ende.
Was ich nicht geschafft habe ist, den Key als ersten Parameter für \setkomavar¹ zu verwenden. Der zweite Parameter funktioniert.
Bespiel: Aus Name=Mustermann soll \setkomavar{Name}{Mustermann}¹ entstehen.
Der Versuch \setkomavar{#1}{#2}¹ ist gescheitert.

Versuche der Form¹

\def\key{Name}
\def\wert{Mustermann}
\setkomavar{\key}{\wert}

sind ebenfalls gescheitert. Ich habe es auch mit

¹ versucht aber nicht hinbekommen.

Ist dieses Vorhaben überhaupt möglich und wenn ja, wie?

Vielleicht kann mir jemand weiterhelfen.

Vielen Dank und ein gutes neues Jahr!

% !TeX program = lualatex
% !TeX encoding = UTF-8 Unicode
% !TeX spellcheck = de_DE_frami
%
\begin{filecontents*}{minbsp.txt}
Name       = Mustermann       
Firstname  = Hans
Birthday   = 11.05.1998     
Birthplace = Musterstadt
\end{filecontents*}
\ProvidesFile{minbsp.tex}[v0.1 2016/12/30]
 
\documentclass[paper=a4,fontsize=11pt,pagesize,headings=normal]{scrartcl}
 
\usepackage{fontspec}
\usepackage{polyglossia}
\setdefaultlanguage[variant=german, spelling=new, babelshorthands=true]{german}
\usepackage{scrletter}
 
\newkomavar{Name}
\newkomavar{Firstname}
\newkomavar{Birthday}
\newkomavar{Birthplace}
 
\newcommand{\setWert}[2]{
   %\setkomavar{#1}{#2}      %% Hier ist das Problem
   #1 #2
 
}
 
\def\chopline#1=#2\\{
   \setWert{\ignorespaces#1\unskip}{\ignorespaces#2\unskip}
}
 
\newcommand{\readPersonalData}[1]{%
   \newif\ifmore \moretrue
   \newread\quelle
   \openin\quelle=#1
   \loop
      \read\quelle to \zeile
      \ifeof\quelle
         \global\morefalse
      \else
         \expandafter\chopline\zeile\\ 
      \fi
   \ifmore\repeat
   \closein\quelle
}
 
\begin{document}
   \readPersonalData{minbsp.txt}
   Testtext
   \usekomavar{Name}
   \usekomavar{Firstname}
   \usekomavar{Birthday}
   \usekomavar{Birthplace}
\end{document}

[Admin-Edit:]

  1. <code></code> Tags eingefügt (siehe Formatierungshinweise)
  2. Textformat in Filtered HTML geändert.
  3. Beispiel direkt in den Text des Beitrags eingefügt

Bild von Markus Kohm

Bei dem Code wären \ignorespaces und \unskip teil des Bezeichners (erstes Argument von \setkomavar). Dass das nicht funktionieren kann, wird schnell klar, wenn man einmal

\newcommand*{\setWert}[2]{%
  \edef\WertA{#1}\show\WertA
  \edef\WertB{#2}\show\WertB
}

zu verwenden, um zu sehen, wie das expandiert (wobei das erste Argument von \setkomavar nicht einmal in dieser Form expandiert wird, sondern als Teil einer command sequence, also nicht expandierbare Teile erhalten bleiben).

Für key=value-Geschichten ist es sinnvoller mit dem Paket keyval oder scrbase zu arbeiten. Alternativ könnte man eventuell etwas die datatool verwenden und als Feldtrenner dort das Gleichheitszeichen einstellen. Mit l3 kann man Strings auch recht gut zerlegen.

Vielen Dank für die schnelle Antwort!
Ich werde mir die zwei Pakete mal anschauen und eine entsprechende Lösung erarbeiten.

Die Lösung für das Problem, so wie ich es eigentlich gemeint habe, ist:

   \expandafter\newsavebox\csname monslot\theslotcounter\endcsname
   \expandafter\savebox\csname monslot\theslotcounter\endcsname{\thetempcounter}

Mit der ersten Zeile definiere ich eine savebox mit dem Namen monslot1
Mit der zweiten Zeile weise ich der Box monslot1 einen Wert zu.

Die zwei Zeilen werden innerhalb einer Schleife genutzt und so werden mehrere durchnummerierte (1..n) Variablen erzeugt.
Ich denke, dass diese Lösung nicht so trivial ist und für den einen oder anderen nützlich sein kann.

Comments for "Dynamische Parameter für \setkomavar" abonnieren