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
% 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

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

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

Wie könnte ich das machen?

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

gefragt 12 Mär '18, 12:19

cis's gravatar image

cis
9.5k95459491
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
\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}

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
\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}
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 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
×24

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

Frage wurde gesehen: 4,155 Mal

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