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}