ConTeXt 产品是否具有独立布局?

ConTeXt 产品是否具有独立布局?

阅读文档后,我发现产品具有隔离的环境。

实验表明我误解或误用了它们。给定以下项目结构:

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

相关内容