LuaLaTeX:如何在 Windows 上使用 \directlua 正确解析绝对路径

LuaLaTeX:如何在 Windows 上使用 \directlua 正确解析绝对路径

我需要解析字体的绝对路径:

\setmainjfont[
    Path          = \currfileabsdir,
    UprightFont   = fonts/HGS_Mincho/HGRMB.ttc,
    BoldFont      = fonts/HGS_Mincho/HGRME.ttc
]{HGS Mincho}

该解决方案\usepackage[abspath]{currfile}需要-recorder选项,但我不使用控制台,并且设置-recorder选项可能是不必要的例程。

其他基于lfs库的解决方案,但如果我们只是像下面这样使用它,就会出现错误(至少在 Windows 中):

\edef\currfileabsdir{\directlua{tex.sprint(lfs.currentdir())}/}
! Undefined control sequence.
l.1 C:\Users
          \i\Documents\TeX\LuaLaTeX_Development
l.6 ...sdir{\directlua{tex.sprint(lfs.currentdir())}
                                                  /}

建议使用 catcodes 如下所示:

\edef\currfileabsdir{\directlua{tex.sprint(-2, lfs.currentdir())}/}

实际情况是,反斜杠将从绝对路径中删除,因此

C:Users/i/Documents/TeX/LuaLaTeX_Development/fonts/HGS_Mincho/HGRMB.ttc

变成

C:UsersmeDocumentsTeXLuaLaTeX_Development/fonts/HGS_Mincho/HGRMB.ttc

如何获取字体的正确绝对路径?


更新:MWE 提出了第一个解决方案

\documentclass[a4paper, twoside]{ltjsarticle}

\usepackage{luatexja-fontspec}

\makeatletter
\edef\currfileabsdir{\directlua{tex.sprint(\the\catcodetable@string, lfs.currentdir())}/}
\makeatother

\setmainjfont[
    Path          = \currfileabsdir,
    UprightFont   = fonts/HGS_Mincho/HGRMB.ttc,
    BoldFont      = fonts/HGS_Mincho/HGRME.ttc
]{HGS Mincho}

\setsansjfont[
    Path          = \currfileabsdir,
    UprightFont   = fonts/HGS_Gothic/HGRGM.ttc,
    BoldFont      = fonts/HGS_Gothic/HGRGE.ttc,
]{HGS Gothic}


\begin{document}
  日本語文字  Latin letters Кириллица
\end{document} 

错误:

luaotfload | db : Reload initiated (formats: otf,ttf,ttc); reason: "File not found: C:UsersiDocumentsTeXLuaLaTeX_Development/fonts/HGS_Mincho/HGRMB.ttc.".

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! fontspec error: "font-not-found"
! 
! The font "fonts/HGS_Mincho/HGRMB.ttc" cannot be found.
! 
! See the fontspec documentation for further information.
! 
! For immediate help type H <return>.
!...............................................  

l.13 ]{HGS Mincho}

在此处输入图片描述

答案1

您的代码失败,因为路径中使用的反斜杠在 Windows 中也是 lua 中的转义字符。由于路径传递到 lua 后端,因此需要使用另一个反斜杠来转义反斜杠。您可以使用 \luaescapestring 来实现这一点。

\edef\currfileabsdir{\luaescapestring{\directlua{tex.sprint(-2,lfs.currentdir())}}/}

或者如果您想在其他地方使用 \currfileabsdir,请将其添加\luaescapestringPath

\edef\currfileabsdir{\directlua{tex.sprint(-2,lfs.currentdir())}/}
\setmainjfont[
   Path          = \luaescapestring{\currfileabsdir},
   ....

相关内容