如何阻止代码块被解析?

如何阻止代码块被解析?

我想直接将一些 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

  1. 使用包将环境内容写入临时文件filecontents

  2. 文件内容存储在\CatchFileEdef包的宏中catchfile
    所有字符都使用 catcode 表逐字读取,其中所有插槽都设置为 catcode 12 ( other),行尾读取为字节0x10( \n)。

  3. 数据通过(\luatexluaescapestring即)传递给函数。\luaescapestringLuaLaTeXPrettyPrintLatexCode

完整示例:

\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\

相关内容