我的问题与LuaTeX:拆分路径字符串以用于宏。然而,与此相反,我希望基名。例如,我对file
来自/path/to/file.ext
或感兴趣path/to/file
。
使用\filename@parse
来自从路径中提取文件名不可能。该命令未定义。可能是因为我正在使用 LuaLaTex。
因此,我尝试采用 Lua 方法。基于https://github.com/Donearm/scripts/blob/master/lib/basename.lua,我把上面的代码修改为(注意另外转义的%
):
\newcommand*{\basename}[1]{\directlua{\unexpanded{
local name = string.gsub([[#1]], "(.*/)(.*)", "\%2")
tex.sprint(name)
}}}
\basename{/path/to/file.ext}
不幸的是,它没有输出任何东西!?!?
答案1
答案2
您可以使用 FFI 和平台相关函数轻松获取 LuaTeX 中的基名。在基于 POSIX 的系统上,您可以使用basename()
功能。
因为它使用 FFI,所以您必须启用--shell-escape
。
我tex.sprint
使用第一个参数-2
切换到逐字的 catcodes,以防路径包含任何被 TeX 特殊处理的字符,例如{}$%#
。
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
local ffi = assert(require("ffi"))
ffi.cdef[[
char *basename(char *path);
]]
function basename(path)
local cstr = ffi.new("char[?]", #path + 1)
ffi.copy(cstr, path)
return ffi.string(ffi.C.basename(cstr))
end
\end{luacode*}
\newcommand*\basename[1]{\directlua{tex.sprint(-2, basename("\luaescapestring{\unexpanded{#1}}"))}}
\begin{document}
\basename{/path/to/file.ext}
\end{document}