Busque y reemplace TeX \ over con LaTeX \ frac

Pregunta:

Tengo un archivo fuente que fue codificado originalmente en TeX (bueno, este es en realidad un archivo conTeXt). Una fracción como 1/(2/x^2) se codifica como {1 \over {2 \over x^2}} . Me gustaría convertir a la sintaxis LaTeX, es decir, \frac{1}{\frac{2}{x^2}} .

¿Alguna pista? Gracias.

Respuesta:

El comando my-replace-over-with-frac definido en el siguiente código de Elisp asume que los argumentos \over siempre están delimitados por llaves.

Hay más construcciones que limitan los argumentos de \over como $ a \over b $ $ c \over d $ o $\matrix{ a \over b & c \over d }$ . En cada uno de esos casos, a \over b c \over d se representan como fracciones separadas.

Si uno ignora eso, puede conducir a un documento LaTeX no válido. Por esa razón, la aplicación predeterminada de my-replace-over-with-frac es interactiva de forma predeterminada. Por cada coincidencia de \over , se le pregunta si desea aceptar el reemplazo o no. Las modificaciones del texto están marcadas con color amarillo.

Si omite algunos reemplazos, luego puede buscar \over para encontrar esos casos y editarlos.

Si eres emprendedor, puedes llamar a my-replace-over-with-frac con prefix-arg. En ese caso, todos los reemplazos se realizan sin interacción del usuario.

(defun my-next-over (&rest args)
  "Search for the next \\over in a math environment.
ARGS are the arguments starting at the 2nd one of `search-forward'."
  (cl-loop while (apply #'search-forward "\\over" args)
       when (and (save-match-data (texmathp))
             (null (nth 8 (syntax-ppss (point)))))
       return (point)
       finally return nil))

(defun my-replace-over-with-frac (&optional b e force)
  "Replace {a \\over b} with {\frac{a}{b}} in region from B to E.
Make replacements without questions if FORCE is non-nil.
Thereby, a and b can be terms that can contain fractions themselves."
  (interactive (append
        (if (use-region-p)
            (list (region-beginning) (region-end))
          (list nil nil))
        (list prefix-arg)))
  (save-point
   (unless b (setq b (point-min)))
   (unless e (setq e (point-max)))
   (goto-char b)
   (let ((ol-over (make-overlay 1 1))
     (ol-frac (make-overlay 1 1))
     (ol-brace (make-overlay 1 1)))
     (unwind-protect
     (progn
       (overlay-put ol-over 'face 'match)
       (overlay-put ol-frac 'face 'match)
       (while (my-next-over e t)
         (move-overlay ol-over (match-beginning 0) (match-end 0))
         (replace-match "}{")
         (goto-char (match-beginning 0))
         (backward-up-list)
         (let ((b-frac (point)))
           (insert "{\\frac")
           (move-overlay ol-frac b-frac (point)))
         (forward-sexp 2)
         (insert "}")
         (move-overlay ol-brace (1- (point)) (point))
         (if (or force
             (y-or-n-p "Apply? "))
         (goto-char (overlay-end ol-over)) ;; consider other occurences of \over in the second operand
           (delete-region (overlay-start ol-over) (overlay-end ol-over))
           (goto-char (overlay-start ol-over))
           (insert "\\over")
           (save-point
        (delete-region (overlay-start ol-frac) (overlay-end ol-frac))
        (delete-region (overlay-start ol-brace) (overlay-end ol-brace))))
         )
       )
       (delete-overlay ol-over)
       (delete-overlay ol-frac)
       (delete-overlay ol-brace)))))

           (delete-overlay ol-frac)))))

El tema de la interacción oculta un poco la simplicidad del método.

La estructura del método es:

(while (search-forward "\\over")
  (save-point
    (replace-match "}{")
    (backward-up-list)
    (insert "\\frac")))

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım