PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Neuer Befehl mit mehreren optionalen Argumenten



Shalec
27-06-2014, 12:56
Hallo,
ich möchte einen Code schreiben, mit mehreren optionalen Argumenten (2..),

Ich hatte gelesen, dass man dies über verschachtelte Deklarationen machen kann..wie z.B.



\newcommand{\zwei}[2][def2]{
\ifthenelse{\empty{#1}{def2}}{%
Schreibe nur #2
}{%
Schreibe #1 und #2
}%
}
\newcommand{\drei}[3][def3]{
\ifthenelse{\empty{#1}{def3}}{%
Schreibe nur #3 und #2
}{%
Schreibe #3, #1 und #2
}%
}
\newcommand{\eins}[3][def1]{
\ifthenelse{\equal{#1}{def1}}{%
\zwei[#2]{#3}
}{%
\drei[#2]{#1}{#3}
}
}


Aber dies scheint mir extrem umständlich und unschön (wegen []{}{}{}{}.. anstelle von [][]{}{}{}), daher frage ich hier. Ich hatte die Googelsuche verwendet und keine Threads hier im Board mit dem zusätzlichen Argument "mrunix" finden können.


Minimalbeispiel:

\documentclass[12pt, twoside, a4paper, toc=index]{scrreprt}
\usepackage{textcomp}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{geometry}%[margin=2.5cm]{geometry}
\geometry{tmargin=0mm,bmargin=0mm,lmargin=25mm,rma rgin=25mm}
\usepackage{ifthen}
\usepackage[absolute]{textpos}

\newcommand{\Absender}{}
\newcommand{\absender}[5][\empty][def]{%
\ifthenelse{\equal{#1}{\empty}}{%
\ifthenelse{\equal{#2}{def}}{
\AtBeginDocument{\renewcommand{\Absender}{#1\\#2\\ #3}}
}{%
\AtBeginDocument{\renewcommand{\Absender}{#3\\#4\\ #5\\e-Mail:\url{#2}}}
}
}{%
\ifthenelse{\equal{#2}{def}}{
\AtBeginDocument{\renewcommand{\Absender}{#1\\#2\\ #3\\Tel:#1}}
}{%
\AtBeginDocument{\renewcommand{\Absender}{#3\\#4\\ #5\\Tel:#1\\e-Mail:\url{#2}}}
}
}%
}

\absender[123456789][xyz@uvw.com]{Name}{Straße}{Adresse}
\newcommand{\From}{%
\begin{textblock*}{90mm}(150mm,20mm)%
\parbox{90mm}{%
\Absender%
}%
\end{textblock*}%
}

\begin{document}
\From
\end{document}


Viele Grüße und vielen Dank,
Shalec

u_fischer
27-06-2014, 13:42
Ich würde sowas mit \NewDocumentCommand aus dem xparse-Paket machen.

Shalec
27-06-2014, 16:20
Ich würde sowas mit \NewDocumentCommand aus dem xparse-Paket machen.

Hallo,
ich habe mir eben die Doku ein wenig durchgelesen. (Die sehr kurz sogar ausfällt..)

Ich kann derzeit leider den Code nicht testen, aber wenn ich es richtig gesehen habe, lässt sich mein Vorhaben über die folgenden Optionen bewerkstelligen


o Optional, mit []
O selbe, wie o, mit Bedingung O{Bedingung}
m Standard, mit {}


Ich denke, dass folgender Code funktioniert. Insofern "\IfNoValueTF" nur nach dem Vorhandensein eines Eintrages in [] sucht.

\NewDocumentCommand\absender{o o m m m}{%
\IfNoValueTF {#1}{
\IfNoValueTF {#2}{%True
\AtBeginDocument{\renewcommand{\Absender}{#3\\#4\\ #5}}
}{%False
\AtBeginDocument{\renewcommand{\Absender}{#3\\#4\\ #5\\e-Mail:\url{#2}}}
}
}{%
\IfNoValueTF {#2}{%True
\AtBeginDocument{\renewcommand{\Absender}{#3\\#4\\ #5\\Tel: #1}}
}{%False
\AtBeginDocument{\renewcommand{\Absender}{#3\\#4\\ #5\\Tel: #1\\e-Mail:\url{#2}}}
}
}
}

Lässt sich über dieses Paket auch etwas derart erzeugen?:


\absender[optional1, optional2]{Wert1}{Wert2}{Wert3}

Ich habe eben "\SplitArgument" entdeckt. Damit sollte obiges Vorhaben funktionieren.

Viele Grüße und vielen Dank für die zügige Antwort.

u_fischer
27-06-2014, 16:44
Evtl. solltest du auch biblatex in Erwägung ziehen. Es hat mächtige Befehle um undefinierte Teile auszublenden und man kann es wunderbar für Adressen benutzen.
http://www.dante.de/events/dante2014/Programm/Vortraege.html#fischer

Shalec
28-06-2014, 13:35
Evtl. solltest du auch biblatex in Erwägung ziehen. Es hat mächtige Befehle um undefinierte Teile auszublenden und man kann es wunderbar für Adressen benutzen.
http://www.dante.de/events/dante2014/Programm/Vortraege.html#fischer

Ach, das wusste ich gar nicht. Ich habe erst kürzlich auf Biblatex mit Biber umgestellt. Dann gucke ich mir das auch noch mal genauer an.

Mein Vorhaben ist es eine Briefvorlage zu erstellen. In der ich dem Adressaten und dem Absender einen festen Platz für Fensterbriefumschläge zu weise und den Text mit gewissen Feinheiten modifiziere. Ich habe eine Klasse dafür, aber diese ist für UTF8 geschrieben, ich nutze latin1 und ANSI. Hier muss ich Umlaute nicht durch \"U für Ü ersetzen.
Die Klasse ist auch sehr an UTF8 gebunden und ich wollte ohnehin sowas erlernen :D Also habe ich mir gedacht, dass ich mir direkt eine Vorlage schreibe.

Viele Grüße

PS: Ich habe obigen Code nun testen können, er funktioniert. Ich verfeinere das nun noch mit Splitargument und versuche eine Abfrage "if tel="\empty" " und "if eMail="\empty" " zu realisieren. Sollte aber nicht all zu schwer sein.

Viele Grüße nochmal ( :-D ) und vielen Dank


Folgender Code erfüllt das gewünschte Vorhaben:

\usepackage{xparse}
\newcommand{\Absender}{}
\ExplSyntaxOn
\NewDocumentCommand\absender{>{\SplitArgument{1}{ , }}o m m m}{%
\IfNoValueTF {\use_i:nn#1}{
\IfNoValueTF {\use_ii:nn#1}{%True
\AtBeginDocument{\renewcommand{\Absender}{#2\\#3\\ #4}}
}{%False
\AtBeginDocument{\renewcommand{\Absender}{#2\\#3\\ #4\\e-Mail:\ \url{\use_ii:nn#1}}}
}
}{%
\IfNoValueTF {\use_ii:nn#1}{%True
\AtBeginDocument{\renewcommand{\Absender}{#2\\#3\\ #4\\Tel:\ \use_i:nn#1}}
}{%False
\AtBeginDocument{\renewcommand{\Absender}{#2\\#3\\ #4\\Tel:\ \use_i:nn#1\\e-Mail:\url{\use_ii:nn#1}}}
}
}
}
\ExplSyntaxOff

Eingabe erfolgt dann mit:

\absender[Op1, Op2]{Arg1}{Arg2}{Arg3}

und die Ausgabe lässt sich über

\Absender
abrufen.

Da Telefon und Internet nicht immer angegeben werden wollen, sind diese optional. Wichtig ist allerdings, dass man in
\absender[, Op2]{...
das "," setzt, da es sonst als Op1 interpretiert wird. Dies genügt meinen Anforderungen. Schöner - wenn andere damit arbeiten wollten - wäre es, die Opi über Tags zu steuern, wie z.B. Tel="Nummer" und abzufragen, ob ein Argument hinter 'Tel=" ' folgt oder ob dies weggelassen wurde. Dann könnte man sich das "," sparen.

Viele Grüße

cgnieder
28-06-2014, 16:10
Folgender Code erfüllt das gewünschte Vorhaben:


\IfNoValueTF {\use_i:nn#1}{ ... } { ... }

Das liefert immer den false-Ast, da \IfNoValueTF auf einen speziellen Marker prüft, der nur Auftritt, wenn das optionale Argument gar nicht (also auch nicht leer) verwendet wird. Da Du aber vor #1 noch \use_i:nn setzt, wird der Marker nie erkannt.

Das Beispiel demonstriert das, lauter Fs:


\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand\test{>{\SplitArgument{1}{,}}o}{
\IfNoValueTF {\use_i:nn#1}{ T } { F }
}
\ExplSyntaxOff
\begin{document}

\test
\test[]
\test[a]
\test[a,b]

\end{document}

Hier sieht man auch ein bisschen, was mit den Argumenten passiert:


\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \test {>{\SplitArgument{1}{,}}o}
{
\IfNoValueTF{#1}
{kein~ optionales~ Argument}
{\shalec_test:nn #1}
}

\cs_new:Npn \shalec_test:nn #1#2
{1:~ #1,~ 2:~ #2}
\ExplSyntaxOff
\begin{document}

\test\par
\test[]\par
\test[a]\par
\test[a,b]

\end{document}

Grüße

Shalec
28-06-2014, 20:01
Interessant. Diese Tests hatte ich leider nicht durchgeführt. Einen Teil davon habe ich beheben können.


\documentclass{article}
\usepackage{xparse}
\usepackage{ifthen}
\usepackage{hyperref}

\newcommand{\Absender}{}
\newcommand{\AbsenderSmall}{}
\ExplSyntaxOn
\NewDocumentCommand\absender{>{\SplitArgument{1}{ , }}O{\empty, \empty} m m m}{%
\renewcommand{\AbsenderSmall}{\begin{scriptsize}#2 ,\ #3,\ #4\end{scriptsize}}
\ifthenelse {\equal{\use_i:nn#1}{\empty}}{
\ifthenelse{\equal{\use_ii:nn#1}{\empty}}{%True
\renewcommand{\Absender}{#2\\#3\\#4}
}{%False
\renewcommand{\Absender}{#2\\#3\\#4\\e-Mail:\ \url{\use_ii:nn#1}}
}
}{%
\ifthenelse{\equal{\use_ii:nn#1}{\empty}}{%True
\renewcommand{\Absender}{#2\\#3\\#4\\Tel:\ \use_i:nn#1}
}{%False
\renewcommand{\Absender}{#2\\#3\\#4\\Tel:\ \use_i:nn#1\\e-Mail:\ \url{\use_ii:nn#1}}
}
}
}
\ExplSyntaxOff
%
\begin{document}
\absender{1}{2}{3}
\Absender\\
\absender[]{1}{2}{3}
\Absender\\
\absender[a]{1}{2}{3}
\Absender\\
\absender[a, b]{1}{2}{3}
\Absender



\end{document}

Ausgabe ist:

1
2
3
1
2
3
e-Mail: -NoValue-
1
2
3
Tel: a
e-Mail: -NoValue-
1
2
3
Tel: a
e-Mail: b

D.h. der Test für das zweite Argument funktioniert nicht. Hast Du (oder jemand anderes) eine Idee, wie das behoben werden könnte?

Vielen Dank für den Hinweis.

Edit:
Wird das Komma in den Ausgaben mit den Fehlern hinzugefügt, funktioniert der Code.

cgnieder
28-06-2014, 20:24
Der Code sieht an manchen Stellen noch wild aus und vor allem mixt er verschiedene Programmier-Varianten (expl3 und Standard-LaTeX) durcheinander. Kannst Du noch mal kurz und knapp sagen, wie Deine gewünschte Verwendung des Befehls ist (also Syntax der Eingabe und was danach heraus kommen soll)? Dann könnte man Dir bestimmt einen effektiveren Vorschlag machen.

Grüße

Shalec
29-06-2014, 11:05
Also idealerweise möchte ich folgende Eingabe leisten:


\absender[tel="Vorwahl Nummer", eMail="Adresse@provider.domain"]{Name}{Straße und Hausnummer}{PLZ und Ort}

Als Ausgabe soll dann folgendes geschehen


falls tel=""
falls eMail=""
Name\\Straße und Hausnummer\\PLZ und Ort
sonst
Name\\Straße und Hausnummer\\PLZ und Ort\\eMail: Adresse@provider.domain
sonst
falls eMail=""
Name\\Straße und Hausnummer\\PLZ und Ort\\Tel: Vorwahl Nummer
sonst
Name\\Straße und Hausnummer\\PLZ und Ort\\Tel: Vorwahl Nummer\\eMail: Adresse@provider.domain


Als mögliche Eingaben sollen folgende gehen:

\absender{Arg1}{Arg2}{Arg3}
\absender[]{Arg1}{Arg2}{Arg3} %= Zeile 1
\absender[tel="V N"]{Arg1}{Arg2}{Arg3}%liefert sonst(tel) - falls(eMail) Zweig
\absender[eMail="Mail"]{Arg1}{Arg2}{Arg3} %liefert falls(tel) - sonst(eMail) Zweig
\absender[tel="V N", eMail="Mail"]{Arg1}{Arg2}{Arg3} %liefert sonst(tel) - sonst(eMail) Zweig


Ich hatte es versucht so hinzumodeln, wie oben gegeben. Für mich persönlich ist der obere Code hinreichend, da ich weiß, dass ich ein Komma setzen muss. Möchte ich diese fertige (ggf. Klasse) Datei jemandem weiter geben, soll dieser intuitiv damit arbeiten können. D.h. es werden durch weggelassen Kommas Fehler erzeugt, da dies die intuitive Eingabe wäre. Ich hatte sowas allerdings vorher noch nicht geschrieben und bin auch entsprechend unbewandert, was expl3 und Standard beschreibt. Den Großteil des Codes hatte ich mir durch Beispiele anderer abgeguckt und umgeschrieben/anhand dessen gelernt, wie es geschrieben werden könnte :-)

Viele Grüße

cgnieder
29-06-2014, 17:14
Da Du ja schon mit expl3 angefangen hast, kannst Du dessen Power ja auch ausnützen. Ich glaube, am besten wäre ein Befehl mit einem Argument mit einer Keyval-Syntax, der einen Fehler oder Warnung ausgibt, wenn Name, Straße und Ort nicht angegeben sind. Wie wäre denn folgendes:


\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}
\usepackage{url}

\ExplSyntaxOn

% Nachricht für fehlende Pflichteinträge:
\msg_new:nnn {shalec / absender} {Eintrag-fehlt}
{ #1~ muss~ angegeben~ werden~ \msg_line_context: }

% Variablen für die Einträge:
\tl_new:N \l_shalec_absender_name_tl
\tl_new:N \l_shalec_absender_strasse_tl
\tl_new:N \l_shalec_absender_ort_tl
\tl_new:N \l_shalec_absender_tel_tl
\tl_new:N \l_shalec_absender_mobil_tl
\tl_new:N \l_shalec_absender_email_tl
\tl_new:N \l_shalec_absender_web_tl

% die keyval-Optionen:
\keys_define:nn {shalec / absender}
{
name .tl_set:N = \l_shalec_absender_name_tl ,
strasse .tl_set:N = \l_shalec_absender_strasse_tl ,
ort .tl_set:N = \l_shalec_absender_ort_tl ,
tel .tl_set:N = \l_shalec_absender_tel_tl ,
mobil .tl_set:N = \l_shalec_absender_mobil_tl ,
email .tl_set:N = \l_shalec_absender_email_tl ,
web .tl_set:N = \l_shalec_absender_web_tl
}

% der Befehl:
\cs_new_protected:Npn \shalec_absender:n #1
{
\group_begin:
\keys_set:nn {shalec / absender} { #1 }
\tl_if_blank:VTF \l_shalec_absender_name_tl
{ \msg_error:nnn {shalec / absender} {Eintrag-fehlt} {name} }
{ \l_shalec_absender_name_tl }
\tl_if_blank:VTF \l_shalec_absender_strasse_tl
{ \msg_error:nnn {shalec / absender} {Eintrag-fehlt} {strasse} }
{ \\ \l_shalec_absender_strasse_tl }
\tl_if_blank:VTF \l_shalec_absender_ort_tl
{ \msg_error:nnn {shalec / absender} {Eintrag-fehlt} {ort} }
{ \\ \l_shalec_absender_ort_tl }
\tl_if_blank:VF \l_shalec_absender_tel_tl
{ \\ Tel.:~ \l_shalec_absender_tel_tl }
\tl_if_blank:VF \l_shalec_absender_mobil_tl
{ \\ Mobil:~ \l_shalec_absender_mobil_tl }
\tl_if_blank:VF \l_shalec_absender_email_tl
{ \\ E-Mail:~ \texttt{\l_shalec_absender_email_tl} }
\tl_if_blank:VF \l_shalec_absender_web_tl
{ \\ Web:~ \exp_args:NV \url \l_shalec_absender_web_tl }
\group_end:
}

% der Benutzerbefehl:
\NewDocumentCommand \absender { m }
{ \shalec_absender:n {#1} }
\ExplSyntaxOff

\begin{document}

\absender{
name = Max Mustermann ,
strasse = Musterweg~1 ,
ort = 12345~Musterstadt
}\par\bigskip

\absender{
name = Max Mustermann ,
strasse = Musterweg~1 ,
ort = 12345~Musterstadt ,
tel = 01234\,567\,890
}\par\bigskip

\absender{
name = Max Mustermann ,
strasse = Musterweg~1 ,
ort = 12345~Musterstadt ,
email = max@mustermann.de
}\par\bigskip

\absender{
name = Max Mustermann ,
strasse = Musterweg~1 ,
ort = 12345~Musterstadt ,
email = max@mustermann.de ,
tel = 01234\,567\,890
}\par\bigskip

\absender{
name = Max Mustermann ,
strasse = Musterweg~1 ,
ort = 12345~Musterstadt ,
email = max@mustermann.de ,
tel = 01234\,567\,890 ,
web = www.mustermann.de ,
mobil = 0123\,456\,78\,90
}

\end{document}

Grüße

Shalec
29-06-2014, 18:43
Da Du ja schon mit expl3 angefangen hast, kannst Du dessen Power ja auch ausnützen. Ich glaube, am besten wäre ein Befehl mit einem Argument mit einer Keyval-Syntax, der einen Fehler oder Warnung ausgibt, wenn Name, Straße und Ort nicht angegeben sind. Wie wäre denn folgendes:


\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}
\usepackage{url}

\ExplSyntaxOn

% Nachricht für fehlende Pflichteinträge:
\msg_new:nnn {shalec / absender} {Eintrag-fehlt}
{ #1~ muss~ angegeben~ werden~ \msg_line_context: }

% Variablen für die Einträge:
\tl_new:N \l_shalec_absender_name_tl
\tl_new:N \l_shalec_absender_strasse_tl
\tl_new:N \l_shalec_absender_ort_tl
\tl_new:N \l_shalec_absender_tel_tl
\tl_new:N \l_shalec_absender_mobil_tl
\tl_new:N \l_shalec_absender_email_tl
\tl_new:N \l_shalec_absender_web_tl

% die keyval-Optionen:
\keys_define:nn {shalec / absender}
{
name .tl_set:N = \l_shalec_absender_name_tl ,
strasse .tl_set:N = \l_shalec_absender_strasse_tl ,
ort .tl_set:N = \l_shalec_absender_ort_tl ,
tel .tl_set:N = \l_shalec_absender_tel_tl ,
mobil .tl_set:N = \l_shalec_absender_mobil_tl ,
email .tl_set:N = \l_shalec_absender_email_tl ,
web .tl_set:N = \l_shalec_absender_web_tl
}

% der Befehl:
\cs_new_protected:Npn \shalec_absender:n #1
{
\group_begin:
\keys_set:nn {shalec / absender} { #1 }
\tl_if_blank:VTF \l_shalec_absender_name_tl
{ \msg_error:nnn {shalec / absender} {Eintrag-fehlt} {name} }
{ \l_shalec_absender_name_tl }
\tl_if_blank:VTF \l_shalec_absender_strasse_tl
{ \msg_error:nnn {shalec / absender} {Eintrag-fehlt} {strasse} }
{ \\ \l_shalec_absender_strasse_tl }
\tl_if_blank:VTF \l_shalec_absender_ort_tl
{ \msg_error:nnn {shalec / absender} {Eintrag-fehlt} {ort} }
{ \\ \l_shalec_absender_ort_tl }
\tl_if_blank:VF \l_shalec_absender_tel_tl
{ \\ Tel.:~ \l_shalec_absender_tel_tl }
\tl_if_blank:VF \l_shalec_absender_mobil_tl
{ \\ Mobil:~ \l_shalec_absender_mobil_tl }
\tl_if_blank:VF \l_shalec_absender_email_tl
{ \\ E-Mail:~ \texttt{\l_shalec_absender_email_tl} }
\tl_if_blank:VF \l_shalec_absender_web_tl
{ \\ Web:~ \exp_args:NV \url \l_shalec_absender_web_tl }
\group_end:
}

% der Benutzerbefehl:
\NewDocumentCommand \absender { m }
{ \shalec_absender:n {#1} }
\ExplSyntaxOff

\begin{document}

\absender{
name = Max Mustermann ,
strasse = Musterweg~1 ,
ort = 12345~Musterstadt
}\par\bigskip

\absender{
name = Max Mustermann ,
strasse = Musterweg~1 ,
ort = 12345~Musterstadt ,
tel = 01234\,567\,890
}\par\bigskip

\absender{
name = Max Mustermann ,
strasse = Musterweg~1 ,
ort = 12345~Musterstadt ,
email = max@mustermann.de
}\par\bigskip

\absender{
name = Max Mustermann ,
strasse = Musterweg~1 ,
ort = 12345~Musterstadt ,
email = max@mustermann.de ,
tel = 01234\,567\,890
}\par\bigskip

\absender{
name = Max Mustermann ,
strasse = Musterweg~1 ,
ort = 12345~Musterstadt ,
email = max@mustermann.de ,
tel = 01234\,567\,890 ,
web = www.mustermann.de ,
mobil = 0123\,456\,78\,90
}

\end{document}

Grüße

Ich probiere das mal aus. Ich hatte mir diese Version nur von jemanden abgeguckt, der damit ein Problem hatte. Wie die Namensvergabe genau funktioniert, weiß ich gar nicht. Ich habe nur gesehen, dass \ExplSyntaxOn Unterstriche für Namen ermöglicht, also als Symbole deutet. Aber vielen Dank schonmal, das sieht nach viel Arbeit aus..

Eine Frage noch:

msg_new:nnn {shalec / absender} {Eintrag-fehlt}
{ #1~ muss~ angegeben~ werden~ \msg_line_context: }
Wie ist dies zu interpretieren?
Ich habe mir eben die Doku des Paketes angeguckt und gehe dies nun langsam durch. ( ftp://ftp.rrzn.uni-hannover.de/pub/mirror/tex-archive/macros/latex/contrib/l3kernel/expl3.pdf )

Viele Grüße

cgnieder
29-06-2014, 19:24
Ich probiere das mal aus. Ich hatte mir diese Version nur von jemanden abgeguckt, der damit ein Problem hatte. Wie die Namensvergabe genau funktioniert, weiß ich gar nicht. Ich habe nur gesehen, dass \ExplSyntaxOn Unterstriche für Namen ermöglicht, also als Symbole deutet.

Jein. Vereinfacht gesagt, werden danach Unterstriche und Doppelpunkte als Buchstaben behandelt, und können daher Teil von Makro-Namen sein. Gleichzeitig werden Leerzeichen ignoriert. Wenn man eines braucht, muss/kann man es mit ~ eingeben.


Eine Frage noch:

msg_new:nnn {shalec / absender} {Eintrag-fehlt}
{ #1~ muss~ angegeben~ werden~ \msg_line_context: }
Wie ist dies zu interpretieren?

Das ist die Nachricht, die im späteren Code für fehlende Einträge verwendet wird. Der Code prüft etwa, ob name leer war und falls ja, ruft er

\msg_error:nnn {shalec / absender} {Eintrag-fehlt} {name}
auf.


Ich habe mir eben die Doku des Paketes angeguckt und gehe dies nun langsam durch. ( ftp://ftp.rrzn.uni-hannover.de/pub/mirror/tex-archive/macros/latex/contrib/l3kernel/expl3.pdf )

Wenn Du Dir die expl3-Programmierkonventionen ernsthaft durchgehen willst, dann empfehle ich außerdem


l3styleguide (http://mirrors.ctan.org/macros/latex/contrib/l3kernel/l3styleguide.pdf)
interface3 (http://mirrors.ctan.org/macros/latex/contrib/l3kernel/interface3.pdf)
Joseph Wrights Artikelserie über Programmieren mit expl3 (http://www.texdev.net/2014/02/02/programming-latex3-a-summary-so-far/)


Grüße

Shalec
30-06-2014, 11:24
Also fürs Erste würde mir schonmal genügen, was die Anzahl der "n" hinter dem : bedeutet. Ich vermute, die Anzahl der nachfolgenden Felder? Die Bedeutung des Buchstabens selbst finde ich schnell in der Doku. Ich habe sie allerdings noch nicht weit lesen können.
Dann welche Bedeutung {shalec / absender} hat - also wie ich die Klammer lesen muss (Funktion Shalec oder Absender?)
{Eintrag-fehlt} ist vermutlich die Errormessage und {name} des Feld, in dem der Fehler auftritt.

Vielen Dank für Deine Hilfe.

cgnieder
30-06-2014, 11:38
Also fürs Erste würde mir schonmal genügen, was die Anzahl der "n" hinter dem : bedeutet.

Die Buchstaben nach dem Doppelpunkt stehen für Art und Anzahl der Argumente, die die Funktion (im expl3-Sinne) hat.

n ist ein Argument mit geschweiften Klammern
\use:n {foo}
N ist ein einzelner Token
\use:N \foo

Es gibt noch eine ganze Reihe weiterer, die in den Quellen, die ich Dir gegeben habe, erklärt werden.

Wenn Du mit LaTeX-Programmierung noch wenig Erfahrung hast, ist es allerdings vielleicht auch einfacher, statt expl3 traditionelle Methoden zu verwenden. Wenn ich heute Abend etwas Zeit habe, setze ich meinen Vorschlag von oben mal ohne expl3 um. Dann kannst Du entscheiden, was Dir lieber ist.

Grüße

cgnieder
30-06-2014, 19:19
Wie versprochen der (fast) gleiche Code wie oben, übersetzt in traditionelles LaTeX. Er nützt etoolbox, das ein paar nützliche Programmierbefehle bereitstellt, und pgfkeys für das Handhaben von Keyval-Optionen.


\documentclass{article}
\usepackage{etoolbox}
\usepackage{pgfkeys}
\usepackage{url}

\makeatletter

% Nachricht für fehlende Pflichteinträge:
\newrobustcmd*\shalec@absender@error[1]{%
\GenericError
{\space\space\space\@spaces\@spaces\@spaces}
{Fehler beim Befehl \string\absender}
{`#1' fehlt, muss aber angegeben werden!}
{%
Bei \string\absender\space muessen `name', `strasse' und `ort' angegeben
werden.%
}%
}

% Variablen für die Einträge:
\newcommand*\shalec@absender@name{}
\newcommand*\shalec@absender@strasse{}
\newcommand*\shalec@absender@ort{}
\newcommand*\shalec@absender@tel{}
\newcommand*\shalec@absender@mobil{}
\newcommand*\shalec@absender@email{}
\newcommand*\shalec@absender@web{}

% die keyval-Optionen:
\pgfkeys{
shalec/absender/.cd ,
name/.code = \def\shalec@absender@name{#1} ,
strasse/.code = \def\shalec@absender@strasse{#1} ,
ort/.code = \def\shalec@absender@ort{#1} ,
tel/.code = \def\shalec@absender@tel{#1} ,
mobil/.code = \def\shalec@absender@mobil{#1} ,
email/.code = \def\shalec@absender@email{#1} ,
web/.code = \def\shalec@absender@web{#1}
}

% der Befehl:
\newrobustcmd*\shalec@absender[1]{%
\begingroup
\pgfqkeys{/shalec/absender}{#1}%
\ifdefempty\shalec@absender@name
{\shalec@absender@error{name}}
{\shalec@absender@name}%
\ifdefempty\shalec@absender@strasse
{\shalec@absender@error{strasse}}
{\\ \shalec@absender@strasse}%
\ifdefempty\shalec@absender@ort
{\shalec@absender@error{ort}}
{\\ \shalec@absender@ort}%
\ifdefempty\shalec@absender@tel
{}
{\\ Tel.: \shalec@absender@tel}%
\ifdefempty\shalec@absender@mobil
{}
{\\ Mobil: \shalec@absender@mobil}%
\ifdefempty\shalec@absender@email
{}
{\\ E-Mail: \texttt{\shalec@absender@email}}%
\ifdefempty\shalec@absender@web
{}
{\\ Web: \expandafter\url\expandafter{\shalec@absender@web} }%
\endgroup
}

% der Benutzerbefehl:
\newrobustcmd*\absender[1]{\shalec@absender{#1}}
\makeatother

\begin{document}

\absender{
name = Max Mustermann ,
strasse = Musterweg~1 ,
ort = 12345~Musterstadt
}\par\bigskip

% % Fehler:
% \absender{
% name = Max Mustermann ,
% strasse = Musterweg~1 ,
% }\par\bigskip

\absender{
name = Max Mustermann ,
strasse = Musterweg~1 ,
ort = 12345~Musterstadt ,
tel = 01234\,567\,890
}\par\bigskip

\absender{
name = Max Mustermann ,
strasse = Musterweg~1 ,
ort = 12345~Musterstadt ,
email = max@mustermann.de
}\par\bigskip

\absender{
name = Max Mustermann ,
strasse = Musterweg~1 ,
ort = 12345~Musterstadt ,
email = max@mustermann.de ,
tel = 01234\,567\,890
}\par\bigskip

\absender{
name = Max Mustermann ,
strasse = Musterweg~1 ,
ort = 12345~Musterstadt ,
email = max@mustermann.de ,
tel = 01234\,567\,890 ,
web = www.mustermann.de ,
mobil = 0123\,456\,78\,90
}

\end{document}

Grüße

Shalec
01-07-2014, 14:56
Vielen Dank auch für diese Lösung.
Hier fällt mir das nachvollziehen wesentlich leichter. Im Grunde habe ich demzufolge noch nie in LaTeX programmiert :D
Aber es ist klasse, was sich alles realisieren lässt.

Shalec
02-07-2014, 20:16
Ein Anliegen hätte ich nun noch.

Ich habe versucht in deinem ersten Code einen renewcommand Befehl erfolglos einzubauen.
Es soll in einer Variable

\newcommand{\AbsenderSmall}{Name, Straße, Ort }
gespeichert werden.

Ich versuche dies nun mit der Alternative.

Viele Grüße