我对Django和LaTeX很陌生,所以我希望之前有人做过这样的事情:
我正在尝试创建一个可以读取LaTeX文件的Django应用程序,提取所有变量(这种形式的东西:“\newcommand{\StartDate}{January 1, 2018}
”)并将它们作为键/值对放入字典中我可以在Django里面工作。
这个想法是LaTeX文件中的每个变量都以占位符值开头。我将构建一个动态表单,使用字典创建字段/值,让用户用实际值替换占位符值。在用户设置了所有值之后,我希望能够将这些新值写回LaTeX文件并从中生成pdf。
我尝试过正则表达式,但遇到了麻烦,因为某些'变量'会包含LaTeX列表的块,例如。我也看过TexSoup,这看起来很有前景,但我还没有完全搞清楚。以下是一个示例LaTeX文件的序言部分,就像我将要处理的那样:
%% Project Name
\newcommand{\projectName}{Project Name}
%% Start and End dates
\newcommand{\startDate}{January 1, 2018}
\newcommand{\finDate}{December 31, 2018}
%% Name of User
\newcommand{\userName}{aUser}
% What tasks will be a part of this process?
\newcommand{\tasks}{
\begin{itemize}[noitemsep,topsep=0pt]
\item Planning of \projectName{} on \startDate{}
\item Construction of \projectName{}
\item Configuration of \projectName{} by \userName{} on \finDate{}
\end{itemize}
}
使用TexSoup,我能够将LaTex文件拉入一个对象,找到一个'\ newcommand'的实例到我可以迭代的生成器对象中:
from TexSoup import TexSoup
soup = TexSoup(open('slatex.tex'))
newcommands = list(soup.find_all('newcommand'))
我知道这会将每个'\ newcommand'拉入自己的元素并正确维护格式,因为我可以轻松地将它们一次打印出来。
我一直试图弄清楚如何从每个项目中拉出'\ newcommand',将项目的名称放入字典键和值进入字典值。我想认为TexSoup暴露了那些具有某种属性或方法的人,但我找不到任何关于它的东西。如果没有,我是否会再次回顾正则表达式?
答案 0 :(得分:0)
每个\newcommand
都有两个必需参数,用{}
表示。因此,我们可以
newcommand
的参数,根据您对slatex.tex
的定义,我们可以获得
{'\\finDate': 'December 31, 2018', '\\startDate': 'January 1, 2018'}
使用以下脚本
from pprint import pprint
from TexSoup import TexSoup
soup = TexSoup(open('slatex.tex'))
newcommands = list(soup.find_all('newcommand'))
result = {}
for newcommand in newcommands:
key, value = newcommand.args
result[key.value] = value.value
pprint(result)
*在旁注中,TexSoup还不了解这些重新定义的变量会对文档的其余部分产生实际影响。它被动地视为任何其他命令。