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 '18, 17:37

cis's gravatar image

cis
9.5k75452491
Akzeptiert-Rate: 29%

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 '18, 17:50) Community

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 '18, 18: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 '18, 18:44

moewe's gravatar image

moewe
3.7k36
Akzeptiert-Rate: 42%

bearbeitet 07 Okt '18, 18:58

Ah super! .....

(07 Okt '18, 19:01) cis
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:

×21

gestellte Frage: 07 Okt '18, 17:37

Frage wurde gesehen: 3,609 Mal

zuletzt geändert: 07 Okt '18, 19:01