Come si possono trasformare le virgolette regolari (cioè ', ") in virgolette LaTeX / TeX (cioè ``, ``' ')

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

  •  19-08-2019
  •  | 
  •  

Domanda

Dato un documento scritto con virgolette normali, ad esempio

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

In che modo si può trasformare questo tipo di cose in virgolette LaTeX, con la semantica appropriata. cioè.

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

In modo che LaTeX produca:

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

Il mio primo pensiero è passare a una regex. Tuttavia, non ricevo hit da Google o dalle librerie regex per "LaTeX cita l'espressione regolare", e, naturalmente, "TeX cita l'espressione regolare". sembra restituire troppi.

Grazie.

È stato utile?

Soluzione

In generale, questo problema è più difficile di quanto sembri.

I casi più semplici possono essere trattati con espressioni regolari, ma per situazioni più generali sarà quasi sicuramente necessario creare un parser ricorsivo: l'espressione regolare funzionerà solo se non si annidano.

Il grosso problema sarà associato all'identificazione di singoli " '" che non sono accoppiati --- come lo sono le contrazioni (il "' " in " non " non deve essere modificato, e non devono essere associati).


Vediamo se possiamo scrivere una descrizione EBNF utilizzabile:

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

che è limitato alle contrazioni che hanno il " '" nel mezzo della parola. Tutta l'azione associata farà eco all'input, tranne per il fatto che i termini squote e dquote sostituiscono le virgolette come appropriato.


Ho usato espressioni regolari seguite da correzioni umane per una soluzione una tantum abbastanza semplice, ma sarebbe stato laborioso per il lavoro in corso.

Altri suggerimenti

Ecco il regex di Python che uso per i miei documenti Latex:

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

Esiste uno script Python che applica il regex su un file in lattice ( qui ). Funziona la maggior parte del tempo. Composizione felice! :)

Ecco alcune sostituzioni di espressioni regolari Perl che potrebbero essere abbastanza buone per quello che vuoi fare.

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

Il codice presuppone che una virgoletta singola o doppia seguita da un carattere alfanumerico inizi una citazione. Inoltre, presuppone che una doppia virgoletta che segue un carattere alfanumerico o un segno di punteggiatura termini una citazione. Queste ipotesi sono probabilmente vere per la maggior parte del tempo ma potrebbero esserci delle eccezioni.

Grazie per l'input: utile e apprezzato.

Mi sono anche imbattuto in questo, da 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

Non utilizzare espressioni regolari per questo tipo di attività!

Forse puoi trarre ispirazione da SmartyPants ?

Stavo cercando una risposta a questo problema e oggi ho deciso di imparare un po 'di tempo. Ho inserito questa funzione lisp nel mio file ~ / .emacs e quindi ho eseguito 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)))

Semplicemente, usa `` per aprire le offerte e '' per chiudere

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top