我已经定义了一个命令
\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}