在 LuaLaTeX 中,我可以从“用户”类文件调用的 lua 脚本发出 LoadClass 吗?

在 LuaLaTeX 中,我可以从“用户”类文件调用的 lua 脚本发出 LoadClass 吗?

LuaLaTeX:希望在 lua 脚本中维护一些参数,并从这些参数以及其他参数中构建一个 \LoadClass 语句,该语句可以从自己的类文件中调用。

我可以通过 cls 文件的 lua 函数调用中的 tex.print 来让一些“其他”tex 命令工作,但是,当尝试使用基于文章类的一些视觉上明显的提示(如景观)的 LoadClass 时,编译器会抱怨有一个缺少 \begin{document}从 cls 文件调用了 lua 函数。我感觉在 cls 文件中 lua 能做的事情非常有限。

这是在 Windows 11 x64 上运行 TeXstudio 4.6.3 的最新 MiKTeX 23.5,使用 LuaHBTeX 版本 1.17.0。

一个最小的 tex 文档:

\documentclass{class/base}
\begin{document}
document content

\uf{}
\end{document}

在 class 子目录中我们有一个最小的用户基类:

\ProvidesClass{class/base}[2023-09-26 v1.0.1 Base Class]
\newcommand{\@base@class}{base}% 
\newcommand{\@base@pkgname}{cms-base}% 

\RequirePackage{currfile}

\RequirePackage{luacode}

\directlua{baselua = require('./class/baselua')}

\newcommand\userParms[1][]{%
    \directlua{
        local parm1 = 'landscape'
        local parm2 = '#1'
        tex.print(baselua.getTexContent(parm1,parm2))
        }
}

\userParms[\currfilename]

%\LoadClass{article}

另外,在类子目录中还有一个简单的 lua 模块:

local function returnsometex(p,v)
    return string.format([[\LoadClass[%s,twoside]{article}]].."\n"..[[\def \uf {%s}]],p,v)
end

return {getTexContent=returnsometex}

我“期望”(也许是徒劳的)tex.printed LoadClass 将被强制执行,以便在编译时,它将在文档的 tex 文件中找到 \begin{document}。

答案1

您的问题与 无关,\LoadClass但是\n.tex.print期望每个参数都是一行输入,它不会尝试将您传递给它的字符串拆分为几行。因此\n(ASCII 字符 0x0A) 在这里没有任何特殊含义,只是出现在行中间的普通字符。

通常\n用作行终止符,因此它永远不会出现在行的中间(尽管 TeX 允许您通过写入例如 将其添加到那里This will^^0a also fail)。因此 LaTeX 不会以任何特殊方式设置 0x0A,TeX 将其视为将使用当前字体排版的常规字符。由于您位于 之前\begin{document},因此尝试排版\n会失败(因为此时任何排版尝试都会失败)。

您可以通过将这些行tex.print作为单独的参数传递来避免这种情况:

local function returnsometex(p,v)
    return string.format([[\LoadClass[%s,twoside]{article}]], p),
           string.format([[\def \uf {%s}]],v)
end

return {getTexContent=returnsometex}

相关内容