Newsgroup: it.comp.software.tex
Titolo: Sillabazione in texttt senza trattino

Ho un testo in cui cito spesso nomi di metodi o altri brevissimi
frammenti di codice, in \texttt{}. Capita che questi siano a fine riga e
quindi non essendo sillabati fuoriescano dal margine. Mi piacerebbe
venissero sillabati cosě come fa il pacchetto hyperref per gli URL,
ovvero senza il trattino, ma non vorrei dover sostituire \texttt{} con
\url{} (mi pare bruttino).
In pratica vorrei che
Bla blabla blablabla bla
Bla bla bla bla bla nomeMetodoUnPoLungo()
blabla bla blabla blaba.
diventasse:
Bla blabla blablabla bla
Bla bla bla bla bla nome
MetodoUnPoLungo() blabla
bla blabla blaba.
Quindi una sillabazione senza il trattino. Se scrivo
nome\-Metodo\-UnPo\-Lungo() viene sillabato ma con il trattino.
Come posso fare?
Grazie!

 Come posso fare?
\usepackage[T1]{fontenc}
\newenvironment{notrattino}
  {\par\medskip\noindent\ttfamily\hyphenchar\font="17 }
  {\par\medskip}
Aggiusta tu eventuali spaziature prima e dopo.
Dichiaro l'uso dei font in codifica T1 perché, alla posizione "17
(in esadecimale, decimale 23) hanno un carattere invisibile che
definisco appunto come il carattere da usare al posto del trattino.
Ciao
Enrico


Me lo sentivo di essermi spiegato male! I vari "bla bla" sono testo
normale, non codice. Quindi un normale paragrafo in cui ogni tanto ci
sono nomi di metodi il \texttt. Però ti ringrazio, ora provo a
giocherellare con un nuovo comando magari :)

 giocherellare con un nuovo comando magari :)
Se devi usare \texttt, tanto vale usare un altro comando:
\usepackage[T1]{fontenc}
\makeatletter
\def\mytt#{\afterassignment\@mytt\let\next= }
\def\@mytt{\bgroup\ttfamily\hyphenchar\font="17 \let\-\@@hyph}
\makeatother
\mytt{nomeabbastanzalungo()}
Se vuoi indicare esplicitamente punti dove vuoi spezzare, puoi
usare \-
L'idea è abbastanza classica. Il comando \mytt non ha argomenti;
il suo sviluppo si mangia la graffa che segue (obbligatoriamente,
se non la metti hai un errore) ed esegue \@mytt.
Il comando \@mytt apre un gruppo che sarà chiuso dalla graffa
che termina l'argomento apparente a \mytt; poi sceglie il font
Typewriter e imposta come carattere per la sillabazione quello
invisibile; come ultima cosa riporta il comando \- al suo
significato originale. Per motivi che non ho mai capito, infatti,
LaTeX definisce \- come \discretionary{-}{}{}.
Il comportamento primitivo di \- è simile, ma il carattere che
LaTeX designa come "-" è il carattere di sillabazione del font
in uso (quello che abbiamo cambiato in quello invisibile).
Ciao
Enrico

 
[CUT]
Ok grazie mille, funziona! Però succede una cosa abbastanza strana...
Dopo aver usato \mytt{nomeLungo\-Metodo()} (che viene sillabato
correttamente) viene misteriosamente sillabata anche la successiva
parola all'interno di un \texttt{}, senza il trattino!
Ma non abbiamo modificato l'uso di \texttt, giusto?

 scrive:

$#^&*# :-(
L'assegnazione di \hyphenchar è globale! E c'è un altro problema,
che appare piuttosto complesso da risolvere: se anche riportassimo
il valore di \hyphenchar al normale dopo aver usato la macro \mytt
con il codice seguente
\makeatletter
\def\mytt#{\afterassignment\@mytt\let\next= }
\def\@mytt{\bgroup\ttfamily\hyphenchar\font="17 \let\-\@@hyph
  \aftergroup\restore@tthyph}
\def\restore@tthyph{{\ttfamily\hyphenchar\font=-1 }}
\makeatother
non si avrebbe il risultato voluto, perché la sillabazione viene
eseguita al momento in cui viene composto il capoverso, usando il valore
di \hyphenchar in quel momento. Quindi il valore sarebbe -1!
La "soluzione" è un'altra: usare due font diversi (ma indistinguibili).
\usepackage[T1,OT1]{fontenc}
{\fontenc{T1}\ttfamily\hyphenchar\font="17 }
\makeatletter
\newcommand{\mytt}[1]{{\let\-\@@hyph\fontencoding{T1}\ttfamily #1}}
\makeatother
Ma così sei costretto a usare la codifica OT1 globalmente.
Se vuoi usare la T1, devi modificare \texttt, in modo che usi il
font OT1.
\usepackage[OT1,T1]{fontenc}
{\fontenc{T1}\ttfamily\hyphenchar\font="17 }
\makeatletter
\newcommand{\mytt}[1]{{\let\-\@@hyph\ttfamily #1}}
\renewcommand{\texttt}[1]{{\fontenc{OT1}\ttfamily #1}}
\makeatother
In ogni caso si tratta di un "kludge". Probabilmente la cosa migliore è 
di scrivere il documento senza preoccuparti di come esce. Quando ne hai 
una stesura definitiva, guardi quali sono i punti dove devi spezzare 
quei nomi lunghi e aggiungi \? nel punto incriminato, dopo aver definito
\newcommand{\?}{\hspace{0pt}}
Per esempio, \texttt{nomepiuttosto\?lungo()}
Ciao
Enrico

 Per esempio, \texttt{nomepiuttosto\?lungo()}
Direi che è perfetto! Non vorrei dire una castroneria, ma non posso
usare \? ogni volta che ho un nome lungo, come se fosse \-? Senza farlo
in "post-produzione" dico. Il significato è diverso, ma il risultato è
lo stesso: se in quel punto deve andare a capo può farlo (e senza
trattino!) se invece non deve andare a capo non ci si accorge di nulla :)

 scrive:

TeX è molto abile a comporre i capoversi rimanendo entro i margini.
Credo che la scelta dipenda da quanti di quei posti problematici hai. Io
andrei per la post-produzione.
Ciao
Enrico