spazio di puntini

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


      devo scrivere degli esercizi svolti con delle parti vuote che devono essere riempite a penna

      per creare lo spazio uso una cosa del tipo
      `$(\phantom{a+b})$`
      esiste un modo per riempire in automatico quello spazio con dei puntni
      in modo che vi sia uno spazio adeguato per scrivere ?
      ciao
      claudio

    Visualizzazione 11 filoni di risposte
    • Autore
      Risposte
      • #94397
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          `\makebox[3em]{\dotfill}` aggiusta via via il 3em con una altro valore per adattare la larghezza della fila di puntini a quanto deve venire scritto; puoi anche definirti un comando, per esempio:`\newcommand\untini[1]{\makebox[#1]{\dotfill}}`da usare così: [tt]\puntini{15mm][/tt] per fare 15 mm di puntini.
          Volendo si potrebbe anche prendere la misura dell’espressione da scrivere sui puntini e lasciare fare tutto a LaTeX;; in questo casi ti conviene leggere la guida tematica Il LaTeX Reference Manual commentato scritto in italiano (da scaricare dalla sottosezione guide tematiche della sezione Documentazione di questo forum] e vedere come usare al meglio il comando \settowidth.

        • #94398
          claudio
          Partecipante
            Up
            0
            Down
            ::


            ho risolto cosi ho trovato del codice che ho adattato
            grazie per avermi indicato dove guardare
            `
            \usepackage{calc}

            \newcommand*\puntini[1][c]{%
            \ifmmode
            \makebox[\widthof{$#1$}]{$\dotfill$}%
            \else
            \makebox[\widthof{#1}]{\dotfill}%
            \fi
            }
            `
            ciao
            claudio

          • #94399
            OldClaudio
            Partecipante
              Up
              0
              Down
              ::

              claudio” post=94014ho risolto cosi ho trovato del codice che ho adattato
              grazie per avermi indicato dove guardare
              `
              \usepackage{calc}

              \newcommand*\puntini[1][c]{%
              \ifmmode
              \makebox[\widthof{$#1$}]{$\dotfill$}%
              \else
              \makebox[\widthof{#1}]{\dotfill}%
              \fi
              }
              `
              ciao
              claudio

              Hai provato a togliere i dollari a cavallo di \dotfill? Non credo che servano, perché comunque dentro \makebox di default sei i n modo testo e \dotfill non è né testuale né matematico; volendo lo si potrebbe considerare testuale, e quindi avresti ragione a mettere i dollari, ma la sua definizione (dal cuore di latex.ltx) è`\def\dotfill{%
              \leavevmode
              \cleaders \hb@xt@ .44em{\hss.\hss}\hfill
              \kern\z@}`A sua volta \leavevmode serve per passare in modo orizzontale se per caso il comando fosse dato in modo verticale, ma non fa praticamante nulal se si è già in modo orizzontale; i restanti comandi possono essere usati in qualunque modo. Anzi conoscendo la definizione puoi copiartela nel tuo preambolo preceduta da \makeatletter e puoi provare a modificare la spaziatura dei puntini cambiano il valore [tt].44[/tt] in un altro valore più piccolo, per esempio [tt]0.3[/tt] per avere puntini più densi.. Un’altra definizione più robusta della tua potrebbe essere
              `\makeatletter
              \newcommand\puntini[1]{%
              \ifmmode\expandafter\@firstoftwo\else
              \expandafter\@secondoftwo\fi
              {\makebox[\widthof{$#1$}]}{\makebox[\widthof{#1}]}{\dotfill}}
              \makeatother`Quei due \expandafter servono per terminare correttamente la frase condizionale, e quei due comandi strani servono per eseguire il primo o il secondo \makebox dopo afer terminato la frase condizionale. Spesso non è necessario ricorrere a costrutti così complicati, ma così si ha la certezza di avere sviluppi robusti. La cosa è fatta in modo automatico, senza ricorrere a comandi astrusi, se si usano i comandi condizionali definiti dal pacchetto etoolbox; magari non ti serve, ma la lettura di quei comandi è molto istruttiva.

            • #94400
              claudio
              Partecipante
                Up
                0
                Down
                ::

                OldClaudio” post=94015

                ho risolto cosi ho trovato del codice che ho adattato
                grazie per avermi indicato dove guardare
                `
                \usepackage{calc}

                \newcommand*\puntini[1][c]{%
                \ifmmode
                \makebox[\widthof{$#1$}]{$\dotfill$}%
                \else
                \makebox[\widthof{#1}]{\dotfill}%
                \fi
                }
                `
                ciao
                claudio

                Hai provato a togliere i dollari a cavallo di \dotfill? Non credo che servano, perché comunque dentro \makebox di default sei i n modo testo e \dotfill non è né testuale né matematico; volendo lo si potrebbe considerare testuale, e quindi avresti ragione a mettere i dollari, ma la sua definizione (dal cuore di latex.ltx) è`\def\dotfill{%
                \leavevmode
                \cleaders \hb@xt@ .44em{\hss.\hss}\hfill
                \kern\z@}`A sua volta \leavevmode serve per passare in modo orizzontale se per caso il comando fosse dato in modo verticale, ma non fa praticamante nulal se si è già in modo orizzontale; i restanti comandi possono essere usati in qualunque modo. Anzi conoscendo la definizione puoi copiartela nel tuo preambolo preceduta da \makeatletter e puoi provare a modificare la spaziatura dei puntini cambiano il valore [tt].44[/tt] in un altro valore più piccolo, per esempio [tt]0.3[/tt] per avere puntini più densi.. Un’altra definizione più robusta della tua potrebbe essere
                `\makeatletter
                \newcommand\puntini[1]{%
                \ifmmode\expandafter\@firstoftwo\else
                \expandafter\@secondoftwo\fi
                {\makebox[\widthof{$#1$}]}{\makebox[\widthof{#1}]}{\dotfill}}
                \makeatother`Quei due \expandafter servono per terminare correttamente la frase condizionale, e quei due comandi strani servono per eseguire il primo o il secondo \makebox dopo afer terminato la frase condizionale. Spesso non è necessario ricorrere a costrutti così complicati, ma così si ha la certezza di avere sviluppi robusti. La cosa è fatta in modo automatico, senza ricorrere a comandi astrusi, se si usano i comandi condizionali definiti dal pacchetto etoolbox; magari non ti serve, ma la lettura di quei comandi è molto istruttiva.

                qualcosa non va con l’ultima persione
                se uso
                `$\puntini[a+b]$`
                mi appare

                a+b]

              • #94401
                OldClaudio
                Partecipante
                  Up
                  0
                  Down
                  ::


                  Usi male l’ultima versione: il suo argomento è obbligatio, non facoltativo, quindi devi usare le graffe, non le quadre.

                • #94402
                  claudio
                  Partecipante
                    Up
                    0
                    Down
                    ::

                    OldClaudio” post=94026Usi male l’ultima versione: il suo argomento è obbligatio, non facoltativo, quindi devi usare le graffe, non le quadre.

                    Si è vero ma mi succede questo
                    se uso
                    `
                    \newcommand*\puntini[1][c]{%
                    \ifmmode
                    \makebox[\widthof{$#1$}]{$\dotfill$}%
                    \else
                    \makebox[\widthof{#1}]{\dotfill}%
                    \fi
                    }
                    `
                    vuole le quadre
                    se uso

                    `
                    \makeatletter
                    \newcommand\puntini[1]{%
                    \ifmmode\expandafter\@firstoftwo\else
                    \expandafter\@secondoftwo\fi
                    {\makebox[\widthof{$#1$}]}{\makebox[\widthof{#1}]}{\dotfill}}
                    \makeatother
                    `
                    vuole le graffe

                    ho capito che dipende da [c]
                    ma perché ?
                    ciao e grazie
                    claudio

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


                      Intendi in modo errato la semantica di \newcommand.

                      Con \newcommand ci può essere o non essere un argomento opzionale: se definisco:
                      `\newcommand\puntini[1]{…}`
                      ottengo una macro con un argomento obbligatorio, invece se definisco:
                      `\newcommand\puntini[1][c]{…}`
                      ottengo una macro con un argomento facoltativo. L’utente può specificarlo (tra parentesi quadre) o meno.

                      Solitamente si hanno comandi con argomenti facoltativi e con argomenti obbligatori, oppure macro con argomenti obbligatori e senza opzionale.
                      Mentre il caso di un comando con un argomento facoltativo (senza comando obbligatorio) non è frequente in LaTeX.

                      Di solito quindi la seconda definizione la si trova così:
                      `\newcommand\puntini[2][c]{…}`
                      che vuol dire che \newccomand è in grado di gestire un solo argomento opzionale che assume il valore di default ‘c’ se non interviene l’utente. A quest’ultima macro devo dare un argomento obbligatorio tra graffe ed eventualmente posso modificare l’opzionale:
                      `\puntini{mandatory arg}`
                      `\puntini[option arg]{mandatory arg}`
                      #1 è l’argomento opzionale (ha un valore di default) e #2 è l’argomento obbligatorio.

                      Ecco invece l’uso raro con solo un argomento opzionale:
                      `\puntini`
                      oppure
                      `\puntini[optional arg]`

                      Da quello che capisco, il tuo primo comando non può funzionare.
                      `\newcommand*\puntini[1][c]{%
                      \ifmmode
                      \makebox[\widthof{$#1$}]{$\dotfill$}%
                      \else
                      \makebox[\widthof{#1}]{\dotfill}%
                      \fi
                      }`
                      perché definisci un comando con un argomento opzionale ma non obbligatorio, quindi #1 vale ‘c’ se l’untente non lo cambia tra parentesi quadre (uso raro).
                      Forse intendi piuttosto qualcosa come:
                      `\newcommand*\puntini[2][c]{%
                      \ifmmode
                      \makebox[\widthof{$#2$}]{$\dotfill$}%
                      \else
                      \makebox[\widthof{#2}]{\dotfill}%
                      \fi
                      }`
                      Ma in questo caso #1 non verrebbe mai utilizzato.
                      R.

                    • #94404
                      OldClaudio
                      Partecipante
                        Up
                        0
                        Down
                        ::


                        Ecco, ci siamo di nuovo; bisogna leggere la documentazione; io suggerirei oltre all’Arte, anche il LaTeX Reference Manual Commentato e tradotto in italiano (sempre nella sezezione Guide tematiche dell Documentazione di questo sito); non è per farmi réclame, ci mancherebbe; È semplicemente una mia opinione che ogni utente di LaTeX dovrebbe poter metere le mani sulla documentazione che descriva TUTTI i comandi accessibili all’utente, almeno come li ha descritti il creatore di LaTeX Leslie Lamport (dal cui cognome nasce quel famoso La che trecede TeX). Alcuni di quei comandi descritti da Lamport si usano molto raramente oppure sono stati sostituiti di fatto dall’uso sistematico di certi pacchetti; tuttavia quel Manuale, secondo me, è fondamentale per ogni utente di LaTeX e spero che la mia traduzione e i miei commenti non lo snaturino rispetto all’originale in inglese che è e resta il riferimento primario per ogni utente.

                        Detto in parole povere: \newcommand, \renewcommand e \providecommand permettono di definire o ridefinire nuovi comandi: la sintassi è:

                        [tt]\newcommand[/tt]{comando}[ numero di argomenti ][ valore di default ]{definizione}
                        [tt]\renewcommand[/tt]{comando}[ numero di argomenti ][ valore di default ]{definizione}
                        [tt]\providecommand[/tt]{comando}[ numero di argomenti ][ valore di default ]{definizione}

                        Intanto \newcommand segnala un errore se si cerca di definire un comando che c’è già, mentre \renewcommand segnala un errore se si cerca di ridefinire un comando che non esiste ancora; infine \providecommand definisce un comando che non esiste ancora, ma non fa nulla se il comando esiste già.

                        Il numero di argomenti dice quanti sono gli argomenti su cui opera il comando

                        Il valore di default non è obbligatorio, ma se c’è dice che l’argomento numero 1 (quello che nella definzione è indicato con #1) è facoltativo e, se usato, va racchiuso fra parentesi quadre; se non usato riceve invece il valore di default.

                        La definizione invece è la sequenza di comandi che vengono eseguiti quando si usa il comando, e i vari argomenti su cui questo opera sono indicati con dei “segnaposto” #1, #2, eccetera fino ad un massimo di numero di argomenti che a sua volta non può essere maggiore di 9.

                        Nella tua prima definizione [tt]\newcommand*\puntini[1][c]{%[/tt] non si capisce affatto a cosa serva quel valore di default “c”; sei sicuro che volevi davvero scrivere una stringa di puntini pari alla larghezza della lettera “c”? Io ho il sospetto che tu non l’abbia mai proovato, perché avresti constatato che la stringa di puntini si ridurrebbe a niente o al massimo ad un solo puntino….!

                        Posso avere equivocato l’uso che ne vuoi fare, ma secondo me non ha senso un valore di default che abbia una larghezza cos`ʼpiccola, nessuna risposta da scrivere sui puntini sarebbe così corta; se anche il tuo studente dovesse scrivere una sola lettera come risposta, sarebbe meglio che la stringa di puntini ne contenesse almeno tre o quattro, altrimenti lo studente non si accorge nemmeno che lì c’è uno spazio per mettere la sua risposta.

                      • #94405
                        claudio
                        Partecipante
                          Up
                          0
                          Down
                          ::


                          riprendo la discussione

                          ho modificato il comando inserendo la possibilità di non fare nulla.
                          Mi sembra che funzioni …
                          è corretto?
                          `
                          \documentclass{book}
                          \usepackage{fixltx2e}
                          \usepackage[T1]{fontenc}
                          \usepackage[utf8]{inputenc}
                          \usepackage[italian]{babel}
                          \usepackage[upright]{fourier}
                          \usepackage{textcomp}
                          \usepackage{amsmath}
                          \usepackage{amsthm}
                          \usepackage{amssymb}
                          \usepackage{isomath}
                          \usepackage{microtype}
                          \usepackage{geometry}
                          % % % % % % % % % % % % % % % % % % % % % % %
                          \usepackage{calc}
                          \usepackage{ifthen}
                          \newboolean{puntinisi}
                          \newcommand{\stampapuntini}{\setboolean{puntinisi}{true}}
                          \newcommand{\nonstampapuntini}{\setboolean{puntinisi}{false}}

                          \makeatletter
                          \newcommand\puntini[1]{%
                          \ifthenelse{\boolean{puntinisi}}{%
                          \ifmmode\expandafter\@firstoftwo\else
                          \expandafter\@secondoftwo\fi
                          {\makebox[\widthof{$#1$}]}{\makebox[\widthof{#1}]}{\dotfill}}{#1}}
                          \makeatother

                          \begin{document}
                          \stampapuntini
                          Questa è una \puntini{prova}

                          \nonstampapuntini
                          Questa è una \puntini{prova}

                          \stampapuntini

                          Questa è una $\puntini{A+B}$
                          \nonstampapuntini

                          Questa è una $\puntini{A+B}$

                          \end{document}
                          `
                          Saluti

                        • #94406
                          OldClaudio
                          Partecipante
                            Up
                            0
                            Down
                            ::


                            Se funziona e sei soddisfatto, lascia pure così.

                            Si può fare di meglio usando l’argomento facoltativo di \newcommand; per meglio dire, usando l’argomento facoltativo di un comando definito con \newcommand; la guida tematica che ti ho indicato contiene la sintassi comepleta di new command che ti ripeto qui: [tt]\newcommand{\[/tt][nome comando[/i][tt]}[ [/tt]numero argomenti[tt] ][ valore predefinito per primo argomento facoltativo[tt] ] [/tt].

                            Nel tuo caso potrebbe essere`\newcommand*{\puntini}[2][]{…}`L’argomento #1 diventa quello facoltativo, mentre il #2 è quello obbligatorio; Dunque ti basta controlalre se l’argomento facoltativo sia vuoto, nel qual caso metti in puntini, altrimenti non li metti. In altre parole al posto dei puntini devi mettere un test che controlli che un certo argomento sia vuoto, per esempio il controllo della stringa corrispondente all’argomento #1(mi pare che sia [tt]\ifstring]/tt] con il pacchetto ifthen, ma è meglio che controlli sulla documentazione di ifthen). Naturalmente puoi anche invertire il test; dipende se nel tuo documento ti ritrovi più spesso a dover mettere i puntini rispetto alle volte in cui non li devi mettere.

                            Non è detto che tu debba modficare il tuo codice; se ti va bene quello che hai creato, non perdere tempo, a meno che tu non voglia controllare se sei capace di usare la sintassi di \newcommand con argomento facoltativo.

                          • #94407
                            claudio
                            Partecipante
                              Up
                              0
                              Down
                              ::


                              avevo pensato al facoltativo
                              ma se voglio cambiare da puntini a non puntini
                              dovrei modificare ogni formula o brano
                              così mi sembra corretto e più gestibile

                            • #94408
                              OldClaudio
                              Partecipante
                                Up
                                0
                                Down
                                ::


                                Infatti, come ho detto se t trovi iù comodo così, resta così, non hai nessun motivo per cambiare.

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

                            Go to top