Como se pode transformar aspas regulares (ou seja,', ") em LaTeX / tex citações (ou seja`', `` '')

StackOverflow https://stackoverflow.com/questions/346567

  •  19-08-2019
  •  | 
  •  

Pergunta

Dado um documento escrito com aspas normais, por exemplo.

Ben said "buttons, dear sir".
I replied "Did you say 'buttons'?" to him.

O que maneiras se pode transformar este tipo de coisas em citações LaTeX, com a semântica apropriadas. i.

Ben said ``buttons, dear sir''.
I replied ``Did you say `buttons'?'' to him.

Assim que LaTeX produz:

Ben said “buttons, dear sir”.
I replied “Did you say ‘buttons’?”

Meu primeiro pensamento é a vez de um regex. No entanto, eu não estou recebendo nenhum hits do Google ou as bibliotecas de regex para "citações LaTeX expressão regular", e, claro, "Tex cita expressão regular" parece retornar demais.

Obrigado.

Foi útil?

Solução

Em geral, este problema é mais difícil do que parece.

Os casos mais simples pode ser tratados com expressões regulares, mas para situações mais gerais que você irá quase certamente precisa para construir um parser recursivo:. expressão regular só irá funcionar se não houver aninhamento

O grande problema vai ser associado com a identificação "'"s únicos que não estão emparelhados --- como é contrações (o "'" em "don't" não deve ser alterado, e não deve ser emparelhado).


Vamos ver se podemos escrever uma descrição utilizável EBNF:

input:       text+
text:        uquote|squote|dquote
squote       "'" text "'"
dquote       """ text """
uquote:      [contraction|.]+
contraction: [A-Za-z]+ "'" [A-Za-z]+

que é limitada a contrações que têm o "'" no meio da palavra. Toda a ação associada apenas ecoará a entrada, a não ser que os termos squote e dquote substituir as aspas conforme o caso.


Eu usei expressões regulares seguidos por fix-ups humanos para um bastante simples one-off, mas isso seria um trabalho intensivo para trabalho em curso.

Outras dicas

Aqui está a regex python que eu uso para os meus documentos de Látex:

'([ \w-]+)'", " `\\1'

Há um script python que se aplica a regex em um arquivo de látex ( aqui ). Funciona na maioria das vezes. typesetting feliz! :)

Aqui estão algumas Perl substituições expressão regular que pode ser bom o suficiente para o que você quer fazer.

s/"(\w)/``$1/g;
s/'(\w)/`$1/g;
s/([\w\.?!])"/$1''/g;

O código assume que um aspas simples ou duplas seguido por um caractere alfanumérico começa uma citação. Além disso, ele assume que uma aspa após um caractere alfanumérico ou sinal de pontuação termina uma cotação. Esses pressupostos são provavelmente verdadeiras maior parte do tempo, mas pode haver exceções.

Obrigado pela contribuição -. Útil e apreciada

Eu também me deparei com isso, a partir do CPAN Latex :: Encode.pm :

    # A single or double quote before a word character, preceded
    # by start of line, whitespace or punctuation gets converted
    # to "`" or "``" respectively.

    $text =~ s{ ( ^ | [\s\p{IsPunct}] )( ['"] ) (?= \w ) }
              { $2 eq '"' ? "$1``" : "$1`" }mgxe;

    # A double quote preceded by a word or punctuation character
    # and followed by whitespace or end of line gets converted to
    # "''".  (Final single quotes are represented by themselves so
    # we don't need to worry about those.)

    $text =~ s{ (?<= [\w\p{IsPunct}] ) " (?= \s | $ ) }
              { "''" }mgxe

Não use expressões regulares para este tipo de tarefa!

Talvez você pode obter alguma inspiração Smartypants ?

Eu estava procurando uma resposta para este problema e decidiu aprender um pouco lisp hoje. Eu coloquei esta função Lisp no meu arquivo ~ / .emacs e depois executar com M-x tex-set-quotes:

(defun tex-set-quotes ()  
  (interactive)  
  (latex-mode)  
  (while (search-forward "\"" nil t)  
   (replace-match "" nil t)  
   (tex-insert-quote nil)))

Simplesmente, use `` para citações de abertura e '' para fechar

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top