PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem bei LUA-Variablen



MC3330
29-04-2020, 21:36
Hallo,

ich habe verschiedene Kommandos in denen ich in LUA Ergebnisse berechne. Diese Ergebnisse greife ich teilweise in anderen Kommandos wieder auf. Da ich teilweise Kommandos mehrfach verwende, bevor ich die Ergebnisse wieder aufgreife habe ich die Variablen über einen Counter unterscheidbar gemacht. Das klappt auch soweit.

Seit ein paar Tagen klappt es bei einer Funktion leider nicht mehr. Ich habe es jetzt soweit debuggt, dass ich weiß, dass es irgendwie mit der Funktion table.shuffle zusammen hängt. Komischerweise klappt es in dem Fall, wenn die Variable keinen Counter enthält und es klappt nicht, wenn es einen Enthält.

Im MB sieht man, dass die Zuordnung mit Counter auch klappt, bei der Funktion table.shuffle aber irgendwas schief läuft. Eventuell geht es nicht, mit der Übergabe des Counter an die LUA-Funktion.

MB



\documentclass{scrartcl}
\usepackage{luacode}
\begin{luacode}
function table.shuffle(tbl)
local tbl2={}
for i = 1,#tbl,1 do
tbl2[i]= tbl[i]
end
for i = #tbl2, 2, -1 do
local j = math.random(i)
tbl2[i], tbl2[j] = tbl2[j], tbl2[i]
end
return tbl2
end---
\end{luacode}
\newcounter{tableid}
\newcommand\einso[1][]{%//
\directlua{
ergebnisohne={1,2,3,4,5,6,7,8,9,10}
}
}%\\
\newcommand\zweio[1][]{%//
\directlua{
ergebnisohneneu=ergebnisohne
shuffleohne = table.shuffle(ergebnisohneneu)
}
}%\\
\newcommand\einsm[1][]{%//
\directlua{
ergebnismit\thetableid={1,2,3,4,5,6,7,8,9,10}
}
}%\\
\newcommand\zweim[1][]{%//
\directlua{
ergebnismitneu\thetableid=ergebnismit\thetableid
shufflemit\thetableid = table.shuffle(ergebnismitneu\thetableid)
}
}%\\
\newcommand\dreim[1][]{%//
\directlua{
shufflemitohneshuffle\thetableid=ergebnismit\theta bleid
}
}%\\





\begin{document}
\einso
\zweio
\textbf{Ergebnis Ohne ID}\\
ergebnis ohne id: \directlua{tex.print(ergebnisohne)}\\
ergebnis neu ohne id: \directlua{tex.print(ergebnisohneneu)}\\
shuffle ohne id: \directlua{tex.print(shuffleohne)}\\\\
\einsm
\zweim
\dreim
\textbf{Ergebnis mit ID}\\
ergebnis mit id: \directlua{tex.print(ergebnismit\thetableid)}\\
ergebnis neu mit id: \directlua{tex.print(ergebnismitneu\thetableid)}\\
shuffle mit id: \directlua{tex.print(shufflem\thetableid)}\\
ergebnis neu mit id ohne shuffle: \directlua{tex.print(shufflemitohneshuffle\thetabl eid)}

\end{document}




Fehlermeldung


load luc: /Users/malte/Library/texlive/2018/texmf-var/luatex-cache/generic/font
s/otl/lmroman10-bold.luc)[\directlua]:1: unexpected symbol near '='.
\\zweim ...e.shuffle(ergebnismitneu\thetableid ) }

l.58 \dreim

The lua interpreter ran into a problem, so the
remainder of this lua chunk will be ignored.

[\directlua]:1: no string to print
stack traceback:
[C]: in function 'print'
[\directlua]:1: in main chunk.
l.61 ...ectlua{tex.print(ergebnismitneu\thetableid)}
\\
The lua interpreter ran into a problem, so the
remainder of this lua chunk will be ignored.

[\directlua]:1: no string to print
stack traceback:
[C]: in function 'print'
[\directlua]:1: in main chunk.
l.62 ...: \directlua{tex.print(shufflem\thetableid)}
\\
The lua interpreter ran into a problem, so the
remainder of this lua chunk will be ignored.

rais
01-05-2020, 14:12
\directlua mag es wohl nicht, wenn eine Zeile auf einem LaTeX-Makro endet (hier \thetableid) und in der nächsten Zeile noch was geschehen soll.
Ändere


\newcommand\zweim[1][]{%//
\directlua{
ergebnismitneu\thetableid=ergebnismit\thetableid
shufflemit\thetableid = table.shuffle(ergebnismitneu\thetableid)
}
}%\\

zu


\newcommand\zweim[1][]{%//
\directlua{
ergebnismitneu\thetableid=ergebnismit\thetableid;
shufflemit\thetableid = table.shuffle(ergebnismitneu\thetableid)
}
}%\\

Damit das Ergebnis auch angezeigt wird, ändere zusätzlich


shuffle mit id: \directlua{tex.print(shufflem\thetableid)}\\

zu


shuffle mit id: \directlua{tex.print(shufflemit\thetableid)}\\

dann sollte es fehlerfrei durchlaufen.
Wozu Du allerdings Deine Makros mit optionalen Parametern definierst, die Du dann doch nicht verwendest...

VG

MC3330
01-05-2020, 14:41
Super vielen Dank. Eigentlich benutzt ich die optionalen Parameter, ich habe es nur für das Minimalbeispiel soweit zusammen gekürzt, dass das nicht mehr vorkommt. Das ist dann im Minimalbeispiel übrig geblieben.