# how to pass the content of the TeX variable to Lua

How can I pass the content of the TeX variable \jobname to a Lua variable?

(I am using LuaLaTeX with the luacode package.)

• I'm not clear on what you want: Mico's answer seems sensible, but that seems almost trivially-obvious so I wonder if there is more to the question. – Joseph Wright Aug 30 '14 at 8:53
• Indeed, <code>\luadirect{p = \luastring{\jobname}}</code> does what I want. Many thanks to Mirco. – Primo Petri Aug 30 '14 at 9:38

Since you're loading the luacode package, you could make use of its macro \luastring. (Yes, the name of the tex file in this example really is uvw.)

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{fontspec}
\usepackage{luacode}
\begin{luacode}
function foo(s) -- "s" is a variable
tex.sprint( s )
end
\end{luacode}
\begin{document}\pagestyle{empty}
The value of \verb+\jobname+ is \directlua{tex.sprint(\luastring{\jobname})}.

The value of \verb+\jobname+ is \texttt{\directlua{ foo(\luastring{\jobname})}}.
\end{document}
• I see no Lua variable here. – egreg Aug 30 '14 at 9:12
• @egreg - the macro \luastring{...} creates a Lua variable, which gets operated on by tex.sprint in the MWE. I've modified the MWE to set up a function that explicitly operates on a variable s that contains the value of \luastring{\jobname}. – Mico Aug 30 '14 at 9:52
• Can one combine it with dofile("...") somehow? – koppor Mar 7 '18 at 16:32
• @koppor - Sure can! (a) Plunk the three lines of Lua code into an external file called, say, myfile.lua. (b) Run \directlua{dofile("myfile.lua")} in the preamble. (c) Run The value of \verb+\jobname+ is \texttt{\directlua{ foo(\luastring{\jobname})}} as in the example shown above. If this instruction needs to be run several times, create a shortcut LaTeX macro, e.g., \newcommand\printjobname{\texttt{\directlua{foo(\luastring{\jobname})}}} in the preamble (and after running dofile); then, just type The value of \verb+\jobname+ is \printjobname in the body of the document. Cheers! – Mico Mar 7 '18 at 17:19
• Thus there is an even number :-) – Sebastiano Mar 26 '20 at 22:49

An addition to Micos answer, you can also access the original \jobname, which was active at the start of LuaTeX: It is available as tex.jobname. This will normally be the same as \jobname, except it doesn't change if \jobname is redefined:

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{fontspec}
\usepackage{luacode}
\begin{document}\pagestyle{empty}
The value of \verb+\jobname+ is \directlua{tex.sprint(\luastring{\jobname})}, the real'' jobname is \directlua{tex.sprint(tex.jobname)}.

\renewcommand\jobname{somename}

The value of \verb+\jobname+ is \directlua{tex.sprint(\luastring{\jobname})}, the real'' jobname is \directlua{tex.sprint(tex.jobname)}.

% Change back, otherwise LaTeX is unhappy
\edef\jobname{\directlua{tex.sprint(tex.jobname)}}
\end{document}

If the jobname is job, this will result in