How can I pass the content of the TeX variable \jobname
to a Lua variable?
(I am using LuaLaTeX with the luacode
package.)
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It only takes a minute to sign up.
Sign up to join this communityHow can I pass the content of the TeX variable \jobname
to a Lua variable?
(I am using LuaLaTeX with the luacode
package.)
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}
\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}
.
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!
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}