Newsgroup: it.comp.software.tex
Titolo: Note sul margine sinistro

Salve,
avrei bisogno di piazzare una nota sul margine sinistro del documento.
Leggendo alcune guide ho scoperto che il comando \marginpar[sinistra]
{destra} permetterebbe fare ciò. Tuttavia, quando l'ho inserito nel
mio documento non ha sortito alcun effetto. In effetti la sintassi del
comando mi insospettisce poiché per avere una nota sol margine
sinistro la forma corretta parrebbe \marginpar[nota]{} dato che il
secondo argomento non è opzionale. Sono peraltro certo che sia
possibile ottenere un tale risultato, si pensi, ad esempio, alle guide
ad un pacchetto che di norma contengono tali note. Come potrei fare?

 scrive:

\marginpar scrive sul margine esterno. L'argomento opzionale serve
a dire che cosa scrivere se il margine esterno è il sinistro invece
del destro.
Supponiamo di dare \marginpar[yyy]{xxx}.
Se LaTeX si trova su una pagina a destra, userà "xxx" mettendolo nel
margine destro (quello esterno), se invece si trova su una pagina a
sinistra userà "yyy" mettendolo nel margine sinistro.
Con \marginpar{xxx} metterà "xxx" sul margine destro in una pagina
a destra, sul margine sinistro in una pagina a sinistra.
Se la composizione è 'twoside', il concetto di pagina a destra o
a sinistra esiste; se la composizione è 'oneside' tutte le pagine
sono considerate a destra.
Che documento hai?
Ciao
Enrico

Grazie per ora per la risposta. Comunque il mio documento penso sia
oneside più precisamente, ad esempio:
\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[italian]{babel}
\begin{document}
 Testo\marginpar[sinistra]{destra}
\end{document}
e francamente vorrei che rimanesse oneside. Il mio obiettivo è di far
comparire la nota sul margine sinistro e basta. Spero si possa
Grazie P.M.

 scrive:

Non con \marginpar. Perché mai vorresti una nota nel margine sinistro?
Cerca marn.sty con Google e vedi se funziona.
Ciao
Enrico

Grazie ancora per l'aiuto, tuttavia non avendo trovato una guida per
il pacchetto marn, mi è toccato modificare il codice dello stesso;
rimane sempre una procedura macchinosa, pensavo fosse una cosa molto
più semplice e meglio codificata. Se avete qualche altro suggerimento,
fatemelo sapere. Mi serve perché sto scrivendo un pacchetto per
assegnare compiti e a margine sinistro vorrei mettere il punteggio di
ciascun esercizio (qualora l'insegnante ritenga utile tale metodo
prettamente ragionieristico).
Grazie ancora,
P.M.

 scrive:

Potresti fare un esempio di come vorresti fare? Un esempio
minimo di codice (lascia perdere la nota a margine), con una
breve descrizione di come ti piacerebbe venisse fuori.
Ciao
Enrico

