阅读文档后,我发现产品具有隔离的环境。
实验表明我误解或误用了它们。给定以下项目结构:
entry.tex
|- p1.tex
| \- p1-env.tex
|- p2.tex
\- p2-env.tex
其中entry.tex
包含两个产品(以 分隔\page
),我希望p1
包含p1-env
但不包括p2-env
。然而,看起来p2-env.tex
是最后加载的,它主导了任何其他样式。
解决方案/解决方法似乎不仅仅是使用环境,而是根据需要使用宏/命令来设置相应的样式。
然而,如果确实所有环境最终都会在最后加载的环境上崩溃,那么 ConTeXt 产品结构和环境的意义何在?
这是一个可以用来说明的示例启动器。
p1-环境.tex
\startenvironment *
\setuplayout[
leftmargin=0pt,
backspace=9em,
cutspace=3em,
leftmargindistance=1em,
leftedgedistance=1em,
leftmargin=7.5em,
]
\stopenvironment
p1.tex
\environment p1-env
\startproject *
Hello from p1 \inmargin{Left}
\stopproject
p2-环境.tex
\startenvironment *
\setuplayout[
leftmargin=0pt,
backspace=3em,
cutspace=9em,
rightmargindistance=1em,
rightedgedistance=1em,
rightmargin=7.5em,
]
\setupmargindata[inmargin]
[style=normal, location=right, stack=yes, distance=0pt]
\stopenvironment
p2.tex
\environment p2-env
\startproject *
Hello from p2 \inmargin{Right}
\stopproject
条目.tex
% !TEX TS-program = ConTeXt (LuaTeX)
\startproduct *
\product p1
\page % Should reset layout.
\product p2
\stopproduct
答案1
我注意到的第一件事是您错误地使用了 ConTeXt 项目结构。
但在讨论之前,让我们先了解一下环境范围。一般规则是:
环境没有作用域。其定义在调用后变为活动状态
\environment
,并且此后无法“停用”。
这是一个非常基本的陈述,是事实的结果,它\environment
只是在幕后执行\input
。同样,在 Plain TeX 中没有“取消输入”(或“deinput”)文件的机制。
让我用您的文档结构的简化版本来演示这一点:
p1-env.tex
\startenvironment *
\def\foo{foo}
\stopenvironment
p2-env.tex
\startenvironment *
\def\baz{baz}
\stopenvironment
p1.tex
\startcomponent *
\environment p1-env
{\tt\meaning\foo\par\meaning\baz}
\stopproject
p2.tex
\startcomponent *
\environment p2-env
{\tt\meaning\foo\par\meaning\baz}
\stopcomponent
entry.tex
\startproduct *
\component p1
\par
\component p2
\stopproduct
执行 ConTeXtentry.tex
会产生以下结果:
您会发现,\foo
即使我们切换到具有不同环境输入的不同文件,它仍然保持定义。原因正是我之前解释过的。
你能通过明确引入范围\begingroup...\endgroup
(或\start...\stop
在 ConTeXt 中)来解决此行为。请记住,这不是一个好主意,因为 TeX 可能会耗尽内存。我不知道这种可能性有多大,也不知道确切的限制是什么,但肯定存在问题。
\startproduct *
\start
\component p1
\stop
\par
\start
\component p2
\stop
\stopproduct
接下来你会在评论中注意到:
奇怪的是,
projects
实际上并没有编译。
是的,解释是项目没有定义有效的\starttext
...\stoptext
结构。您也可以从日志中看到这一点:
system > invalid \starttext ... \stoptext structure
那么问题是,项目到底是什么?答案是,项目是环境文件的集合。想象一下,您有一长串的环境,用于页面布局、颜色主题、参考书目宏和文档的数学宏。您不想在每个组件中重复整个列表,这就是您在项目中收集此列表的原因。例如
proj-mag.tex
\startproject *
\environemnt env-design
\environemnt env-layout
\environemnt env-biblio
\environemnt env-mathem
\stopproject
p-issue1.tex
\project proj-mag
\startproduct *
\component c-editorial
\stopproduct
运行 ConTeXt 的文件是p-issue1.tex
。