使用 lualatex 时删除“\currfileabspath”中的“./”

使用 lualatex 时删除“\currfileabspath”中的“./”

我对软件包currfile和命令有一点小问题\currfileabspath。使用编译文件时,(pdf|xe)latex我得到了预期的结果,但如果我使用lualatex它,它会添加./到文件的绝对路径中。我在 Fedora 29 中使用 TeXLive 2018(已更新),工作目录如下所示:

[pablo@fedora forum] $ pwd
/home/pablo/forum
[pablo@fedora forum] $ ls -lha
total 12K
drwxrwxr-x.  2 pablo pablo 4,0K feb 17 13:11 .
drwx------. 43 pablo pablo 4,0K feb 17 13:10 ..
-rw-rw-r--.  1 pablo pablo  187 feb 17 13:03 test.tex

我的 MWE(test.tex)是这样的:

\documentclass{article}
\usepackage[abspath]{currfile}
\setlength{\parindent}{0pt} 
\begin{document}
\texttt{\jobname.pdf} created from file \texttt{\currfileabspath}%
\end{document}

我使用以下行来编译它:

$ pdflatex -recorder test.tex

我得到:

test.pdf created from file /home/pablo/forum/test.tex

这是正确的,但如果我将其更改为:

$ lualatex -recorder test.tex

我明白了

test.pdf created from file /home/pablo/forum/./test.tex

我该如何解决这个问题?问候

答案1

删除句号很容易:

\documentclass{article}
\usepackage[abspath]{currfile}
\usepackage{expl3}
\ExplSyntaxOn
\regex_replace_once:nnN{\.\/}{}\currfileabspath
\ExplSyntaxOff
\setlength{\parindent}{0pt}
\begin{document}
\texttt{\jobname.pdf} created from file 
\currfileabspath%
\end{document}

但我认为,当使用 lualatex 时,如果 currfile 能够做到这一点会更好,因为句点和斜线也在其他命令中。

答案2

您可以使用 FFI 和平台相关函数轻松获取 LuaTeX 中的绝对路径。在基于 POSIX 的系统上,您可以使用realpath()函数,在 Windows 上你可以使用_fullpath(我认为)。

因为它使用 FFI,所以您必须启用--shell-escape

tex.sprint使用第一个参数-2切换到逐字的 catcodes,以防路径包含任何被 TeX 特殊处理的字符,例如{}$%#

\documentclass{article}
\directlua{
local ffi = assert(require"ffi")

ffi.cdef[[
char *realpath(const char *path, char *resolved_path);
]]
    
function realpath(path)
    local p = ffi.C.realpath(path, ffi.NULL)
    if p \string~= ffi.NULL then
        return ffi.string(p)
    end
    return nil
end
}

\def\currfileabspath{%
  \directlua{tex.sprint(-2, realpath(status.filename))}%
}

\begin{document}
\currfileabspath
\end{document}

相关内容