Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

08 Okt '18, 19:15

Skillmon's gravatar image

Skillmon
1.2k6

`\csname` funktioniert folgendermaßen: Es wandelt alles bis `\endcsname` (nicht einschließlich) in einen Befehlsnamen um (mit Expansion wie bei `\edef` für das Argument). Wenn du also automatisiert einen Macronamen erzeugen möchtest, verwendest du: \csname Matrix\Roman{foocount}\endcsname Du möchtest allerdings, dass dieser Name gebildet wird, bevor `\newcommand` sein erstes Argument (nämlich den zu verwendenden Macronamen) liest. Also verwenden wir `\expandafter`: \expandafter\newcommand\csname Matrix\Roman{foocount}\endcsname{definition} Allerdings benötigen wir auch den Wert von `\Roman{foocount}` für die Definition, also verwenden wir statt `\newcommand` ein `\edef` und alles, was nicht expandiert werden soll soll, beschützen wir mit `\noexpand` oder `\unexpanded` (das Folgende verwendet nur `\noexpand`) -- außerdem müssen wir erneut darauf achten, dass die richtigen Macros betroffen sind und nicht `\csname` `\csname`, weshalb erneut abermals `\expandafter` verwendet wird. Schließlich verwenden wir noch einen Mechanismus für den loop, der nicht gruppiert (sodass der `\edef` überhaupt was macht): `\loop` aus dem LaTeX-Kernel reicht hier vollständig aus: \documentclass[]{article} \usepackage{pgfplotstable} % Matrizen eingeben \pgfplotstableread[]{ 1 2 3 4 1 2 3 4 }\matrixI \pgfplotstableread[]{ 1 2 1 2 }\matrixII \newcommand{\dimensionen}[1] {% \pgfplotstablegetcolsof{#1}% \pgfmathtruncatemacro{\Spaltenzahl}{\pgfplotsretval}% } \newcounter{foocount} \loop \ifnum\value{foocount}<2 \stepcounter{foocount} \expandafter\edef\csname Matrix\Roman{foocount}\endcsname {% Matrix\Roman{foocount}: \noexpand\pgfplotstabletypeset[] {\expandafter\noexpand\csname matrix\Roman{foocount}\endcsname} mit \noexpand\dimensionen {\expandafter\noexpand\csname matrix\Roman{foocount}\endcsname} \noexpand\pgfplotsretval\noexpand~Spalten.% } \repeat \begin{document} \MatrixI \MatrixII \end{document}
Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

08 Okt '18, 17:00

Skillmon's gravatar image

Skillmon
1.2k6

`\csname` funktioniert folgendermaßen: Es wandelt alles bis `\endcsname` (nicht einschließlich) in einen Befehlsnamen um (mit Expansion wie bei `\edef` für das Argument). Wenn du also automatisiert einen Macronamen erzeugen möchtest, verwendest du: \csname Matrix\Roman{foocount}\endcsname Du möchtest allerdings, dass dieser Name gebildet wird, bevor `\newcommand` sein erstes Argument (nämlich den zu verwendenden Macronamen) liest. Also verwenden wir `\expandafter`: \expandafter\newcommand\csname Matrix\Roman{foocount}\endcsname{definition} Allerdings benötigen wir auch den Wert von `\Roman{foocount}` für die Definition, also verwenden wir statt `\newcommand` ein `\edef` und alles, was nicht expandiert werden soll beschützen wir mit `\noexpand` oder `\unexpanded` (das Folgende verwendet nur `\noexpand`) -- außerdem müssen wir erneut darauf achten, dass die richtigen Macros betroffen sind und nicht `\csname` weshalb erneut `\expandafter` verwendet wird. Schließlich verwenden wir noch einen Mechanismus für den loop, der nicht gruppiert (sodass der `\edef` überhaupt was macht): `\loop` aus dem LaTeX-Kernel reicht hier vollständig aus: \documentclass[]{article} \usepackage{pgfplotstable} % Matrizen eingeben \pgfplotstableread[]{ 1 2 3 4 1 2 3 4 }\matrixI \pgfplotstableread[]{ 1 2 1 2 }\matrixII \newcommand{\dimensionen}[1] {% \pgfplotstablegetcolsof{#1}% \pgfmathtruncatemacro{\Spaltenzahl}{\pgfplotsretval}% } \newcounter{foocount} \loop \ifnum\value{foocount}<4 \ifnum\value{foocount}<2 \stepcounter{foocount} \expandafter\edef\csname Matrix\Roman{foocount}\endcsname {% Matrix\Roman{foocount}: \noexpand\pgfplotstabletypeset[] {\expandafter\noexpand\csname matrix\Roman{foocount}\endcsname} mit \noexpand\dimensionen {\expandafter\noexpand\csname matrix\Roman{foocount}\endcsname} \noexpand\pgfplotsretval\noexpand~Spalten.% } \repeat \begin{document} \MatrixI \MatrixII \end{document}
Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

08 Okt '18, 16:57

Skillmon's gravatar image

Skillmon
1.2k6