我对软件包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}