modificare un sty originale

  • Creatore
    Topic
  • #103234
    claudio
    Partecipante
      Up
      0
      Down
      ::


      ho un problema con
      dot2texi.sty
      l’avevo segnalato in precedenza
      il pacchetto non mi riconosce windows 7
      la riga è questa dove fallisce
      `
      \immediate\write18{\ifwindows del \else rm — \fi “\ip@file”}
      `

      ho risolto con questo taglio
      `
      \immediate\write18{del “\ip@file”}
      `
      a parte il caso particolare
      come si opera in questi casi?
      il bisturi è obbligatorio?
      ciao
      claudio

    Visualizzazione 3 filoni di risposte
    • Autore
      Risposte
      • #103235
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Ci sono due cose da fare:
          1) non si modifica il file originale, ma si aggiunge nel proprio preambolo o in un file di macro personali la ridefinizione corretta della macro incriminata.
          2) si cerca nel file sorgente che contiene l’errore (nel caso tuo l’autore o il manutentore di dot2texi.sty) e gli si comunica il problema, possibilmente suggerendogli come superarlo; certamente non con la tua modifica che non prende più in considerazione le macchine UNIX.

        • #103236
          Up
          0
          Down
          ::


          In teoria quel codice fa parte di un costrutto più esteso, il cui unico scopo è impostare vero o falso i condizionali [tt]\ifwindows[/tt] e [tt]\ifdtt@ShellEscapeEnabled[/tt]. Il condizionale [tt]\ifwindows[/tt] compare solo in quel frangente, dove viene impostato, ma non viene più utilizzato in nessun’altro posto. Ho il dubbio che sia un rimasuglio di qualche aggiornamento dimenticato dagli autori del pacchetto.

          Ti consiglio di copiare il file dot2texi.sty e cambiargli nome, poi sostituisci le righe 114-139
          `
          \newif\ifdtt@ShellEscapeEnabled
          \newif\ifwindows
          \edef\ip@file{\jobname.w18}
          \edef\ip@sig{write18-test-\the\year\the\month\the\day\the\time}
          \edef\ip@win{'\ip@sig'}
          \def\ip@read@file{%
          \newread\instream
          \openin\instream=\ip@file
          \@tempcnta=\endlinechar
          \endlinechar=-1
          \read\instream to\@tempa
          \endlinechar=\@tempcnta
          \closein\instream}
          \immediate\write18{echo \ip@win >”\ip@file”}
          \IfFileExists{\ip@file}{\dtt@ShellEscapeEnabledtrue}{\dtt@ShellEscapeEnabledfalse}
          \ifdtt@ShellEscapeEnabled
          \ip@read@file
          \ifx\@tempa\ip@sig
          \windowsfalse
          \else
          \ifx\@tempa\ip@win
          \windowstrue
          \fi
          \fi
          \immediate\write18{\ifwindows del \else rm — \fi “\ip@file”}
          \fi
          `
          con semplicemente
          `
          \newif\ifdtt@ShellEscapeEnabled
          \ifnum\pdfshellescape\@ne
          \dtt@ShellEscapeEnabledtrue
          \else
          \dtt@ShellEscapeEnabledfalse
          \fi
          `
          [tt]\pdfshellescape[/tt] è un contatore che viene impostato all’inizio della compilazione dal programma con tre possibili valori:

          • [tt]0[/tt], quando write18 è completamente disabilitato
          • [tt]1[/tt], quando write18 è attivo
          • [tt]2[/tt], quando write18 è attivo in modalità ristretta

          La modifica che ti ho indicato semplicemente, invece di usare tutto il sistema complesso di prima, controlla se write18 è attivo e quindi imposta a vero il condizionale [tt]\ifdtt@ShellEscapeEnabled[/tt]. Dovrebbe essere indipendente dal sistema operativo. Unica pecca: questo contatore è definito solo per [tt]pdflatex[/tt]. Se devi compilare con altri programmi occorre rattoppare in altro modo.

        • #103237
          claudio
          Partecipante
            Up
            0
            Down
            ::


            quella parte di codice viene
            da
            ifplatform
            e serve anche per scegliere tra rm unix e del windows
            il problema che dot2tesxi è del 2008 e che sospetto
            sia non mantenuto.
            ciao
            claudio

          • #103238
            Up
            0
            Down
            ::


            In realtà anche la parte del [tt]rm[/tt] o [tt]del[/tt] fa parte del meccanismo di rivelazione. In sostanza crea il file [tt]\jobname.w18[/tt] (che quindi avrà il nome del tuo main-file) con una stringa contenuta nella macro [tt]\ip@win[/tt] racchiusa tra apici [tt]'[/tt]. Su linux, la shell di comando interpreta gli apici come delimitatori (tutto il testo compreso tra essi verrà utilizzato senza essere interpretato, quindi anche caratteri che altrimenti avrebbero altri impieghi) e li rimuove, mentre immagino che su windows, nelle versioni precedenti a 7, non fossero interpretati o diversamente. Dopo aver salvato il file, legge la prima riga (se sei in shell escape) e la confronta con le macro [tt]\ip@win[/tt] e [tt]\ip@sig[/tt] per comprendere se sei su un sistema unix o windows. Nel primo caso il condizionale [tt]\ifwindows[/tt] viene impostato a vero, nel secondo a falso. Infine elimina il file [tt]\jobname.w18[/tt] usando la opportuna funzione in base al sistema operativo impiegato. Il condizionale [tt]\ifwindows[/tt] immagino servisse solo per selezionare il corretto comando tra [tt]del[/tt] o [tt]rm[/tt] per eliminare il file [tt]\jobname.w18[/tt]. Se usi la versione che ti ho indicato non hai bisogno di tutto il costrutto e non servono né il condizionale [tt]\ifwindows[/tt], né la rimozione del file [tt]\jobname.w18[/tt] perché non viene creato.

            In sostanza, tutto quel codice serve per comprendere se hai attivato lo shell escape e impostare il condizionale [tt]\ifdtt@ShellEscapeEnabled[/tt] a vero o falso di conseguenza. Se stai compilando con [tt]pdflatex[/tt], tutto questo la fai più semplicemente valutando quale valore viene assegnato al contatore [tt]\pdfshellescape[/tt] e agendo di conseguenza.

        Visualizzazione 3 filoni di risposte
        • Devi essere connesso per rispondere a questo topic.

        Go to top