总体思路是,我可以通过在我的子项目中包含包 mymacros.sty 来获取项目根目录的相对路径。我有以下设置:
- 麦可乐
- 韓國
- 图形.tikz
mymacros.sty 的内容如下所示:
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mymacros}
\RequirePackage{xparse}
\NewExpandableDocumentCommand \projectabspath {}
{%
\directlua{tex.print(file.pathpart(file.addsuffix(file.collapsepath("\@currname"),'sty')))}%
}
我正在使用 lua 从宏中提取相对路径\@currname
。
当我在文件figure.tikz中调用宏时
\documentclass{standalone}
\RequirePackage{luatex85}
\usepackage{../mymacros}
\typeout{\projectabspath}
\begin{document}
absolute path: \projectabspath
\end{document}
我得到的路径为空。我的代码有什么问题?
答案1
到引用大卫卡莱尔:
\usepackage 的参数是名称而不是文件路径。传递相对文件路径时有时也能正常工作,这只是因为系统缺乏错误检查。如果包确实使用 \ProvidesPackage 声明自身,则使用此类路径将生成名称不正确的警告。
让我们暂时忽略这一点,看看为什么你的代码不起作用:
您将在宏展开时获得 的值\@currname
,该点位于文档的中间。此时没有当前包,因此\@currname
为空。
要解决此问题,您必须\projectabspath
在阅读包时进行扩展。您可以使用\edef
以下方法存档:
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mymacros}
\edef \projectabspath
{%
\directlua{tex.print(file.pathpart(file.collapsepath("\@currname", true)))}%
}
或者直接从 Lua 定义宏:
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mymacros}
\directlua{
token.set_macro('projectabspath', file.pathpart(file.collapsepath(token.scan_string(), true)))
}\@currname
注意我添加了, true
collapsepath,否则返回的路径不是绝对的。
一般来说,LuaTeX 提供了一种比分析更可靠的方法来获取当前文件的路径\@currname
:使用status.filename
。
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mymacros}
\directlua{
token.set_macro('projectabspath', file.pathpart(file.collapsepath(status.filename, true)))
}