Kann man eigentlich die newcommands \testI, \testII, \testIII irgendwie mit foreach erzeugen?

So geht es nicht:

Öffne in Overleaf
\documentclass[margin=5mm]{standalone}
\usepackage{pgffor}

\begin{document}
\foreach \a/\b in{I/aaa,II/bbb,III/ccc}{
\newcommand{\test\a}{\b}
}

% \testI, \testII, \testIII
\end{document}

gefragt 07 Okt, 11:37

cis's gravatar image

cis
8.2k15167264
Akzeptiert: 70%

Erinnere ich mich richtig? Hast Du so eine Frage nicht schon neulich gestellt? Mit \csname bekommst Du das hin. Du kannst einfach in https://texwelt.de/wissen/antwort_link/23119/ nachschaun wie das geht.

(07 Okt, 11:50) Murmeltier

Ja, ich dachte auch erst, mit csname muss es gehen. Aber hier erzeuge ich die Kommandos doch überhaupt erst mit der foreach-Schleife. Hab es mit csname nicht hinbekommen.

(07 Okt, 12:16) cis

Alles, was sich innerhalb von \foreach abspielt, passiert implizit innerhalb einer Gruppe, daher müssen die Makros \global definiert sein, wenn sie außerhalb von \foreach genutzt werden sollen.

Ferner kann nicht einfach \newcommand{\testI}{\b} genutzt werden, da \b nicht mehr bekannt ist oder nicht mehr den richtigen Wert hat, wenn \testI ausgeführt werden soll. Also muss \b entweder expandiert werden, oder wir müssen \let nutzen. Das kann man sich an folgenden Beispiel klarmachen.

Öffne in Overleaf
\documentclass{article}

\begin{document}
\def\b{aaa}
\newcommand*{\testI}{\b}
\def\b{bb}
\newcommand*{\testII}{\b}

\testI, \testII
\end{document}

TeX ist eine Makrosprache und \newcommand{\testI}{\b} oder \def\testI\b heißt einfach: "Ersetze jedes Vorkommen von \testI mit \b". Du möchtest aber \testI durch den Wert von \b zur Definitionszeit ersetzen. Das bekommt man mit \edef hin (\xdef ist ein globales \edef), dabei wird die Definition vollständig expandiert, \edef\testI{\b} ist also das gleiche wie \def\testI{aaa}, wenn \b zu aaa expandiert. Mit \expandonce können wir das zu einer einmaligen Expansion umbauen, das ist hier nicht relevant, aber interessant, wenn \b selbst mittels eines anderen Makros \c definiert ist. \let\testI\b weist \testI die Definition von \b zu, es ist dabei sehr ähnlich zu der Zuweisung mit \edef und einmaliger Expansion mittels \expandonce.

Möglich wären also mindestens

Öffne in Overleaf
\documentclass{article}
\usepackage{pgffor}
\usepackage{etoolbox}

\begin{document}
\foreach \a/\b in{I/aaa,II/bbb,III/ccc}{
  \global\expandafter\let\csname test\a\endcsname\b 
}

\testI, \testII, \testIII

% \cslet von etoolbox
\foreach \a/\b in{I/aaa,II/bbb,III/ccc}{
  \global\cslet{tost\a}\b
}

\tostI, \tostII, \tostIII

% \csxdef von etoolbox
\foreach \a/\b in{I/aaa,II/bbb,III/ccc}{
  \csxdef{tust\a}{\expandonce{\b}} 
}

\tustI, \tustII, \tustIII

% \csgdef von etoolbox
\foreach \a/\b in{I/aaa,II/bbb,III/ccc}{
  \expandafter\csgdef\expandafter{tast\a\expandafter}\expandafter{\b} 
}

\tastI, \tastII, \tastIII

% \csxdef von etoolbox
\foreach \a/\b in{I/aaa,II/bbb,III/ccc}{
  \csxdef{tist\a}{\b} 
}

\tistI, \tistII, \tistIII
\end{document}
Permanenter link

beantwortet 07 Okt, 12:44

moewe's gravatar image

moewe
2764

bearbeitet 07 Okt, 12:58

Ah super! .....

(07 Okt, 13:01) cis
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×15

Frage gestellt: 07 Okt, 11:37

Frage wurde angeschaut: 118 Mal

Zuletzt aktualisiert: 07 Okt, 13:01