确定包的相对路径

确定包的相对路径

总体思路是,我可以通过在我的子项目中包含包 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

注意我添加了, truecollapsepath,否则返回的路径不是绝对的。

一般来说,LuaTeX 提供了一种比分析更可靠的方法来获取当前文件的路径\@currname:使用status.filename

    \NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mymacros}

\directlua{
  token.set_macro('projectabspath', file.pathpart(file.collapsepath(status.filename, true)))
}

相关内容