- Questo topic ha 12 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 11 anni, 11 mesi fa da
OldClaudio.
-
CreatoreTopic
-
13 Maggio 2014 alle 5:50 #94396::
devo scrivere degli esercizi svolti con delle parti vuote che devono essere riempite a pennaper 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
-
CreatoreTopic
-
AutoreRisposte
-
-
13 Maggio 2014 alle 5:58 #94397::
`\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.
-
13 Maggio 2014 alle 7:44 #94398
-
13 Maggio 2014 alle 11:17 #94399::
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
claudioHai 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.
-
13 Maggio 2014 alle 19:23 #94400::
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
claudioHai 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 apparea+b]
-
13 Maggio 2014 alle 19:51 #94401
-
14 Maggio 2014 alle 2:49 #94402::
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 graffeho capito che dipende da [c]
ma perché ?
ciao e grazie
claudio
-
14 Maggio 2014 alle 5:15 #94403::
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.
-
14 Maggio 2014 alle 5:38 #94404::
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.
-
10 Ottobre 2014 alle 10:37 #94405::
riprendo la discussioneho 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}$
\nonstampapuntiniQuesta è una $\puntini{A+B}$
\end{document}
`
Saluti
-
11 Ottobre 2014 alle 9:45 #94406::
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.
-
11 Ottobre 2014 alle 10:58 #94407
-
11 Ottobre 2014 alle 15:51 #94408
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.