我正在写书。这些章节存储在markdown中文件。我使用pandoc生成各章的LaTeX文件。这是项目的结构:
我想使用scons生成乳胶文件并调用LaTeX来编译PDF。
SConstruct
脚本仅定义后续位置脚本可以找到这本书的章节:
manuscript = Environment()
Manuscript.Replace(MARKDOWN_FILES = Glob('Manuscript/*.md'))
SConscript('Editions/PDF/SConscript', exports='manuscript')
此脚本定义了LaTeX环境:
Import('manuscript')
PDF = Environment()
PDF.Replace(PDFLATEX='lualatex')
Export('PDF')
SConscript('tex/SConscript')
SConscript('Layout_1/SConscript')
SConscript('Layout_2/SConscript')
此脚本使用生成器函数来创建LaTeX文件:
import os
Import('Manuskript')
# write LaTeX file to Editions/PDF/tex
pandoc_action = 'pandoc -f markdown -o Editions/PDF/tex/{} {}'
def generate_pandoc_action(source, target, env, for_signature):
# get the name of the target file
tex_file = target[0].rstr().split(sep='/')[-1]
return pandoc_action.format(tex_file, source[0])
env = Environment(ENV = os.environ)
markdownToLaTeX = Builder(generator = generate_pandoc_action,
suffix='.tex',
src_suffix='.md')
env['BUILDERS']['Pandoc'] = markdownToLaTeX
for input in Manuskript['MARKDOWN_FILES']:
env.Pandoc(input)
我尝试了几种其他方式来像自定义一样调用pandoc建造者。无论如何,LaTeX文件总是在目录Book/Manuscript
,我不得不移动或复制它们到Editions/PDF/tex
。
此脚本调用lualatex生成第一个PDF布局。第二个布局的脚本将相应显示。
Import('PDF')
basename = 'layout_'
pdf = PDF.PDF(basename + '.tex')
PDF.Clean(pdf, basename + '.synctex.gz')
Default(pdf)
Book/Editions/PDF/tex/SConscript
始终处理所有即使Book/Manuscript
中的markdown文件改变了。我试图用VariantDir
告诉脚本它应该在Book/Editions/PDF/tex/
中寻找目标但是每当我运行scons --debug=explain
时,它都会说:
scons: building `Manuscript/some_chapter.tex' because it doesn't exist
我如何告诉scons生成目标Book/Editions/PDF/tex/
并在该目录中查找在检查是否必须创建目标时?
Book/Editions/PDF/SConscript
不能像我预期。我的期望是scons将
Book/Editions/PDF/tex
以生成LaTeX来自所有已更改的Markdown文件的文件Book/Editions/PDF/Layout_1
以生成第一个版面的PDF]Book/Editions/PDF/Layout_2
以生成第二版面的PDF]但是scons仅执行第二步和第三步,并且似乎要么完全忽略了第一步,要么决定它不必执行它。这是输出scons --debug=explain
:
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: `Editions/PDF/Layout_1/book.pdf' is up to date.
scons: `Editions/PDF/Layout_2/book.pdf' is up to date.
scons: done building targets.
scons仅调用Pandoc构建器,如果我删除或取消注释后续行在Book/Editions/PDF/SConscript
中。例如这样:
SConscript('tex/SConscript')
# SConscript('Layout_1/SConscript')
# SConscript('Layout_2/SConscript')
我不明白为什么scons忽略tex/SConscript
其他两个脚本何时处于活动状态?有什么问题吗?
提前感谢
婚姻
您需要为构建者指定目标(或让发射器来完成)。同样,所有文件都以字符串表示时
尝试一下,看看是否有帮助。
import os
Import('Manuskript')
env = Environment(ENV = os.environ)
markdownToLaTeX = Builder('pandoc -f markdown -o $TARGET $SOURCE',
suffix='.tex',
src_suffix='.md')
env['BUILDERS']['Pandoc'] = markdownToLaTeX
for input in Manuskript['MARKDOWN_FILES']:
# write LaTeX file to Editions/PDF/tex
target = '#Editions/PDF/tex/'+File(input).file
env.Pandoc(target, '#Book/'+input)