bug-auctex
[Top][All Lists]
Advanced

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

bug#56160: 13.1.3; fill breaks verbatim macros not followed with spaces


From: Ikumi Keita
Subject: bug#56160: 13.1.3; fill breaks verbatim macros not followed with spaces
Date: Wed, 29 Jun 2022 15:28:08 +0900

Hi Thibaut,

>>>>> Thibaut Benjamin <thibaut.benjamin@gmail.com> writes:
> The behavior of LaTeX-fill-* seems to break when used with a verbatim
> macro which is not followed by a space.

> A minimal example is a TeX file containing only the following line

>> Lorem ipsum dolor sit amet, consectetur adipiscing elit, \verb|sed 
>> do|eiusmod tempor
>> 
> Running the LaTeX-fill-buffer command yields the following, which does not
> compile since a line break is inserted inside a verbatim macro.

>> Lorem ipsum dolor sit amet, consectetur adipiscing elit, \verb|sed
>> do|eiusmod tempor

Thanks for your report. I can confirm it. (My `fill-column' is 75.)

To developers:
The reason for this behavior is that `LaTeX-fill-move-to-break-point'
moves the point on the space inside "\verb|sed do|". The function
tries to avoid line break inside \verb, but it doesn't work for this case:
,----
| (defun LaTeX-fill-move-to-break-point (linebeg)
|   "Move to the position where the line should be broken."
|   (fill-move-to-break-point linebeg)
| [...]
|   ;; Cater for \verb|...| (and similar) contructs which should not be
|   ;; broken. (FIXME: Make it work with shortvrb.sty (also loaded by
|   ;; doc.sty) where |...| is allowed.  Arbitrary delimiters may be
|   ;; chosen with \MakeShortVerb{<char>}.)  This could probably be
|   ;; handled with `fill-nobreak-predicate', but this is not available
|   ;; in XEmacs.
|   (let ((final-breakpoint (point))
|         (verb-macros (regexp-opt (append (LaTeX-verbatim-macros-with-delims)
|                                          
(LaTeX-verbatim-macros-with-braces)))))
|     (save-excursion
|       ;; Look for the start of a verbatim macro in the current line.
|       (when (re-search-backward (concat (regexp-quote TeX-esc)
|                                         "\\(?:" verb-macros 
"\\)\\([^a-z@*]\\)")
|                                 (line-beginning-position) t)
|         ;; Determine start and end of verbatim macro.
|         (let ((beg (point))
|               (end (if (not (string-match "[ [{]" (match-string 1)))
|                        (cdr (LaTeX-verbatim-macro-boundaries))
|                      (TeX-find-macro-end))))
|           ;; Determine if macro end is behind fill column.
|           (when (and end
|                      (> (- end (line-beginning-position))
|                         (current-fill-column))
|                      (> end final-breakpoint))
|             ;; Search backwards for place to break before the macro.
|             (goto-char beg)
|             (skip-chars-backward "^ \n")
|             ;; Determine if point ended up at the beginning of the line.
|             (when (save-excursion (skip-chars-backward " \t%") (bolp))
|               ;; Search forward for a place to break after the macro.
|               (goto-char end)
|               (skip-chars-forward "^ \n" (point-max)))
|             (setq final-breakpoint (point))))))
|     (goto-char final-breakpoint))
`----
In this case, the end position of "\verb|sed do|" sits before fill
column, so the conditional of `when' after the comment "Determine if
macro end is behind fill column." evaluates to nil. I suppose that this
code presumes that \verb|...| always has a space after it.

I think it's a good chance to accomplish an idea suggested in the above
comment, to make use of `fill-nobreak-predicate'; we no longer have to
cater for XEmacs.

How about the attached patch? This temporally adds `LaTeX-verbatim-p' to
`fill-nobreak-predicate' to avoid space inside \verb|...| when
`fill-move-to-break-point' is called.

Note that it would fail when the user uses tex-font.el or disables
font lock, because `LaTeX-verbatim-p' depends on the facilities of
font-latex.el.

What do you think about it?

Regards,
Ikumi Keita
#StandWithUkraine #StopWarInUkraine

Attachment: tentative-patch
Description: Use fill-nobreak-predicate


reply via email to

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