我想直接将一些 Latex 代码传递给 Lua,而不对其进行解析:
\directlua{
PrintPrettyLatexCode("LATEX CODE GOES HERE!")
}
但是 latex 尝试解析“LATEX CODE GOES HERE!”。我希望它完全被视为字符串,以便 PrintPrettyLatexCode 函数将其视为字符串。
不过斜线需要双斜线。我认为只需要解析代码块,并在 latex 解析之前将所有斜线变为双斜线(这样宏\mymacro
最终会变成\\mymacro
,我认为 latex 不会尝试扩展它)
也许类似
\directlua{
PrintPrettyLatexCode(\MakeDoubleSlashes{"LATEX CODE GOES HERE!"})
}
如果存在的话会起作用吗\MakeDoubleSlashes
?
答案1
LuaTeX 提供了\luaescapestring
对 Lua 字符串中的字符进行转义的功能:
\directlua{
PrintPrettyLatexCode("\luaescapestring\expandafter{\detokenize{LATEX CODE GOES HERE!}}")
}
添加
以下定义环境PrettyPrintLatexCode
:
使用包将环境内容写入临时文件
filecontents
。文件内容存储在
\CatchFileEdef
包的宏中catchfile
。
所有字符都使用 catcode 表逐字读取,其中所有插槽都设置为 catcode 12 (other
),行尾读取为字节0x10
(\n
)。数据通过(
\luatexluaescapestring
即)传递给函数。\luaescapestring
LuaLaTeX
PrettyPrintLatexCode
完整示例:
\RequirePackage{filecontents}
\RequirePackage{catchfile}
\RequirePackage{luacode}
\makeatletter
\newcommand*{\PrettyPrint@FileName}{test.file}
\newenvironment*{PrettyPrintLatexCode}{%
\csname filecontents*\endcsname{\PrettyPrint@FileName}%
}{%
\csname endfilecontents*\endcsname
\CatchFileEdef{\PrettyPrint@FileData}{\PrettyPrint@FileName}{%
\PrettyPrint@CatchSetup
}%
\luadirect{%
PrettyPrintLatexCode("\luatexluaescapestring{\PrettyPrint@FileData}")%
}%
}
\begingroup
\lccode`\~=13 %
\lccode`\9=10 %
\lowercase{\endgroup
\def\PrettyPrint@CatchSetup{%
\luatexcatcodetable\CatcodeTableOther
\endlinechar=13 %
\catcode13=\active
\def~{9}%
}%
}
\makeatother
% Provide a dummy definition for PrettyPrintLatexCode
\luadirect{%
function PrettyPrintLatexCode(str)
texio.write_nl(
"*****************************",
str,
"*****************************",
""
)
end}
\begin{PrettyPrintLatexCode}
\section{Hello World}
Some text with "double" and 'single' quotes.
and unmatched (parentheses].
Umlauts: äöüß
\end{PrettyPrintLatexCode}
\stop
PrettyPrintLatexCode
终端/日志文件中的虚拟结果:
*****************************
\section{Hello World}
Some text with "double" and 'single' quotes.
and unmatched (parentheses].
Umlauts: äöüß
*****************************
答案2
您可以加载luacode
包并使用\luaexec
:\directlua
\luaexec{
PrintPrettyLatexCode(\MakeDoubleSlashes{"LATEX CODE GOES HERE!"})
}
(当然,这假设这PrintPrettyLatexCode
是一个有效的lua
函数并且`MakeDoubleSlashes
是一个有效的 TeX 宏。)您仍然需要在#
和%
字符前添加反斜杠;但是,~
(波浪号)和\\
(双反斜杠)字符不需要转义。要排版单个反斜杠,您需要使用\string\
。