Salve a tutti.
Ho creato un ambiente per scrivere teoremi (lo so che ci sono i pacchetti apposta) con il seguente codice:
`…`
Il mio problema \`e che dopo il numero mi lascia uno spazio che non \`e fisso, ma varia a seconda della frase che viene e, mi sembra, a parit\`a di frase cambia lo spazio se dopo il \begin{teo} metto un \label{key}.
Vediamo dove il tuo codice ha spazi, li segno con
PROTECTED1
Non ho segnato quelli alla fine della prima e seconda riga (quella vuota) e dopo le graffe di chiusura degli argomenti di \newenvironment perché compaiono nel preambolo, dove sono ignorati. Quelli dentro gli argomenti, invece, fanno parte delle macro definite e quindi diventano importanti quando si compone il testo.
I primi due in blu sono irrilevanti perché seguiti da \par che, per prima cosa, elimina sempre gli spazi che lo precedono. Analogamente per l’ultimo. Non ho segnato spazi dopo \medskip e \itshape perché, dal momento che seguono un nome di comando, sono ignorati in fase di lettura della lista di token. Anche quello dopo 0pt è ignorato, perché segue una misura esplicita, argomento dell’assegnazione “\parindent=0pt”.
Dirai che là non ci sono spazi, ma non è così: il fine riga equivale a uno spazio, se non è seguito immediatamente da una riga vuota (nel .tex, si intende).
C’è poi un altro spazio che appare inaspettato quando usi l’ambiente “teo”:
PROTECTED2
I due in blu sono irrilevanti: il primo è seguito dal \par emesso da \end{teo}, il secondo appare dopo il \par\medskip quando TeX è in “modo verticale”, cioè tra capoversi, e quindi ignora gli spazi.
Come vedi ce ne sono due. Lo spazio dopo \begin{teo} non è irrilevante perché viene dopo
`\scshape{Teorema \theteocount}
che conclude l’espansione di \begin{teo}. Quindi tra l’etichetta e l’inizio del testo hai sempre l’equivalente di due spazi tra parole nella prima riga dell’enunciato.
Soluzione. Ogni volta che si definisce un ambiente in cui la parte “\begin” contiene testo che comincia o prosegue un capoverso, occorre mettere “\ignorespaces” che elimina lo spazio dopo “\begin{
C’è un’altra finezza da introdurre nel tuo codice: è bene che l’inizio del testo del teorema sia a una distanza fissa dall’etichetta:
`\newenvironment{teo}
{\par\medskip
\refstepcounter{teocounter}%
\noindent\textsc{Theorem \theteocounter.}\enspace
\itshape\ignorespaces}
{\par\medskip}`
Ho modificato il modo di scrivere il codice come piace a me :), ma non solo. Lo scatto del contatore va più propriamente dopo aver emesso la spaziatura verticale (non è che cambi molto); non ho messo a zero il rientro, bensì allineato al margine l’etichetta con \noindent (se l’enunciato ha più di un capoverso è bene che i successivi al primo abbiano il rientro); fra l’etichetta e il testo ho inserito uno “spazio en”, cioè metà di un quadratone (spazio en = 0.5em).
Si potrebbe pensare che
`\begin{teo}\label{socrate}
Ogni uomo è mortale, Socrate è un uomo, dunque Socrate è mortale.
\end{teo}`
introduca di nuovo lo spazio, perché \ignorespaces vedrebbe \label e non lo spazio dato dal fine riga; no, perché \label è definito in modo da non fare cose del genere.
Vedi che è meglio usare \newtheorem e non reinventare l’acqua calda? 😉
Ciao
Enrico
PS (per Lorenzo): è evidente che Emanuele ha sottoposto il problema per darmi l’occasione di una dotta dissertazione. 🙂