多次处理环境主体

多次处理环境主体

大家好,我是包编写(LaTeX2e)和这个论坛的新手,我可能阅读了太多的 TeXBook 而对 LaTeX 了解不够。

我的包可以工作,除了逐字禁止. 假设用户输入

\begin{file}
  \begin{head}
    foo1 (say, an exercise)
  \end{head}
  \begin{body}
    \begin{head} 
      short answer to foo1
    \end{head}
    \begin{body}
      long explanation of the answer to foo1
    \end{body}
  \end{body}

  \begin{head}
    foo2 (say, a theorem)
  \end{head}
  \begin{body}
    long explanation of foo2 (say, a very long  
    proof that we want to put in an Appendix)
  \end{body}    
\end{file}

我排版了环境的内容head,然后是环境的内容body,然后是bodybody,等等:

  foo1
  foo2

  short answer to foo1
  long explanation of foo2

  long explanation of the answer to foo1

链接从一个部分中的每个项目指向前一部分和后一部分的相应项目。通过巧妙的编号,链接(几乎)很容易获得。

环境file只是为了允许我多次读取其内容:我使用 Will Robertson 的environ.sty,它定义了吞噬其内容并可以多次使用的环境。不幸的是,由于内容在执行之前被读取,因此 catcode 是固定的,并且逐字失败。此外,这非常慢,并且消耗内存。

我看到了另外三种方法:

  • 2. 我想我可以编写一个自定义输出例程:将所有“head”与所有“body”并行排版在两个(如果是嵌套的,则更多)框中,然后才将其剪切成页面。这至少与“multicols”包不兼容(并且我只能在一个框中存储约 20 页:最大长度约 6 米)。
  • 3. 将 `body` 的内容逐字写入辅助文件。然后加载辅助文件并执行其内容。我还不太熟悉 (La)TeX 中的读写功能,但这可能是可行的方法。能否在同一次运行中写入文件并从中读取?
  • 4. 我的最后一个想法是使用 docstrip 技巧:让 `\end{file}` 再次输入文档,并使用不同的布尔值/计数器设置。为了忽略 `\begin{file}` 之前的所有内容,我需要设置相当多的 catcode。到达这个 `\begin{file}` 后,我需要切换回来,并解析 `\begin` 和 `\end`。像这样更改 catcode 可能不利于兼容性。

此外,head/的嵌套body使得其中一些方法变得更加困难。

您会推荐这四种方法中的哪一种(或多种)?

答案1

总结其他人的评论,这里最好的方法可能是将环境的内容写入单独的文件,然后在适当的时候读回。为了允许逐字记录材料,您可能希望以逐字记录的方式执行此操作。寻找灵感的明显地方是以下软件包listingsbeamer,或者正如 Aditya 所说的 ConTeXt 实现(我猜是 Mark II,因为您似乎正在寻找基于 TeX 的解决方案)。

当然,另一种方法是自己分离输入并跳过适当的部分进行读取。这将有一个主文件、一个或多个附加文件,并使用类似comment包来选择性地停用某些部分。

更详细地了解一下真正的问题性质可能会有所帮助。我并不完全清楚这些环境的全部性质。

答案2

在 ConTeXt 中,这可以通过使用 轻松实现blocks。如以下示例所示,逐字记录在块内工作良好。在内部,在 MkII 中,块的内容存储在外部文件中,\jobname.tub而在 MkIV 中,它们存储在内存中。请参阅strc-blk.(mkii|mkiv|lua)代码。

\defineblock[头部]
\defineblock[主体]

\开始文本
\keepblocks[HEAD]
\hideblocks[BODY] %默认


\开始HEAD
foo1
\开始输入
  一些#逐字和文本
\停止输入
\结束HEAD

\开始主体
主体1
\结束主体

\开始HEAD
foo2
\结束HEAD

\开始主体
主体2
\结束主体

\页

% 仅显示主体
\进程块[主体]

\页

% 显示 HEAD 和 BODY
\进程块[HEAD,BODY]

\停止文本

相关内容