我有一个非常简单的 ConTeXt 项目结构,如图所示,基于2013 年手册:
/main.tex
\startproject main
\environment layout
\product handbook
\stopproject
/layout.tex
\startenvironment layout
\stopenvironment
/handbook/handbook.tex
\startproduct handbook
\project main
\component intro
\stopproduct
/handbook/intro.tex
\startcomponent intro
\project main
\product handbook
Hello, world!
\stopcomponent
编译 intro.tex 可以按预期工作,但编译 handbook.tex 却不包含 intro 组件。事实上,日志表明intro.tex 甚至没有被打开:
open source > level 1, order 2, name '../handbook/handbook.tex'
fonts > preloading latin modern fonts (second stage)
fonts > 'fallback modern rm 12pt' is loaded
open source > level 2, order 3, name '../main.tex'
open source > level 3, order 4, name '../layout.tex'
close source > level 3, order 4, name '../layout.tex'
close source > level 2, order 4, name '../main.tex'
close source > level 1, order 4, name '../handbook/handbook.tex'
我需要在源文件中进行哪些更改才能使此 ConTeXt 功能按预期工作?
这是一个类似的问题,但除了一条表明文档不正确的评论外,没有任何答案。
答案1
ConTeXt 从您当前的工作目录开始查找文件,而不是您正在编译的文件的目录。
ConTeXt 只会扫描父目录中的文件,而不会扫描子目录中的文件。(根据 2013 年手册,这显然是有意为之。)但是,这意味着如果您正在编译项目,则必须将工作目录更改为您打算传递给上下文命令的源文件。换句话说,只有context handbook.tex
在手册文件夹内才有效。运行类似context handbook/handbook.tex
或context ../handbook/handbook.tex
(我在问题中尝试执行的操作)之类的操作将无法正确找到文件。这是因为,同样,ConTeXt 不会在子文件夹中查找文件。
在理想情况下,ConTeXt 应该从输入文件的目录开始,然后从那里向上搜索,而不是从当前工作目录开始。但现在,您需要从与文件相同的目录中调用上下文命令。
请注意,此系统还有另一个副作用:您不能将组件存储在产品的子文件夹中。产品必须将其所有组件都放在同一个文件夹中,或者将产品之间共享的组件放在项目的根目录中。
答案2
这不是一个真正的答案,但是对于评论来说有点长。
你可以做
mtxrun --path=FOO --script context BAR.tex
运行上下文BAR.tex
,位于FOO
。
\usepath
组件可以位于子目录下,但需要通过或指定路径\usesubpath
。
文件在父目录中查找(我认为是两级,也许可以配置)。您还可以使用子路径指定组件。