LuaLaTeX:从路径中提取基本名称

LuaLaTeX:从路径中提取基本名称

我的问题与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

\filename@parse在您引用的示例文档 lualatex 中定义

从路径中提取文件名

在 pdflatex 或 lualatex 中给出相同的结果。

答案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}

相关内容