Miktex 2.9

Bonjour,
Je viens d'installer Miktex 2.9 64-bit sur windows 8, et à la compilation, de fichiers contenant des \include trucmuch.tex dans des subdirectories, le message d'erreur suivant sort : "I can't write on file trucmuch.aux"... En regardant un peu sur le web, j'ai vu que miktex refuse d'écrire à l'intérieur des directories, à cause d'une sécurité supplémentaire sur la version 2.9, qu'on peut désactiver grâce à la commande "set MIKTEX_ALLOWUNSAFEOUTPUTFILES=1". Le problème est que je ne sais pas comment on peut activer cette commande !.. Alors si quelqu'un peut m'y aider ou m'indiquer une procédure de remplacement pour ce faire, je lui en serais reconnaissant. Merci
Faouzi

Réponses

  • Bonjour,

    Plutôt que recréer un topic identique, je déterre celui-ci vieux de 8 ans.
    Donc si quelqu’un pouvait expliquer la procédure, ce serait sympa.
  • Désolé, mais ça m'a l'air un peu pourri. Le truc suggéré :
    set MIKTEX_ALLOWUNSAFEOUTPUTFILES=1
    
    se lance théoriquement dans un shell Windows (cmd.exe...) ou un fichier .bat et affecte en principe les commandes lancées par la suite dans ce même shell. Donc ça « marcherait » (théoriquement) si tu compilais après depuis ce shell, en lançant par exemple pdflatex en ligne de commande.

    Dans la commande 'set' ci-dessus, MIKTEX_ALLOWUNSAFEOUTPUTFILES est une variable d'environnement. Il est possible d'affecter une variable d'environnement de manière globale pour Windows (un truc comme Paramètres système, Environnement, bla bla bla ; cela a certainement changé depuis la dernière fois que j'ai fait ça, presque au siècle dernier). On peut supposer que cela permettrait de « résoudre » le problème sans avoir à compiler depuis la ligne de commande. Mais vu le nom de ladite variable d'environnement, je ne m'y risquerais pas.

    Je regarderais d'abord si le MiKTeX est à jour (peut-être est-ce un problème déjà réglé) et s'il l'est, j'essaierais de modifier la structure de l'arborescence dans laquelle se trouvent les fichiers .tex pour ne plus avoir le problème — cela doit au moins marcher avec tout dans le même dossier !
  • Bonjour,

    Merci pour votre retour.
    J'ai la version la plus récente de MikTeX et le problème persiste toujours.
    Je ne peux pas faire \include{ ../Dossier/fichier.tex} car j'ai le message d'erreur "I can't write on file fichier.aux". Visiblement c'est une mesure de sécurité et après des recherches sur Internet, la seule méthode que j'ai trouvée est set MIKTEX_ALLOWUNSAFEOUTPUTFILES=1.
    Je n'ai pas d'erreur avec input au lieu de include mais dans ce cas, je ne bénéficie plus de la commande \includeonly, qui est très pratique puisque mon cours est divisé en de nombreux chapitres (et je souhaite bien sûr conserver l'arborescence de mes dossiers)
  • Ah ! Voilà le coupable :
    ../Dossier/fichier.tex
    
    Il est tout à fait normal que TeX refuse d'écrire dans ../Dossier, à cause du « .. ». Sans cette mesure de sécurité, compiler un document préparé par quelqu'un de mal intentionné, ou faisant appel à une classe, un package, etc., contenant du code malveillant, pourrait effacer n'importe quel fichier de ton ordinateur. A priori, faire le
    set MIKTEX_ALLOWUNSAFEOUTPUTFILES=1
    
    revient à dire « oui, je veux ça ». C'est possible, mais je te conseille plutôt de revoir ta structure pour que les fichiers à écrire soient ou bien dans le répertoire du fichier .tex principal, ou bien dans des sous-répertoires.
  • Re bonjour,

    Comme je l’ai écrit, je ne souhaite pas modifier l’arborescence de mes fichiers.
    Et je ne comprends pas:
    - pourquoi ça marche avec un input
    - ce que ça change que mon fichier à inclure soit dans un dossier parent
    Bref, tant pis, je ferai des input au lieu de include et je compilerai à chaque fois l’intégralité
  • \input ne fait que lire le fichier indiqué alors qu'\include lit le .tex et écrit un fichier .aux dans le même dossier. Par défaut, quand on compile un document, les implémentations actuelles de TeX ne permettent pas d'écrire dans des répertoires parents, et c'est heureux. Tu veux que quelqu'un puisse te transmettre un document et que lorsque tu le compiles, ça écrase un fichier important ou fiche en l'air ton système ?

    Comme je l'ai dit, tu peux mettre l'option si tu veux ; je t'ai donné le mot-clé : variable d'environnnement. Un moteur de recherche quelconque te dira comment procéder avec ta version de Windows. Évidemment, je le déconseille.
  • Mais pourquoi les fichiers dans les répertoires parents seraient plus importants?
    Voici mon arborescence:
    1. Dossier cours
    2. Dossiers chapitres
    Mon fichier cours.tex est dans le dossier cours, et il appelle les chapitres qui sont dans le dossier chapitres.
    Je ne vois vraiment pas ce qui est risqué là-dedans.
    Le fait qu'il lise me suffit largement mais malheureusement il n'existe pas de commande \inputonly
  • Si TeX peut écrire dans les répertoires parents et que mes documents sont dans /home/moi/TeX, il peut modifier /home/moi/.bashrc ou /home/moi/.zshrc puis tranquillement attendre que j'entre un mot de passe pour le récupérer, etc. Non merci.

    Je propose quelque chose comme ça :

    cours.tex qui fait \include{chapitres/truc}
    chapitres/truc.tex
    chapitres/machin.tex
    etc.

    cours.tex est au même niveau que le dossier 'chapitres'. Peut-être que ceci marche aussi à condition de compiler main.tex, à vérifier :

    main.tex qui \input cours/cours.tex
    cours/cours.tex qui \include ../chapitres/truc ou ../chapitres/machin
    chapitres/truc.tex
    chapitres/machin.tex
    etc.

    avec main.tex au même niveau que les dossiers 'cours' et 'chapitres'.
  • Merci pour les suggestions.
    Oui, si cours.tex est au même niveau que le dossier Chapitres, cela doit fonctionner
    Je ne comprends pas pourquoi il n'existe pas de commande \inputonly
  • \include fait plus qu'un simple filtre via \includeonly. Grâce aux fichiers .aux, on a accès aux références définies dans les fichiers précédemment compilés soumis à \include, même lorsqu'ils ne sont pas dans la liste du \includeonly (mais évidemment, ces références peuvent ne plus être à jour si on ne recompile jamais ces fichiers).

    Il ne serait pas difficile d'écrire une macro \inputonly et un \myinput qui va avec ; mais dans ce cas, supposons que tu mettes \inputonly{machin,truc} dans main.tex et qu'une partie de ce que tu compiles exécute $\backslash$ref{sec-bidule} où le \label{sec-bidule} correspondant est uniquement présent dans bidule.tex. Il y aurait alors un message
    LaTeX Warning: Reference `sec-bidule' on page x undefined on input line y.
    
    car la référence 'sec-bidule' ne serait pas définie au moment du $\backslash$ref{sec-bidule}. Même chose pour les éléments que bidule.tex ajoute à la table des matières : ils sont écrits dans le fichier .aux adéquat qui est ensuite relu pour écrire ces choses-là dans le fichier .toc, lequel est lu par \tableofcontents pour produire la table des matières formatée.
  • Ok, ça n’a pas l’air simple tout ça.
    Je crois que je vais déplacer mon fichier cours.tex
Connectez-vous ou Inscrivez-vous pour répondre.