LuaLaTeX 在 lua 中设置路径

LuaLaTeX 在 lua 中设置路径

我已经定义了一个命令

\newcommand{\mypath}{/Documents/Myfile/additionalresources/}

其中包含我在主文件中需要的一些外部文件的路径。我需要使用命令在文档的 Lua 部分中\mypath设置一些文件dofile,我尝试过

dofile('\luastringN{\mypath}'..'mydata.lua'),

但没用。有什么建议吗?非常感谢!

答案1

我假设您使用包\luastringN中的命令luacode。它\luastringN做什么?根据luacode文档

幸运的是,LuaTEX 提供了一个原语,可以满足我们的需要:转义 Lua 字符串中需要转义的字符。不幸的是,它的名称非常长(尤其是在 LATEX 中可用的前缀形式中):。\luatexluaescapestring此外,除了这个原语之外,您还需要考虑使用引号。因此,此包提供了一个较短的版本:\luastring 也包括引文,因此 的更安全版本\foo可以定义为 \newcommand*\foo[2]{\luadirect{foo(\luastring{#1}, #2)}} 需要注意的是 的参数\luastring在转换为 Lua 字符串之前会完全展开。如果不需要这种展开,则提供了两种变体:\luastringN 不扩展,并且\luastringO仅适用于一级扩展(第一个标记)。

因此\luastringN不展开其论点并包括引号。这意味着

dofile('\luastringN{\mypath}'..'mydata.lua'),

变成

dofile('"\\mypath "mydata.lua')

"\mypath "mydata.lua由于该文件不存在,因此失败。

我们必须改变两件事:我们必须去掉多余的引号并扩展\mypath到存储在的实际路径\mypath

删除引号很容易:切勿在 周围写引号\luastringN

对于扩展,您必须在完全扩展和单级扩展之间做出选择。这里应该没有区别,因为\mypath直接扩展到路径并且路径不可扩展,但我建议在这里进行单级扩展:如果您尝试使用包含活动字符的路径,这可以避免出现问题。因此,对于单级扩展,请使用\luastringO

\documentclass{article}
\usepackage{luacode}
\newcommand{\mypath}{/Documents/Myfile/additionalresources/}
\begin{document}
\directlua{dofile(\luastringO{\mypath}..'mydata.lua')}
\end{document}

这有效,但还有另一种方法可以获得相同的结果:不要使用\luastringO从 lua 获取宏的值,而是只需使用 Lua 函数token.get_macro

\documentclass{article}
\newcommand{\mypath}{/Documents/Myfile/additionalresources/}
\begin{document}
\directlua{dofile(token.get_macro'mypath' .. 'mydata.lua')}
\end{document}

这更加灵活,因为宏名称可以通过 Lua 函数计算,它可能更有效,因为宏的值从未插入到主标记流中,并且您不需要任何额外的包。

作为更一般的建议,我建议(几乎)永远不要使用\luastring[NO]\luaescapestring。该token库提供了更好、更安全的接口来从 TeX 获取值。

还有一个细节:不要用 附加字符串..,而是使用 :更安全file.join。这样可以确保组件之间始终有一个路径分隔符,即使\mypath没有尾随/

\documentclass{article}
\newcommand{\mypath}{/Documents/Myfile/additionalresources/}
\begin{document}
\directlua{dofile(file.join(token.get_macro'mypath', 'mydata.lua'))}
\end{document}

相关内容