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

Inclure un modèle LaTeX automatiquement

11 réponses
Avatar
rachid
Bonsoir à tous,
j'apprends petit à petit toutes les inombrables possibilités qu'offre
emacs et à ce sujet je souhaite inclure automatiquement un fichier latex
contenant les macros de base chaque fois que j'ouvre un nouveau fichier
latex (*.tex) donc j'essaie de le faire avec mes connaissances limités
et la méthode du "hook".
Voici ce que j'ai mis dans mon ~/.emacs :

(setq latex-mode-hook
'(lambda ()
(insert-file "~/modele.tex")))

Mais il ne se passe rien quand j'ouvre un nouveau latex, pourriez-vous
m'aider à résoudre simplement ce problème?
Merci.

10 réponses

1 2
Avatar
Benoit Izac
Bonjour,

le 09/03/2005 à 21:23, rachid a écrit
dans le message <422f5a55$0$29948$ :

j'apprends petit à petit toutes les inombrables possibilités qu'offre
emacs et à ce sujet je souhaite inclure automatiquement un fichier
latex contenant les macros de base chaque fois que j'ouvre un nouveau
fichier latex (*.tex) donc j'essaie de le faire avec mes connaissances
limités et la méthode du "hook".
Voici ce que j'ai mis dans mon ~/.emacs :

(setq latex-mode-hook
'(lambda ()
(insert-file "~/modele.tex")))



Tu devrais regarder la documentation de insert-file :

| This function is meant for the user to run interactively.
| Don't call it from programs! Use `insert-file-contents' instead.
| (Its calling sequence is different; see its documentation).

Je ne sais pas si c'est ce que tu cherches mais je trouve ça vraiment
pratique : <http://emacs-template.sourceforge.net/>

--
Benoit Izac
Avatar
Matthieu Moy
rachid writes:

(setq latex-mode-hook
'(lambda ()
(insert-file "~/modele.tex")))



Surtout pas, sinon, tu vas ajouter "modele.tex" a chaque fois que tu
ouvres un fichier LaTeX (même si il existait déjà).

