Um aus einer Tabellenzeile aus einer externen Datei

1 2 3 1 3 2 2 1 3 2 3 1 ...

eine kommaseparierte Liste zu machen, verwende ich eine xdef-Methode

Öffne in Overleaf
Code, hier editierbar zum Übersetzen:
% Kommaseparierte Permutationsliste erstellen:
\newcommand{\PermutationsListe}{}% Name reservieren
\let\PermutationsListe=\empty% Liste erstellen
\makeatletter
\foreach \i in {0,...,\cols}
{
\pgfplotstablegetelem{0}{\i}\of{\Perm}
\ifx\empty\PermutationsListe{} \protected@xdef\PermutationsListe{\pgfplotsretval}%
\else \protected@xdef\PermutationsListe{\PermutationsListe,\pgfplotsretval}%
\fi
}\makeatother
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Was ich hier bräuchte wäre aber ein Befehl des Typs \PermutationsListe{<Zeilennummer>}, so dass mir z.B. \PermutationsListe{2} die Ausgabe 2, 1, 3 liefert.

Wenn ich das oben genannte in ein newcommand stecke, funktioniert es nicht mehr.

Öffne in Overleaf
Code, hier editierbar zum Übersetzen:
\newcommand\PermutationsListeErstellen[1]{%
% Kommaseparierte Permutationsliste erstellen:
\newcommand{\PermutationsListe}{}% Name reservieren
\let\PermutationsListe=\empty% Liste erstellen
\makeatletter
\foreach \i in {0,...,\cols}
{
\pgfplotstablegetelem{#1}{\i}\of{\Perm}
\ifx\empty\PermutationsListe{} \protected@xdef\PermutationsListe{\pgfplotsretval}%
\else \protected@xdef\PermutationsListe{\PermutationsListe,\pgfplotsretval}%
\fi
}\makeatother
}%
\PermutationsListeErstellen{0}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Ich bekomme ! You can't use a prefix withthe character @'. @`

Wie könnte ich das machen?

Öffne in Overleaf
Code, hier editierbar zum Übersetzen:
\begin{filecontents*}{permutationen.txt}
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
\end{filecontents*}
%\documentclass[]{article}
\documentclass[border=5mm, varwidth]{standalone}
%\usepackage{sagetex}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{amsmath}
\usepackage{pgfplotstable}
\begin{document}
% Liste einlesen
\pgfplotstableread{permutationen.txt}{\Perm}
\pgfplotstablegetcolsof{\Perm}
\pgfmathsetmacro{\cols}{\pgfplotsretval-1}
% Kommaseparierte Permutationsliste erstellen:
\newcommand{\PermutationsListe}{}% Name reservieren
\let\PermutationsListe=\empty% Liste erstellen
\makeatletter
\foreach \i in {0,...,\cols}
{
\pgfplotstablegetelem{0}{\i}\of{\Perm}
\ifx\empty\PermutationsListe{} \protected@xdef\PermutationsListe{\pgfplotsretval}%
\else \protected@xdef\PermutationsListe{\PermutationsListe,\pgfplotsretval}%
\fi
}\makeatother
Anzeigen: \PermutationsListe
\end{document}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

gefragt 12 Mär '18, 12:19

cis's gravatar image

cis
9.5k96460491
Akzeptiert-Rate: 29%

bearbeitet 12 Mär '18, 12:32

1

Also für so eine Art von Datenverarbeitung ist TeX wirklich nicht gemacht. Probier doch mal Lua.

(12 Mär '18, 12:22) Henri
1

«Wenn ich das oben genannte in ein newcommand oder eine foreach-Schleife stecke funktioniert es nicht mehr.» Was funktioniert nicht mehr? Was hast du versucht? Die Qualität deiner Fragen nimmt in letzter Zeit ganz schön ab. Ich kann nicht hellsehen.

(12 Mär '18, 12:24) Henri

Hab mal alles ergänzt.

(12 Mär '18, 12:33) cis

Wegen Lua. Das Problem ist, dass das nur ein Randausschnitt von einer Sache ist, in deren Hintergrund aufwendige CAS-Rechnungen stehen. Wenn ich erst Werte mit Sage berechne und dann später mit Lua verabeite, hätte ich ja gleich Lua nehmen können. Da muss doch irgendwie einfacher gehen.

(12 Mär '18, 12:35) cis

@cis: Und warum nimmst Du nicht einfach gleich Lua? Das ist meist einfacher. Selbst der Aufruf von externen Programmen mit anschließender Verarbeitung von deren Ergebnisse ist damit wesentlich natürlicher als mit dem \write18-Fremdkörper.

(13 Mär '18, 08:09) saputello

Ist natürlich reine Geschmacksache, aber: Ich finde die Umsetzungen mit Lua nicht so elegant.

(13 Mär '18, 09:17) cis
Ergebnis 5 von 6 show 1 more comments

\makeatletter und \makeatother müssen außerhalb von \newcommand stehen. Innerhalb von \newcommand sind die Catcodes schon fixiert und lassen sich nicht mehr ändern.

Öffne in Overleaf
Code, hier editierbar zum Übersetzen:
\begin{filecontents*}{permutationen.txt}
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
\end{filecontents*}
\documentclass{article}
\usepackage{pgfplotstable}
% Liste einlesen
\pgfplotstableread{permutationen.txt}{\Perm}
\pgfplotstablegetcolsof{\Perm}
\pgfmathsetmacro{\cols}{\pgfplotsretval-1}
\makeatletter
\DeclareRobustCommand\PermutationsListeErstellen[2]{%
% Kommaseparierte Permutationsliste erstellen:
\@ifdefinable#2{\let#2=\empty}% Liste erstellen
\foreach \i in {0,...,\cols} {%
\pgfplotstablegetelem{#1}{\i}\of{\Perm}%
\ifx\empty\PermutationsListe
\protected@xdef\PermutationsListe{\pgfplotsretval}%
\else
\protected@xdef\PermutationsListe{\PermutationsListe,\pgfplotsretval}%
\fi
}%
}
\makeatother
\begin{document}
\PermutationsListeErstellen{1}{\PermutationsListe}
\foreach \i in \PermutationsListe {
\i
}
\end{document}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

alt text

Deutlich eleganter, kürzer und lesbarer geht das natürlich mit Lua. Als Bonus funktioniert hier auch die von dir gewünschte Syntax (zumindest fast).

Öffne in Overleaf
Code, hier editierbar zum Übersetzen:
\begin{filecontents*}{permutationen.txt}
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
\end{filecontents*}
\documentclass{article}
\usepackage{pgffor}
\usepackage{luacode}
\begin{luacode*}
local perms = {}
for line in io.lines("permutationen.txt") do
perms[#perms+1] = { string.match(line, "(%d+)%s*(%d+)%s*(%d+)") }
end
function get_perm(n)
tex.sprint(table.concat(perms[n+1],","))
end
\end{luacode*}
\newcommand\PermutationsListeErstellen[1]{\directlua{get_perm(#1)}}
\begin{document}
\foreach \i in {\PermutationsListeErstellen{1}} {
\i
}
\end{document}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Permanenter link

beantwortet 13 Mär '18, 01:29

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 13 Mär '18, 11:08

Außerdem gehören Definitionen im Sinne von Trennung von Form und Inhalt in die Dokumentpräambel also vor \begin{document}.

(13 Mär '18, 08:06) saputello

Oha, also das ist ja an sich das, was ich suche aber: Wenn ich mal das hier mache

\foreach \i in \PermutationsListeErstellen{1}{ \i }

kommt ein seltsames Ergebnis "1, 1" raus...

(13 Mär '18, 10:42) cis

@cis \PermutationsListeErstellen ist nicht expandierbar und kann daher in diesem Kontext nicht verwendet werden.

(13 Mär '18, 10:44) Henri

@cis Siehe aktualisierte Antwort.

(13 Mär '18, 10:58) Henri

Puh, jetzt bin ich verwirrt. Jetzt tut die Schleife, aber wie bekomme ich jetzt den Aufruf \PermutationsListeErstellen{1} ?

(13 Mär '18, 11:12) cis
Deine Antwort
[Vorschau ausblenden]

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

Frage-Themen:

×39
×24

gestellte Frage: 12 Mär '18, 12:19

Frage wurde gesehen: 4,216 Mal

zuletzt geändert: 13 Mär '18, 11:12

Willkommen, erstes Mal hier? Schau mal unter FAQ!

×