Извлечение структуры документа LaTex, включая комментарии

Извлечение структуры документа LaTex, включая комментарии

Мне нравится писать «специальный» комментарий с заголовком в начале каждого абзаца в моих документах, что-то вроде этого:

\section{Introduction}

% 1.0 Visually tracking balls is an interesting problem.  
Text related to why tracking balls is important, blah, blah, blah.   
Blah, blah, blah. 

% 1.1 Tracking balls is difficult because of these challenges.  
Text relating the challenges, blah, blah, blah.  
More blah, blah, blah. 

% 2.0 Previous work.  
Text relating the existing work on tracking balls, blah, blah, blah.  
Blah, blah, blah. 

Это помогает мне поддерживать структуру содержания моих документов.

Я хотел бы извлечь структуру документа: команды секционирования (например, \chapterи \sectionт. п.) и "специальные" комментарии в начале каждого абзаца.
Я хотел бы проанализировать исходный файл LaTex (или группу из них, если основной файл включает другие исходные файлы) и создать новый файл, содержащий только команды секционирования и "специальные" комментарии, преобразованные в обычный текст (без комментариев) или, что еще лучше, преобразованные в маркированный список.

Таким образом, вывод, полученный при запуске парсера на предыдущем коде, будет следующим:

\section{Introduction}

\begin{itemize}  
  \item 1.0 Visually tracking balls is an interesting problem.  
  \item 1.1 Tracking balls is difficult because of these challenges.  
  \item 2.0 Previous work.  
\end{itemize}

Лучшее решение, которое я нашел на данный момент, состоит в том, что я помечаю специальные комментарии последовательностью символов (т. е. начинаю их с «%$»), а затем выполняю grep-анализ вхождений «%$» и команд секционирования в исходном файле.

Заранее спасибо.

решение1

Это легко сделать с помощью любых инструментов командной строки, здесь я использую grep и sed (в cygwin bash на windows), но в других системах есть похожие инструменты, или вы можете использовать perl.

Если zz.texэто ваш оригинальный файл,

Командная строка

$ grep "\(sub\)*section\|^%" zz.tex | sed -e '/^\\s/ a \\\\begin{itemize}' -e 's/^%/\\item /' -e '$ a \\\\end{itemize}'

выходы

\section{Introduction}
\begin{itemize}
\item  1.0 Visually tracking balls is an interesting problem.  
\item  1.1 Tracking balls is difficult because of these challenges.  
\item  2.0 Previous work.  
\end{itemize}

решение2

Здесь я использую подход «таблицы содержания», под которым я подразумеваю, что я явно записываю информацию в aux-файл и обрабатываю ее оттуда. ОТРЕДАКТИРОВАНО, чтобы представить два подхода: 1) когда «XYZecutive summary» содержится в исходном документе, и 2) когда summary является внешним документом.

В обоих случаях у меня есть файл tex, в котором я могу многократно использовать макрос \addxyzline{type}{content}для добавления различных строк в файл aux. У меня также есть макрос \writexyz, который будет читать файл .aux и создавать файл .xyz. Он может появиться в исходном документе после \begin{document}, либо до того, как произошло какое-либо секционирование, либо после того, как произошло все секционирование.

ПОДХОД 1: XYZ-резюме в одном документе

При таком подходе макрос не только \writexyzзаписывает данные в файл .xyz, но и обрабатывает этот документ на втором проходе, соответствующим образом форматируя его содержимое.

Краткое изложение (содержащее всю \addxyzlineинформацию) появляется при вызове \writexyz. В этом MWE я размещаю его после toc, но перед document matter. Я играю с \addtocontentsопределением макроса, чтобы секционирование краткого изложения не заканчивалось дублирующим секционированием в toc.

