![将 \environment 效果限制在单个部分](https://linux22.com/image/356144/%E5%B0%86%20%5Cenvironment%20%E6%95%88%E6%9E%9C%E9%99%90%E5%88%B6%E5%9C%A8%E5%8D%95%E4%B8%AA%E9%83%A8%E5%88%86.png)
我正在研究一个真正受益于分成多个文件的东西,所以我想弄清楚项目/产品/组件结构。我确实认为我已经完成了大部分工作,除了在(滥用)使用该\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