
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
, \section
y 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.tex
es 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 \writexyz
macro, 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 \writexyz
macro 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 \addxyzline
informació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 \addtocontents
definició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}
ENFOQUE 2: Documento resumido separado
Aquí, creo el cuerpo de mi documento como antes, pero \writexyz
no 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 \addxyzline
contenido:
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 \addxyzline
informació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
POSDATA
Como puede ver, el primer argumento de \addxyzline
es 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 subsubject
y ú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=empty
le dice a ConTeXt que no coloque el encabezado (subtema, en este caso) en la salida; incrementnumber=yes
Es 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