Espandere le definizioni personali latex

  • Creatore
    Topic
  • #110688
    Up
    0
    Down
    ::


    Ciao a tutti,

    sono nuovo del gruppo e spero di non fare una domanda fuori posto, nel caso mi scuso in partenza.

    Come tutti gli utilizzatori latex ho un mio file di definizioni personali.
    Ora avrei bisogno di trovare un modo per espandere le definizioni all’interno del file sorgente.

    Ad esempio, se questa è la definizione:

    `\def\tendto#1{\overset{#1 }{\longrightarrow}}`

    e il codice sorgente è:

    `\[
    \tendto{x\to 0}
    \]`

    mi dovrebbe venire espanso come:

    \[
    \overset{ x\to 0}{\longrightarrow}
    \]

    Qualcuno di voi conosce un metodo, o se il compilatore latex fornisce un codice intermedio con le definizioni sostituite?

    Grazie in anticipo per l’aiuto, Andrea.

Visualizzazione 11 filoni di risposte
  • Autore
    Risposte
    • #110689
      claudio
      Partecipante
        Up
        0
        Down
        ::


        Benvenuto
        una cosa così?
        `
        \documentclass[10pt,a4paper]{book}
        \usepackage[utf8]{inputenc}
        \usepackage{amsmath}
        \usepackage{amsfonts}
        \usepackage{amssymb}
        \usepackage{graphicx}
        \newcommand{\mio}[2]{\genfrac{}{}{0pt}{}{#1}{#2}}
        \begin{document}
        $\mio{x\to 0}{\longrightarrow}$
        \end{document}
        `
        claudio

      • #110690
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Non mi è chiaro quale sia il tuo problema. Ti ho editato un poco il tuo messaggio perché sia visibile il codice e non il suo risultato; ma quello che capisco è che hai definito una macro (con def invece che con \newcommand — quasi sempre pericoloso fare così, perché se non si sa esattamente quello che si sta definendo, si potrebbe inchiodare il sistema TeX); usi questa macro e ottieni esattamente quello che dovresti ottenere.
          Le macro servono a quello; do produrre il risultato senza bisogno di scrivere tutta la sequenza di istruzioni native che l’interprete esegue per te, sostituendo in successione le definizioni delle ulteriori macro contenute nella tua definizione originale.

          Vedo che usi i doppi dollari per le equazioni in display; questo è un altro errore di chi prende codice altrui, magari datato. Per esempio, non è teoricamente sbagliato usare il doppio dollaro se si compila con plain tex; ma oggi, virtualmente, nessuna usa il linguaggio nativo di tex o di plain tex se non per scrivere macro da usare con il markup LaTeX. Io ti ho sostituito i doppi dollari con i comandi equivalenti di LaTeX formati da [tt] \[…\] [/tt]; il primo dei due segni è il comando di apertura di una espressione matematica in display e se viene emesso in mdo matematico viene segnalato un errore; il secondo è il comando di chiusura che può essere usato solo in matematica e se viene emesso in modo testo viene segnalato un errore. I doppi dollari non fanno nulla per verificare di essere usati nel modo di composizione giusta e il loro uso è fortissimamente scoraggiato.

          Visto che sei nuovo nel foum, ti suggerisco di scaricare dalla sezione Documentazione di questo sito le varie guide più o meno approfondite, e la guida tematica Il LaTeX Reference Manual commentato perché tu, leggendole, possa conoscere esattamente come si usa il sistema TeX con LaTeX.

          Tornando al tuo quesito; se proprio vuoi vedere sviluppate le tue macro in modo matematico, dovresti impostare i parametri \tracingcommands e \tracingmacros, come è descritto nel TeXbook, testo molto difficile per un principiante e di solito disponibile solo in versione cartacea. Viene usato dai programmatori più avanzati quando vogliono controllare le loro macro nei dettagli. Non te lo consiglio assolutamente. Invece il pacchetto trace, più facile da usare ma comunque non adatto a un principiante, permette di eseguire questa tracciatura, ma solo in modo testo.

        • #110691
          Up
          0
          Down
          ::


          Ciao e grazie mille per la risposta.

          in realtà mi serve qualcosa che rimpiazzi la mia definizione con la sua espressione originaria latex in modo che possa essere compilato anche da chi non usa le mie definizioni.

          Ad esempio:

          `
          \[
          \mio{x\to 0}{\longrightarrow}
          \]`

          dovrebbe venire sostituito da
          `
          \[
          \overset{x\to 0}{\longrightarrow}
          \]
          `
          in un file intermedio.

          GRazie ancora Andrea

        • #110692
          Up
          0
          Down
          ::


          Ciao OldClaudio e grazie per la risposta.

          So che sembra assurda la mia richiesta, in effetti le macro servono proprio a non dover riscrivere tutto il codice. Il problema è che il mio testo latex ora deve essere editato attraverso un programma di grafica che usa un sistema WYSIWYG per il testo e le figure ma utilizza un plugin per introdurre le formule in latex.

          Ora questo plugin non legge le mie definizioni ma solo i comandi latex nativi. Quindi, dato che le formule sono parecchie, mi occorre trovare un modo per effettuare la sostituzione in automatico. Avevo addirittura pensato di farmi uno script python ma speravo di poter trovare qualcosa già pronto.

          Ti ringrazio tantissimo anche per i suggerimenti che mi hai dato, in effetti sono piuttosto vecchio di latex e non sono aggiornatissimo sui nuovi pacchetti che lentamente sto imparando a utilizzare. Ogni suggerimento mi aiuta a migliorare.
          Ora proverò a leggere le guide che mi hai suggerito e a utilizzare il pacchetto trace, poi ti faccio sapere.

          Grazie ancora, Andrea.

        • #110693
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::


            Ho capito il problema.
            In questo caso trace non ti serve a niente.
            che io sapia non esiste nessun comando che ti sostirisca in automatico la tua macro con il suo sviluppo. Purtroppo bisogna fare le sostituzioni a mano, Oppure…

            Esiste, almeno per le piattaforme Mac, un programmino che si chiama LaTeXit; l’ho descritto molto in breve nella Introduzione all’arte della composizione tipografica con LaTeX. Non so se sia disponibile anche per altre piattaforme, perché, appunto, io uso un Mac. Ha le caratteristiche di un Equation Editor, ma la sua specificità è che salva nel file dove immetti la tua formula anche il codice con cui è scritta, oltre all’immagine della formula composta, cosicché per un eventuale diting, non è necessario ricominciare da zero come in altri Equation Editor. Inoltre contiene due finestre, una con la quale puoi immettere quello che ti serve con dei click di mouse, come in qualunque altro Equation Editor, e l’altro dove puoi scrivere il codice LaTeX come lo vuoi tu.
            Se non questo, visto che mi pare che lavori con ubuntu (che è una delle tante incarnazioni di Linux conformi alle direttive del consorzio Debian) sia Debian Linux vero e proprio. Puoi provare con altri Equation Editor che operino sui tuoi sistemi operativi.

            Tutti gli Equation Editor, che io sappia, non riconoscono macro personali.

            Inoltre, almeno per l’esempio che hai indicato, Kile (che non mi pare che sia più i’editor migliore per lavorare con Linux — ampiamente sorpassato dall’editor multipiattaforma TeXstudio, secondo il mio parere personale, ovviamente, quaindi senza alcune valore assoluto) forse è in grado di usare le regular expressions. Sapendole usare, e potendole usare, la sostituizione che vorresti ottenere si più fare attraverso l’editor stesso; non ti dico che sia facile, ma se usi Linux e LaTeX da tempo, non dovrebbe esserti troppo difficile farlo.

          • #110694
            marcocurreli
            Partecipante
              Up
              0
              Down
              ::


              Con Sed si dovrebbe poter fare in modo abbastanza semplice e veloce.

            • #110695
              Up
              0
              Down
              ::


              Ciao,

              desideravo ringraziarvi per tutti i consigli. Il problema ancora non l’ho risolto, probabilmente opterò per farmi a mano uno script con python che faccia le sostituzioni, però mi avete insegnato un sacco di cose.
              TexStudio è davvero molto valido. Devo ancora prenderci la mano ma lo trovo molto più semplice e stabile di kile.

              Grazie ancora Andrea

            • #110696
              gamboz
              Partecipante
                Up
                0
                Down
                ::


                se usi emacs, ti allego uno script che penso faccia quello che vuoi, ma solo per macro definite cosi’:
                \newcommand{\x}{x}

                si usa cosi’:
                M-x load-file
                …/replace-macros.txt

                (non tanto testato 🙂

                Attachments:
                You must be logged in to view attached files.
              • #110697
                Up
                0
                Down
                ::


                Ciao Gamboz

                grazie mille per lo script, penso sia l’unica strada per fare quello che mi occorre. Ho provato a utilizzarlo seguendo le tue istruzioni ma non sono riuscito a farlo andare. Il file si carica ma poi non fa nulla. Purtroppo non conosco lisp per cui non so dove mettere le mani. Cosa sbaglio secondo te?

                Ciao e ancora grazie Andrea.

              • #110698
                gamboz
                Partecipante
                  Up
                  0
                  Down
                  ::


                  lo esegui su un file tex con la macro definita con \newcommand?
                  attenzione che non capisce \def ecc. e non capisce \newcommand con argomenti oppure senza una coppia di graffe intorno al nome della macro
                  forse la versione di emacs?

                  elaboro sulla procedura:
                  dovresti aprire un tex in emacs (ad es. come questo):
                  `
                  \documentclass{article}
                  \newcommand{\x}{XXX}
                  \newcommand{\y}{YYY}
                  \begin{document}
                  a \x\ b\y c
                  \end{document}
                  `
                  poi digitare M-x load-file
                  replace-macros.txt
                  (dovrebbe dirti “Loading replace-macros.txt…done” nel minibuffer)
                  e ottieni
                  `
                  \documentclass{article}
                  \newcommand{\x}{XXX}
                  \newcommand{\y}{YYY}
                  \begin{document}
                  a XXX\ bYYYc
                  \end{document}
                  `

                • #110699
                  Up
                  0
                  Down
                  ::


                  Ciao Gamboz,

                  volevo dirti un super grazie per la macro. Ho seguito le tue istruzioni e funziona alla perfezione. Ora dovrei provare a generalizzarla per includere le definizioni contenenti parametri….dici che è un lavoro molto difficile?
                  Con python non dovrebbe essere un compito terribile. Hai qualche consiglio?

                  Ancora grazie davvero, non ho parole,

                  Andrea

                • #110700
                  gamboz
                  Partecipante
                    Up
                    0
                    Down
                    ::


                    se concosci python vai con python

                    forse e’ consigliabile partire in piccolo (macro semplici)
                    per poi crescere (argomenti, argomenti opzionali, commenti nella definizione, ecc)

                    attenzione anche alle “sottostringhe”: \x vs \xx
                    (nelle espressioni regolari \b, \< e \> sono tuoi amici)

                    la cosa piu’ delicata mi sembra il parsing delle macro
                    “\def” potrebbe essere un incubo
                    ma anche cose come la seguente potrebbero essere “divertenti” (scrivo un po’ a caso):
                    `\newcommand\x[1][2]{$\{ #1 %}
                    x#2\}$}
                    `
                    se poi condividi quello che hai fatto te ne sarei grato 🙂

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

                Go to top