\documentclass{article}
\newcommand\addxyzline[2]{\addtocontents {xyz}{\protect \xyzline {#1}{#2}}}
\let\svaddtocontents\addtocontents
\makeatletter
\newcommand\writexyz{%
  \renewcommand\addtocontents[2]{\relax}%
  \clearpage\setcounter{section}{0}\noindent%
  {\Huge\hrulefill XYZecutive Summary\hrulefill\par}%
  \newcommand\xyzline[2]{\expandafter\csname##1\endcsname{##2}}\@starttoc{xyz}%
  \par\noindent\hrulefill\clearpage\setcounter{section}{0}%
  \let\addtocontents\svaddtocontents
}
\makeatother
\begin{document}
\tableofcontents% CAN UNCOMMMENT TO SEE THAT toc WORKS FINE
\writexyz

\section{Introduction}
\addxyzline{section}{Introduction}

\addxyzline{begin}{itemize}
\addxyzline{item}{1.0 Visually tracking balls is an interesting problem.}
Text related to why tracking balls is important, blah, blah, blah.   
Blah, blah, blah. 

\addxyzline{item}{1.1 Tracking balls is difficult because of these challenges.}
Text relating the challenges, blah, blah, blah.  
More blah, blah, blah. 

\addxyzline{item}{2.0 Previous work.}
Text relating the existing work on tracking balls, blah, blah, blah.  
Blah, blah, blah.
\addxyzline{end}{itemize}

\end{document}

введите описание изображения здесь

ПОДХОД 2: Отдельный сводный документ

Здесь я создаю тело документа, как и раньше, но \writexyzрезюме будет записано не в тот же документ, а только в файл .xyz.

\documentclass{article}
\newcommand\addxyzline[2]{\addtocontents {xyz}{\protect \xyzline {#1}{#2}}}
\makeatletter
\newcommand\writexyz{\newcommand\xyzline[2]{}\@starttoc{xyz}}
\makeatother
\begin{document}
%\tableofcontents% CAN UNCOMMMENT TO SEE THAT toc WORKS FINE
\section{Introduction}
\addxyzline{section}{Introduction}

\addxyzline{begin}{itemize}
\addxyzline{item}{1.0 Visually tracking balls is an interesting problem.}
Text related to why tracking balls is important, blah, blah, blah.   
Blah, blah, blah. 

\addxyzline{item}{1.1 Tracking balls is difficult because of these challenges.}
Text relating the challenges, blah, blah, blah.  
More blah, blah, blah. 

\addxyzline{item}{2.0 Previous work.}
Text relating the existing work on tracking balls, blah, blah, blah.  
Blah, blah, blah.
\addxyzline{end}{itemize}

\writexyz
\end{document}

Что касается вывода на экран, компиляция создает вывод исходного документа, независимо от его \addxyzlineсодержания:

введите описание изображения здесь

Однако он также создает файл .xyz (в данном случае xyz.xyz, поскольку я назвал свой исходный файл xyz.tex) со следующей информацией:

\xyzline {section}{Introduction}
\xyzline {begin}{itemize}
\xyzline {item}{1.0 Visually tracking balls is an interesting problem.}
\xyzline {item}{1.1 Tracking balls is difficult because of these challenges.}
\xyzline {item}{2.0 Previous work.}
\xyzline {end}{itemize}

содержащий всю мою \addxyzlineинформацию.

Затем у меня есть очень простой второй tex-файл:

\documentclass{article}
\newcommand\xyzline[2]{\csname#1\endcsname {#2}\par}
\begin{document}
\input{xyz.xyz}% NAME OF .xyz FILE GOES HERE IN THE ARGUMENT
\end{document}

который предоставляет сводную информацию xyz

введите описание изображения здесь


ПОСТСКРИПТУМ

Как можно видеть, первый аргумент \addxyzline— это текст любого имени макроса. В моем MWE я использовал "section", "begin", "item" и "end". Другие полезные заклинания могут включать

\addxyzline{relax}{this is just text added on the same line}
\addxyzline{newline}{this is just text on a new line}

решение3

Вот решение ConTeXt, которое использует подход «таблицы содержания». Выберите заголовок раздела, который вы не используете, скажемsubsubject и используйте его для аннотации вашегоконтурв основном документе:

\setuphead[subsubject][placehead=empty, before=,after=, incrementnumber=yes]

\starttext

\section{Introduction}

\subsubject{1.0 Visually tracking balls is an interesting problem.}
Text related to why tracking balls is important, blah, blah, blah.   
Blah, blah, blah. 

\subsubject{1.1 Tracking balls is difficult because of these challenges.}
Text relating the challenges, blah, blah, blah.  
More blah, blah, blah. 

\subsubject{2.0 Previous work. }
Text relating the existing work on tracking balls, blah, blah, blah.  
Blah, blah, blah. 

\stoptext

В первой строке placehead=emptyсообщает ConTeXt, что не следует помещать заголовок (в данном случае подтему) в вывод; incrementnumber=yesэто необходимо для того, чтобы запись оглавления была написана таким образом, чтобы к ней можно было получить доступ из других файлов.

Далее создадим отдельный файл для создания контура. Я предположу, что имя основного файла было test.tex.

\starttext
\ctxlua{job.load("test.tuc")}
\placelist[section,subsubject]
          [pagenumber=no, headnumber=no]   
\stoptext

который дает

введите описание изображения здесь

Связанный контент