Parágrafos em argumentos

Parágrafos em argumentos

Gostaria de extrair o conteúdo de vários comandos de látex, por exemplo

  • seção
  • capítulo
  • rubrica
  • nota lateral, etc.

de um .texarquivo. Esses elementos acabariam eventualmente em um arquivo CSV

chapter, chapter 1 title text
chapter, chapter 2 title text
figure, figure text

Isso requer uma expressão regular ou é uma reinvenção da roda?


O .texarquivo é gerado a partir de um documento markdown, via pandoc.


Exemplo A

\documentclass{report}
\usepackage{hyperref}
\newcommand*\Quux{Pouet}

\begin{document}
\chapter[foo]{Foo}
\url{http://www.tex.org}
\end{document}

Gostaria de extrair os capítulos e URLs.

Exemplo B

\documentclass{tufte-book}
\begin{document}
\chapter{A chap}
\marginnote{A note}
\end{document}

Gostaria de extrair a nota de margem

Responder1

Você pode usar um arquivo como este para instrumentar todos os comandos de seccionamento (vamos chamá-lo de 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

Então, suponha que você queira verificar um arquivo chamado 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}

Tudo o que você precisa fazer é colocar instrumenter.texum local presente TEXINPUTS(possivelmente no mesmo diretório tested.tex) e executar:

latex '\input instrumenter \input tested'

(aspas simples são para o shell aqui, adapte ao seu shell). Você obterá um arquivo chamado sectioning.csvno mesmo diretório tested.texque se parece com este exemplo:

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

Você pode adicionar aspas duplas à saída (ou o que for necessário para o formato CSV) caso alguns títulos contenham o separador ponto-e-vírgula ( ;). Basta adicioná-los na linha que diz:

\iow_now:Nn \l_csgillespie_iow { #2 ; ##2 ; ##3 }

Parágrafos em argumentos

Caso você use este código para agrupar outros comandos e esses comandos possam legalmente ter \partokens (por exemplo, linhas em branco) em seus argumentos, adicione um +na frente dos argumentos correspondentes, assim:

\RenewDocumentCommand #1 { s +O{##3} +m }

O O{##3}corresponde ao argumento opcional do comando encapsulado (padrão para o valor do argumento obrigatório), o mao seu argumento obrigatório. Não deve +ser útil para comandos de seccionamento padrão, mas pode ser se você usar este sistema para registrar argumentos de outros comandos.

Responder2

O pacote extract permitiria que você fizesse isso:

https://www.ctan.org/tex-archive/macros/latex/contrib/extract

A documentação no leia-me (extract.pdf) é muito boa.

informação relacionada