emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Verse block and separations (was: [bug] `org-latex-line-break-safe'


From: Max Nikulin
Subject: Re: Verse block and separations (was: [bug] `org-latex-line-break-safe' breaks the export of verse blocks to LaTeX)
Date: Wed, 19 Oct 2022 18:08:32 +0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.2.2

On 16/10/2022 23:33, Juan Manuel Macías wrote:
               (replace-regexp-in-string
                "^[ \t]+" (lambda (m) (format "\\hspace*{%dem}" (length m)))
                (replace-regexp-in-string
                 "\\(\\\\\\\\\n\\)+\\([ \t]*\\\\\\\\\\)+" "\n"
                 (replace-regexp-in-string
                  "\\([ \t]*\\\\\\\\\\)?[ \t]*\n" "\\\\\n"
                  (setq contents
                        (if lin
                            (replace-regexp-in-string "\\(\n\\)+\\([ \t]*\n\\)+" 
"\\\\\\\\!\n\n"
                                                      contents)
                          contents)) nil t) nil t) nil t) linreset)

I had a hope, it is possible to do it in a single pass of `replace-regexp-in-string', but unfortunately the function does not allow to make conditional substitution based on (rx (optional (group string-start))) (a bug?).

I still prefer to avoid replacement of latex newlines back to empty string. Though I am really happy with the following code, I expected a more concise snippet. Unit tests may found bugs in it.

(let ((contents "\n\n 0  \n\n\na b\nc d e  \n\n\nf g  \n   h i\n\n"))
  ;; Strip leading newlines.
  (setq contents
        (replace-regexp-in-string
         (rx string-start (1+ (0+ blank) ?\n)) ""
         contents 'fixed-case 'literal))
  ;; Add explicit line breaks and strip trailing spaces.
  (setq contents
        (replace-regexp-in-string
         (rx (0+ blank) ?\n
             (optional (group (1+ (0+ blank) ?\n)))
             (optional (group (0+ blank) (not (any blank ?\n)))))
         (lambda (m)
           (let ((par (match-string 1 m))
                 (next (match-string 2 m)))
             (if next
                 (concat (if par "\n\n" "\\\\\n")
                         next)
               "")))
         contents 'fixed-case 'literal))
  ;; Indented lines.
  (replace-regexp-in-string
   (rx line-start (1+ blank))
   (lambda (m) (format "\\hspace*{%dem}" (length m)))
   contents 'fixed-case 'literal))

Feel free to use it for inspiration during your work on a patch.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]