Extraer la estructura de un documento LaTex, incluidos los comentarios.

Extraer la estructura de un documento LaTex, incluidos los comentarios.

Me gusta escribir un comentario "especial" con un título al principio de cada párrafo de mis documentos, algo como esto:

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

Esto me ayuda a mantener bien estructurado el contenido de mis documentos.

Lo que me gustaría hacer es extraer la estructura de un documento: comandos de sección (es decir \chapter, \sectiony similares) y comentarios "especiales" al principio de cada párrafo.
Me gustaría analizar un archivo fuente de LaTex (o un grupo de ellos, en caso de que el archivo principal incluya otros archivos fuente) y producir un nuevo archivo que contenga solo los comandos de sección y los comentarios "especiales", convertidos en texto normal ( sin comentar) o, mejor aún, convertido en una lista con viñetas.

Entonces, el resultado generado al ejecutar el analizador en el código anterior sería:

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

La mejor solución que encontré hasta ahora consiste en etiquetar los comentarios especiales con una secuencia de caracteres (es decir, comenzarlos con "%$") y luego agrupar las apariciones de "%$" y de los comandos de sección en el archivo fuente.

Gracias de antemano.

Respuesta1

Esto se hace fácilmente con cualquier herramienta de línea de comandos. Aquí uso grep y sed (en cygwin bash en Windows), pero otros sistemas tienen sistemas similares o podrías usar perl.

Si zz.texes su archivo original,

La línea de comando de

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

salidas

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

Respuesta2

Aquí utilizo un enfoque de "tabla de contenido", con lo que quiero decir que escribo información explícitamente en el archivo auxiliar y la proceso desde allí. EDITADO para presentar dos enfoques: 1) donde el "resumen ejecutivo XYZ" está contenido en el documento original, y 2) donde el resumen es un documento externo.

En ambos casos, tengo mi archivo tex en el que puedo usar repetidamente la macro \addxyzline{type}{content}para agregar varias líneas al archivo auxiliar. También tengo la \writexyzmacro, que leerá el archivo .aux y creará un archivo .xyz. Puede aparecer en el documento fuente después de \begin{document}, antes de que se haya producido cualquier sección o después de que se haya producido toda la sección.

ENFOQUE 1: Resumen ejecutivo XYZ en el mismo documento

En este enfoque, la \writexyzmacro no sólo escribe cosas en el archivo .xyz, sino que también procesa ese documento en la segunda pasada, formateando el contenido adecuadamente.

El resumen ejecutivo (que contiene toda la \addxyzlineinformación) aparece a invocación de \writexyz. En este MWE, lo coloco después del toc pero antes del asunto del documento. Juego con la \addtocontentsdefinición macro para que la sección del resumen ejecutivo no termine como una sección duplicada en el 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}

ingrese la descripción de la imagen aquí

ENFOQUE 2: Documento resumido separado

Aquí, creo el cuerpo de mi documento como antes, pero \writexyzno escribiré el resumen en el mismo documento, sino simplemente en el archivo .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}

En cuanto a la salida en pantalla, la compilación produce la salida del documento original, independientemente del \addxyzlinecontenido:

ingrese la descripción de la imagen aquí

Sin embargo, también crea un archivo .xyz (en este caso xyz.xyz, ya que llamé a mi archivo original xyz.tex), con la siguiente información:

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

que contiene toda mi \addxyzlineinformación.

Luego, tengo un segundo archivo tex muy simple:

\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 proporciona la información resumida de xyz

ingrese la descripción de la imagen aquí


POSDATA

Como puede ver, el primer argumento de \addxyzlinees el texto de cualquier nombre de macro. En mi MWE, he usado "sección", "comienzo", "elemento" y "fin". Otros encantamientos útiles podrían incluir

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

Respuesta3

Aquí hay una solución ConTeXt que utiliza el enfoque de "tabla de contenido". Elija un encabezado de sección que no esté usando, dígalo subsubjecty úselo para anotar sudescribiren el 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

En la primera línea, placehead=emptyle dice a ConTeXt que no coloque el encabezado (subtema, en este caso) en la salida; incrementnumber=yesEs necesario garantizar que la entrada de ToC esté escrita de manera que sea accesible a través de otros archivos.

Luego cree un archivo separado para crear un esquema. Asumiré que el nombre del archivo principal era test.tex.

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

lo que da

ingrese la descripción de la imagen aquí

información relacionada