大家好,我是包编写(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
,然后是body
的body
,等等:
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
答案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] \停止文本