关于 latex->lua->latex->lua 调用链的问题。如何将字符串传回 latex?

关于 latex->lua->latex->lua 调用链的问题。如何将字符串传回 latex?

关于我正在学习的基本 lualatex 编程的问题。

我有一个 lua 函数,它返回文件名的完整路径。它本身工作正常。我从 lua 打印值,它是正确的。我想从 latex 调用这个 lua 函数,返回完整路径,然后再次用这个值调用第二个 lua 函数,以便对文件进行其他处理。

(后来我想在 lua 中打开该文件来读取其内容)。但我想看看是否可以分两步完成此操作。

问题是当我从第一个 lua 调用获得结果时,我不知道如何将其作为字符串从 lua 发送回来,以便将其保存在 latex 中并将其传递给下一个 lua 调用。

由于完整文件名包含,_我当然需要所有内容都是字符串,我不知道如何将结果返回为字符串,以便让 Latex 满意并让我稍后将此值传递给 lua。我需要为此使用 verbatim 吗?但这会搞乱对 lua 的第二次调用吗?这是调用流程

       (current folder,file name)
 latex ---------------------------> lua first call 
       <-------- return full file name "/home/me/etc..../file_name.m"


         (full file name)
 latex -------------------> second lua call (does processing on file)
          <---- return final result

这是上面的 MWE

\documentclass{article}
\IfFileExists{luatex85.sty}{\usepackage{luatex85}}{}

\ifdefined\HCode% detect tex4ht
\usepackage[utf8]{luainputenc}
\usepackage[T1]{fontenc}
\else
\usepackage{fontspec}
\fi    
\usepackage{luacode}

\begin{luacode*}
require 'lfs'    
-- first Lua function
function fullpath(curDir,fileName)
    local pathseparator = package.config:sub(1,1)

    if os.type == "windows" then
       fileName=string.gsub(fileName,"/",pathseparator)
    end

    local name=table.concat({lfs.currentdir(),fileName}, pathseparator);
    print(name)
    tex.print(name)
end

-- second Lua function
function format(fileName)
    --for now, just print it.
    tex.print("\\verb|"..fileName.."|")
end    
\end{luacode*}

\newcommand\fullpath[2]{\luadirect{fullpath(\luastring{#1},\luastring{#2})}}    
\newcommand\format[1]{\luadirect{format(#1)}}

\begin{document}    
%ask Lua to find full path name of some file. This should work
%on both windows and Linux

%how to save this result in Latex?
%\fullpath{\jobname.tex}{sub_folder/foo7_1.tex}  %causes an error.

\edef\name{\fullpath{\jobname.tex}{sub_folder/foo7_1.tex}}

%send the name back to lua. causes error if uncomment
%\format{\name}%causes error. I need to pass VALUE of \name to lua. How?
\end{document}

如何才能使上述操作有效?我可以在一个函数中完成 lua 中的所有操作,但我想学习如何完成上述操作。


感谢 David 的帮助。这是最终版本,可在 Windows 和 Linux 上运行,并生成输出。我想在 Windows 和 Linux 上显示输出。

\documentclass{article}
\IfFileExists{luatex85.sty}{\usepackage{luatex85}}{}

\ifdefined\HCode% detect tex4ht
\usepackage[utf8]{luainputenc}
\usepackage[T1]{fontenc}
\else
\usepackage{fontspec}
\fi    
\usepackage{luacode}

\begin{luacode*}
require 'lfs'    
-- first Lua function
function fullpath(curDir,fileName)
    local pathseparator = package.config:sub(1,1)

    if os.type == "windows" then
       fileName=string.gsub(fileName,"/",pathseparator)
    end

    local name=table.concat({lfs.currentdir(),fileName}, pathseparator);
    tex.print(-2,name)
end    
-- second Lua function
function format(fileName)
    tex.print(-2,fileName)
end

\end{luacode*}

\newcommand\fullpath[2]{\luadirect{fullpath(\luastring{#1},\luastring{#2})}}
\newcommand\format[1]{\luadirect{format(\luastring{#1})}}

\begin{document}    
\def\name{\fullpath{\jobname.tex}{sub_folder/foo7_1.tex}}
 %send the name back to lua to test the call
\format{\name}%
\end{document}

在寡妇

Mathematica 图形

在 Linux 上

Mathematica 图形

答案1

您想使用 catcode 表 -2 打印:所有 catcode 12 或 10:

\documentclass{article}
\IfFileExists{luatex85.sty}{\usepackage{luatex85}}{}

\ifdefined\HCode% detect tex4ht
\usepackage[utf8]{luainputenc}
\usepackage[T1]{fontenc}
\else
\usepackage{fontspec}
\fi    
\usepackage{luacode}

\begin{luacode*}
require 'lfs'    
-- first Lua function
function fullpath(curDir,fileName)
    local pathseparator = package.config:sub(1,1)

    if os.type == "windows" then
       fileName=string.gsub(fileName,"/",pathseparator)
    end

    local name=table.concat({lfs.currentdir(),fileName}, pathseparator);
    print(name)
    tex.print(-2,name)
end

-- second Lua function
function format(fileName)
    --for now, just print it.
    tex.print(-2,fileName)
end    
\end{luacode*}

\newcommand\fullpath[2]{\directlua{fullpath(\luastring{#1},#2)}}    
\newcommand\format[1]{\directlua{format(#1)}}

\begin{document}    
%ask Lua to find full path name of some file. This should work
%on both windows and Linux

%how to save this result in Latex?
\fullpath{\jobname.tex}{"sub_folder/foo7_1.tex"}  %causes an error.

%edef causes error
\def\name{\fullpath{\jobname.tex}{"sub_folder/foo7_1.tex"}}


%send the name back to lua. causes error if uncomment
\format{"\name"}    
\end{document}

就我个人而言,我不会luacode在这里使用包,而只是使用\directlua\luaescapestring因为这样更容易理解 lua 和 tex 之间的关系,因为涉及的层并不多。

相关内容