管理大型文档中的数百个独立组件

管理大型文档中的数百个独立组件

我正在制作一本包含数百项活动的工作簿。每项活动都显示为一个单独的部分,通常包含说明、书写或绘画的空间,有时还包含要完成的插图或图表。

在过去的项目中,我发现这样的文档最终会变得很长且难以管理。我尝试了几种解决方案。最初,我只是在外部文件中为每个活动创建一个宏,然后简单地在主文件中检索宏:

\define\activityone {
    \section{Bird Watching}
        How many birds can you find near your home? Draw a picture of them in the space below.
}

\define\activitytwo{
    \section{What kind of bird?}
        Use the bird guide to find the birds. What are they called? Write the names near your picture above.
}

由于每个都是唯一的,但可能有一些具有相同的格式,所以我还尝试为每种格式制作不同的宏,这些宏放在主文件中,如下所示:

 \activitystyle{Bird Watching}{How many birds can you find near your home? Draw a picture of them in the space below.}

这两种解决方案都有助于将内容与格式分开,但最终似乎并没有使文档管理得更清晰。还有其他方法可以管理较大文档中的多段文本吗?

  • 我正在使用 ConTeXt,但有时各种 TeX 的解决方案也适用于其他品种。

答案1

最好的选择显然是创建某种形式的数据库来管理内容,并使主文件简短易读。虽然听起来很奇怪,但 TeX 非常适合这样做。需要更详细地定义数据库的结构,因此我将仅使用活动列表来演示该技术,例如(观鸟、游泳、画画、填字游戏等)。活动可以有子活动等。

最好将每个活动保存在自己的文件中,或者您可以为其创建宏。在下面的示例中,我使用了两者。第一个使用宏(\lipsum[1]),第二个使用文件astro.tex,我们在示例中使用创建了该文件filecontents

\AddActivityDetail{Swimming}{\lipsum[1]}
\AddActivityDetail{Astro surfing}{\input{astro}}

在此处输入图片描述

\documentclass[11pt]{book}
\usepackage{lstdoc,lipsum,filecontents}

\begin{filecontents*}{astro.tex}
\lipsum[5]
\end{filecontents*}
\begin{document}
\makeatletter
\def\alist{}

\let\sort\lst@BubbleSort 
\def\addtolist#1#2{
  \lst@lAddTo\alist{#2}
}

\long\gdef\addActivity#1#2{\addtolist\alist{#1,}}

\def\AddActivityDetail#1#2{%
\long\expandafter\def\csname#1\endcsname{\textbf{#1}: #2}
\addActivity{#1}{#2}
\sort\alist
}

\def\PrintActivity{%
  \@for \i:=\alist\do{%
  \csname\i\endcsname}
}
%example
\AddActivityDetail{Bird Watching}{\lipsum[2]}
\AddActivityDetail{Stone Throwing}{\lipsum[3]}
\AddActivityDetail{Swimming}{\lipsum[1]}
\AddActivityDetail{Astro surfing}{\input{astro}}
% print the activities
\PrintActivity
\makeatother
\end{document}

活动将自动按字母数字顺序排序。如果您不需要此功能,可以注释掉\sort和相关宏。

除了包之外,代码应该ConTeXt也能正常工作,我不确定(lipsum 和 filecontents、lstdoc),但我确信 ConTeXt 有等效的宏。如果这可行,请发表一两条评论。

答案2

我会使用 LuaLatex。与 TeX 相比,LuaLatex 可以让你拥有更多的控制权,并且可以更高效地完成与“编程”相关的任务。即使你找到了 TeX 解决方案,你也应该预料到它会慢得多。当我将代码从 TeX“移植”到 Lua 时,编译时间从大约 1 分钟缩短到几乎瞬间完成。

您可以在 Lua 中执行的操作基本上是通过编程方式创建宏。

由于您希望将内容和样式分开,因此您需要弄清楚您想要在格式设置中使用哪种类型的控件。例如,您是否需要在字符级别进行控制,或者您的样式是否会“包装”内容。在第一种情况下,您必须开发自己的标记语言或在内容中混合 TeX。如果您只是“包装”内容,那么您可以使用宏在 latex 中轻松高效地完成此操作。

不过我真的不知道你到底想做什么。听起来你只是想包含某些文本块,而不弄乱正文。

在这种情况下,您可以使用数据库并让 lua 从中检索数据。例如,您可以将练习存储在其中。您可以在数据库字符串中使用文本标记,lua 会将其传递给 tex。您还可以在数据库中使用“样式”,甚至让 lua 预处理字符串以插入这些样式。

例如

代替

长文本

长例子

你可以有

长文本

\示例{示例324.5}

其中 \example 是一个宏,它调用一个 lua 函数,该函数插入来自其他地方的 example324.5...。

现在,如果您的示例/过多内容遵循非常规律的模式(例如,每个部分末尾的示例和每个章节末尾的过多内容,您可以创建自己的自定义环境,在末尾自动添加这些内容(同样,某些内容必须从某个地方(数据库/文本文件)检索它们)

您能解释一下您到底想如何分离格式和内容吗?对于您来说,这能轻松做到吗?

您想将主要内容与示例/练习/等分开,还是想将格式与示例/练习/等分开?后者似乎更难,除非您有非常具体和通用的“样式”,它们都会使用。(在这种情况下,您可以使用 lua 轻松应用这些样式)

例子:

示例样式1

我的示例标题

示例 243)我的示例文本是带有图像的示例:\img{myexample.png}

并且您可以制作一个 lua 处理器,自动将 ExampleStyle1 应用于此示例,它可以格式化标题、示例编号、后续文本甚至图像……但如果您有许多不同的示例格式,那么这不是一个好方法,因为您将拥有与示例一样多的样式。

答案3

管理资料有三个部分:创建、搜索和检索。我不确定你到底想要什么,所以我只是写一些可能的想法。

对于创建,我认为最好的解决方案是使用缓冲区(直接使用或在宏后面使用)。缓冲区比宏更好,因为任何事物可以是缓冲区的一部分。例如,您可以使用类似以下内容的内容:

\startactivity[title={What kind of bird}, reference={bird:type}]
Use the bird guide to find the birds. What are they called? Write the names near your picture above.
\stopactivity

其中 a 在内部\startactivity使用\grabcontent(或\dostartbuffer)(请参阅m-r.tex分布中的示例)。要将问题与答案分开,您可以使用在活动内部定义答案。这样,您可以控制是在活动结束时打印答案还是在结束时一起打印所有答案。有关块的详细信息,请参阅上下文手册。

上述内容可以以这样一种方式实现,即您可以编写代码\getactivity[bird:type]来检索活动。(基本上,您只是一个包装器\getbuffer)。

关于搜索,我没有好的建议。对于图像,我发现了 ConTeXt图像数据库有用。设置起来需要一些努力,但之后您可以通过查看概览页面轻松搜索图像。根据 wiki,在 MkIV 中,图像数据库还可以处理其他资源(如文件),但我不知道新的资源管理功能如何工作。

相关内容