Anschlussfrage zu https://texwelt.de/wissen/fragen/23239/newcommands-mit-foreach-erzeugen


Also ich hatte gehofft, ich raff das jetzt endlich mal mit diesem csname, aber ich stehe vor folgendem Problem:

Ich habe eine Anzahl Matrizen \matrixI, \matrixII,....

Zu diesen lese ich die Spaltenzahl aus:

\newcommand{\dimensionen}[1]{% \pgfplotstablegetcolsof{#1}% \pgfmathtruncatemacro{\Spaltenzahl}{\pgfplotsretval}% }

Und möchte nun möglichst automatisch Kommandos \MatrixI, \MatrixII,... erstellen, die mir bei Aufruf folgendendes liefern:

alt text

Wie könnte ich das machen, ohne dass ich jedes Kommando \MatrixI, \MatrixII,... einzeln erstellen muss?

MWE:

alt text

Öffne in Overleaf
\documentclass[border=5mm, varwidth]{standalone}
\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}%
}

\begin{document}

% Wie für alle vorhanden Matrizen automatisch erstellen?
\newcommand\MatrixI{
MatrixI: \pgfplotstabletypeset[]{\matrixI} mit \dimensionen{\matrixI} \pgfplotsretval ~Spalten.
}

\MatrixI

%\MatrixII

\bigskip
Konventionell: \\
MatrixI: \pgfplotstabletypeset[]{\matrixI} mit \dimensionen{\matrixI} \pgfplotsretval ~Spalten.

MatrixII: \pgfplotstabletypeset[]{\matrixII} mit \dimensionen{\matrixII} \pgfplotsretval ~Spalten.

\end{document}

gefragt 08 Okt '18, 15:34

cis's gravatar image

cis
9.5k93459491
Akzeptiert-Rate: 29%

bearbeitet 08 Okt '18, 15:36


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

Öffne in Overleaf
\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:

Öffne in Overleaf
\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 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:

Öffne in Overleaf
\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}
Permanenter link

beantwortet 08 Okt '18, 16:57

Skillmon's gravatar image

Skillmon
1.2k6
Akzeptiert-Rate: 46%

bearbeitet 08 Okt '18, 19:15

Wow, sehr gut erklärt. Das bringt mich ein gutes Stück weiter!

(08 Okt '18, 17:11) cis

Lustig: Ich habe \ifnum\value{foocount}<999 eingestellt und kann bis \MatrixCMXCIX erzeugen (CMXCIX = 999).

(08 Okt '18, 17:25) cis

Statt dem für mich immer etwas gruslig anmutenden \expandafter\edef\csname Matrix\Roman{foocount}\endcsname kann man auch \csedef{Matrix\Roman{foocount}} von etoolbox verwenden.

(08 Okt '18, 17:33) moewe
1

@moewe ja, natürlich, aber zum Verständnis ist, denke ich, obiges Beispiel sinnvoller, zumal \csedef exakt das Gleiche macht (nur eben "versteckt" für den Anwender).

(08 Okt '18, 19:10) Skillmon

Oha.. mir ist hier etwas ganz Schlimmes aufgefallen: im \newcommand{\dimensionen} hat hier \pgfmathtruncatemacro{\Spaltenzahl}{\pgfplotsretval} eigentlich gar keinen Zweck; es wird der \pgfretval von \pgfplotstablegetcolsof{#1} verwendet. Kann man das ändern? Weil ich brauche eigentlich als '\dimensionen' eine ganze Handvoll Dimensionen...

(09 Okt '18, 23:13) cis

Hab es, denke ich hinbekommen. Man muss einfach '\noexpand\Spaltenzahl\noexpand~Spalten.' ersetzen. War vermutlich auch so gemeint.

(09 Okt '18, 23:45) cis

Wow, also das ist wirklich eine sehr abgedrehte Methode. Ich konnte damit jetzt mein Applet für Lineare Gleichungssysteme fertigstellen. Funktioniert reibungslos.

(09 Okt '18, 23:53) cis
Ergebnis 5 von 7 show 2 more comments
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×39

gestellte Frage: 08 Okt '18, 15:34

Frage wurde gesehen: 4,089 Mal

zuletzt geändert: 09 Okt '18, 23:53