答案1
我也对使用 生成 LaTeX 代码感兴趣Python
,所以您的帖子给了我使用框架的提示。我刚刚创建了一个简单的示例:
from Cheetah.Template import Template
definition = """\\documentclass{article}
\\title{$paper.title}
\\author{$author.name}
\\begin{document}
\\maketitle
\\end{document}"""
class author:
"""A simple example author class"""
name = "Uwe Ziegenhagen"
def f(self):
return 'Hello World'
class paper:
"""A simple example paper class"""
title = "My First paper"
def f(self):
return 'hello world'
uwe = author()
mypaper = paper()
print Template(definition, searchList=[{'author' : uwe,'paper' : mypaper}])
出于存档目的,对于不太熟悉 Cheetah 框架的人来说,以上只是一个常规的 Python 脚本。脚本在标准输出上的输出(当然可以通过管道传输到文件中)是 LaTeX 代码。
答案2
这不是这个问题的真正答案,因为它不涉及 Cheetah。但是,如果有人搜索真值表,他们可能会想要一个真值表宏,因此我会出于这个原因发布它。宏\truthtable{<prims>}{<exprs>}
(用 编译LuaLaTeX
)采用两个参数:
- 第一个参数是一个逗号分隔的原始(变量)列表
- 第二个参数是一个以分号分隔的逻辑语句列表,涉及以下操作:
- 否定,输入为
-
- 连词,输入为
*
- 析取,输入为
+
- 含义,输入为
(stuff)->(stuff)
- 否定,输入为
例如,\truthtable{a,b,c,d}{-a;a*b*d;(a)->(b);a*(b+c);(a*(b+c))->(b)}
产生以下内容:
\documentclass{article}
\usepackage{xparse}
\begingroup
\catcode`\%=12\relax
\gdef\patmatch{"(%b())->(%b())","!%1||%2"}
\endgroup
\def\setimpaux#1{%
\directlua{
local s, _ = string.gsub("\luatexluaescapestring{#1}",\patmatch)
tex.sprint(s)
}
}
\ExplSyntaxOn
\int_new:N \l__tt_num_rows_int
\int_new:N \l__tt_num_cols_int
\int_new:N \l__tt_num_vars_int
\clist_new:N \l__tt_vars_clist
\seq_new:N \l__tt_exprs_seq
\seq_new:N \l__tt_header_seq
\NewDocumentCommand {\truthtable}{ m m }
{
\truth_table:nn {#1}{#2}
}
\cs_new_protected:Npn \truth_table:nn #1#2
{
\clist_set:Nn \l__tt_vars_clist {#1}
\seq_set_split:Nnn \l__tt_exprs_seq {;} {#2}
\int_set:Nn \l__tt_num_vars_int {\clist_count:N \l__tt_vars_clist}
\int_set:Nn \l__tt_num_rows_int {\fp_to_int:n {2^{\l__tt_num_vars_int}-1}}
\int_set:Nn \l__tt_num_cols_int {\clist_count:N \l__tt_vars_clist +\seq_count:N \l__tt_exprs_seq}
\__tt_gen_bins:
\seq_map_function:NN \l__tt_exprs_seq \__tt_eval_bools:n
\__tt_build_table:
}
\cs_new_protected:Npn \__tt_build_header:
{
\seq_set_from_clist:NN \l__tt_header_seq \l__tt_vars_clist
\seq_concat:NNN \l__tt_header_seq \l__tt_header_seq \l__tt_exprs_seq
\tl_set:Nx \l_tmpa_tl {\seq_use:Nnnn \l__tt_header_seq {&}{&}{&}}
\tl_replace_all:Nnn \l_tmpa_tl {*} {\wedge}
\tl_replace_all:Nnn \l_tmpa_tl {+} {\vee}
\tl_replace_all:Nnn \l_tmpa_tl {->} {\to}
\tl_replace_all:Nnn \l_tmpa_tl {-} {\neg}
\tl_use:N \l_tmpa_tl
}
\cs_generate_variant:Nn \seq_use:Nnnn {cnnn}
\cs_new_protected:Npn \__tt_build_table:
{
\begin{array}{*{\int_use:N \l__tt_num_cols_int}{c}}
\__tt_build_header:\\\hline
\int_step_inline:nnnn {0}{1}{\l__tt_num_rows_int}
{
\seq_use:cnnn {l__tt_row_{##1}_seq}{&}{&}{&}\\
}
\end{array}
}
\cs_new_protected:Npn \__tt_set_imp:n #1
{
\tl_if_in:nnT {#1} {->}
{
\tl_set:Nx \l_tmpb_tl {\setimpaux{#1}}
\exp_args:NV \__tt_set_imp:n \l_tmpb_tl
}
}
\cs_generate_variant:Nn \__tt_set_imp:n {V}
\cs_generate_variant:Nn \tl_replace_all:Nnn {Nnx}
\cs_new_protected:Npn \__tt_eval_bools:n #1
{
\tl_set:Nn \l_tmpa_tl {#1}
\int_step_inline:nnnn {0}{1}{\l__tt_num_rows_int}
{
\int_set:Nn \l_tmpa_int {1}
\tl_set_eq:NN \l_tmpb_tl \l_tmpa_tl
\__tt_set_imp:V \l_tmpb_tl
\tl_replace_all:Nnn \l_tmpb_tl {*}{&&}
\tl_replace_all:Nnn \l_tmpb_tl {+}{||}
\tl_replace_all:Nnn \l_tmpb_tl {-}{!}
\clist_map_inline:Nn \l__tt_vars_clist
{
\tl_replace_all:Nnx \l_tmpb_tl {####1} {\seq_item:cn {l__tt_row_{##1}_seq} {\l_tmpa_int}}
\int_incr:N \l_tmpa_int
}
\seq_put_right:cx {l__tt_row_{##1}_seq} {\fp_eval:n \l_tmpb_tl}
}
}
\cs_generate_variant:Nn \seq_set_split:Nnn {cnx}
\cs_new_protected:Npn \__tt_gen_bins:
{
\int_step_inline:nnnn {0}{1}{\l__tt_num_rows_int}
{
\seq_clear_new:c {l__tt_row_{##1}_seq}
\seq_set_split:cnx {l__tt_row_{##1}_seq} {} {\int_to_binary:n {##1}}
\int_while_do:nn {\seq_count:c {l__tt_row_{##1}_seq} < \l__tt_num_vars_int}
{
\seq_put_left:cn {l__tt_row_{##1}_seq} {0}
}
}
}
\ExplSyntaxOff
\begin{document}
\[
\truthtable{a,b,c,d}{-a;a*b*d;(a)->(b);a*(b+c);(a*(b+c))->(b)}
\]
\end{document}
答案3
如果您想使用 Python 进行此类工作,那么像 Cheetah 这样的模板模块就太过分了。我会直接使用 Python,如下所示:
template = """\\documentclass{{article}}
\\title{{ {title} }}
\\author{{ {author} }}
\\begin{{document}}
\\maketitle
\\end{{document}}"""
info = {"title": "My First Paper",
"author": "A. Author"}
print template.format(**info)
答案4
编织
我用编织用于在 LaTeX 中嵌入 Python 代码。这是我的最小工作示例。
它使用 cals 来生成表格。Python 代码生成并计算管道测量值。
Python 还负责在 nl_BE.utf8 语言环境中格式化输出,用逗号代替小数点。
LaTeX 注释的第一行指示如何编译此 .Pnw 文件以生成 .tex 和 .pdf 文件。如有疑问,请咨询以下优秀文章这让我开始了。
Python 注释显示了如何在 Debian GNU/Linux 中生成其他语言环境。
%sudo easy_install -U Pweave
%Pweave -f tex filename.Pnw | pdflatex -synctex=1 -interaction=nonstopmode filename.tex
\documentclass{article}
%text symbols
\usepackage{textcomp}
%table
\usepackage{cals}
\begin{document}
\makeatletter
\begin{calstable}
\colwidths{{12mm}{18mm}{18mm}{12mm}{15mm}}
\def\cals@cs@width{0pt} %no vertical column separation lines
\setlength{\cals@paddingT}{3pt}
\setlength{\cals@paddingB}{2pt}
\alignC
\thead{\brow \cell{sectie} \cell{$D_{out}$\,(m)} \cell{$D_{in}$\,(m)} \cell{$\ell$\,(m)} \cell{$A$\,(m\texttwosuperior)} \erow}
<%
from math import pi
from locale import setlocale, LC_ALL, format
#sudo dpkg-reconfigure locales
setlocale(LC_ALL, 'nl_BE.utf8')
Atot = 0
for i in range(0,6):
section = i + 1
Dout = 0.060 - i * 0.005
Din = Dout - 0.004
length = 1.8
A = pi * (Dout + Din) * length + pi / 2.0 * (Dout**2 - Din**2)
print('\\brow \\cell{%s} \\cell{%s} \\cell{%s} \\cell{%s} \\cell{%s} \\erow' % (section, format('%.3f', Dout), format('%.3f', Din), format('%.2f', length), format('%.2f', A)))
Atot += A
%>
\tfoot{\brow \alignR \nullcell{ltb} \nullcell{tb} \nullcell{tb} \nullcell{tbr} \spancontent{Totaal:} \alignC \cell{<%=format('%.2f', Atot)%>} \erow}
\end{calstable}
\makeatother
De totale oppervlakte bedraagt <%=format('%.2f', Atot)%>\,m\texttwosuperior.
\end{document}