Newsgroup: it.comp.software.tex
Titolo: Come evitare che Latex vada a capo in automatico

Salve a tutti.
Sono nuovo di questo forum, ed ho da poco iniziato ad utilizzare
Latex.
Sto scrivendo una lista di esercizi di matematica e vorrei affiancare
ad ogni espressione il risultato. Tuttavia non riesco ad allinearlo
con l'espressione. Infatti se l'espressione è allineata a sinistra e
il risultato a destra, questo viene inserito in una nuova linea, e non
è gradevole da vedere.
Come posso risolvere tale problema?
Sperando che qualcuno possa aiutarmi vi porgo i miei
Saluti
Roberto

 Come posso risolvere tale problema?
Il modo migliore è di definirsi un ambiente per gli esercizi, che ti dà
modo, in caso, di modificare come vengono composti senza dover cambiare
come li scrivi.
Suppongo siano del tipo 
|<numero> <espressione>    <risultato>|
dove le barre verticali rappresentano i margini della pagina.
\usepackage{enumerate}
\newenvironment{esercizi}
  {\subsection*{Esercizi}\begin{enumerate}[(1)]}
  {\end{enumerate}}
\newcommand{\esercizio}[2]{\item $\displaystyle#1$\hfill
 $\displaystyle\left[\,#2\,\right]}
Lo userai nel modo seguente:
\begin{esercizi}
\esercizio{a-a}{0}
\esercizio{a+a}{2a}
\end{esercizi}
Così è il minimo. Ma proviamo qualcosa di più elaborato; sostituisci
le cose di prima con questo:
\newcommand{\esercizio}[2]{\item $#1$\hfill\soluzionees{#2}}
\newcommand{\soluzionees}[1]{%
  \def\guardasoluzione{#1}%
  \ifx\guardasoluzione\empty\else
   $\left[\,\displaystyle#1\,\right]$\fi}
\newcommand{\soluzionepb}[1]{%
  \expandafter\def\expandafter\guardasoluzione\expandafter{#1}%
  \ifx\guardasoluzione\empty\else
   [\thinspace#1\thinspace]\fi}
\newenvironment{esercizi}
  {\subsection*{Esercizi}
   \list{(\arabic{enumi})}{\usecounter{enumi}%
     \leftmargin 0pt \settowidth{\labelwidth}{1.5em}%
     \labelsep 0pt \itemindent\labelwidth
     \renewcommand{\makelabel}[1]{##1\hfil}}}
  {\endlist}
\newenvironment{problema}[1]
  {\def\lasoluzione{#1}\item}
  {\hspace*{1em}\hfill\soluzionepb{\lasoluzione}}
Ora nell'ambiente "esercizi" puoi usare anche il sottoambiente
"problema"; inoltre, se l'argomento occupato dalla soluzione è
vuoto, non verrà stampato niente. Esempio:
\begin{esercizi}
\esercizio{a-a}{0}
\esercizio{1+1}{}
\esercizio{a+a}{2a}
\begin{problema}{$5$}
Un triangolo rettangolo ha un cateto lungo~$3$ e l'altro lungo~$4$;
calcola la misura della sua ipotenusa.
\end{problema}
\begin{problema}{}
Determina il minimo numero pari maggiore di~$2$ che non si possa
scrivere come somma di due numeri primi.
\end{problema}
\end{esercizi}
Unica avvertenza: come vedi, nelle soluzioni dei problemi è obbligatorio
scrivere le formule fra $; questo perché, tipicamente, le soluzioni 
degli esercizi sono formule, quelle dei problemi possono essere anche
accompagnate da testo.
Si può migliorare, vedi tu se hai altre esigenze.
Ciao
Enrico

 \end{esercizi}
È un briciolo più difficile del precedente, direi :-)
A parte gli scherzi, come hai imparato a scrivere codice di quel
livello? Esistono delle bibbie sacre che trattano non solo le cose
introduttive, ma anche codice di quel livello?
-- 
Andrea Bergia

 introduttive, ma anche codice di quel livello?
LaTeX Companion, per la maggior parte. C'è un trucco con un triplo 
\expandafter che non è proprio elementare. Ora lo spiego, perché ci
sono occasioni in cui alcuni di questi trucchi sono utili.
Il problema è di vedere se l'argomento all'ambiente "problema" è vuoto; 
questo argomento va poi portato nella parte finale dell'ambiente. Ma 
nel terzo argomento di \newenvironment non si possono usare i parametri
#1, #2 e così via.
Il modo standard è di definirsi un comando che contiene l'argomento:
\def\lasoluzione{#1}
Poi, nella parte finale dell'ambiente uso il comando come argomento
di \soluzionepb che compone la soluzione, se c'è.
Fin qui è una procedura standard. Adesso, però, voglio che se
l'argomento è vuoto, non si stampi nulla.
In \soluzionees è facile, perché non ho bisogno di portarmi dietro
l'argomento come espansione di un comando:
\def\soluzionees{%
  \def\guardasoluzione{#1}%
  \ifx\guardasoluzione\empty\else
   $\left[\,\displaystyle#1\,\right]$\fi}
Definisco un nuovo comando "scratch" con il contenuto dell'argomento;
confronto questo con \empty, la cui definizione è \def\empty{}. Se
il test dà vero, l'argomento è vuoto e non faccio nulla; altrimenti
lo compongo.
Nel caso di \soluzionepb, non ho più l'argomento, ma solo il comando
\lasoluzione che lo contiene. Se procedessi allo stesso modo, mettendo
\lasoluzione al posto di #1, il test sarebbe sempre falso! Allora la
definizione di \guardasoluzione diventa
\expandafter\def\expandafter\guardasoluzione\expandafter{#1}
(qui #1 è sempre \lasoluzione); il primo \expandafter fa espandere
il secondo, che fa espandere il terzo il quale fa espandere ciò
che sta dopo la graffa: nel nostro caso è \lasoluzione.
Si potrebbe anche dire, più semplicemente,
\edef\guardasoluzione{#1}
che però espande completamente ciò che sta fra le graffe, che non sempre
può essere corretto. Esempio:
\def\aaa{xxx}
\def\bbb{\aaa}
\expandafter\def\expandafter\ccc\expandafter{\bbb}
\edef\ddd{\bbb}
Dopo questo, con \show\ccc e \show\ddd, TeX risponde:
\ccc=macro:
->\aaa .
\ddd=macro:
->xxx.
Noti la differenza? Se nell'espansione di \aaa ci fossero dei 
condizionali, potrebbero essere espansi "al momento sbagliato", dando
risultati non conformi con ciò che si desidera.
Ciao
Enrico

 
Beh, è un po' off-topic, ma io colgo l'occasione per ringraziarVi tutti, 
visto che mi son laureato e ho fatto bella figura anche grazie a voi.
Una menzione particolare va a Enrico, credo che dopo questo topic ci si può 
solo inchinare, anche Knuth lo farebbe forse :) ...(non l'orsetto) 
Scusate ma dovevo dirvi grazie, continuerò a leggervi e se possibile a 
rispondere (sensatamente).
Ciao!
Stefano