PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sonderzeichen in Befehlsdefinitionen



MC3330
26-12-2019, 06:33
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-Wörterbuch:_TeX_Primitiven:_%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

rais
27-12-2019, 16:14
AFAIR geht das nur über den einen oder anderen Umweg:


\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

MC3330
27-12-2019, 16:42
Danke, schau ich mir direkt mal an.

MC3330
27-12-2019, 19:48
Die Lösung in deinem Minimalbeispiel bezieht sich ja auf Definitionen ohne Befehle. Gibt es auch einen Weg, dass für NewDocumentCommand hinzubekommen?

rais
29-12-2019, 12:33
\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

MC3330
29-12-2019, 14:15
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?

rais
29-12-2019, 15:05
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:


\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

MC3330
29-12-2019, 16:18
Ok, vielen dank. Dann schau ich mal, wie ich das für mich am besten hinbekomme. Du hast mir mal wieder sehr geholfen.