Anzeige:
Ergebnis 1 bis 8 von 8

Thema: Sonderzeichen in Befehlsdefinitionen

  1. #1
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219

    Sonderzeichen in Befehlsdefinitionen

    Hallo,

    ich arbeite im Moment viel mit Tikz zum erstellen von Arbeitsblättern.
    Dabei habe ich mir für verschiedene Aufgabenformate relativ viele verschiedene eigene Befehle mit \NewDocumentCommand erstellt. Das klappt auch alles sehr gut.

    Da es teilweise sehr viele eigene Styles und eigene Befehle sind, finde ich es teilweise schwer sie alle systematisch zu benennen. Es wäre sehr praktisch, wenn es ein Trennzeichen wie _ oder : gäbe, dass man in den Befehlen benutzten kann. Ich schon danach gesucht und rausgefunden, dass man nur Zeichen der Kategorie 11 (Buchstaben) verwenden kann (https://de.wikibooks.org/wiki/LaTeX-...en:_%5Ccatcode).

    Mann kann Zeichen wohl anderen Kategorien zuordnen, aber dann gibt es wohl in anderen Bereichen relativ leicht Probleme.

    Gibt es irgendeine eleganten Lösung, dass man in der Befehlsdefinition andere Zeichen als Buchstaben benutzen kann?


    Viele Grüße
    Swizz

  2. #2
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.859
    AFAIR geht das nur über den einen oder anderen Umweg:
    Code:
    \documentclass{article}
    \usepackage{etoolbox}
    
    %TeX:
    \expandafter\def\csname a1b\endcsname{was auch immer}
    
    %LaTeX:
    \makeatletter
    \@namedef{a!b}{was auch immer v2}
    \@namedef{a?b}{was auch immer v3}
    \makeatother
    
    %etoolbox:
    \csdef{a:b}{was auch immer v4}
    
    \csdef{a?b}{Achtung!}
    
    \begin{document}
    \csname a1b\endcsname
    
    \makeatletter
    \@nameuse{a!b}
    \makeatother
    
    oder auch
    \csname a?b\endcsname
    
    \csuse{a:b}
    
    \end{document}
    Beachte auch, daß die hier verwendeten zuweisenden Befehle das damit kreierte Makro klaglos überschreiben, sollte es bereits definiert gewesen sein.
    Es lohnt daher zumindest darüber nachzudenken, vor Zuweisung zu testen, ob es das ´neue' Makro wirklich noch nicht gibt.
    \ifcsdef/\ifcsundef (ebenfalls etoolbox) käme dafür in den Sinn.

    VG
    Rainer
    There's nothing a good whack with a hammer won't fix!

  3. #3
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219
    Danke, schau ich mir direkt mal an.

  4. #4
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219
    Die Lösung in deinem Minimalbeispiel bezieht sich ja auf Definitionen ohne Befehle. Gibt es auch einen Weg, dass für NewDocumentCommand hinzubekommen?

  5. #5
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.859
    \NewDocumentCommand aus dem xparse-Paket testet, ob dessen erstes Argument einem Befehlsnamen in der Form `\' gefolgt von mindestens einem oder mehreren TeX-Buchstaben (cat. 11) entspricht.
    Dieser Test müsste zumindest modifiziert werden, um auch Nicht-Buchstaben, wie TeX sie versteht, zuzulassen.
    Aber wozu den Umstand?
    \@namedef{a!b}{} erzeugt keinen Befehl \a!b, sondern die Sequenz \csname a!b\endcsname (cs steht für control sequence) und muss auch so abgerufen werden.
    Sonst hättest Du beim Aufruf das gleiche Problem: der Parser stoppt die Interpretation des Befehlsnamens beim Auftreten eines Nicht-Buchstabens.
    Hieße der Befehl \a!b, würde beim Aufruf daraus \a gefolgt von !b.

    Wie gesagt, per Umweg...

    VG
    Rainer
    There's nothing a good whack with a hammer won't fix!

  6. #6
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219
    Zitat Zitat von rais Beitrag anzeigen
    Aber wozu den Umstand?
    \@namedef{a!b}{} erzeugt keinen Befehl \a!b, sondern die Sequenz \csname a!b\endcsname (cs steht für control sequence) und muss auch so abgerufen werden.
    Sonst hättest Du beim Aufruf das gleiche Problem: der Parser stoppt die Interpretation des Befehlsnamens beim Auftreten eines Nicht-Buchstabens.
    Hieße der Befehl \a!b, würde beim Aufruf daraus \a gefolgt von !b.

    Wie gesagt, per Umweg...
    Ich verstehe glaube ich nicht, was du mir damit sagen willst. Ich möchte ja, dass ich einen Befehl, denn ich mit Parametern aufrufen kann mit einem Sonderzeichen benennen kann. Dafür brauche ich ja Newdocumentcommand oder newcommand.

    So wie es in deinem Beispiel ist, klappt es zwar mit den Sonderzeichen, aber da habe ich ja nicht die Möglichkeit irgendwelche Parameter anzugeben. Beides zusammen bekomme ich nicht hin.

    Übersehe ich da gerade irgendwas, was für dich offensichtlich ist?
    Geändert von rais (29-12-2019 um 16:09 Uhr) Grund: fehlende ] ergänzt

  7. #7
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.859
    Zitat Zitat von swizz Beitrag anzeigen
    So wie es in deinem Beispiel ist, klappt es zwar mit den Sonderzeichen, aber da habe ich ja nicht die Möglichkeit irgendwelche Parameter anzugeben. Beides zusammen bekomme ich nicht hin.
    oh, Parameter können hier auch mit angegeben werden, aber in \def-Manier, will sagen: #1#2#3 für 3 aufeinanderfolgende Parameter. Entsprechend gibt es hier keinen (direkten) Weg, optionale Parameter zu verwenden (dazu müsste an passender Stelle z.B. mit dem vom LaTeX-Kern zur Verfügung gestelltem \@ifnextchar auf [ testen und entsprechend verzweigen, sprich: noch (mindestens) einen Befehl erstellen, der dann entsprechend aufgerufen wird).
    Aber zurück zur eigentlichen Deklaration von Parametern hier:
    Code:
    \documentclass{article}
    \usepackage{etoolbox}
    
    %TeX:
    \expandafter\def\csname a1b\endcsname#1{was auch immer (#1)}
    
    %LaTeX:
    \makeatletter
    \@namedef{a!b}#1{was auch immer (#1) v2}
    \@namedef{a?b}{was auch immer v3}
    \makeatother
    
    %etoolbox:
    \csdef{a:b}#1#2{was auch immer (#1, #2) v4}
    
    \csdef{a?b}{Achtung!}
    
    \begin{document}
    \csname a1b\endcsname{bla}
    
    \makeatletter
    \@nameuse{a!b}{test}
    \makeatother
    
    oder auch
    \csname a?b\endcsname
    
    \csuse{a:b}{bla}{blubb}
    
    \end{document}
    VG
    Rainer
    There's nothing a good whack with a hammer won't fix!

  8. #8
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219
    Ok, vielen dank. Dann schau ich mal, wie ich das für mich am besten hinbekomme. Du hast mir mal wieder sehr geholfen.

Lesezeichen

Berechtigungen

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