Ich möchte den Inhalt verschiedener Latex-Befehle extrahieren, zB
- Abschnitt
- Kapitel
- Untertitel
- Randbemerkung usw.
aus einer .tex
Datei. Diese Elemente würden schließlich in einer CSV-Datei landen
chapter, chapter 1 title text
chapter, chapter 2 title text
figure, figure text
Ist hierfür ein regulärer Ausdruck erforderlich oder wird das Rad neu erfunden?
Die .tex
Datei wird über Pandoc aus einem Markdown-Dokument generiert.
Beispiel A
\documentclass{report}
\usepackage{hyperref}
\newcommand*\Quux{Pouet}
\begin{document}
\chapter[foo]{Foo}
\url{http://www.tex.org}
\end{document}
Ich möchte die Kapitel und URLs extrahieren.
Beispiel B
\documentclass{tufte-book}
\begin{document}
\chapter{A chap}
\marginnote{A note}
\end{document}
Ich möchte die Randnotiz extrahieren
Antwort1
Sie können eine Datei wie diese verwenden, um alle Abschnittsbefehle zu instrumentieren (nennen wir sie 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
Nehmen wir an, Sie möchten eine Datei mit dem Namen überprüfen 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}
Sie müssen lediglich instrumenter.tex
einen in vorhandenen Speicherort eingeben TEXINPUTS
(möglicherweise dasselbe Verzeichnis wie tested.tex
) und dann Folgendes ausführen:
latex '\input instrumenter \input tested'
(einfache Anführungszeichen stehen hier für die Shell, passen Sie sie an Ihre Shell an). Sie erhalten eine Datei namens sectioning.csv
im selben Verzeichnis, tested.tex
die für dieses Beispiel so aussieht:
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
Sie können der Ausgabe doppelte Anführungszeichen hinzufügen (oder was auch immer Sie für das CSV-Format benötigen), falls einige Titel das Semikolon als Trennzeichen ( ;
) enthalten. Fügen Sie sie einfach in die folgende Zeile ein:
\iow_now:Nn \l_csgillespie_iow { #2 ; ##2 ; ##3 }
Absätze in Argumenten
Falls Sie diesen Code zum Umschließen anderer Befehle verwenden und diese Befehle zulässigerweise \par
Token (z. B. Leerzeilen) in ihren Argumenten haben können, fügen Sie +
vor den entsprechenden Argumenten ein ein, wie folgt:
\RenewDocumentCommand #1 { s +O{##3} +m }
Das O{##3}
entspricht dem optionalen Argument des umschlossenen Befehls (standardmäßig der Wert des obligatorischen Arguments), das m
seinem obligatorischen Argument. Das +
sollte für Standard-Abschnittsbefehle nicht nützlich sein, könnte es aber sein, wenn Sie dieses System zum Protokollieren von Argumenten anderer Befehle verwenden.
Antwort2
Mit dem Extraktionspaket können Sie Folgendes tun:
https://www.ctan.org/tex-archive/macros/latex/contrib/extract
Die Dokumentation in der Readme-Datei (extract.pdf) ist ziemlich gut.