保存为宏和 \scantokens 作为外部文件的替代方案

保存为宏和 \scantokens 作为外部文件的替代方案

我正在使用 Python 脚本自动生成大量 TeX 代码。我一直将 TeX 代码保存到文件中,然后通过 将这些文件带入我的文档中的适当位置\input。这种方法可行,但有时会生成大量外部文件,其中许多文件只有几行。

我正在考虑将生成的 TeX 代码保存在宏中。我可以在序言中引入一个包含宏定义的大文件,而不是在文档的各个位置引入许多小文件。这种方法的问题在于 TeX 代码可以包含逐字和类似的内容。我已经开发了一种方法,用于将此类内容保存在宏中,然后使用\scantokens(下面的最小示例)检索它。与将 TeX 代码留在单独的外部文件中相比,这种方法有什么缺点吗?是否存在\scantokens无法准确复制我从\input外部文件中获得的内容的情况?

在应用方面,这主要与我的pythontex包。该包允许您将 Python 代码包含在 LaTeX 文档中,执行它并引入其输出。Python 代码在编译期间保存到外部文件中。然后脚本执行每个代码块,并将每个块的输出保存在其自己的文件中。这些文件通过 自动带回到 LaTeX 文档中的适当位置\input。这允许将 Python 代码中某个函数的输出print()替换为其输出。通常,打印内容(外部文件)只有几到几十行,但它们可以根据用户需要而变大。

\documentclass{article}

\makeatletter
\long\def\catcher#1{%
    \def\name{#1}%
    \begingroup
    \endlinechar`\^^J
    \let\do\@makeother\dospecials
    \catcher@i}

\begingroup
\catcode`!=0
!catcode`!\=12
!long!gdef!catcher@i#1\endcatcher^^J{%
    !endgroup!expandafter!gdef!name{#1}}%
!endgroup

\def\getter#1{\expandafter\scantokens\expandafter{#1\empty}}
\makeatother

\catcher\myfile
Text, with verb \verb!#$^_!
\begin{verbatim}
Verbatim
environment
\end{verbatim}
More text
\endcatcher

\begin{document}

\getter\myfile 

\end{document}

答案1

我发现了一个重大问题,目前无法\scantokens将其作为来自文件的一般替代品\input。 LuaTeX 实现\scantokens有一个错误(参考在 tex.sx跟踪这里) 与 相关\newlinechar。因此,任何需要与 LuaTeX、XeTeX 和 pdfTeX 兼容的文档或包仍应使用\input

相关内容