Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Indentation

17 réponses
Avatar
Ph. Ivaldi
Bonjour,

J'aimerai que l'environnement LaTeX 'asy' ne soit pas indenté, comme
l'environnement 'verbatim'.
J'utilise Auctex.

Comment faire ?

Merci.
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/

7 réponses

1 2
Avatar
Vincent Belaïche
Ph. Ivaldi a écrit :
Mon but était de mettre ce code dans une extension
(asy-mode.el pour être précis) et là, il est impossible, à ma
connaissance, de passer par defcustom.
Je procède donc ainsi:
(add-hook 'after-init-hook
(lambda ()
(eval-after-load "latex"
'(progn
;; Regexp matching environments with indentation
;; at col 0 for begin/end.
(setq LaTeX-verbatim-regexp
(concat LaTeX-verbatim-regexp "|asy"))
etc...))))

Si le code est vilain j'espère qu'on me le ferra savoir :-)




Juste une question pour mieux comprendre le code ci-dessus et la
remarque de Ralf : je ne connais pas asy-mode.el, mais il semble que
c'est une extension d'AUCTeX.

Exact ?

Est-il donc possible que asy-mode.el soit chargé sans que AUCTeX n'ait
été chargé.

Si ce n'est pas possible, il serait plus logique que tu mettes ce code
dans un hook appelé au chargement d'asy-mode, un truc du genre :

(add-hook 'asy-mode-hook (lambda () ... et là tu fais tes settings ))


Si le passage en asy-mode n'offre pas de hook, il vaudrait mieux faire
une contribution à l'équipe qui développe asy-mode pour qu'ils insèrent
un run-hooks ou run-mode-hooks dans la fonction d'activation du mode que
de procéder comme tu le proposes.


cf mail de Phil Pham.


Tu veux dire que c'est à faire de toute façon ?



Ben dans le code envoyé par Phil Pham il y avait bien un

;; Filling
(make-local-variable 'LaTeX-indent-environment-list)
(add-to-list 'LaTeX-indent-environment-list
'("lstlisting" current-indentation))


Donc ça avait l'air à faire en plus que toucher au
LaTeX-verbatim-regexp. Non ?

A+,
Vincent.


PS : Sinon dans regexp-opt il y a un autre problème en plus de celui
qu'a signalé Ralf, c'est que tu passes en argument une liste de string,
et non d'une part une première expression régulière _re_ déjà formée à
laquelle tu veux ajouter une alternative, et une seconde expression
régulière _nch_ contenant la nouvelle alternative à ajouter.
Donc ça ne correspond pas à ce qu'on veut faire, et qu'on fait un peu
crasseusement :-) avec un (concat re "|" nch).
Je suis d'accord que ça marche dans 99.9% des cas de faire comme ça.
C'est juste pour le principe que je chipote.
Avatar
Ph. Ivaldi
Le 20 avril 2008, Vincent Belaïche écrivit :

Juste une question pour mieux comprendre le code ci-dessus et la
remarque de Ralf : je ne connais pas asy-mode.el, mais il semble que
c'est une extension d'AUCTeX.
Exact ?



Pas vraiment.
asy-mode est un mode majeur pour éditer du code Asymptote
( http://asymptote.sourceforge.net/ )
Mais comme on peut embarquer du code Asymptote dans un fichier LaTeX
en le mettant dans un environnement 'asy' et en effectuant une triple
compilation (pdf)latex-asy-(pdf)latex il définit quelques raccourcis
pour automatiser la chose et surtout il définit un mode hybride
LaTeX/Asy (j'ai nommé lasy-mode) qui bascule automatiquement en mode
asy-mode quand le curseur se trouve dans un environnement asy; cela
permet aussi de ne compiler que la partie de code Asymptote que l'on
édite sans avoir à recompiler le .tex

Est-il donc possible que asy-mode.el soit chargé sans que AUCTeX n'ait
été chargé.



En fait je n'avais jamais essayé mais c'est tellement bien codé ;-) que
oui, il est tout à fait possible que asy-mode.el soit chargé sans que AUCTeX
le soit.

Si ce n'est pas possible, il serait plus logique que tu mettes ce code
dans un hook appelé au chargement d'asy-mode, un truc du genre :
(add-hook 'asy-mode-hook (lambda () ... et là tu fais tes settings ))



Non, ça ne marche pas ainsi; asy-mode est un mode majeur à part
entière; il peut cependant interagir avec AUCTeX... quand on le
lui demande gentiment :-)

Si le passage en asy-mode n'offre pas de hook,



Il l'offre.

il vaudrait mieux faire
une contribution à l'équipe qui développe asy-mode pour qu'ils
insèrent un run-hooks ou run-mode-hooks dans la fonction d'activation
du mode que de procéder comme tu le proposes.



Heu... l'équipe qui développe asy-mode c'est essentiellement moi :-)
Quand je dis que je mets du code dans asy-mode.el c'est dans le fichier
qui sera officiellement distribué par Asymptote.

cf mail de Phil Pham.


Tu veux dire que c'est à faire de toute façon ?


Ben dans le code envoyé par Phil Pham il y avait bien un
;; Filling
(make-local-variable 'LaTeX-indent-environment-list)
(add-to-list 'LaTeX-indent-environment-list
'("lstlisting" current-indentation))
Donc ça avait l'air à faire en plus que toucher au
LaTeX-verbatim-regexp. Non ?



Oui, ça m'a échappé et Mathieu Moy me l'a aussi fait remarquer.
--
Amitiés,
Philippe Ivaldi.
http://piprim.tuxfamily.org/
Avatar
Ralf Angeli
* Ph. Ivaldi (2008-04-20) writes:

Le 20 avril 2008, Ralf Angeli écrivit :

* Ph. Ivaldi (2008-04-19) writes:

Je procède donc ainsi:
(add-hook 'after-init-hook



Pourquoi est-ce que tu ajoutes ça à `after-init-hook' ? Le mode est
chargé après la phase init,



Le mode certainement mais pas le paquet (voir la remarque sur le
eval-after-load).
Par acquit de conscience j'ai fait l'essai suivant:
* je crée un paquet essai.el qui contient le code
(defvar toto "Valeur par défaut de toto")
(message toto)
(provide `essai)

* dans mon .emacs je mets:
(require 'essai)
(setq toto "Valeur modifiée de toto !")

* je relance Emacs et je trouve dans *Messages* "Valeur par défaut de
toto".

Donc le paquet n'est pas chargé après l'init.

Comme dans le « eval-after-load "latex" » j'utilise une variable qui
influence le comportement de latex-mode, je m'assure que l'ordre
setq-require n'a pas d'importance en mettant tout dans un
after-init-hook.



Mais le `eval-after-load' va s'occuper de ça en tout cas. On ne doit
pas le mettre dans `after-init-hook'. Et peut-être tu n'as pas besoin
de tous les deux. Vois plus bas.

donc mettre le code dans `after-init-hook'
fait rien.

(lambda ()
(eval-after-load "latex"





La remarque précédente me fait penser que tu as lu
« add-hook 'LaTeX-mode-hook » à la place de
« eval-after-load "latex" ».



Non, j'ai vraiment lu `eval-after-load'.

Ça va changer la valeur de `LaTeX-verbatim-regexp' globalement. Il
vaudrait mieux d'utiliser `make-local-variable' avent de changer la
valeur.



Il faudrait alors que je mette
(add-hook 'LaTeX-mode-hook
(lambda nil
(set (make-local-variable 'LaTeX-verbatim-regexp)
(concat LaTeX-verbatim-regexp "|asy"))))



Non. Asy mode est un mode majeur qui charge et utilise AUCTeX,
correct ? Parce que il y a autres buffers qui utilisent de l'AUCTeX
pur, Asy mode ne doit pas changer la valeur globale de
`LaTeX-verbatim-regexp'. On peut atteindre ça par changer la valeur
buffer-local dans le moment que Asy mode est activé. Ça veux dire que
tu peux mettre le
(set (make-local-variable 'LaTeX-verbatim-regexp)
(concat LaTeX-verbatim-regexp "|asy"))
dans la fonction du mode. Mais AUCTeX doit être chargé avant cette
instruction.

--
Ralf
Avatar
Ph. Ivaldi
Le 21 avril 2008, Ralf Angeli écrivit :

* Ph. Ivaldi (2008-04-20) writes:
Comme dans le « eval-after-load "latex" » j'utilise une variable qui
influence le comportement de latex-mode, je m'assure que l'ordre
setq-require n'a pas d'importance en mettant tout dans un
after-init-hook.


Mais le `eval-after-load' va s'occuper de ça en tout cas.
On ne doit
pas le mettre dans `after-init-hook'. Et peut-être tu n'as pas besoin
de tous les deux. Vois plus bas.



OK, après quelques tests et quelques remaniements j'ai supprimé le
`after-init-hook'.

Il faudrait alors que je mette
(add-hook 'LaTeX-mode-hook
(lambda nil
(set (make-local-variable 'LaTeX-verbatim-regexp)
(concat LaTeX-verbatim-regexp "|asy"))))



Non. Asy mode est un mode majeur qui charge et utilise AUCTeX,
correct ?



Non asy-mode peut fonctionner sans AUCTeX, il ne le charge donc pas.

Parce que il y a autres buffers qui utilisent de l'AUCTeX
pur, Asy mode ne doit pas changer la valeur globale de
`LaTeX-verbatim-regexp'.



Bien chef :-)

On peut atteindre ça par changer la valeur
buffer-local dans le moment que Asy mode est activé. Ça veux dire que
tu peux mettre le
(set (make-local-variable 'LaTeX-verbatim-regexp)
(concat LaTeX-verbatim-regexp "|asy"))
dans la fonction du mode.



C'est un peu plus compliqué que ça car le mode hybride
asy-mode/latex-mode n'est activé qu'à la demande de l'utilisateur.
Pour taper un petit code asy ou modifier un fichier je ne bascule pas,
en général, en lasy-mode (le mode hybride).
Du coup une indentation de tout le code TeX va mettre la pagaille.

J'ai contourné la problème en mettant
8<------8<------8<------8<------8<------8<------8<------8<------8<------
(add-hook 'LaTeX-mode-hook
(lambda nil
(when (or asy-insinuate-latex-globally-p
(save-excursion
(beginning-of-buffer)
(save-match-data
(search-forward "begin{asy}" nil t))))
(asy-set-latex-asy-indentation))
(LaTeX-add-environments
'("asy" (lambda (env &rest ignore)
(unless asy-insinuate-latex-p (asy-insinuate-latex))
(LaTeX-insert-environment env))))))
8<------8<------8<------8<------8<------8<------8<------8<------8<------

Où `asy-set-latex-asy-indentation' est défini par:
8<------8<------8<------8<------8<------8<------8<------8<------8<------
(defun asy-set-latex-asy-indentation ()
"Set the indentation of environnment 'asy' like the environnment
'verbatim' is."
;; Regexp matching environments with indentation at col 0 for begin/end.
(set (make-local-variable 'LaTeX-verbatim-regexp)
(concat (default-value 'LaTeX-verbatim-regexp) "|asy"))
;; Alist of environments with special indentation.
(make-local-variable 'LaTeX-indent-environment-list)
(add-to-list 'LaTeX-indent-environment-list
'("asy" current-indentation)))
8<------8<------8<------8<------8<------8<------8<------8<------8<------

`asy-insinuate-latex' permet d'ajouter un menu Asymptote à côté de LaTeX
et appelle, sous certaines conditions, la
fonction `asy-set-latex-asy-indentation' mais je ne vais pas rentrer
dans les détails...

Conclusion:
Si à l'ouverture d'un .tex le code "begin{asy}" est présent ou si
l'utilisateur fait C-c C-e asy <ret> alors asy-mode ajoute un menu
Asymptote et modifie *localement* des variables d'indentation.
Pour passer en mode hybride il faut toujours le demander explicitement
avec M-x lasy-mode <ret>

Pensez-vous que ce soit correct ?
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/
Avatar
Ralf Angeli
* Ph. Ivaldi (2008-04-22) writes:

Le 21 avril 2008, Ralf Angeli écrivit :

Parce que il y a autres buffers qui utilisent de l'AUCTeX
pur, Asy mode ne doit pas changer la valeur globale de
`LaTeX-verbatim-regexp'.



Bien chef :-)



Mon Français est un peut rouillé. Quelquefois je choisis des mots
incorrects. (c:

(add-hook 'LaTeX-mode-hook
(lambda nil



Si on peut activer le mode hybride en plus d'AUCTeX, il soit (ou
serait ?) mieux d'utiliser une fonction définit par defun parce que on
pourrait l'enlever encore comme le mode est deactivé avec `remove-hook'.

(when (or asy-insinuate-latex-globally-p
(save-excursion
(beginning-of-buffer)
(save-match-data
(search-forward "begin{asy}" nil t))))



Ça pourrait durer longuement avec des fichiers grandes.

Pensez-vous que ce soit correct ?



Je ne connais pas tous le contexte pour décider que ça marche en tous
cas.

--
Ralf
Avatar
Ph. Ivaldi
Le 23 avril 2008, Ralf Angeli écrivit :

* Ph. Ivaldi (2008-04-22) writes:
Le 21 avril 2008, Ralf Angeli écrivit :
Parce que il y a autres buffers qui utilisent de l'AUCTeX
pur, Asy mode ne doit pas changer la valeur globale de
`LaTeX-verbatim-regexp'.


Bien chef :-)


Mon Français est un peut rouillé. Quelquefois je choisis des mots
incorrects. (c:



Sincèrement, c'était une boutade.
Que j'aimerais avoir un anglais aussi rouillé que
votre Français l'est...

(add-hook 'LaTeX-mode-hook
(lambda nil


Si on peut activer le mode hybride en plus d'AUCTeX, il soit (ou
serait ?)



serait

mieux d'utiliser une fonction définit par defun parce que on
pourrait l'enlever encore comme le mode est deactivé avec
`remove-hook'.



D'accord, je le mets dans un defun.

(when (or asy-insinuate-latex-globally-p
(save-excursion
(beginning-of-buffer)
(save-match-data
(search-forward "begin{asy}" nil t))))


Ça pourrait durer longuement avec des fichiers grandes.



Je crois que c'est re-search-forward qui pose problème sur les gros
fichiers.
J'ai testé (il vaut vraiment le vouloir) sur un .tex de 215 Mo en
mettant un begin{asy} au milieu.
Le curseur placé au début du fichier:
M-: (let ((stt (current-time)))
(save-excursion
(save-match-data
(search-forward "begin{asy}" nil t)))
(time-to-seconds (time-since stt))) <ret>

Résultat:
0.880891

En mettant le begin{asy} à la fin j'obtiens 0.262864 seconde et en le
mettant à la ligne 1000000, 0.068439 seconde.
Je pense que c'est acceptable alors que l'ouverture d'un .txt de la même
taille demande plus d'une minute.

Pensez-vous que ce soit correct ?


Je ne connais pas tous le contexte pour décider que ça marche en tous
cas.



S'il y a un problème, les utilisateurs ne manqueront pas de le faire
savoir :-)

Merci beaucoup pour ton aide et ta patience.
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/
Avatar
Ph. Ivaldi
Le 24 avril 2008, Ph. Ivaldi écrivit :

J'ai testé en
mettant un begin{asy} au milieu.
[...]
En mettant le begin{asy} à la fin
[...]
en le mettant à la ligne 1000000



Ce qui est pertinent ici c'est de ne pas le mettre du tout (ça sert de
dormir); la recherche dure toujours moins d'une seconde.
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/
1 2