<p>当然也有像Jinja这样的模板系统,但它们可能会对你的要求造成过度破坏。您还可以使用RST格式化页面,并使用它生成乳胶,但这可能是过分了。见鬼,自动生成页面对于你必须定义的字段的数量来说可能是多余的,但是从什么时候开始,多余的就阻止了我们!:)</p>
<p>我做了一些类似于Python字符串格式的事情。获取上面的LaTeX文档,并通过将<code>%(placeholder_name1)s</code>标记放入文档中来“标记”文件。例如,如果要将类名放在哪里,请使用<code>%(course_name)s</code></p>
<pre><code>\textbf{\Large "%(homework_title)s" \\}
\vspace{1cm}
\textbf{\Large "%(course_name)s" \\}
</code></pre>
<p>然后,从Python中,可以加载该模板并将其格式化为:</p>
<pre><code>template = file('template.tex', 'r').read()
page = template % {'course_name' : 'Computer Science 500',
'homework_title' : 'NP-Complete'}
file('result.tex', 'w').write(page)
</code></pre>
<p>如果您想自动找到这些标记,那么以下操作应该做得很好:</p>
<pre><code>import sys
import re
import subprocess
template = file('template.tex', 'r').read()
pattern = re.compile('%\(([^}]+)\)[bcdeEfFgGnosxX%]')
tokens = pattern.findall(template)
token_values = dict()
for token in tokens:
sys.stdout.write('Enter value for ' + token + ': ')
token_values[token] = sys.stdin.readline().strip()
page = template % token_values
file('result.tex', 'w').write(page)
subprocess.call('pdflatex result.tex')
</code></pre>
<p>代码将遍历令牌并向控制台打印一个提示,要求您为每个令牌输入一个内容。在上面的示例中,您将得到两个提示(带有示例答案):</p>
<pre><code>Enter value for homework_title: NP-Complete
Enter value for course_name: Computer Science 500
</code></pre>
<p>最后一行调用结果文件的<code>pdflatex</code>,并从中生成PDF。如果您想更进一步,还可以要求用户输入输出文件名或将其作为命令行选项。</p>