Bloccare compilazione

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


      Come si fa bloccare la compilazione e scrivere nel log un messaggio personale?
      Mi spiego
      ho preparato un comando che mi scrive un trinomio di secondo grado il classico
      `
      ax^2+bx+c
      `
      Come fare in test su a
      del tipo se a=0 allora blocco tutto e scrivo nel log “hai messo a =0 controlla”
      ciao
      claudio

    Visualizzazione 12 filoni di risposte
    • Autore
      Risposte
      • #121037
        strolego
        Partecipante
          Up
          0
          Down
          ::


          Io farei
          `
          \usepackage{ifthen}
          \newcommand{\testzero}[1]{\relax
          \ifthenelse{ #1=0}{
          \message{a=0}%
          \stop}{#1}
          }`

          ora se tu scrivi
          `\testzero{2}`
          va avanti se altrimenti vale zero si ferma con messaggio a terminale e nel log

          Ci sono di sicuro altre soluzioni

        • #121038
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::


            Quello che ti scrive @strolego è corretto, ma dipende da cosa ne vuoi fare del tuo trinomio di secondo grado.

            La scrittura ax^2+bx+c va benissimo per essere stampata; ma se dopo avere scritto la forumletta vuoi calcolare le radici con valori numerici di a, b, c, lo puoi fare con \fpeval, ma dentro il suo argomento devi mettere il test di @stolego, oppure un test differente che sfrutti le funzionalità di \fpeval; vedi la documentazione di xfp.

            LaTeX, come sai bene, serve essenzialmente per scrivere; serve anche per disegnare e per disegnare deve poter eseguire dei calcoli; TeX e LaTeX209 si limitavano moltissimo nei calcoli, in particolare eseguendoli con numeri reali, perché al su internoi valori numerisci erano sempre espressi mediante scaled points, cioè con valori interi corrispondenti a 2(16) volte il valore di una lunghezza specificato in punti tipografici. Per fortuna alcunianni fa gli sviluppi di LaTeX3 hanno permesso di mettere a disposizione degli utenti il pacchetto xfp che permette di fare conti con numeri reali veri esprssi in decimale con 16 cifre fratte(di defaault); le macro \fpeval e \inteval permettono di “evaluate a floating point expression” e “evaluate an integer expression” (ho scritto in inglese in modoche i nomi delle macro abbiano un significato ben preciso. Puoi fare di tutto con queste due macro. @egreg ne ha scritto sia su ArsTeXnica, sia nella documentazione di vari pacchetti. Io ho usato queste cose sia per il pacchetto graphpaper (insieme a Francesco) sia per i pacchetti curve2e e per euclideangeometry. Capisco che con i tempi che corrono TikZ spopoli e annulli tutti i pacchetti grafici disponibili, ma mi sono divertito un mondo a scrivere macro per fare calcoli di ogni genere, compresi quelli con numeri complessi, che sono un modo molto comodo per lavorare con le coordinate del piano, sia usando la forma cartesiana sia quella polare. Recentemente ho scritto un pacchetto che sostituisce per certi scopi un medaglione realizzabile con tcolorbox, basato su TikZ), con qualche macro che sfrutta curve2e, e la velocità di compilazione è almeno raddoppiata se non triplicata.

            Quindi ora i conti si possono fare; ovviamente richiedono dei test e sono disponibili sia i comandi nativi di TeX, sia il pacchetto ifthen che ti ha suggerito @strolego, sia altri test incorporati nelle macro che eseguono calcli in virgola mobile.

            Scusa la prolissità e la mia mancanza di modestia (chi si loda si imbroda, dice il proverbio); ma ci sono tante cose a portata di tutti che non vengono usate o sfruttate abbastanza.

          • #121039
            claudio
            Partecipante
              Up
              0
              Down
              ::


              no i calcoli li fanno gli altri
              devo solo scrivere un comando che dati tre numeri mi stampi un trinomio di secondo grado.
              Ovviamente a deve essere diversa da zero. La richiesta è paranoica se per sbaglio arriva un a=0 il sistema si deve bloccare.
              Cercando nel forum ho trovato un problema simile e il contributo di Gustavo, l’indimenticabile letteracdp
              eccolo link
              ciao e grazie
              claudio

            • #121040
              claudio
              Partecipante
                Up
                0
                Down
                ::


                ho provato a implementarlo così
                `
                \documentclass[10pt,a4paper]{article}
                \usepackage{etoolbox}
                \newcommand{\parteAtriSec}[1]{\ifnumequal{#1}{0}{\message{a=0}\stop}
                {\ifnumcomp{#1}{>}{0}{\ifnumequal{#1}{1}
                {x^{2}}{#1x^{2}}}
                {\ifnumequal{#1}{-1}{-x^{2}}{#1x^{2}}}}}
                \newcommand{\trimonioSecGrad}[3]{\parteAtriSec{#1}}
                \begin{document}
                $\trimonioSecGrad{0}{-1}{1}$
                \end{document}
                `

                nel log appare il messaggio a=0 ma l’errore è il math mode non concluso
                ciao
                claudio

              • #121041
                robitex
                Amministratore del forum
                  Up
                  0
                  Down
                  ::


                  Ciao.
                  Ti consiglio Lua per risolvere e mantenere “elevate potenzialità espressive” del codice.
                  Per esempio, in Lua puoi creare un oggetto che corrisponde al trinomio.
                  Al momento della creazione, puoi effettuare i controlli e aggiungere nuovi metodi al bisogno.
                  TeX non è adatto per svolgere questi compiti, mentre Lua è a disposizione per compierli abbastanza bene.
                  Si può pensare addirittura di connettere software esterni di calcolo simbolico.

                  Per esempio, in questo codice l’idea è passare i tre valori (numerici) a Lua. Lua li valida (controlla solo se la a è diversa da zero) e costruisce l’oggetto.
                  Poi un metodo (il :tex() ) avvia il codice matematico LaTeX necessario per stampare il trinomio.
                  Questo metodo non è elegante. Troppi if then else. Ma si sa come rimediare… :

                  A questo punto non è difficile immaginare un metodo che calcola le radici, disegna il grafico, risolve disequazioni, usa una diversa lettera, stampa in ordine inverso rispetto al grado, somma due trinomi, eccetera eccetera.
                  Potrei anche aggiungere nuovi metodi di costruzioni dell’oggetto, come uno che fa il quadrato del binomio.

                  Ecco il file:
                  [attachment=2696]u.tex[/attachment]

                  Alla prossima.
                  R.

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


                    La tua risposta mi ha fatto venir voglia di studiare Lua
                    Carina è la gestione dell’input, le variabili locali etc
                    Esiste il costrutto case ?
                    ciao
                    Claudio

                  • #121043
                    robitex
                    Amministratore del forum
                      Up
                      0
                      Down
                      ::

                      claudio” post=121559La tua risposta mi ha fatto venir voglia di studiare Lua
                      Carina è la gestione dell’input, le variabili locali etc
                      Esiste il costrutto case ?
                      ciao
                      Claudio

                      No, sarebbe una sintassi ridondante per un linguaggio che ricerca l’essenzialità.
                      Ti rimando alla guida tematica sull’argomento (dovrebbe esserci il link nella mia firma in basso).
                      R.

                    • #121044
                      claudio
                      Partecipante
                        Up
                        0
                        Down
                        ::


                        Continuando con il discorso,
                        l’esempio mio con etoolbox e quello di robitex permettono di scrivere il trinomio abc. Quelle righe di codice non sono più idonee
                        per scrivere bac o cba. In pratica servono 6 funzioni diverse.
                        Per quanto ne so non è possibile scrivere in latex una procedura che presi a,b,c li scriva in ordine casuale senza utilizzare una variabile globale (abc, acb, bac etc..).
                        In lua, ho intuito che è possibile
                        ciao
                        claudio

                      • #121045
                        robitex
                        Amministratore del forum
                          Up
                          0
                          Down
                          ::

                          claudio” post=121561Continuando con il discorso,
                          l’esempio mio con etoolbox e quello di robitex permettono di scrivere il trinomio abc. Quelle righe di codice non sono più idonee
                          per scrivere bac o cba. In pratica servono 6 funzioni diverse.
                          Per quanto ne so non è possibile scrivere in latex una procedura che presi a,b,c li scriva in ordine casuale senza utilizzare una variabile globale (abc, acb, bac etc..).
                          In lua, ho intuito che è possibile
                          ciao
                          claudio

                          Si lo è sicuramente per esempio ricorrendo a generatori casuali esterni.
                          Tuttavia occorre un momento per riflettere perché ci sono due tipi diversi di procedura di shuffle casuale rispetto al momento della compilazione.

                          Infatti, durante la compilazione il codice mescola più o meno casualmente un insieme di elementi.
                          Una seconda compilazione dello stesso documento darebbe quindi un risultato differente.

                          Oppure è possibile ottenere la sequenza casuale random e poi inserirla nel sorgente come dato fisso.
                          Ogni compilazione avrà la sua sequenza casuale ma sarà sempre la stessa.

                          Ecco un esempio:`% !TeX program = LuaLaTeX
                          \directlua{
                          function shuffle(data, rnd_seq)
                          local t = {}
                          for i, pos in ipairs(rnd_seq) do
                          t = data[pos]
                          end
                          return t
                          end
                          }

                          \documentclass{article}
                          \begin{document}
                          (\directlua{
                          local shuffled_seq = shuffle({ 'a', 'b', 'c' }, {3, 1, 2})
                          tex.print(table.concat(shuffled_seq, [[, ]]))
                          })
                          \end{document}`

                          Spero di essermi spiegato con questa differenza.
                          Prima infatti anch’io seguivo il primo approccio per poi rendermi conto che il secondo è più comodo perché si ha il controllo, ed è egualmente casuale.

                          R.

                        • #121046
                          claudio
                          Partecipante
                            Up
                            0
                            Down
                            ::


                            la mia soluzione etoolbox
                            `
                            \documentclass[10pt,a4paper]{article}
                            %\usepackage{abort}
                            \usepackage{etoolbox}

                            \newcommand{\parteAtriSecabc}[1]{\ifnumequal{#1}{0}{\message{a=0}\stop}%
                            {\ifnumcomp{#1}{>}{0}{\ifnumequal{#1}{1}
                            {x^{2}}{#1x^{2}}}%
                            {\ifnumequal{#1}{-1}{-x^{2}}{#1x^{2}}}}}
                            \newcommand{\parteBtriSecabc}[1]{%
                            \ifnumequal{#1}{0}{}{\ifnumgreater{#1}{0}{\ifnumequal{#1}{1}{+x}{+#1x}}
                            {\ifnumequal{#1}{-1}{-x}{#1x}}}%
                            }
                            \newcommand{\parteCtriSecabc}[1]{%
                            \ifnumequal{#1}{0}{}{\ifnumgreater{#1}{0}{+#1}{#1}}%
                            }
                            %3 bac
                            \newcommand{\parteAtriSecbac}[1]{\ifnumequal{#1}{0}{\message{a=0}\stop}%
                            {\ifnumcomp{#1}{>}{0}{\ifnumequal{#1}{1}
                            {+x^{2}}{+#1x^{2}}}%
                            {\ifnumequal{#1}{-1}{-x^{2}}{#1x^{2}}}}}
                            \newcommand{\parteBtriSecbac}[1]{%
                            \ifnumequal{#1}{0}{}{\ifnumgreater{#1}{0}{\ifnumequal{#1}{1}{x}{#1x}}
                            {\ifnumequal{#1}{-1}{-x}{#1x}}}%
                            }

                            \newcommand{\parteCtriSeccab}[1]{%
                            \ifnumequal{#1}{0}{}{\ifnumgreater{#1}{0}{#1}{#1}}%
                            }
                            \newcommand{\newtrinomio}[4]{
                            \ifcase #4
                            \parteAtriSecabc{#1}\parteBtriSecabc{#2}\parteCtriSecabc{#3}%1 abc
                            \or
                            \parteAtriSecabc{#1}\parteCtriSecabc{#3}\parteBtriSecabc{#2}%2 acb
                            \or
                            \parteBtriSecbac{#2}\parteAtriSecbac{#1}\parteCtriSecabc{#3}%3 bac
                            \or
                            \parteBtriSecbac{#2}\parteCtriSecabc{#3}\parteAtriSecbac{#1}%4 bca
                            \or
                            \parteCtriSeccab{#3}\parteAtriSecbac{#1}\parteBtriSecabc{#2}%5 cab
                            \or
                            \parteCtriSeccab{#3}\parteBtriSecabc{#2}\parteAtriSecbac{#1}%6 cba
                            \fi
                            }

                            \begin{document}
                            \[\newtrinomio{1}{2}{4}{4}\]

                            \[\newtrinomio{1}{2}{4}{2}\]
                            \end{document}
                            `
                            Si può eliminare il quarto parametro?

                          • #121047
                            OldClaudio
                            Partecipante
                              Up
                              0
                              Down
                              ::


                              Dobbiamo ringraziare @robitex per la sua passione per LuaTeX e LuaLaTeX. Certamente unire il linguaggio di composizione tipografia ((La)TeX) con un linguaggio di trattamento dati (Lua) è stata un’idea vincente da parte di Hans e Taco. Sicuramente Il linguaggio Lua è una forza della natura, ma a tutt’oggi vedo che anche in seno al LaTeX Team il ricorso a Lua è mmolto casuale.
                              Personalmente l’ho usato pochissimo, un epsilon tendente a zero; solo una sua funzione è utile per i lavoro che faccio io, ed è il fatto che si può convincere Lua(La)TeX a caricare le impostazioni per una data lingua, compresi i suoi pattern, anche se non sono già codificati e scritti dentro il file di formato, come succede con pdfLaTeX XeLaTeX. Per cui riesco a creare nuovi patter e testarli subito senza bisogno di inserirli in nessun formato.

                              Ma lo ammetto; in quanto Old, non ho più la mente fresca che ha YoungClaudio. E per qunto ci abbia provato non sono riuscito a imparare una sola regola di quel linguaggio. Dovrei fare come fa @robitex che spinto dalle necessita delsuo lavoro, ha studiiato a fondo Lua e ora lo maneggia con disinvoltura.

                              YougClaudio, tu hai l’età per cimentarti con Lua; buttati a farlo e vedrai quante soddisfazioni potrai ottenere.

                              Un linguaggio che maneggio male è LaTeX3; non ho controllato, ma credo che LaTeX3 sia meno difficile da imparare che Lua; il concetto base è sempre lo stesso del linguaggio LaTeX, ma con funzioni molto più potenti. Non vedrei male una funzione (il nome delle macro in L3 è “funzione”) che riceve a, b, c e che prima ne faccia l’analisi e poi o emetta il messaggio d’errore con lo \stop, oppure crei il trinomio e lo scriva; potrebbe anche calcolarne le radici; a seconda del segno del discriminante potrebbe anche scriverlo scomposto in fattori; potrebbe calcolarne il quadrato. Non sono sicuro che possa formare una lista dei tre coefficienti e comporre un trinomi dalla una permutazione casuale dei coefficienti, come sarebbe capace di fare Lua; forse sì, ma non l’ho mai fatto. Con LaTeX ho invece creato un programmino FORTRAN per permutare una lista di 500 numeri, accedendo a questo programma esterno con la funzionalità del “write18” del sistema TeX. Sono riuscito a compilare degli eserciziari di allenamento per i test di ingresso gestiti dal consorzio universitario che usa questi test. Ho cioè surrogato Lua col Fortran per una specialissima funzione che ero in grado di programmare, mentre non ero capace di farlo in Lua. Non dico affatto che Fortran (number cruncher) sostituisca Lua (general data cruncher), ma talvolta succede.

                              Quindi le vie della programmazione sono infinite; tutto sta a volerle percorrere.

                            • #121048
                              robitex
                              Amministratore del forum
                                Up
                                0
                                Down
                                ::


                                Si mi trovo bene con Lua. Sono a mio agio con la sintassi e ho scritto parecchie linee di codice per i compiti più disparati anche fuori dai sorgenti TeX.

                                La mia opinione in merito alla convenienza di un linguaggio o meno è la seguente.
                                Di ogni funzionalità LaTeX, l’utente cerca senza dubbio una personale naturalezza d’uso. Per questo penso che se Lua in quanto linguaggio generale, aiuta ad ampliare moltissimo l’espressività del linguaggio nel sorgente che scrive l’utente per comporre i propri documenti, allora diventa essenziale.
                                Posso dimostrare che questo è sempre stato il mio intento: fin dal mio primo articolo per ArsTeXnica nel 2007 ho sempre dato la massima importanza alla sintassi del linguaggio come vera forza del sistema TeX.

                                Il fatto che non ci siano ancora molti pacchetti che fanno uso di Lua, non vuol dire che il ragionamento sia sbagliato.
                                Penso che la comunità di sviluppatori, alla luce delle potenziate e potenziali nuove funzioni debba dirigersi con coerenza di sintassi e coordinamento, verso Lua, decisamente verso Lua per fornire agli utenti un potentissimo strumento di scrittura e composizione tipografica.
                                Lua è di gran lunga la migliore occasione che abbiamo per far evolvere il sistema TeX in qualcosa di ancora più semplice e potente da usare.

                                La comunità ConTeXt ha proposto MKIV, un formato TeX basato su Lua, ma poi le cose sono cambiate e MKIV non viene più sviluppata ma solo mantenuta. Un nuovo motore ha preso il suo posto.
                                La comunità di sviluppatori LaTeX è rimasta al solo TeX non rendendosi conto del potenziale di Lua o se ne è resa conta, non volendo cambiare registro con LaTeX3.
                                Io penso che questa scelta del Team di LaTeX3 sia sbagliata.

                                Due comunità diverse che non hanno unito le forze, hanno prese direzioni diverse perdendo forse l’occasione più importante.
                                Ciao.
                                R.

                              • #121049
                                OldClaudio
                                Partecipante
                                  Up
                                  0
                                  Down
                                  ::


                                  Sono d’accordo con te, e sono convinto che nell’evoluzione del sistema TeX rimarrà solo Lua(La)TeX; forse sopravviverà ConTeX, dove MKII non evolve ma va solo in manutenzione, mentre MKIV da quel che vedo continua a svilupparsi; la stessa guida LuaTeX Reference Manual mi pare che sia scritta con ConTeXt. Tuttavia TeX e ConTeXt sono due varietà diverse e non intercambiabili.
                                  Già oggi molti pacchetti, compresi quelli “standard”, contengono parti scritte in Lua; da fontspec a imakeidx. Quest’ultimo mi è caro perché l’ho cominciato insieme a egreg, poi ho lasciato a lui ogni paternità; la parte scritta in Lua, l’ha aggiunta lui.

                                  Ma apprezzo anche LaTeX3; chi si occupa di queste cose lavora sul linguaggio, quando poi queste cose vanno a finire nei formati, o nelle classi, o nei pacchetti, la commistione di Lua e di L3 produce risultati formidabili.

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

                              Go to top