2013-06-11 9 views
7

Uso Emacs in combinazione con AUCTeX per modificare i manoscritti con molti metodi matematici incorporati utilizzando $. Quando si riempie automaticamente (ad es. Con M-q), Emacs spesso rompe questi ambienti matematici in linea in posizioni che disturbano la fluidità della lettura (ad es. In pedici o simili).Previene Emacs dal linebreaking in TeX matematica in linea

C'è un modo per dire a Emacs di preferire di mettere l'intero ambiente $…$ in una nuova riga se ciò impedirebbe la rottura? Più specificamente, se si verificasse un'interruzione della matematica, l'intero ambiente dovrebbe essere spostato su una nuova linea che non dovrebbe essere distrutta.

Un esempio:

Lorem ipsum dolor sit amet, consectetur adipisici elit, sed $a^2 + b^2 = c^2$ eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam. 

dovrebbe tradursi in

Lorem ipsum dolor sit amet, consectetur adipisici elit, sed 
$a^2 + b^2 = c^2$ eiusmod tempor incidunt ut labore et dolore magna 
aliqua. Ut enim ad minim veniam. 

risposta

5

Prova:

(add-hook 'LaTeX-mode-hook 
      (lambda() 
      (add-to-list 'fill-nobreak-predicate 'texmathp))) 

inserirlo nel vostro .emacs e riavviare emacs.

+0

Grazie, è vicino! È bello che raccolga brevi ambienti matematici distribuiti su più righe. Ciò a costo, tuttavia, che le righe molto lunghe non possono essere spezzate _esplicitamente_ (voglio dire che le interruzioni esplicite vengono cancellate premendo 'M-q'). Sai come incorporare questo. (È complicato però: non riesco nemmeno a dirlo in modo più preciso in modo conciso.) – Xlea

+1

Non sono sicuro di capire cosa intendi con "interruzioni esplicite". Se intendi solo le posizioni del testo in cui hai premuto 'RET', beh, non c'è modo di distinguere quelle dalle interruzioni di riga automatiche eseguite dalle funzioni di riempimento di emacs. Potresti, tuttavia, aggiungere il simbolo di commento '%' alla fine di una riga per cercare di impedire che l'interruzione di riga venga modificata da 'M-q'. – mk1

+0

Quello che voglio dire è che se la matematica lunga (più lunga di una riga) è già su una linea separata e interrotta (da chiunque), allora non voglio tirare le righe successive di Emacs (cioè, non rimuovere una interruzione di riga se quella porterebbe a una linea troppo lunga). Sto già usando '%' ma non è molto conveniente. – Xlea

1

Si può fare qualcosa di simile:

(add-hook 'LaTeX-mode-hook 
      (lambda() 
      (add-hook 'fill-nobreak-predicate 'my-latex-fill-nobreak))) 

e quindi definire una funzione my-latex-fill-nobreak che restituisce non-nil se sei all'interno di un breve ambiente matematico, ad es qualcosa di simile:

(defun my-latex-fill-nobreak() 
    (save-excursion 
    (when (search-backward "$" (- (point) 20) t) 
     ;; We found a nearby $. Now let's see if it's an opening $ 
     ;; rather than a closing one. Using font-lock properties is 
     ;; a hack, but it might be good enough. Apparently (texmathp) 
     ;; could be a better choice. 
     (eq (get-text-property (point) 'face) 'font-latex-math-face)))) 
+1

È possibile utilizzare 'texmathp' per rilevare se il punto è in modalità matematica. – mk1

+0

Ho provato ad aggiungerlo a ~/.emacs ma questo non sembra avere alcun effetto. – Xlea

+0

Probabilmente a causa del $ non quotato nella ricerca regexp. L'ho modificato per utilizzare invece una ricerca non regexp, che potrebbe risolvere il problema. – Stefan

Problemi correlati