Как я могу извлечь переменные из документа LaTeX в словарь Python, чтобы я мог вытащить его в Django? - PullRequest
0 голосов
/ 30 мая 2018

Я довольно новичок в Django и LaTeX, поэтому я надеюсь, что кто-то уже делал что-то подобное раньше:

Я пытаюсь создать приложение Django, которое может читать файл LaTeX,Извлеките все переменные (вещи этой формы: "\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 голосов
/ 04 июня 2018

Каждый из \newcommand s имеет два обязательных аргумента, обозначаемых {}.В результате мы можем

  1. получить доступ к каждому newcommand аргументу, а
  2. получить доступ к значению каждого аргумента

С вашим определением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 еще не понимает, что эти переопределенные переменные будут иметь ощутимое влияниена остальной части документа.Он относится к ним как к любой другой команде, пассивно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...