Extraindo a estrutura de um documento LaTex, incluindo comentários

Extraindo a estrutura de um documento LaTex, incluindo comentários

Gosto de escrever um comentário “especial” com um título no início de cada parágrafo dos meus documentos, mais ou menos assim:

\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. 

Isso me ajuda a manter o conteúdo dos meus documentos bem estruturado.

O que eu gostaria de fazer é extrair a estrutura de um documento: comandos de seccionamento (ou seja \chapter, \sectione similares) e comentários "especiais" no início de cada parágrafo.
Gostaria de analisar um arquivo fonte LaTex (ou um grupo deles, caso o arquivo principal inclua outros arquivos fonte) e produzir um novo arquivo que contenha apenas os comandos de seccionamento e os comentários "especiais", transformados em texto normal ( não comentado) ou, melhor ainda, transformado em uma lista com marcadores.

Portanto, a saída gerada executando o analisador no código anterior seria:

\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}

A melhor solução que encontrei até agora consiste em rotular os comentários especiais com uma sequência de caracteres (ou seja, iniciando-os com "%$") e, em seguida, executar o grep nas ocorrências de "%$" e dos comandos de seccionamento no arquivo fonte.

Desde já, obrigado.

Responder1

Isso é feito facilmente com qualquer ferramenta de linha de comando aqui eu uso grep e sed (no cygwin bash no Windows), mas outros sistemas são semelhantes ou você pode usar perl

Se zz.texfor o seu arquivo original,

A linha de comando do

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

saídas

\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}

Responder2

Aqui eu uso uma abordagem de "índice", ou seja, escrevo explicitamente informações no arquivo aux e as processo a partir daí. EDITADO para apresentar duas abordagens: 1) onde o "Resumo XYZecutivo" está contido no documento original, e 2) onde o resumo é um documento externo.

Em ambos os casos, tenho meu arquivo tex no qual posso usar repetidamente a macro \addxyzline{type}{content}para adicionar várias linhas ao arquivo aux. Também tenho a \writexyzmacro, que irá ler o arquivo .aux e criar um arquivo .xyz. Ele pode aparecer no documento de origem depois \begin{document}, antes de qualquer seccionamento ter ocorrido ou depois de todo o seccionamento ter ocorrido.

ABORDAGEM 1: Resumo XYZecutivo no mesmo documento

Nessa abordagem, a \writexyzmacro não apenas grava coisas no arquivo .xyz, mas também processa esse documento na segunda passagem, formatando o conteúdo adequadamente.

O resumo executivo (contendo todas as \addxyzlineinformações) aparece na invocação do \writexyz. Neste MWE, coloco-o depois do toc, mas antes do documento. Eu brinco com a \addtocontentsdefinição macro para que o seccionamento do resumo executivo não acabe como um seccionamento duplicado no 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}

insira a descrição da imagem aqui

ABORDAGEM 2: Documento de Resumo Separado

Aqui, eu crio o corpo do meu documento como antes, mas \writexyznão gravarei o resumo no mesmo documento, mas apenas no arquivo .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}

No que diz respeito à saída da tela, a compilação produz a saída do documento original, independentemente do \addxyzlineconteúdo:

insira a descrição da imagem aqui

Porém, ele também cria um arquivo .xyz (neste caso xyz.xyz, já que chamei meu arquivo original de xyz.tex), com as seguintes informações:

\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}

contendo todas as minhas \addxyzlineinformações.

Então, eu tenho um segundo arquivo tex muito simples:

\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}

que fornece informações resumidas de xyz

insira a descrição da imagem aqui


PÓS-SCRITO

Como se pode ver, o primeiro argumento \addxyzlineé o texto de qualquer nome de macro. No meu MWE, usei "seção", "início", "item" e "fim". Outros encantamentos úteis podem incluir

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

Responder3

Aqui está uma solução ConTeXt que usa a abordagem de "índice". Escolha um cabeçalho de seção que você não está usando, diga subsubjecte use-o para anotar seucontornono documento principal:

\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

Na primeira linha, placehead=emptydiz ao ConTeXt para não colocar o cabeçalho (subassunto, neste caso) na saída; incrementnumber=yesé necessário garantir que a entrada do ToC seja escrita de uma forma que seja acessível por meio de outros arquivos.

Em seguida, crie um arquivo separado para criar um esboço. Presumo que o nome do arquivo principal seja test.tex.

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

que dá

insira a descrição da imagem aqui

informação relacionada