将 \environment 效果限制在单个部分

将 \environment 效果限制在单个部分

我正在研究一个真正受益于分成多个文件的东西,所以我想弄清楚项目/产品/组件结构。我确实认为我已经完成了大部分工作,除了在(滥用)使用该\environment功能时的一些细节:我希望一些组件使用特定的环境,而不影响文档的其余部分。

如果我将其放在组件的开头,它就不会卸载并最终影响产品中此组件之后的每个组件:

\startcomponent c_acronyms
\project proj_ref
\product prd_data
\environment env_list


\startchapter[title=Acronym definitions]

...

\stopchapter
\stopcomponent

\start我可以使用和来破解一个解决方案\stop,但就黑客而言,这感觉相当丑陋,并且该环境的任何连续调用都会被忽略:

\startcomponent c_acronyms
\project proj_ref
\product prd_data


\startchapter[title=Acronym definitions]
\start
\environment env_list

...

\stop
\stopchapter

\startchapter[title=Keeps default formatting]
\start
\environment env_list

...

\stop
\stopchapter
\stopcomponent

我感觉我正在尝试使用\environment它来做一些实际上并非为之设计的东西,但最好的替代品是什么?我想我可以用模块来做一些事情,但对于这么小的命令集合来说,这似乎比必要的要重得多(特别是在我的 Windows TeXLive 安装中,它似乎无法识别项目目录中的模块)。我应该整理一个具体的吗\definestartstop

作为参考,以下是我的层次结构其余部分的最低限度内容:

\startproduct prd_data
\project proj_ref


\startfrontmatter

\completecontent

\component c_acronyms

\stopfrontmatter
\stopproduct

 

\startproject proj_ref
\environment env_ref


\product prd_data

\stopproject

 

\startenvironment env_ref

\usepath[{data}]


\setupcolors[state=start]
\setupinteraction[state=start]


% Add thin spaces before tall punctuation
\definecharacterspacing[thin]
\setupcharacterspacing[thin][\number`:][left=.16667,alternative=1]
\setupcharacterspacing[thin][\number`;][left=.16667,alternative=1]
\setupcharacterspacing[thin][\number`?][left=.16667,alternative=1]
\setupcharacterspacing[thin][\number`!][left=.16667,alternative=1]
\setcharacterspacing[thin]


% Define look-and-feel for the document
\setupalign[hanging]
\setupindenting[yes,small]
\setupwhitespace[medium]

\definefontfeature[default][default][protrusion=quality]


\stopenvironment

 

\startenvironment env_list


% Override look-and-feel for tabbed lists
\setupindenting[no]
\setupwhitespace[big] % Makes the issue more obvious


\stopenvironment

当我在这里时,有谁知道为什么编译项目文件不会编译每个产品?我猜这最初是由于对每次调用一个输出的限制,但切换到 LuaTeX 肯定可以生成子进程?

答案1

一种选择是使用\setups

\startenvironment env_list

% Override look-and-feel for tabbed lists
\startsetups[tabbled-list]
  \setupindenting[no]
  \setupwhitespace[big] % Makes the issue more obvious
\stopsetups

\stopenvironment

然后,在项目文件中输入环境并使用

\start
\setups[tabbed-list]
....
\stop

限制要应用设置的区域。有些环境接受密钥setup,因此取决于您如何实现標籤清單,你甚至可以传递setups=tabbed-list给适当的\setup...命令。

答案2

您可以编写自己的\environment包装器,打开一个组,输入环境文件并忽略内部\start ... \stopenvironment

所以如果你有一个文件env_test.tex

\startenvironment *

  \def\envtest{Test}

\stopenvironment

你可以做

\unexpanded\def\startlocalenvironment{%
  \dosingleempty\dostartlocalenvironment}
\def\dostartlocalenvironment[#1]{%
  \start
  \let\startenvironment\gobbleoptorarg
  \let\stopenvironment\relax
  \input{#1}}

\def\stoplocalenvironment{\stop}

\unexpanded\def\gobbleoptorarg{%
  \doifelsenextoptionalcs\gobbleopt\gobblearg}

\def\gobbleopt[#1]{}
\def\gobblearg #1 {}

\starttext

\startlocalenvironment[env_test]

  \show\envtest

\stoplocalenvironment

\show\envtest

\stoptext

在命令行上我得到

> \envtest=macro:
->Test

...

> \envtest=undefined

相关内容