Me gustaría extraer el contenido de varios comandos de látex, por ejemplo
- sección
- capítulo
- subtítulo
- nota al margen, etc.
de un .tex
archivo. Estos elementos eventualmente terminarían en un archivo CSV.
chapter, chapter 1 title text
chapter, chapter 2 title text
figure, figure text
¿Esto requiere una expresión regular o se trata de reinventar la rueda?
El .tex
archivo se genera a partir de un documento de rebajas, a través de pandoc.
Ejemplo A
\documentclass{report}
\usepackage{hyperref}
\newcommand*\Quux{Pouet}
\begin{document}
\chapter[foo]{Foo}
\url{http://www.tex.org}
\end{document}
Me gustaría extraer los capítulos y las URL.
Ejemplo B
\documentclass{tufte-book}
\begin{document}
\chapter{A chap}
\marginnote{A note}
\end{document}
Me gustaría extraer la nota al margen.
Respuesta1
Puede utilizar un archivo como este para instrumentar todos los comandos de sección (llamémoslo instrumenter.tex
):
\RequirePackage{xparse}
\ExplSyntaxOn
\iow_new:N \l_csgillespie_iow
% #1: sectioning command name as a single token
% #2: character tokens representing the command name, without the backslash
\cs_new_protected:Npn \csgillespie_instrument_sec_cmd:Nn #1#2
{
% Save the original sectioning command
\cs_gset_eq:cN { g_csgillespie_#2_orig: } #1
\RenewDocumentCommand #1 { s O{##3} m }
{
\iow_now:Nn \l_csgillespie_iow { #2 ; ##2 ; ##3 }
\IfBooleanTF {##1}
{ \use:c { g_csgillespie_#2_orig: } * {##3} }
{ \use:c { g_csgillespie_#2_orig: } [##2] {##3} }
}
}
\cs_generate_variant:Nn \csgillespie_instrument_sec_cmd:Nn { c }
% #1: character tokens representing the command name, without the backslash
\cs_new_protected:Npn \csgillespie_instrument_sec_cmd_ifexists:n #1
{
\cs_if_exist:cT {#1}
{ \csgillespie_instrument_sec_cmd:cn {#1} {#1} }
}
\AtBeginDocument
{
\iow_open:Nn \l_csgillespie_iow { sectioning.csv }
\clist_map_inline:nn
{
part, chapter, section, subsection, subsubsection, paragraph,
subparagraph
}
{ \csgillespie_instrument_sec_cmd_ifexists:n {#1} }
}
\AtEndDocument { \iow_close:N \l_csgillespie_iow }
\ExplSyntaxOff
\endinput
Luego, supongamos que desea verificar un archivo llamado tested.tex
:
\documentclass{report}
\newcommand*\Quux{Pouet}
\begin{document}
\chapter[foo]{Foo}
\chapter{Bar \emph{Baz!}}
\chapter*{\Quux !}
\section{A \emph{section}!}
\section[Short title]{Another section}
\end{document}
Todo lo que tiene que hacer es colocar instrumenter.tex
una ubicación presente en TEXINPUTS
(posiblemente el mismo directorio que tested.tex
) y luego ejecutar:
latex '\input instrumenter \input tested'
(Las comillas simples son para el shell aquí, adáptese a su shell). Obtendrá un archivo llamado sectioning.csv
en el mismo directorio que tested.tex
se ve así para este ejemplo:
chapter;foo;Foo
chapter;Bar \emph {Baz!};Bar \emph {Baz!}
chapter;\Quux !;\Quux !
section;A \emph {section}!;A \emph {section}!
section;Short title;Another section
Es posible que desee agregar comillas dobles a la salida (o lo que necesite para el formato CSV) en caso de que algunos títulos contengan el separador de punto y coma ( ;
). Simplemente agréguelos en la línea que dice:
\iow_now:Nn \l_csgillespie_iow { #2 ; ##2 ; ##3 }
Párrafos en argumentos
En caso de que utilice este código para encapsular otros comandos y estos comandos puedan tener \par
tokens legalmente (por ejemplo, líneas en blanco) en sus argumentos, agregue un +
delante de los argumentos correspondientes, así:
\RenewDocumentCommand #1 { s +O{##3} +m }
El O{##3}
corresponde al argumento opcional del comando empaquetado (por defecto es el valor del argumento obligatorio), el m
a su argumento obligatorio. No debería +
ser útil para comandos de sección estándar, pero podría serlo si usa este sistema para registrar argumentos de otros comandos.
Respuesta2
El paquete de extracción le permitiría hacer eso:
https://www.ctan.org/tex-archive/macros/latex/contrib/extract
La documentación en el archivo Léame (extract.pdf) es bastante buena.