Newsgroup: it.comp.software.tex
Titolo: Ridefinire un comando

Sto realizzando della documentazione in cui ho inserito dei link a siti, 
mediante il comando \href del pacchetto hyperref:
\usepackage[pdfborder=0,dvipdfm]{hyperref}
Siccome nel pdf finale il testo del link č formattato uguale al testo e non 
si capisce a vista che č un link, volevo visualizzarlo in grassetto (a 
qualcos'altro).
Cosě ho scritto questo, sperando di ridefinire il comando:
\renewcommand{\href}[2]{\textbf{\href{#1}{#2}}}
Perň non funziona nel senso che errori non ne da, ma non crea il dvi...
Nel file di log, c'č scritto questo ma non so se c'entra:
    ! TeX capacity exceeded, sorry [save size=32768].
E poco piů sotto mi prende pure per il cuxo:
    If you really absolutely need more capacity,
    you can ask a wizard to enlarge me.
C'č modo di fare quello che mi serve?
Ciao
Marco 

 \renewcommand{\href}[2]{\textbf{\href{#1}{#2}}}
/me ulula.
Allora. Normalmente la ridefinizione si fa nel seguente modo:
\let\oldcommand\command
\renewcommand{\command}[n]{blah blah \oldcommand{#1}{#2}...{#n}}
Perché altrimenti il TeX entra in un loop infinito (un comando che
chiama se stesso.
Alcuni comandi come \verb perň non possono essere trattati in questa
maniera. Non ricordo se \href č tra questi, prova e se ci sono
problemi ripassa.
-- 
Giuseppe "Oblomov" Bilotta
"E la storia dell'umanitŕ, babbo?"
"Ma niente: prima si fanno delle cazzate,
 poi si studia che cazzate si sono fatte"
(Altan)
("And what about the history of the human race, dad?"
 "Oh, nothing special: first they make some foolish things,
  then you study what foolish things have been made")

 \renewcommand{\command}[n]{blah blah \oldcommand{#1}{#2}...{#n}}
Io ho fatto cosě, ma non funziona lo stesso.
\let\href\href
\renewcommand{\href}[2]{\textbf{\href{#1}{#2}}}
Ho scritto giusto?
Ciao
Marco 

 \renewcommand{\href}[2]{\textbf{\href{#1}{#2}}}
Lasciamo stare, mi sa che č una complicazione inutile.
Mi credo un nuovo comando che faccio prima. :-)
Ciao
Marco 

Ho scritto giusto?
Direi proprio di no, se l'hai scritto così. Non è una pozione magica
("ci manca un po' di let"), è un linguaggio, per quanto astruso ed
involuto: si suppone che quello che si dice debba significare
qualcosa.
Se il problema è evitare un ciclo infinito, fintanto che usi lo stesso
identificatore non lo eviti; e \let\href\href è un'istruzione
palesemente inutile: \href è già ben solidamente \href, non c'è
necessità di rinforzarne il legame.
È un problema di tempi nell'associazione simbolo/valore,
evidentemente, legato forse anche alla natura macro del linguaggio
TeX. Devi legare il vecchio \href ad un identificatore di comodo, in
modo da poterne ritrovare il vecchio valore all'interno della nuova
definizione (l'identificatore \href, all'interno della ridefinizione,
è legato al nuovo valore che gli stai associando, che richiama
\href... e via così):
  \let\oldhref\href
  \renewcommand{\href}[2]{\textbf{\oldhref{#1}{#2}}}
Dopodiché non è detto che funzioni, per i motivi già detti da Giuseppe
Bilotta, ma almeno è una frase di senso compiuto.
Ciao.

 Bilotta, ma almeno è una frase di senso compiuto.
Invece funziona perfettamente!!
Uso LaTeX di continuo per scrivere, ed ho imparato nelle varie guide online.
Purtroppo sono totalmente carente nella parte di programmazione del 
linguaggio.
Mi piacerebbe poter comprare un bel manuale e riempire le mie lacune.
Ma di cartaceo non ho trovato nulla e prima di cercare materiale online, 
vorrei avere un bel libro.
Come riferimento e poi perchè mi piace avere il libro. :-)
Ciao
Marco 



\let\oldhref\href
\renewcommand{\href}[2]{\textbf{\oldhref{#1}{#2}}
-- 
Giuseppe "Oblomov" Bilotta
Hic manebimus optime

 \renewcommand{\href}[2]{\textbf{\oldhref{#1}{#2}}
Eh, ora ho capito. :-)
Ma prima non mi era chiaro che \oldcommand \command dovessero essere 
diversi.
Ciao
Marco 

linguaggio.
Non ti preoccupare, non sei tu, è LaTeX che è un incubo per chiunque.
I tempi di apprendimento sono normalmente più lunghi che per altri
linguaggi, e anche i più esperti hanno a volte residue incertezze.
Per chiarire ulteriormente il punto (il mio messaggio, ad una rilettura, è
sembrato abbastanza abbastanza oscuro anche a me), provo a fare un esempio
analogico con un altro ipotetico linguaggio:
    Function href(uno, due)
      ImpostaGrassetto
      href(uno, due)
    End Function
Così dovrebbe essere più evidente dove stia il problema: l'istruzione
href(uno, due) che cosa fa? chiama una funzione href() precedentemente
definita, o chiama ricorsivamente la href() che si sta definendo? Di per sé
non è chiaro che cosa si voglia fare, anche perché in molti linguaggi una
chiamata ricorsiva è perfettamente legittima.
Alcuni linguaggi hanno strumenti specifichi per risolvere quest'ambiguità,
con altri ci si deve arrangiare con qualche accorgimento, altri scelgono a
priori uno dei due comportamenti e non è possibile fargli fare altro. In
LaTeX la procedura standard è quella detta: associare la precedente
definizione ad un simbolo di comodo, ed utilizzare quello all'interno della
nuova definizione.
(L'analogia non è particolarmente precisa, perché in LaTeX non esistono
funzioni o subroutine vere e proprie, ma il problema è lo stesso.)
Ciao.

 linguaggi, e anche i più esperti hanno a volte residue incertezze.
Il fatto è che a me piacerebbe approfondire la conoscenza del linguaggio, 
perchè mi piace.
Anche se è complicato.
Però non voglio imparare da guide online, perchè mi riesce + difficile.
Preferisco avere un bel libro tra le mani.
Ne esistono?
Qualcuno avrà pur scritto qualcosa!
Ciao
Marco 

 Ne esistono?
Ne esistono sì. Ti rimando alle FAQ: 
http://www.linux.it/~salve/TeX-FAQ/TeX-FAQ-biblio.html
Ciao.