# LuaTeX: Split path string for use in macros

I would like to parse a path in Lua in order to split it into its folder and file components. The goal is to create a macro that accepts an argument of the form myfolder/myfile and be able to use myfolderinside the lua block in order to put it into other macros.

The following does not work but is supposed to showcase what I seek:

\newcommand*{\splitme}[1]{\directlua{
local parts=split(#1,'[\\/]+');
tex.sprint("\graphicspath{",parts[1],"}");
}}


I checked out http://lua-users.org/wiki/SplitJoin but could not piece it together in LuaLaTeX. Is it possible though without too much hassle?

• Can we assume we are simply splitting at the last / char? If so, string.match is likely the way to go – Joseph Wright Mar 7 '17 at 9:28
• you don't actually need lua for this of course, latex already has in the format \filename@parse which is used all over the graphics package to split a filename into directory, basename and extension parts. – David Carlisle Mar 7 '17 at 9:43
• @Joseph: Yes, that was my intention. Henry Menke has actually used string.match in his answer... – FlorianL Mar 7 '17 at 15:40
• @David: Thanks for the hint. I just tried looking into \filename@parse, but find it very hard to understand its usage. – FlorianL Mar 7 '17 at 15:42
• @FlorianL I added an example – David Carlisle Mar 7 '17 at 15:52

In such cases StackOverflow can be helpful.

\documentclass{article}

% https://stackoverflow.com/questions/5243179
\newcommand*{\splitme}[1]{\directlua{\unexpanded{
local parts = string.match([[#1]], "(.-)([^\\/]-)\$")
tex.sprint(parts)
%tex.sprint("\graphicspath{",parts,"}")
}}}

\begin{document}

\splitme{/home/user/test.jpg}

\splitme{/home/user/}

\splitme{/home/user}

% Print the backslash
\def\\{\textbackslash}

\splitme{C:\\home\\user\\test.jpg}

\splitme{C:\\home\\user\\}

\splitme{C:\\home\\user}

\end{document}


Since I'm not very familiar with lua nor LuaLaTeX here is some lua code, which should return the substring:

local i = 0
local p = 0
while i <= in_string:len() do
if in_string:sub(i,i) == "/" then
p = i
end
i = i + 1
end
return in_string:sub(0,p)


There might be a much simpler solution making use of the capabilities of lua, but since I don't know these, this is what I would have done.

If you just need / (and you shouldn't ever need \ as a path separator in latex) then the format already has a filename parser for this:

\documentclass{article}

\makeatletter
\newcommand\splitme[1]{\filename@parse{#1}\filename@area}
\makeatother
\begin{document}

\splitme{/home/user/test.jpg}

\splitme{/home/user/}

\splitme{/home/user}

\end{document}

• With the difference this is not expandable. – egreg Mar 7 '17 at 15:56
• @egreg well true but lots of things aren't expandable:-) (actually it could be expandable, or defined by directlua since it is definable in texsys.cfg at format time.:-) – David Carlisle Mar 7 '17 at 16:00