¿Cómo se pueden convertir las comillas regulares (es decir, '' ") en comillas LaTeX / TeX (es decir, '', `` '')

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

  •  19-08-2019
  •  | 
  •  

Pregunta

Dado un documento escrito con comillas normales, por ejemplo,

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

¿De qué maneras se puede convertir este tipo de cosas en citas de LaTeX, con la semántica adecuada? es decir

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

Para que LaTeX produzca:

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

Mi primer pensamiento es recurrir a una expresión regular. Sin embargo, no recibo ningún resultado de Google o de las bibliotecas de expresiones regulares para "LaTeX cita la expresión regular" y, por supuesto, "TeX cita la expresión regular". parece que devuelve demasiados.

Gracias.

¿Fue útil?

Solución

En general, este problema es más difícil de lo que parece.

Los casos más simples pueden tratarse con expresiones regulares, pero para situaciones más generales seguramente necesitará construir un analizador recursivo: la expresión regular solo funcionará si no hay anidamiento.

El gran problema va a estar asociado con la identificación de " '" s individuales que no están emparejados --- al igual que las contracciones (el "' " en " don't " no se debe cambiar, y no se deben emparejar).


Veamos si podemos escribir una descripción EBNF utilizable:

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

que se limita a las contracciones que tienen el " '" en el medio de la palabra. Todas las acciones asociadas solo harán eco de la entrada, excepto que los términos squote y dquote reemplazan las comillas según corresponda.


Utilicé expresiones regulares seguidas de arreglos humanos para un uso bastante simple, pero eso requeriría mucho trabajo para el trabajo continuo.

Otros consejos

Aquí está la expresión regular de Python que uso para mis documentos de Latex:

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

Hay un script de Python que aplica la expresión regular en un archivo de látex ( aquí ) Trabaja la mayor parte del tiempo. ¡Feliz composición tipográfica! :)

Aquí hay algunas sustituciones de expresiones regulares de Perl que pueden ser lo suficientemente buenas para lo que quieres hacer.

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

El código supone que una comilla simple o doble seguida de un carácter alfanumérico comienza una comilla. Además, se supone que una comilla doble después de un carácter alfanumérico o un signo de puntuación termina una comilla. Estas suposiciones probablemente sean ciertas la mayor parte del tiempo, pero puede haber excepciones.

Gracias por el aporte, útil y apreciado.

También me he encontrado con esto, de 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

¡No use expresiones regulares para este tipo de tarea!

Tal vez pueda inspirarse en SmartyPants ?

Estaba buscando una respuesta a este problema y decidí aprender un poco hoy. Pongo esta función lisp en mi archivo ~ / .emacs y luego ejecuto con 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)))

Simplemente, use `` para abrir citas y '' para cerrar

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top