Absätze in Argumenten

Absätze in Argumenten

Ich möchte den Inhalt verschiedener Latex-Befehle extrahieren, zB

  • Abschnitt
  • Kapitel
  • Untertitel
  • Randbemerkung usw.

aus einer .texDatei. 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 .texDatei 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.texeinen 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.csvim selben Verzeichnis, tested.texdie 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 \parToken (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 mseinem 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.

verwandte Informationen