Um aus einer Tabellenzeile aus einer externen Datei
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 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 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
Ergebnis 5 von 6
show 1 more comments
|
Ö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} 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} beantwortet 13 Mär '18, 01:29 Henri Außerdem gehören Definitionen im Sinne von Trennung von Form und Inhalt in die Dokumentpräambel also vor
(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
kommt ein seltsames Ergebnis "1, 1" raus...
(13 Mär '18, 10:42)
cis
@cis
(13 Mär '18, 10:44)
Henri
Puh, jetzt bin ich verwirrt. Jetzt tut die Schleife, aber wie bekomme ich jetzt den Aufruf
(13 Mär '18, 11:12)
cis
|
Also für so eine Art von Datenverarbeitung ist TeX wirklich nicht gemacht. Probier doch mal Lua.
«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.
Hab mal alles ergänzt.
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.
@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.Ist natürlich reine Geschmacksache, aber: Ich finde die Umsetzungen mit Lua nicht so elegant.