Como fazer uma lista e contar palavras-chave do LaTeX em um arquivo de origem?

2

Eu estou tentando fazer listas (e eventualmente contar e fazer estatísticas) as palavras-chave do LaTeX que aparecem em alguns documentos. Basicamente, uma palavra-chave "válida" do LaTeX pode ser identificada por:

  1. O fato de que ele não começa com um sinal "%" (seria comentado, portanto, não em uso)
  2. Começa com uma barra invertida.
  3. Is é seguido por um colchete esquerdo (ou um colchete esquerdo, caso haja opções).

Eu entendo que existem outros casos "especiais": palavras-chave seguidas por nada (um espaço em branco), ou outra palavra-chave, mas estas são relativamente raras e eu não me importo com a imprecisão. Meu principal objetivo é obter uma idéia do número de palavras-chave diferentes em vários tipos de documentos.

Eu tentei várias maneiras usando o awk, mas não consegui nada funcionando ... Anexei um MWE (sem sentido e não funcional!) De um arquivo LaTeX para referência.

\documentclass[a4paper]{scrreprt} % Mode production
\usepackage[T1]{fontenc}
\renewcommand{\thechapter}{\Alph{chapter}}
\fancypagestyle{FrontPageTestReportStyle}
\fancyfoot[C]{}
\newcommand{\WaterMark}[1]{%
\begin{tikzpicture}[remember picture,overlay]
\node[rotate=60]
\end{tikzpicture}%
\begin{figure}[H]
\centering
\begin{minipage}[b]{.46\textwidth}
\centering
\includegraphics[width=#2]{#3}\caption {#4}
\end{minipage}
\caption {#3}
\end{figure}
\raggedright
\begin{tabular}{|c|cS|cS|}
\hline
\multirow{2}{*}{Part number}&\multicolumn{2}{c|}{Cavity A}&\multicolumn{2}{c|}{Cavity B}\
\end {tabular}
\end{table}
    
por Yves 20.05.2012 / 17:43

2 respostas

2

Aqui está um script que divide os comandos do LaTeX em um arquivo de origem. Ele retira comentários começando com % . Ele exibe todos os comandos com um \ inicial e todos os nomes de ambiente também.

sed -e 's/^\(\(\)*\)%.*//' \
    -e 's/\([^\]\(\\\)*\)%.*//' \
    -e 's/\./\n&/g' |
sed -n -e 's/^\begin *{\([^{}]*\)}.*//p' \
       -e 's/^\end *{.*//' \
       -e 's/^\(\[@A-Za-z][@A-Za-z]*\).*//p' \
       -e 's/^\(\[^@A-Za-z]\)//p' |

Explicações:

  1. O primeiro sed pass adiciona uma nova linha antes de cada barra invertida. As duas primeiras expressões retiram comentários, tomando cuidado para reter \% , mas ainda retiram comentários que são precedidos por \ .
  2. No segundo sed pass, a primeira expressão imprime nomes de ambiente dos comandos \begin e a segunda expressão ignora os comandos \end . A terceira expressão imprime comandos cujos nomes são letras e a quarta expressão imprime comandos cujo nome é um símbolo.

Este script não lida com ambientes verbatim.

    
por 21.05.2012 / 09:44
0

Isso soa como uma variação em esta questão .

Então, vou trabalhar nessa resposta:

for w in 'cat test.tex'; do echo $w; done|sort|egrep '\[a-z]*{'|uniq -c
  1 A}&\multicolumn{2}{c|}{Cavity
  1 \begin{figure}[H]
  1 \begin{minipage}[b]{.46\textwidth}
  1 \begin{tabular}{|c|cS|cS|}
  1 \begin{tikzpicture}[remember

A expressão regular pode precisar de algum trabalho, mas isso deve ajudá-lo a começar.

    
por 20.05.2012 / 21:29