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.