Hey Leute,

ich versuche 3 Variablen beliebig oft zu konkatinieren und zwischendrin zu ändern. Also im Grunde

var concat = ""
var system = "System 1"
var notiz  = "Eine Notiz"
concat = concat + " " + system + ":" + notiz
system = "System 2"
notiz = "Notiz 2"
concat = concat + " " + system + ":" + notiz

usw. sodass am Ende eine Variable raus kommt, die beliebig viele Systeme mit vielen Noitzen auflistet.

Ich habe mir dafür nun folgendes zusammengegoogelt:

\documentclass[12pt]{article}
\begin{document}

% 0. Definiere TextString 
\newcommand{\textstring}{}

% 1. Definiere Variablen
\edef\system{System 1: }
\edef\notiz{Online; }
% 2. Konkatiniere den String 
\expandafter\def\expandafter\textstring\expandafter{\textstring { }\system \notiz}
% 3. Ausgabe zu Testzwecken
\textstring  ~ \newline

% Wiederhole Schritt 1-3 beliebig oft
\edef\system{System 2: }
\edef\notiz{Offline; }
\expandafter\def\expandafter\textstring\expandafter{\textstring { }\system \notiz}
\textstring

\end{document}

Wie nun zu sehen klappt das aber nicht wie gewünscht.

alt text

System und Notiz sollen beliebig oft überschrieben werden können und anschließend jedes mal das Konkatinieren durchgeführt werden.

Was mache ich bloß falsch? Ich habe gefült überall schon \expandafter dran gehangen aber es klappt nichts.

Grüße: Jonas

gefragt 10 Jan '20, 14:40

JonnyKnipst's gravatar image

JonnyKnipst
2113
Akzeptiert-Rate: 0%

bearbeitet 13 Jan '20, 01:58

stefan's gravatar image

stefan ♦♦
18.3k163148


Da \def nicht expandiert, enthält \textstring nach dem ersten \expandafter\def… ein \system. Das wird dann von Dir umdefiniert. Also ändert sich damit auch die Ausgabe von \textstring. Lerne den Unterschied zwischen \def, \edef, \protected@edef etc. Es gibt dazu AFAIK auch schon eine Frage.

Übrigens: Bei Verwendung von \edef oder (besser) \protected@edef brauchst du kein \expandafter:

\documentclass[12pt]{article}
\begin{document}

% 0. Definiere TextString 
\newcommand{\textstring}{}

% 1. Definiere Variablen
\edef\system{System 1: }
\edef\notiz{Online; }
% 2. Konkatiniere den String 
\edef\textstring{\textstring { }\system \notiz}
% 3. Ausgabe zu Testzwecken
\textstring

% Wiederhole Schritt 1-3 beliebig oft
\edef\system{System 2: }
\edef\notiz{Offline; }
\edef\textstring{\textstring { }\system \notiz}
\textstring

\end{document}

alt text

Allerdings geht das natürlich in die Hose, wenn \system oder \notiz etwas enthält, was nicht voll expandierbar ist.

Und dann wären da noch die Sequenzen in LaTeX3, die sich für so etwas ebenfalls anbieten.

Permanenter link

beantwortet 10 Jan '20, 15:33

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 13 Jan '20, 01:58

stefan's gravatar image

stefan ♦♦
18.3k163148

Allerdings geht das natürlich in die Hose, wenn \system oder \notiz etwas enthält, was nicht voll expandierbar ist.

Ja ich glaube das wird nun mein nächstes Problem. Ich will am Ende die Systeme in einer \begin{decription} Umgebung auflisten als Items mit Text. Aber das scheint nicht zu funktionieren.

Ich habe eindeutig zu wenig Ahnung von LaTeX und der Expandierbarkeit.

(10 Jan '20, 16:36) JonnyKnipst
1

@JonnyKnipst Ich habe deine „Antwort” in einen Kommentar umgewandelt. Anders als in Diksussionsforen sind Antworten hier immer als Antwort auf die Frage zu verstehen. Kommentare können dafür als Kommentar zu einer Frage oder Antwort angegeben werden. Wichtige Zusatzinfos zur Frage sollten hingegen in die Frage eingearbeitet werden. Erweiterungen der Frage sollten man besser als Folgefrage stellen. Wobei es meist eine gute Idee ist, XY-Probleme zu vermeiden.

(10 Jan '20, 16:45) saputello
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:

×7

gestellte Frage: 10 Jan '20, 14:40

Frage wurde gesehen: 3,834 Mal

zuletzt geändert: 10 Jan '20, 16:48