Questo è il codice per ora del pacchetto (credo sia scritto abbastanza
rozzamente ma è il primo che scrivo, fate pure le vostre critiche):
\ProvidesPackage{Esercitazione}
\usepackage{ifthen}
\newif\if@roman
\newif\if@riga
\newcounter{diff}
\newcommand{\forloop}[5][1]%
{%
\setcounter{#2}{#3}%
\ifthenelse{#4}%
{%
#5%
\addtocounter{#2}{#1}%
\forloop[#1]{#2}{\value{#2}}{#4}{#5}%
}%
% Else
{%
}%
}%
\DeclareOption{riga}{\@rigatrue}
\DeclareOption{roman}{\@romantrue}
\ProcessOptions\relax
\newcounter{esercizio}
\setcounter{esercizio}{0}
\if@roman
	\usepackage{pslatex}
\fi
\newtoks\materia
\newtoks\argomenti
\newtoks\data
\def\componititolo{
	\begin{center}
		{\Large\bf Esercitazione di \the\materia}\\
		{\large \sf \the\argomenti}\\
		{\large \the\data}
	\end{center}
	\if@riga
		\hrule
		\vspace{3pt}
	\fi
}
\newenvironment{ex}[2][0]{%
\par%
\addtolength{\leftskip}{\baselineskip}%
\addtolength{\parindent}{-\baselineskip}%
\addtolength{\parindent}{-\baselineskip}%
\refstepcounter{esercizio}%
{\bf \ifthenelse{\equal{#2}{p}}{Problema}{Esercizio}
\arabic{esercizio}.}%\forloop{diff}{0}{\value{diff} < #1}{*}.}%
\addtolength{\parindent}{\baselineskip}%
\addtolength{\parindent}{\baselineskip}}%
{%
\par%
questo è un esempio di codice
}\begin{document}
\componititolo
Questa impaginazione fa schifo.\\
$\mathcal{C}$
\begin{ex}[]{}
 davvero, fa proprio schifo
\end{ex}
Più o meno ottengo l'effetto sperato. Anzi, a dire il vero, non
proprio, in quanto gradirei mettere insieme i due argomenti: cioè
inserire un numero per la difficoltà seguito (nella stessa stringa) da
un p per dire che si tratti di un problema; mi spiego con degli
esempi: con
\begin{ex}[3]
dovrebbe scrivere:
Esercizio n***.
(le stelline indicano la difficoltà)
con
\begin{ex}[3p]
invece dovrebbe scrivere
Problema n***.
(Ora come ora per ottenere questo risultato debbo scrivere \begin{ex}
[3]{p}).
Tuttavia non so come manipolare le stringhe in LaTeX.
In aggiunta a ciò vorrei specificare un nuovo parametro per ogni
esercizio che metta in una nota di margine sinistra la dicitura "m
punti" ad esempio
\begin{ex}[2]{3}
dovrebbe sortire
(3 punti)    Esercizio n**.
dove "(3 punti)" è nota a margine sinistro. Ringrazio per la pazienza.
P. M.

 scrive:

Ci sono parecchie cose che non vanno. Per esempio tutti quegli
\addtolength non li capisco proprio.
Io farei così:
=====
\newenvironment{ex}[3][e]
  {\par\noindent
   \ifnum#2=0
   \else
   \llap{(#2 punti)\quad}%
   \fi
   \refstepcounter{esercizio}%
   \textbf{%
     \if #1p%
       Problema%
     \else
       Esercizio%
     \fi
     \ \theesercizio\transform@intoasts{#3}. }\ignorespaces}
  {\par}
%%% macro truccosa per trasformare un intero in asterischi
\def\transform@intoasts#1{%
  \begingroup
    \uccode`m=`*
    \uppercase\expandafter{\romannumeral\number#1 000}%
 \endgroup}
=====
La sintassi dell'ambiente ex è
\begin{ex}[<char>]{<int1>}{<int2>}
<Testo dell'esercizio>
\end{ex}
<char> è 'e' oppure 'p'; il primo è il default
<int1> è il punteggio (un intero non negativo)
<int2> è la difficoltà (un intero non negativo)
Se <int1> è 0, non compare nulla a sinistra; analogamente, se
<int2> è 0, non compare alcun asterisco.
\begin{ex}{0}{0}: né punteggio né asterischi
\begin{ex}{0}{1}: niente punteggio, un asterisco
\begin{ex}{3}{2}: (3 punti) nel margine sinistro, due asterischi
Con \begin{ex}[p]{0}{0} avrai scritto "Problema" invece che "Esercizio".
Alcune altre note: nei .sty si usa \RequirePackage invece di
\usepackage; non si devono usare i comandi \bf, \sf e simili, vanno
invece preferiti i comandi più lunghi \bfseries, \sffamily
(dentro gruppi) oppure \textbf e \textsf.
Il pacchetto ifthen non serve, con queste macro.
Ciao
Enrico

Grazie ancora per l'aiuto,
quegli \addtolength mi servivano perché desideravo che la dicitura
Esercizio/Problema fosse al pari del testo, precedente, poi, nel testo
dell'esercizio il margine sinistro venisse rientrato. Ho provato a
modificare il codice che mi ha fornito (che mi ha permesso peraltro di
imparare diverse cose):
\theesercizio\transform@intoasts{#3}\addtolength{\leftskip}
{\baselineskip}\ignorespaces}
ed ovviamente alla conclusione
\addtolength{\leftskip}{\baselineskip}
\par}
Purtroppo però vorrei che la prima riga dove c'è scritto Problema
fosse al pari con le altre, ma ciò non succede. Come potrei fare?
P.M.

 scrive:

Carino quel \transform@intoasts, vero?
La frase "ovviamente alla conclusione" mi dice che non ricordi che
un ambiente forma un gruppo. Dopo \end{ex} il valore di \leftskip è 
comunque uguale a quanto valido prima di \begin{ex} e dunque non
occorre rimetterlo al valore precedente.
Direi che come vuoi tu è tipograficamente è bruttino. In ogni caso 
ricorda che \baselineskip è una misura verticale e non va mai usata in
"orizzontale".
\newenvironment{ex}[3][e]
  {\par\noindent
%%% riga magica per far rientrare le righe dopo la prima %%%
   \hangindent=\parindent\hangafter=1
%%%
   \ifnum#2=0
   \else
   \llap{(#2 punti)\quad}%
   \fi
   \refstepcounter{esercizio}%
   \textbf{%
     \if #1p%
       Problema%
     \else
       Esercizio%
     \fi
     \ \theesercizio\transform@intoasts{#3}. }\ignorespaces}
  {\par}
In alternativa, puoi scrivere, al posto della riga magica
\setlength{\leftskip}{\parindent}%
\hspace*{-\parindent}%
ma la soluzione con \hangindent e \hangafter mi piace di più.
Ma è solo una questione di studio: molto meglio aggiungere una
spaziatura verticale prima e dopo, il nero del titolo (Problema o 
Esercizio) mette in risalto lo stesso con risparmio di spazio e
flusso del testo più regolare:
\newenvironment{ex}[3][e]
  {\addvspace{\medskipamount}\par\noindent
   \ifnum#2=0
   \else
   \llap{(#2 punti)\quad}%
   \fi
   \refstepcounter{esercizio}%
   \textbf{%
     \if #1p%
       Problema%
     \else
       Esercizio%
     \fi
     \ \theesercizio\transform@intoasts{#3}. }\ignorespaces}
  {\par\addvspace{\medskipamount}}
Usa \bigskipamount se ti pare poco, ma io direi di no. Usando
\addvspace si evita che le spaziature si accumulino.
Ciao
Enrico

Ho optato per la seconda soluzione:
\setlength{\leftskip}{\parindent}%
\hspace*{-\parindent}%
in quanto, nel caso l'esercizio dovesse avere più di un paragrafo col
primo metodo sembrerebbe non dare l'effetto desiderato. Ho molto
apprezzato il trucco con i numeri romani (anche se ho constatato, con
rammarico, che LaTeX sembra ignorare che i romani per esprimere le
migliaia usavano anche un trattino orizzontale sopra le unità, ma non
penso un esercizio con tanti asterischi verrà mai assegnato). Quanto
al resto purtroppo non ho trovato ancora un testo che mi possa far
apprendere certi argomenti di LaTeX in modo approfondito ma specifico,
non troppo estensivo. Un'altra domanda da ignorante, stavo cercando di
capire la sintassi di \if e penso di averla capita ma se, ad esempio,
per un problema avessi voluto usare
\begin{ex}[pr]....
cioè una stringa di due caratteri anziché di uno? Sarebbe tutto
svanito. Mi auguro di no!
Complimenti per i suggerimenti
P.M.

Un ulteriore precisazione: gli argomenti numerici di \ifnum debbono
per forza essere numeri interi?. Se ad esempio volessi mettere un
esercizio che vale 1.5 punti ho visto tutto si blocca \ifnum. Perché
questi comandi così plain hanno delle limitazioni così assurde?
P.M.

 troppo estensivo.
e' un po' una richiesta di moglie piena e botte ubriaca...
   il TeX  book
 
http://www.cs.utk.edu/~eijkhout/texbytopic-a4.pdf

 svanito. Mi auguro di no!
In tal caso si dovrebbe esaminare l'argomento opzionale un
carattere alla volta. Negli "Appunti" che ti ho indicato c'è
almeno un esempio al riguardo.
Il condizionale \ifnum permette solo confronti fra interi. Puoi
usare numeri decimali sostituendolo con \ifdim:
   \ifdim#2pt=0pt
   \else
   \llap{(#2 punti)\quad}%
   \fi
Ciao
Enrico

Un'altra domanda (visto che sapete tutte le risposte), come si fa a
controllare se una stringa è vuota? Mi servirebbe perché se l'utente
non immette il campo desiderato, ad es. "Classe" sul documento non
venga scritta la parola "Classe" con un campo vuoto a fianco.
Grazie preventivamente
P.M.

 writes:

É possibile usare il package ifthen e le macro 
\ifthenelse{\equal{#1}{}}{se vero}{se non é vero (ma bene trovato nemenno)}
 
c'é ancora il package xifthen e allora si puo usare
\ifthenelse{\isempty{#1}}{se vero}{se non é vero (ma bene trovato nemenno)}
-- 
Le TeXnicien de surface

 scrive:

Normalmente si adotta una strategia indiretta. Supponiamo che all'utente
sia richiesto di scrivere
\Classe{Prima}
per ottenere il risultato desiderato. Tu vuoi che se questo comando non
viene dato, LaTeX non stampi proprio nulla:
\def\@Classe{}
\def\Classe#1{\gdef\@Classe{#1}}
Spiegazione: si dà un valore di default alla macro \@Classe (vuoto),
mentre il comando \Classe semplicemente ridefinisce (globalmente,
per evitare problemi di vario tipo) il significato di \@Classe.
Adesso vediamo come usarlo; avrai una macro che si occupa di scrivere
l'intestazione:
\def\componititolo{%
 ...
 \ifx\@Classe\@empty\else <qualcosa che usa \@Classe>\fi
 ...}
Se \@Classe ha il valore di default, quindi non è stato usato il comando
\Classe, non succede nulla; altrimenti viene seguito il ramo \else e si 
può fare qualsiasi cosa usando il valore di \@Classe, che si espande al
valore giusto.
Ciao
Enrico

Un'ulteriore domanda. Volendo mettere, in un libro ad esempio,
l'indice di tutti gli esercizi, come potrei fare. Ho visto che c'è un
comando simile per i teoremi tipo \listtheorems, ma si applica solo ai
teoremi e non agli ambienti che ho creato. Come potrei fare?
Grazie
P.M.