(et au passage,

* C'est `add-hook' et non `setq' qu'il faudrait dans ce cas là,

* L'apostrophe devant le lambda est inutile (et même nuisible) en
Emacs lisp.)

Voir plutôt:

,----[ C-h f auto-insert RET ]
| auto-insert is an interactive compiled Lisp function in `autoinsert'.
| (auto-insert)
|
| Insert default contents into new files if variable `auto-insert' is non-nil.
| Matches the visited file name against the elements of `auto-insert-alist'.
`----

--
Matthieu
Avatar
drkm
Matthieu Moy writes:

rachid writes:

(setq latex-mode-hook
'(lambda ()
(insert-file "~/modele.tex")))





[...]

Voir plutôt:

,----[ C-h f auto-insert RET ]
| auto-insert is an interactive compiled Lisp function in `autoinsert'.
| (auto-insert)
|
| Insert default contents into new files if variable `auto-insert' is non-nil.
| Matches the visited file name against the elements of `auto-insert-alist'.
`----



Je ne connais (n'utilise) ni auto-insert ni Template (cité par
Benoît). Une autre méthode pourrait être, selon les préférences du
PO, une commande appelée interactivement (liée à une séquence de son
choix) insérant un fichier donné, selon un nom symbolique. Quelque
chose comme :

(defvar bi:latex-templates-alist
'(("rapport" . "~/LaTeX/templates/rapport.tex")
("article" . "~/LaTeX/templates/article.tex")
("styleN" . "/usr/local/share/LaTeX/..."))
"Styles de fichiers LaTeX.
La clef est le nom du style, la valeur le nom du fichier associé,
contenant un template à insérer dans un nouveau document de ce
style.")

(defun bi:insert-latex-template (style)
"Insère un template de document LaTeX, correspondant au `STYLE'.
Cfr. `bi:latex-templates-alist'."
(interactive
(list (completing-read "Style: " bi:latex-templates-alist nil t)))
(insert-file-contents (assoc style bi:latex-templates-alist)))

(eval-after-load 'tex-mode
'(define-key latex-mode-map (kbd "...") 'bi:insert-latex-template))

--drkm
Avatar
Jean Magnan de Bornier
rachid a écrit :
Bonsoir à tous,
j'apprends petit à petit toutes les inombrables possibilités qu'offre
emacs et à ce sujet je souhaite inclure automatiquement un fichier latex
contenant les macros de base chaque fois que j'ouvre un nouveau fichier
latex (*.tex) donc j'essaie de le faire avec mes connaissances limités
et la méthode du "hook".
Voici ce que j'ai mis dans mon ~/.emacs :

(setq latex-mode-hook
'(lambda ()
(insert-file "~/modele.tex")))

Mais il ne se passe rien quand j'ouvre un nouveau latex, pourriez-vous
m'aider à résoudre simplement ce problème?
Merci.



Je te recommande d'utiliser template, il faut investir un peu de temps
mais c'est très agréable. Je t'envoie en privé un exemple si tu veux.
--
jean
Avatar
Matthias Meulien
drkm écrivait :

(...) Je ne connais (n'utilise) ni auto-insert ni Template (cité par
Benoît). Une autre méthode pourrait être,



AMHA, il ne s'agit pas d'une « autre méthode » : auto-insert fait ça !

Chez moi j'ai ça :

;; Charge le paquettage d'insertion automatique de squelettes ou de
;; fichiers à la creation d'un fichier puis précise où trouver les
;; modèles à insérer.
(load-library "autoinsert")
(setq auto-insert-directory (expand-file-name "~/.insert/"))
(add-hook 'find-file-hooks 'auto-insert)

;; Définition de l'insertion automatique lors de la création d'un
;; fichier auquel est associé le mode `latex-mode'
(add-to-list 'auto-insert-alist '(latex-mode . alt-auto-insert-latex))

(defun alt-auto-insert-latex ()
"Insert a template for a latex file depending on the document class."
(interactive)
(let* ((class
(completing-read
"Class of the document (default value is `none'): "
'(("article" 1) ("report" 2) ("book" 3)
("letter" 4) ("slides" 5) ("exam" 6)
("none" 7)) nil t nil nil "none"))
(name (concat auto-insert-directory class ".tex")))
(if (not (equal class "none"))
(cond ((file-readable-p name) (insert-file-contents name))
(t (message "No template file found for this document class")))
(skeleton-insert
'((read-file-name "Main file: " )
"% Time-stamp: <" (current-time-string)
" " (user-login-name) ">n% Author: "
(user-full-name) " <" (progn user-mail-address) ">nn"
_ "nn%% Local Variables:n%% tex-main-file: ""
str ""n%% End:n")))))

Cordialement,
--
Matthias
Avatar
drkm
Matthias Meulien writes:

drkm écrivait :

(...) Je ne connais (n'utilise) ni auto-insert ni Template (cité par
Benoît). Une autre méthode pourrait être,



AMHA, il ne s'agit pas d'une « autre méthode » : auto-insert fait ça !

Chez moi j'ai ça :



D'après ce que je vois de ton code (et je répète que je ne connais
pas Auto Insert, et peux donc dire des conneries), Auto Insert
lui-même ne connait pas les styles multiples. En fait, tu à une
fonction tout à fait similaire à ce que j'ai proposé, fonction que tu
as insérée dans Auto Insert, plutôt que de la binder à une séquence.

C'est intéressant, cette possibilité. Mais je préfère tout de même
la manière que j'ai proposée, au niveau de l'alist (plutôt que de
coder les infos en dur dans l'appel à `completing-read'). Ce qui
permet de plus de s'affranchir de la contrainte de l'unique répertoire
central.

Donc si j'ai bien compris, ceci s'insère dans Auto Insert :

(defvar bi:latex-templates-alist
'(("rapport" . "~/LaTeX/templates/rapport.tex")
("article" . "~/LaTeX/templates/article.tex")
("styleN" . "/usr/local/share/LaTeX/..."))
"Styles de fichiers LaTeX.
La clef est le nom du style, la valeur le nom du fichier associé,
contenant un template à insérer dans un nouveau document de ce
style.")

(defun bi:insert-latex-template ()
"Insère un template de document LaTeX, correspondant au `STYLE' prompté.
Cfr. `bi:latex-templates-alist'."
(let ((style (completing-read "Style: " bi:latex-templates-alist nil t)))
(insert-file-contents (assoc style bi:latex-templates-alist))))

(push '(latex-mode . bi:insert-latex-template) auto-insert-alist)

Le problème que je vois, c'est que d'après ton code, Auto Insert se
sert de `find-file-hook'. Et si j'ai bonne mémoire, le nom du fichier
n'est pas encore disponible à ce moment. Ce qui peut être un frein à
l'ajout d'une sorte de template, où l'on résoudrait des tags comme le
nom de l'auteur, la date ou le nom de fichier (comme le fait Template,
je crois).

Enfin, il faudrait que j'y jette un oeil, parce que là, je dis
peut-être des bêtises.

--drkm
Avatar
Matthieu Moy
drkm writes:

Le problème que je vois, c'est que d'après ton code, Auto Insert se
sert de `find-file-hook'. Et si j'ai bonne mémoire, le nom du fichier
n'est pas encore disponible à ce moment.



Mauvaise mémoire ;-) (changer de mémoire ?)

Ce qui peut être un frein à l'ajout d'une sorte de template, où l'on
résoudrait des tags comme le nom de l'auteur, la date ou le nom de
fichier (comme le fait Template, je crois).



Je fais ça avec auto-insert, donc, ça doit être possible.

En fait, le truc a droite dans `auto-insert-alist', c'est un skeleton,
qui peut contenir de code lisp quelconque.

L'avantage par rapport a Template, c'est que c'est un truc qui fait
partie d'Emacs, rien d'autre a installer.

--
Matthieu
Avatar
Matthias
drkm écrivait :

(...) Ce qui permet de plus de s'affranchir de la contrainte de
l'unique répertoire central.



Mais cette contrainte n'existe pas avec `auto-insert' ! La doc de la
variable `auto-insert-alist' dit explicitement que le nom de fichier a
insérer peut ne pas être relatif au répertoire désigné dans
`auto-insert-directory' :

ACTION may be a skeleton to insert (see `skeleton-insert'), an
absolute file-name or one relative to `auto-insert-directory' or a
function to call.

Donc si j'ai bien compris, ceci s'insère dans Auto Insert :



Oui, c'est cela.

(...) Le problème que je vois, c'est que d'après ton code, Auto
Insert se sert de `find-file-hook'. Et si j'ai bonne mémoire, le nom
du fichier n'est pas encore disponible à ce moment.



Puisque l'insertion doit être liée au mode du tampon et que celui-ci
est déterminé à partir du nom de fichier (via `auto-mode-alist'), ce
nom est connu au moment de l'appel à `find-file-hook', non ?
--
Matthias
Avatar
drkm
Matthieu Moy writes:

drkm writes:

Le problème que je vois, c'est que d'après ton code, Auto Insert se
sert de `find-file-hook'. Et si j'ai bonne mémoire, le nom du fichier
n'est pas encore disponible à ce moment.



Mauvaise mémoire ;-)



En effet, j'aurais du tester ceci avant de répondre :

(add-hook 'find-file-hook
(lambda ()
(message "%S (%S)" buffer-file-name (buffer-file-name))))

Mais ça n'est pas mémoire qui est en cause. Ça veut plutôt dire que
je peux supprimer un hack dégueulasse que j'ai quelque part ;-)

(changer de mémoire ?)



Si seulement c'était possible.

Ce qui peut être un frein à l'ajout d'une sorte de template, où l'on
résoudrait des tags comme le nom de l'auteur, la date ou le nom de
fichier (comme le fait Template, je crois).



Je fais ça avec auto-insert, donc, ça doit être possible.



Oui, je n'ai pas testé avant de poster. Mea cupla.

En fait, le truc a droite dans `auto-insert-alist', c'est un skeleton,
qui peut contenir de code lisp quelconque.



Mmmh. Il faut que je m'y intéresse un peu. J'avais regardé du côté
de Template, mais ça ne m'a pas trop plu pour ce que je voulais faire.
J'ai alors codé quelque chose qui s'apparente apparemment à un Auto
Insert simplifié (mais contenant un truc dégueux, dont je parle plus
haut).

Cool, je vais pouvoir supprimer mon code et utiliser Auto Insert :-)

L'avantage par rapport a Template, c'est que c'est un truc qui fait
partie d'Emacs, rien d'autre a installer.



En effet.

--drkm
Avatar
drkm
Matthias writes:

drkm écrivait :

(...) Ce qui permet de plus de s'affranchir de la contrainte de
l'unique répertoire central.



Mais cette contrainte n'existe pas avec `auto-insert' !



Je ne parle pas d'Auto Insert. Mais de la fonction que tu as
postée. Les valeurs permises sont (i) directement codées dans
completing-read et (ii) obligatoirement relative à un répertoire
central. Je trouve que ce n'est pas facilement adaptable.

Alors qu'en sortant l'alist contenue dans l'appel à completing-read,
et en en faisant une variable, ça permet de personaliser plus
facilement. Par exemple si tu es amené à travailler sur une machine
autre que la tienne. Ou si tu veux partager ta config avec un autre
utilisateur.

[...]

Puisque l'insertion doit être liée au mode du tampon et que celui-ci
est déterminé à partir du nom de fichier (via `auto-mode-alist'), ce
nom est connu au moment de l'appel à `find-file-hook', non ?



En effet, je n'avais pas testé avant de poster, je me suis juste
servi de ma pauvre mémoire (cfr. réponse à Matthieu).

--drkm
1 2