使用scons生成乳胶源文件并编译pdf

问题描述 投票:0回答:1

我正在写书。这些章节存储在markdown中文件。我使用pandoc生成各章的LaTeX文件。这是项目的结构:

  • 书籍/手稿:包含降价文件
  • Book / Editions / PDF / tex:包含生成的LaTeX文件
  • 书籍/版本/ PDF /布局_1 /:书籍的第一版面
  • 书籍/版本/ PDF /布局_2 /:书籍的第二版面

我想使用scons生成乳胶文件并调用LaTeX来编译PDF。

scons设置

Book / SConstruct:

SConstruct脚本仅定义后续位置脚本可以找到这本书的章节:

manuscript = Environment()
Manuscript.Replace(MARKDOWN_FILES = Glob('Manuscript/*.md'))

SConscript('Editions/PDF/SConscript', exports='manuscript')

书籍/版本/ PDF / SConscript:

此脚本定义了LaTeX环境:

Import('manuscript')

PDF = Environment()

PDF.Replace(PDFLATEX='lualatex')

Export('PDF')

SConscript('tex/SConscript')

SConscript('Layout_1/SConscript')

SConscript('Layout_2/SConscript')

书籍/版本/ PDF / tex / 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

书籍/版本/ PDF / Layout_1 / SConscript

此脚本调用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

  1. 输入目录Book/Editions/PDF/tex以生成LaTeX来自所有已更改的Markdown文件的文件
  2. 输入目录Book/Editions/PDF/Layout_1以生成第一个版面的PDF]
  3. 输入目录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其他两个脚本何时处于活动状态?有什么问题吗?

提前感谢

婚姻

scons
1个回答
0
投票

您需要为构建者指定目标(或让发射器来完成)。同样,所有文件都以字符串表示时

尝试一下,看看是否有帮助。

书籍/版本/ PDF / 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)
© www.soinside.com 2019 - 2024. All rights reserved.