如何将LaTeX文档中的变量提取到Python字典中以便将其拖入Django?

时间:2018-05-30 03:22:14

标签: python django variables latex

我对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暴露了那些具有某种属性或方法的人,但我找不到任何关于它的东西。如果没有,我是否会再次回顾正则表达式?

1 个答案:

答案 0 :(得分:0)

每个\newcommand都有两个必需参数,用{}表示。因此,我们可以

  1. 访问每个newcommand的参数,
  2. 访问每个参数的值
  3. 根据您对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还不了解这些重新定义的变量会对文档的其余部分产生实际影响。它被动地视为任何其他命令。