Usando perl para modificar um documento LaTeX

4

Estou tentando usar perl para modificar um documento LaTeX . Na verdade, estou tentando alterar o formato de citação de, por exemplo:

. \cite{poelma20113d}

para

\cite{poelma20113d}.

Em outras palavras, eu quero encontrar as citações que são precedidas por um período e um espaço e substituí-las por espaços em branco, em seguida, colocar a citação e, em seguida, colocar um período depois dela. Alguém poderia me ajudar como posso fazer isso via perl one liner? A razão pela qual eu quero fazer isso é que eu quero mudar o formato do meu manuscrito que foi preparado para o Journal of Physics of Fluids no Journal of Physical Review E.

    
por AFP 31.05.2014 / 09:56

2 respostas

1

Isso localizará e realizará a troca conforme você está perguntando:

$ perl -lpe 's/\. (\cite.*)/$1./' afile 
\cite{poelma20113d}.

Para que o liner faça a alteração real no arquivo:

$ perl -i.bak -lpe 's/\. (\cite.*)/$1./' afile 

Isso manterá o arquivo original em afile.bak . Se você quiser abrir mão dos arquivos .bak criados, poderá informar perl para não fazer isso omitindo qualquer argumento para a opção -i :

$ perl -i -lpe 's/\. (\cite.*)/$1./' afile 

Como funciona

Os exemplos acima procuram os seguintes bits dentro de cada string do arquivo afile .

  • \. - procura por um literal . .
  • s/.../../ - procura por um padrão e o substitui por outro padrão.
  • (\cite.*) - procura o padrão de um literal \ seguido pela string cite , seguido por qualquer outra coisa. Tudo isso é salvo em uma variável, $1 porque está envolto em parens (ou seja, (....) ). Nota : (\cite.*}) será interrompido quando atingir a chave direita } . Dessa forma, a próxima sentença após o comando LaTeX \cite{} , por exemplo, em . \cite{poelma20113d} This is the next sentence. , será processada corretamente.
  • $1. - $1 é o que combinamos nos parênteses, então colocamos isso seguido por um . .
por 31.05.2014 / 10:31
2

Tenho certeza que o LaTeX só pode ser apropriadamente analisado com o LaTeX 1 e a implementação do LaTeX em Perl seria um verdadeiro desafio. Portanto, qualquer solução trivial Perl falhará em algumas condições de borda. Trabalhando fora do exemplo a seguir

This is cite{foo}. \cite{foo} This is cite[foo]{bar}. \cite[foo]{bar} This is citet{foo, bar}.\citet{foo, bar}

que abrange um único argumento opcional, várias citações, formas alternativas de \cite que começam com \cite e quantidade variável de espaço em branco entre o . e o \cite . A expressão perl a seguir parece fazer o que você precisa

perl -pe 's/(.\s*)(\cite)([^{]*)(\[[^\]]*\])?{([^}]*)}/\{\}./g' afile

This is cite{foo}\cite{foo}. This is cite[foo]{bar}\cite[foo]{bar}. This is citet{foo, bar}\citet{foo, bar}.

    
por 31.05.2014 / 17:33