Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 17

Thema: Neuer Befehl mit mehreren optionalen Argumenten

  1. #1
    Registrierter Benutzer
    Registriert seit
    19.02.2011
    Beiträge
    76

    Neuer Befehl mit mehreren optionalen Argumenten

    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.

    Code:
    \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:
    Code:
    \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,rmargin=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
    Geändert von Shalec (27-06-2014 um 12:59 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    Ich würde sowas mit \NewDocumentCommand aus dem xparse-Paket machen.

  3. #3
    Registrierter Benutzer
    Registriert seit
    19.02.2011
    Beiträge
    76
    Zitat Zitat von u_fischer Beitrag anzeigen
    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.
    Code:
    \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?:

    Code:
    \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.
    Geändert von Shalec (27-06-2014 um 16:22 Uhr)

  4. #4
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    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...e.html#fischer

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.02.2011
    Beiträge
    76
    Zitat Zitat von u_fischer Beitrag anzeigen
    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...e.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 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:
    Code:
    \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:
    Code:
    \absender[Op1, Op2]{Arg1}{Arg2}{Arg3}
    und die Ausgabe lässt sich über
    Code:
    \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
    Geändert von Shalec (28-06-2014 um 15:29 Uhr)

  6. #6
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    Zitat Zitat von Shalec Beitrag anzeigen
    Folgender Code erfüllt das gewünschte Vorhaben:
    Code:
    \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:

    Code:
    \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:

    Code:
    \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
    Clemens

  7. #7
    Registrierter Benutzer
    Registriert seit
    19.02.2011
    Beiträge
    76
    Interessant. Diese Tests hatte ich leider nicht durchgeführt. Einen Teil davon habe ich beheben können.

    Code:
    \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:
    Code:
    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.
    Geändert von Shalec (28-06-2014 um 20:04 Uhr)

  8. #8
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    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
    Clemens

  9. #9
    Registrierter Benutzer
    Registriert seit
    19.02.2011
    Beiträge
    76
    Also idealerweise möchte ich folgende Eingabe leisten:

    Code:
    \absender[tel="Vorwahl Nummer", eMail="Adresse@provider.domain"]{Name}{Straße und Hausnummer}{PLZ und Ort}
    Als Ausgabe soll dann folgendes geschehen
    Code:
    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:
    Code:
    \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

  10. #10
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    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:

    Code:
    \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
    Clemens

  11. #11
    Registrierter Benutzer
    Registriert seit
    19.02.2011
    Beiträge
    76
    Zitat Zitat von cgnieder Beitrag anzeigen
    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:

    Code:
    \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:
    Code:
    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/m...rnel/expl3.pdf )

    Viele Grüße

  12. #12
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    Zitat Zitat von Shalec Beitrag anzeigen
    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.

    Zitat Zitat von Shalec Beitrag anzeigen
    Eine Frage noch:
    Code:
    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
    Code:
    \msg_error:nnn {shalec / absender} {Eintrag-fehlt} {name}
    auf.

    Zitat Zitat von Shalec Beitrag anzeigen
    Ich habe mir eben die Doku des Paketes angeguckt und gehe dies nun langsam durch. ( ftp://ftp.rrzn.uni-hannover.de/pub/m...rnel/expl3.pdf )
    Wenn Du Dir die expl3-Programmierkonventionen ernsthaft durchgehen willst, dann empfehle ich außerdem



    Grüße
    Clemens

  13. #13
    Registrierter Benutzer
    Registriert seit
    19.02.2011
    Beiträge
    76
    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.

  14. #14
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    Zitat Zitat von Shalec Beitrag anzeigen
    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
      Code:
      \use:n {foo}
    • N ist ein einzelner Token
      Code:
      \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
    Clemens

  15. #15
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    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.

    Code:
    \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
    Clemens

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •