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/

10 réponses

1 2
Avatar
Vincent Belaïche
Ph. Ivaldi a écrit :
Bonjour,

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

Comment faire ?

Merci.



Bonjour Philippe,

Dans l'info node d'AUCTeX "Indenting" on peut lire

There are certain LaTeX environments which should be indented in a
special way, like `tabular' or `verbatim'. Those environments may be
specified in the variable `LaTeX-indent-environment-list' together with
their special indentation functions. Taking the `verbatim' environment
as an example you can see that `current-indentation' is used as the
indentation function. This will stop AUCTeX from doing any indentation
in the environment if you hit <TAB> for example.
[...]
-- User Option: LaTeX-indent-environment-list
List of environments with special indentation. The second element
in each entry is the function to calculate the indentation level in
columns.

The filling code currently cannot handle tabular-like environments
which will be completely messed-up if you try to format them.
This is why most of these environments are included in this
customization option without a special indentation function. This
will prevent that they get filled.



Je pense qu'il suffit que tu fasses
`M-x customize-group<RET>LaTeX-indentation'

Puis après tu cliques sur le bouton `Show Value' dans la rubrique `
Latex Indent Environment List'

Puis après tu cliques sur un bouton 'Ins' pour ajouter un item, et tu
rentre un truc pareil que pour Verbatim.

A la fin tu n'oublies pas de sauvegrader ta customization en cliquant
sur "Set for current Session" ou "Save for future sessions" selon ton
choix puis sur "Finish", ça mettra à jour automatiquement ton fichier
d'init .emacs.

Et Wouala !

A+,
Vincent.

PS-1 : Tu peux lire la doc du paquetage widget.el si ça t'interesse de
connaitre la logique de l'interface formulaire d'Emacs (boutons, liste
éditable, etc...).
PS-2 : Tu aurais pu accéder directement à la variable
'LaTeX-indent-environment-list' grace à la commande `M-x
customize-variable<RET>LaTeX-indent-environment-list', mais je t'ai
proposé de passer par le group si jamais tu as d'autres customisations à
faire dans le même genre.
Avatar
Ph. Ivaldi
Le 18 avril 2008, Vincent Belaïche écrivit :

Bonsoir Vincent,

Je pense qu'il suffit que tu fasses
`M-x customize-group<RET>LaTeX-indentation'

Puis après tu cliques



Mais... mais... c'est un blasphème ! :-)

sur le bouton `Show Value' dans la rubrique `
Latex Indent Environment List'

Puis après tu cliques



Décidément ! :-)

sur un bouton 'Ins' pour ajouter un item, et tu
rentre un truc pareil que pour Verbatim.

A la fin tu n'oublies pas de sauvegrader ta customization en cliquant



C-c C-s marche assez bien, aussi ;-)

sur "Set for current Session" ou "Save for future sessions" selon ton
choix puis sur "Finish", ça mettra à jour automatiquement ton fichier
d'init .emacs.



Hep là... Pas touche à mon .emacs:
(setq custom-file "~/emacs.d/etc/customize.el")

Trêve de plaisanteries. J'ai fait un petit
(add-to-list 'LaTeX-indent-environment-list
'("asy" current-indentation))

et maintenant j'obtiens une indentation toute bancale:
8<------8<------8<------8<------8<------8<------8<------8<------8<------
begin{frame}
Here is an inline PDF movie, generated with the commands
begin{center}
begin{asy}
import animate;
etc...
end{asy}
% Uncomment the following line when not using the inline package option:
% ASYanimategraphics[controls,loop]{10}{movie1}{}{}
end{center}
Du text...
end{frame}
8<------8<------8<------8<------8<------8<------8<------8<------8<------

C-h v AUCTeX-version <ret>
.... Its value is "11.83"

M-x emacs-version <ret>
GNU Emacs 23.0.60.1 (i486-pc-linux-gnu, GTK+ Version 2.8.20) of
2008-02-15 on elegiac, modified by Debian

Je te remercie sincèrement pour ton aide; la variable
`LaTeX-indent-environment-list' m'avait complètement échappé mais le
problème reste entier.

D'autres idées ?
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/
Avatar
phil pham
Bonjour


D'autres idées ?



Et en ajoutant cela:

(LaTeX-verbatim-regexp): New variable. begin and end of
environments other than "verbatim*?", e.g., "program", could
start at column 0.

Cf. listings.el
%%%%%%%%%%
;; New environments
(LaTeX-add-environments
"lstlisting")
;; Filling
(make-local-variable 'LaTeX-indent-environment-list)
(add-to-list 'LaTeX-indent-environment-list
'("lstlisting" current-indentation))
(make-local-variable 'LaTeX-verbatim-regexp)
(setq LaTeX-verbatim-regexp (concat LaTeX-verbatim-regexp "|
lstlisting"))
(add-to-list 'LaTeX-verbatim-environments-local "lstlisting")
(add-to-list 'LaTeX-verbatim-macros-with-delims-local "lstinline")
(add-to-list 'LaTeX-verbatim-macros-with-braces-local "lstinline")
%%%%%%%%%%%

Cordialement, Phil Pham
Avatar
Ph. Ivaldi
Le 19 avril 2008, phil pham écrivit :

(LaTeX-verbatim-regexp): New variable. begin and end of
environments other than "verbatim*?", e.g., "program", could
start at column 0.



Bingo !
Un simple
(setq LaTeX-verbatim-regexp (concat LaTeX-verbatim-regexp "|asy"))
colle définitivement asy en colonne 0.
Je m'empresse de l'ajouter dans asy-mode.el...

Merci,
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/
Avatar
Vincent Belaïche
Mais... mais... c'est un blasphème ! :-)



Je vois que tu as dû lire ce node d'info à l'intention des
blasphémateurs (je crois que le titre était Emacs for the Heathen) qui
prétendait que la véritable signification d'EMACS est
ESC-META-ALT-CTRL-SHIFT, et qu'un authentique utilisateur d'Emacs
regrette de n'avoir pas de pédales en plus du clavier ;-)
Malheureusement je ne suis pas arrivé à retrouver de noeud.

Sinon, simple question pour éclairer le pauvre pécheur :-) que je suis :
si tu fais directement

(add-to-list 'LaTeX-indent-environment-list
'("asy" current-indentation))

Dans ton .emacs au lieu de passer pas custom-set, est-ce que ça ne
risque pas d'être écrasé au moment ou AUCTeX est chargé.

Est-ce que tu as évalué

(add-to-list 'LaTeX-indent-environment-list
'("asy" current-indentation))

avec 'M-:' juste pour faire un essai pendant que tu éditais un fichier
LaTeX, ou bien est-ce que tu as mis ça texto dans ton .emacs ?


A+,
Vincent.

PS-1: N'est-il pas dangereux de modifier dans le une variable définie
par un 'defcustom' autrement qu'en passant par la commande
customize-variable , quitte à taper la modification directement en ELISP
dans la fonction custom-set-variables pour ne pas se compromettre à
cliquer dans un joli formulaire ;-).
Je pense que si on veut LISPer directement dans ces variables il faut
prendre la précaution de mettre ça dans un hook.

PS-2: Cf docstring de add-to-list :

If you want to use `add-to-list' on a variable that is not defined
until a certain package is loaded, you should put the call to `add-to-list'
into a hook function that will be run only after loading the package.
`eval-after-load' provides one way to do this. In some cases
other hooks, such as major mode hooks, can do the job.


PS-3: J'ai fait l'essai de ce que je proposais, et effectivement ça ne
marche pas. En tout cas, même si ça ne suffisait pas c'était à faire, cf
mail de Phil Pham.

PS-4: LaTeX-verbatim-regexp est également un defcustom, donc les points
que j'évoquais précédemment pour LaTeX-indent-environment-list sont à
considérer également pour LaTeX-verbatim-regexp.

PS-5: Il est à noter que, même dans un hook, cette façon de faire un
"concat" dans une expression régulière (cf. LaTeX-verbatim-regexp dans
courriel de Phil Pham) n'est pas 100% sûre. Si par exemple il y a déjà
un environnement "as", alors l'expression régulière ne trouvera jamais
"asy" car elle s'arrêtera en trouvant "as". À moins de forcer les Regexp
à être POSIX. Bon, OK, je chipote, pour que ça arrive ça serait vraiment
pas de chance, m'enfin bon, vaut mieux quand même savoir que c'est
possible.

C'est dommage qu'il n'y ait pas une fonction add-alternative-to-regexp
ou regexp-add-alternative qui permette d'ajouter une alternative dans
une expression régulière en testant si ce n'est pas déjà dedans, et en
faisant en sorte de mettre les gros avant les petits que que l'arbre ne
puisse pas cacher la forêt (ou qu' "as" ne cache pas "asy"). Est-ce que
quelqu'un sait si un truc de ce genre existe ?



Ph. Ivaldi a écrit :
Le 18 avril 2008, Vincent Belaïche écrivit :

Bonsoir Vincent,

Je pense qu'il suffit que tu fasses
`M-x customize-group<RET>LaTeX-indentation'

Puis après tu cliques



Mais... mais... c'est un blasphème ! :-)

sur le bouton `Show Value' dans la rubrique `
Latex Indent Environment List'

Puis après tu cliques



Décidément ! :-)

sur un bouton 'Ins' pour ajouter un item, et tu
rentre un truc pareil que pour Verbatim.

A la fin tu n'oublies pas de sauvegrader ta customization en cliquant



C-c C-s marche assez bien, aussi ;-)

sur "Set for current Session" ou "Save for future sessions" selon ton
choix puis sur "Finish", ça mettra à jour automatiquement ton fichier
d'init .emacs.



Hep là... Pas touche à mon .emacs:
(setq custom-file "~/emacs.d/etc/customize.el")

Trêve de plaisanteries. J'ai fait un petit
(add-to-list 'LaTeX-indent-environment-list
'("asy" current-indentation))

et maintenant j'obtiens une indentation toute bancale:
8<------8<------8<------8<------8<------8<------8<------8<------8<------
begin{frame}
Here is an inline PDF movie, generated with the commands
begin{center}
begin{asy}
import animate;
etc...
end{asy}
% Uncomment the following line when not using the inline package option:
% ASYanimategraphics[controls,loop]{10}{movie1}{}{}
end{center}
Du text...
end{frame}
8<------8<------8<------8<------8<------8<------8<------8<------8<------

C-h v AUCTeX-version <ret>
.... Its value is "11.83"

M-x emacs-version <ret>
GNU Emacs 23.0.60.1 (i486-pc-linux-gnu, GTK+ Version 2.8.20) of
2008-02-15 on elegiac, modified by Debian

Je te remercie sincèrement pour ton aide; la variable
`LaTeX-indent-environment-list' m'avait complètement échappé mais le
problème reste entier.

D'autres idées ?
Avatar
Ph. Ivaldi
Le 19 avril 2008, Vincent Belaïche écrivit :

Mais... mais... c'est un blasphème ! :-)



Je vois que tu as dû lire ce node d'info à l'intention des
blasphémateurs ... ;-)



Même pas... mais je trouve que l'utilisation de la sourie est, en
générale, une grande perte de temps; c'est aussi pour ça que
j'apprécie Emacs.

Sinon, simple question pour éclairer le pauvre pécheur :-) que je
suis : si tu fais directement

(add-to-list 'LaTeX-indent-environment-list
'("asy" current-indentation))

Dans ton .emacs au lieu de passer pas custom-set, est-ce que ça ne
risque pas d'être écrasé au moment ou AUCTeX est chargé.



Non puisque LaTeX-indent-environment-list n'existe que si AUCTeX est
déjà chargé.

Est-ce que tu as évalué

(add-to-list 'LaTeX-indent-environment-list
'("asy" current-indentation))

avec 'M-:' juste pour faire un essai pendant que tu éditais un fichier
LaTeX, ou bien est-ce que tu as mis ça texto dans ton .emacs ?



Ni l'un ni l'autre. J'ai écrit le code dans *scratch* et fait un C-x C-e
après la dernière parenthèse.

PS-1: N'est-il pas dangereux de modifier dans le une variable définie
par un 'defcustom' autrement qu'en passant par la commande
customize-variable , quitte à taper la modification directement en
ELISP dans la fonction custom-set-variables pour ne pas se
compromettre à cliquer dans un joli formulaire ;-).
Je pense que si on veut LISPer directement dans ces variables il faut
prendre la précaution de mettre ça dans un hook.



Exact.
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 :-)

PS-3: J'ai fait l'essai de ce que je proposais, et effectivement ça ne
marche pas. En tout cas, même si ça ne suffisait pas c'était à faire,



Tout à fait !
J'étais moi aussi persuadé que ça marcherait.

cf mail de Phil Pham.



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

PS-4: LaTeX-verbatim-regexp est également un defcustom, donc les
points que j'évoquais précédemment pour LaTeX-indent-environment-list
sont à considérer également pour LaTeX-verbatim-regexp.

PS-5: Il est à noter que, même dans un hook, cette façon de faire un
"concat" dans une expression régulière (cf. LaTeX-verbatim-regexp dans
courriel de Phil Pham) n'est pas 100% sûre. Si par exemple il y a déjà
un environnement "as", alors l'expression régulière ne trouvera jamais
"asy" car elle s'arrêtera en trouvant "as".



Si, elle trouve quand même asy.
J'ai testé avec
(setq LaTeX-verbatim-regexp
"as|phrase|vasy|verbatim*?|asy|asticot|ramasse|ananas")
et ça marche parfaitement pour tous les environnements.

À moins de forcer les
Regexp à être POSIX.



En revanche le code suivant
(setq LaTeX-verbatim-regexp (regexp-opt
(list LaTeX-verbatim-regexp "asy")))
fait tout planter. Pourquoi ?

Bon, OK, je chipote,



Non, si cela avait été un risque effectif.

C'est dommage qu'il n'y ait pas une fonction add-alternative-to-regexp
ou regexp-add-alternative qui permette d'ajouter une alternative dans
une expression régulière en testant si ce n'est pas déjà dedans, et en
faisant en sorte de mettre les gros avant les petits que que l'arbre
ne puisse pas cacher la forêt (ou qu' "as" ne cache pas "asy"). Est-ce
que quelqu'un sait si un truc de ce genre existe ?



Je pensais que regexp-opt était là pour ça...

Merci pour tes remarques !
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/
Avatar
Ralf Angeli
* Ph. Ivaldi (2008-04-19) writes:

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



Pourquoi est-ce que tu ajoutes ça à `after-init-hook' ? Le mode est
chargé après la phase init, donc mettre le code dans `after-init-hook'
fait rien.

(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"))



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

En revanche le code suivant
(setq LaTeX-verbatim-regexp (regexp-opt
(list LaTeX-verbatim-regexp "asy")))
fait tout planter. Pourquoi ?



Parce que ça quote les caractères spéciales, comme `'. Vois par
example le résultat de M-: (regexp-opt '("")) <RET>.

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

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

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



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.

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" ».
Où alors il y a un truc qui m'échappe...


'(progn
;; Regexp matching environments with indentation
;; at col 0 for begin/end.
(setq LaTeX-verbatim-regexp
(concat LaTeX-verbatim-regexp "|asy"))



Ç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"))))

Pourquoi serait-ce mieux ?

En revanche le code suivant
(setq LaTeX-verbatim-regexp (regexp-opt
(list LaTeX-verbatim-regexp "asy")))
fait tout planter. Pourquoi ?



Parce que ça quote les caractères spéciales, comme `'.



Effectivement je n'avais pas lu la doc:
,----[(regexp-opt strings &optional paren)
| Return a regexp to match a string in the list strings.
| Each string should be unique in strings and should not contain any regexps,
| quoted or not.
`----
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/
Avatar
Matthieu Moy
Ph. Ivaldi writes:

Le 19 avril 2008, phil pham écrivit :

(LaTeX-verbatim-regexp): New variable. begin and end of
environments other than "verbatim*?", e.g., "program", could
start at column 0.



Bingo !
Un simple
(setq LaTeX-verbatim-regexp (concat LaTeX-verbatim-regexp "|asy"))
colle définitivement asy en colonne 0.
Je m'empresse de l'ajouter dans asy-mode.el...



En fait, il y a deux choses : comment tu indentes les deux lignes
begin et end, et comment tu indentes l'intérieur.

Puisqu'on parlait de ça, j'ai ajouté ceci à mon .emacs.el :

;; begin/end lstlisting alignés à gauche ...
(setq LaTeX-verbatim-regexp (concat LaTeX-verbatim-regexp
"|lstlisting"))
;; ... et pas d'indentation automatique à l'intérieur.
(add-to-list 'LaTeX-indent-environment-list
'("lstlisting" current-indentation))

je suppose que le mode asy marche à peu près comme ça aussi.

--
Matthieu
Avatar
Ph. Ivaldi
Le 20 avril 2008, Matthieu Moy écrivit :

En fait, il y a deux choses : comment tu indentes les deux lignes
begin et end, et comment tu indentes l'intérieur.
Puisqu'on parlait de ça, j'ai ajouté ceci à mon .emacs.el :
;; begin/end lstlisting alignés à gauche ...
[...]
je suppose que le mode asy marche à peu près comme ça aussi.



Tout à fait.
Je n'avais pas fait attention à l'intérieur de l'environnement car
la bascule asy-mode/latex-mode se fait automatiquement.
Du coup, si l'utilisateur indente tout le code en étant en latex-mode le
code asy est scotcher à gauche...
J'ajoute donc immédiatement dans asy-mode.el le
(add-to-list 'LaTeX-indent-environment-list
'("asy" current-indentation))

Merci pour cette précieuse mise au point !

PS: pour ceux qui utilisent l'extraordinaire asy-mode ;-) , inutile de
se précipiter comme une bête sur le dépôt SVN; il est verrouillé le
temps que le mainteneur revienne.
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/
1 2