Particolare marginpar

  • Creatore
    Topic
  • #17921
    Up
    0
    Down
    ::


    Salve,
    ho sempre letto il forum ma questo è il mio primo post. Innanzitutto congratulazioni per l’efficienza di un tale servizio! Finora non ho mai avuto la necessità di postare una domanda, ma ora vorrei chiedere due cose (ovviamente ho già cercato in giro ma non sono riuscito a fare ciò che voglio…). Mi scuso anticipatamente se quel che cerco è scritto in qualche manuale e io non l’ho trovato 😳

    Andiamo per ordine.

    PRIMO PROBLEMA (più semplice)
    ———————————–
    Vorrei, quando scrivo un Teorema, una Proposizione (uso ovviamente AMS), ecc avere una barra laterale che “evidenzi” la presenza del teorema, senza che vada fuori del margine (quindi in pratica il testo del teorema risulterà un pochino indentato rispetto al resto del testo). La resa sarebbe qualcosa del tipo seguente:

    Il seguente teorema spiega bla bla
    | | Teorema (di Torricelli). Sia f una funzione bla bla
    | | bla bla bla
    | | bla bla bla
    Dimostrazione. bla bla bla

    Penso che sia una richiesta abbastanza semplice. Ho cercato nel pacchetto AMS ma non ho trovato nulla.

    SEOCNDO PROBLEMA (più difficile)
    ———————————–
    Riguarda le note a margine (so che non si usano molto in italiano, ma cmq sono belline!). Già uso marginpar in questa forma (sicuramente poco elegante, ma che funziona):

    \newcommand{\mymarginpardx}[2][5000]{\linespread{1} \marginpar{\footnotesize\sffamily \edef\oldtolerance{\the\tolerance} \tolerance=#1\relax \hskip0pt #2\par\tolerance=\oldtolerance}}

    Poi potrei chiamare direttamente

    \mymarginpar[5000]{questa scritta è la nota a margine}

    Ma io vorrei che venisse una linea verticale a lato, come per evidenziare la nota. Ho pensato a una cosa tipo la seguente:

    \mymarginpardx[10000]{
    \vspace{-10mm} % = -0.333333 * numero righe
    {\rule{0.5mm}{10mm}} % = vspace
    \hspace{-2 mm } \begin{tabular}{p{2cm}*{0}{c}}
    %lasciare riga vuota

    \resizebox{0.85\width}{\height}{ L’integrale di Lebesgue} \\
    \resizebox{0.85\width}{\height}{ è alla base del concetto} \\
    \resizebox{0.85\width}{\height}{ di trasformata di Fourier} \\
    \end{tabular}
    }

    Ci sono vari obbrobri in questa implementazione (il resizebox, il vspace e l’hspace a mano, …), però funziona e dà l’idea di quello che vorrei. Ora, il punto è il seguente:
    1) ogni volta devo regolare manualmente tutte le lunghezze (mentre vorrei automatizzare il tutto)
    2) se la nota viene in una pagina sx allora devo cambiare tutto… e se poi (allungando magari un discorso) mi va a finire a dx? mi si sovrappone col testo… un caos!

    Quindi vorrei una soluzione, non mi interessa quando pulita sia, ma che automatizzi il tutto (cioè, se ci sono quattro righe, fa direttamente lui la linea verticale più lunga, ecc ecc) e che riesca da solo a capire che nelle pagine di sx la lineetta va messa a destra del margine e in quelle di dx a sx del margine (cioè sempre attaccata al testo).

    Ringrazio per le risposte sapienti che verranno,
    bye.

Visualizzazione 7 filoni di risposte
  • Autore
    Risposte
    • #17922
      Up
      0
      Down
      ::

      PRIMO PROBLEMA (più semplice)
      ———————————–
      Vorrei, quando scrivo un Teorema, una Proposizione (uso ovviamente AMS), ecc avere una barra laterale che “evidenzi” la presenza del teorema, senza che vada fuori del margine (quindi in pratica il testo del teorema risulterà un pochino indentato rispetto al resto del testo). La resa sarebbe qualcosa del tipo seguente:

      Il seguente teorema spiega bla bla
      | | Teorema (di Torricelli). Sia f una funzione bla bla
      | | bla bla bla
      | | bla bla bla
      Dimostrazione. bla bla bla

      Penso che sia una richiesta abbastanza semplice. Ho cercato nel pacchetto AMS ma non ho trovato nulla.

      Semplice? Be’, forse non hai proprio le idee chiare su ciò che è facile e ciò che è difficile. Porre barre laterali non è proprio il massimo della semplicità. Una soluzione ce l’ho, con parecchi limiti.

      1) La numerazione dei teoremi è unica; se non ti va, peggio per te. 🙂

      2) Gli enunciati non possono essere divisi fra due pagine.

      `\newbox\barbox
      {
      \setlength\fboxsep{0pt}\setlength\fboxrule{0pt}
      \global\setbox\barbox=\hbox{%
      \colorbox[gray]{.8}{\hskip 4pt\relax\vrule height3pt width 0pt}%
      \hskip4pt}
      \dimen0=\ht\barbox \advance\dimen0-1pt \ht\barbox=\dimen0 \dp\barbox=-1pt
      }

      \newcommand*{\thethmname}{}
      \newtheorem{innerthm}{\thethmname}

      \newenvironment{thm}[1]
      {\par\addvspace{\medskipamount}\noindent\renewcommand{\thethmname}{#1}%
      \valign\bgroup##\cr\leaders\copy\barbox\vfill\cr
      \vbox\bgroup\advance\hsize-8pt\vspace*{-1ex}
      \begin{innerthm}}
      {\end{innerthm}\vspace*{-1ex}\egroup\cr\egroup\par\addvspace{\medskipamount}}
      `
      Lo usi dicendo
      `\begin{thm}{Teorema (di Torricelli)}
      Il barometro è bello. Il calcolo integrale di più.
      \end{thm}`
      Ti produce una barra grigia (devi caricare il pacchetto color, ovviamente) a fianco dell’enunciato, allineata al margine della gabbia.

      Nota per gli intenditori: ho usato \valign ❗ ❗ ❗ 😉

      Per il secondo problema, che è effettivamente complicato, hai due strade: una è lasciar perdere, l’altra è aprire un nuovo topic.

      Ciao
      Enrico

    • #17923
      Up
      0
      Down
      ::


      Ti ringrazio, è proprio bello!!

      Per l’altra cosa, forse chiedo troppo, anche se penso che si farebbe più o meno come tu hai fatto questa… se mai ci riuscirò (:o) la posterò, magari a qualcuno serve (non vorrei aprire un altro topic per non scocciare…)

      CaO

      P.S. Non è che qualcuno sa quale è questo carattere? L’ho cercato ovunque…

    • #17924
      Up
      0
      Down
      ::


      Per quanto riguarda il marginpar particolare, ho fatto un po’ di progressi però vorrei un aiuto perché da solo non ce la farei mai 😉 Spero che alla fine dopo tanti sforzi venga una cosa carina da poter postare funzionante, così da essere utile anche ad altri.

      Sullo spunto del post di egreg ho modificato il codice così:
      `
      \newbox\stripbox
      {
      \setlength\fboxsep{0pt}\setlength\fboxrule{0pt}
      \global\setbox\stripbox=\hbox{%
      \hskip2pt \colorbox[gray]{.5}{\hskip 4pt\relax\vrule height3pt width 0pt}%
      \hskip6pt}
      \dimen0=\ht\stripbox \advance\dimen0-1pt \ht\stripbox=\dimen0 \dp\stripbox=-1pt
      }

      \newenvironment{striscia}[0]
      {\par\addvspace{\medskipamount}\noindent%
      \valign\bgroup##\cr\leaders\copy\stripbox\vfill\cr
      \vbox\bgroup\advance\hsize-14pt\vspace*{-1.5ex}
      }
      {\vspace*{-1ex}\egroup\cr\egroup\par\addvspace{\medskipamount}}
      `
      Questo crea semplicemente una striscia a sinistra del testo che scrivi in \begin{striscia} testo testo \end{striscia}.

      Il seguente codice invece crea un comando con cui do in pasto al marginpar tutta la striscia (poi ridimensiono la box perché è grande… so che non si fa ma per ora faccio così).

      `
      \setlength{\marginparwidth}{4cm}
      \let\oldmarginpar\marginpar
      \renewcommand\marginpar[1]{\-\oldmarginpar[\raggedleft\sffamily\footnotesize #1]%
      {\raggedright\sffamily\footnotesize #1}}

      \newcommand{\marginstripsx}[1]{ \marginpar{
      \resizebox{0.8\width}{\height}{ \begin{tabular}{p{4cm}}
      \begin{striscia} \begin{flushleft}\tolerance=10000 #1\end{flushleft} \end{striscia}
      \end{tabular} } }}`

      Ora ho due problemi per andare avanti.

        1. Come faccio a modificare il codice per far venire la striscia non a sinistra ma a destra?

      Dopo aver capito questo, vorrei creare un ambiente marginpardx per i margini nelle pagine di sx, ma non c’è alcuna difficoltà (oltre questa). Allora sorge un altro problema:
      vorrei far scegliere a latex quale margine prendere in base alla pagina nella quale si trova; sarebbe a dire: se la pagine è a sx scegli quello per le pagine di sx e vcv. Ci sarebbe bisogno di una sorta di if… allora

        2. Come faccio a scrivere un codice che scelga tra due alternative in cui la condizione è: “la pagina in cui ti trovi è di sx?”

      Spero che riusciremo nell’impresa…

      bye e grazie per la disponibilità

      P.S. Domandina sull’altro problema: c’è un comando per azzerare ad inizio capitolo (anche manualmente eh, nel senso che ogni capitolo lo riscrivo) il counter del teorema?

    • #17925
      Up
      0
      Down
      ::

      Per quanto riguarda il marginpar particolare, ho fatto un po’ di progressi però vorrei un aiuto perché da solo non ce la farei mai 😉 Spero che alla fine dopo tanti sforzi venga una cosa carina da poter postare funzionante, così da essere utile anche ad altri.

      Sullo spunto del post di egreg ho modificato il codice così:
      `
      \newbox\stripbox
      {
      \setlength\fboxsep{0pt}\setlength\fboxrule{0pt}
      \global\setbox\stripbox=\hbox{%
      \hskip2pt \colorbox[gray]{.5}{\hskip 4pt\relax\vrule height3pt width 0pt}%
      \hskip6pt}
      \dimen0=\ht\stripbox \advance\dimen0-1pt \ht\stripbox=\dimen0 \dp\stripbox=-1pt
      }

      \newenvironment{striscia}[0]
      {\par\addvspace{\medskipamount}\noindent%
      \valign\bgroup##\cr\leaders\copy\stripbox\vfill\cr
      \vbox\bgroup\advance\hsize-14pt\vspace*{-1.5ex}
      }
      {\vspace*{-1ex}\egroup\cr\egroup\par\addvspace{\medskipamount}}
      `
      Questo crea semplicemente una striscia a sinistra del testo che scrivi in \begin{striscia} testo testo \end{striscia}.

      Il seguente codice invece crea un comando con cui do in pasto al marginpar tutta la striscia (poi ridimensiono la box perché è grande… so che non si fa ma per ora faccio così).

      `
      \setlength{\marginparwidth}{4cm}
      \let\oldmarginpar\marginpar
      \renewcommand\marginpar[1]{\-\oldmarginpar[\raggedleft\sffamily\footnotesize #1]%
      {\raggedright\sffamily\footnotesize #1}}

      \newcommand{\marginstripsx}[1]{ \marginpar{
      \resizebox{0.8\width}{\height}{ \begin{tabular}{p{4cm}}
      \begin{striscia} \begin{flushleft}\tolerance=10000 #1\end{flushleft} \end{striscia}
      \end{tabular} } }}`

      Ora ho due problemi per andare avanti.

        1. Come faccio a modificare il codice per far venire la striscia non a sinistra ma a destra?

      Dopo aver capito questo, vorrei creare un ambiente marginpardx per i margini nelle pagine di sx, ma non c’è alcuna difficoltà (oltre questa). Allora sorge un altro problema:
      vorrei far scegliere a latex quale margine prendere in base alla pagina nella quale si trova; sarebbe a dire: se la pagine è a sx scegli quello per le pagine di sx e vcv. Ci sarebbe bisogno di una sorta di if… allora

        2. Come faccio a scrivere un codice che scelga tra due alternative in cui la condizione è: “la pagina in cui ti trovi è di sx?”

      Spero che riusciremo nell’impresa…

      bye e grazie per la disponibilità

      P.S. Domandina sull’altro problema: c’è un comando per azzerare ad inizio capitolo (anche manualmente eh, nel senso che ogni capitolo lo riscrivo) il counter del teorema?

      Ti dico subito che stai facendo un sacco di pasticci. Nell’ambiente “striscia” non è affatto necessario usare una nuova “box”, la \barbox dei teoremi va benissimo. Errore invece è modificare “\advance\hsize-8pt” in “-14pt”; inoltre non solo non devi aumentare il valore assoluto del \vspace a -1.5ex, ma devi del tutto togliere quei due \vspace:
      `\newenvironment{striscia}
      {\par\addvspace{\medskipamount}\noindent%
      \valign\bgroup##\cr\leaders\copy\barbox\vfill\cr
      \vbox\bgroup\advance\hsize-8pt
      }
      {\egroup\cr\egroup\par\addvspace{\medskipamount}}`
      Togli pure tutto il codice relativo a \stripbox.

      Quanto ai \marginpar, prova così:
      `\setlength{\marginparwidth}{2cm}
      \newcommand{\leftstrip}[1]{%
      \valign{##\cr
      \leaders\copy\barbox\vfill\cr
      \vbox{\hsize\marginparwidth\advance\hsize-8pt
      \raggedright\sffamily\footnotesize #1}\cr
      }
      }
      \newcommand{\rightstrip}[1]{%
      \valign{##\cr
      \vbox{\hsize\marginparwidth\advance\hsize-8pt
      \raggedright\sffamily\footnotesize #1}\cr
      \leaders\copy\barbox\vfill\cr
      }
      }
      \let\oldmarginpar\marginpar
      \renewcommand\marginpar[1]{%
      \oldmarginpar[\leftstrip{#1}]{\rightstrip{#1}}}`
      Avrai la strisciolina all’esterno. Non mi sembra molto attraente, se devo dire la verità.

      Sull’ultima domanda ti dovrei dire di leggere una guida. Sarò buono 🙂
      `\newtheorem{xyz}{abc}[chapter]`
      Ciao
      Enrico

      PS: corretto. Grazie ad Andrea

    • #17926
      DMW
        Up
        0
        Down
        ::


        Piccola correzione
        `
        \setlength{\marginparwidth}{2cm}
        `

        al posto di
        `
        \setlength{\marginpar}{2cm}`

        Ciao

        Andrea

      • #17927
        Up
        0
        Down
        ::

        Piccola correzione
        `\setlength{\marginparwidth}{2cm}`
        al posto di
        `\setlength{\marginpar}{2cm}`

        Non era l’unica magagna. Occorre tenere conto che le due righe devono andare al margine e con le macro descritte non succede. Scrivo di nuovo tutto.
        `\newbox\barleftbox
        \newbox\barrightbox
        {\setlength\fboxsep{0pt}\setlength\fboxrule{0pt}
        \global\setbox\barleftbox=\hbox{%
        \colorbox[gray]{.8}{\hskip 4pt\relax\vrule height3pt width 0pt}%
        \hskip4pt}
        \dimen0=\ht\barleftbox \advance\dimen0-1pt
        \ht\barleftbox=\dimen0
        \dp\barleftbox=-1pt
        \global\setbox\barrightbox=\hbox{%
        \hskip4pt
        \colorbox[gray]{.8}{\hskip 4pt\relax\vrule height3pt width 0pt}}
        \dimen0=\ht\barrightbox \advance\dimen0-1pt
        \ht\barrightbox=\dimen0
        \dp\barrightbox=-1pt
        }

        \newcommand*{\thethmname}{}
        \newtheorem{innerthm}{\thethmname}
        %\newtheorem{innerthm}{\thethmname}[chapter] % se i teoremi vanno numerati per capitolo

        \makeatletter
        \newenvironment{thm}[1]
        {\par\addvspace{\medskipamount}\noindent\renewcommand{\thethmname}{#1}%
        \valign\bgroup##\cr\leaders\copy\barleftbox\vfill\cr
        \vbox\bgroup\advance\hsize-8pt\vspace*{-1ex}
        \begin{innerthm}}
        {\end{innerthm}\vspace*{-1ex}\egroup\cr\egroup\par\addvspace{\medskipamount}}
        \makeatother

        \newenvironment{striscia}
        {\par\addvspace{\medskipamount}\noindent%
        \valign\bgroup##\cr\leaders\copy\barleftbox\vfill\cr
        \vbox\bgroup\advance\hsize-8pt
        }
        {\egroup\cr\egroup\par\addvspace{\medskipamount}}

        \setlength{\marginparwidth}{2cm} % o qualche altro valore

        \newcommand{\leftstrip}[1]{%
        \valign{##\cr
        \leaders\copy\barleftbox\vfill\cr
        \vbox{\hsize\marginparwidth\advance\hsize-8pt
        \raggedright\sffamily\footnotesize #1}\cr
        }
        }
        \newcommand{\rightstrip}[1]{%
        \valign{##\cr
        \vbox{\hsize\marginparwidth\advance\hsize-8pt
        \raggedright\sffamily\footnotesize #1}\cr
        \leaders\copy\barrightbox\vfill\cr
        }
        }

        \let\oldmarginpar\marginpar
        \renewcommand\marginpar[1]{%
        \oldmarginpar[\leftstrip{#1}]{\rightstrip{#1}}}`
        Ciao
        Enrico

      • #17928
        Up
        0
        Down
        ::


        Beh, innanzitutto…. GRANDIOSO!!! E’ molto bello e va liscissimo, senza warning.. nulla… bellissimo! Grazie Enrico e grazie Andrea!

        Qualche appuntino e qualche domandina 😉 Io intedevo la barra internamente cioè l’ultima riga così (ma si tratta solo di gusti eh!!)

        `\oldmarginpar[\rightstrip{#1}]{\leftstrip{#1}}}`

        Poi ho messo il raggedleft invece del raggedright nella sezione rightstrip (così viene allineato a destra nelle pagine di sinistra).

        Sinceramente non ho capito l’ultimo post di Enrico, nel senso che non capisco cosa non andasse. Cmq col nuovo codice tutto ok.

        Ultima cosa sulla numerazione dei teoremi: sapevo già che si faceva così, ma in questo modo mi mette il numero del capitolo e poi del teorema. Io invece intendevo una cosa diversa, e cioè mantenere la numerazione semplice all’interno di ogni capitolo, ma farla ripartire da 1 quando si cambia capitolo. Cmq non è importante… e anche discutibile per le ambiguità che si creerebbero.

        Ancora grazie 100’000.

        Ciao,
        Guido

      • #17929
        Up
        0
        Down
        ::

        Beh, innanzitutto…. GRANDIOSO!!! E’ molto bello e va liscissimo, senza warning.. nulla… bellissimo! Grazie Enrico e grazie Andrea!

        Qualche appuntino e qualche domandina 😉 Io intedevo la barra internamente cioè l’ultima riga così (ma si tratta solo di gusti eh!!)

        `\oldmarginpar[\rightstrip{#1}]{\leftstrip{#1}}}`

        Poi ho messo il raggedleft invece del raggedright nella sezione rightstrip (così viene allineato a destra nelle pagine di sinistra).

        Sinceramente non ho capito l’ultimo post di Enrico, nel senso che non capisco cosa non andasse. Cmq col nuovo codice tutto ok.

        Andava male la spaziatura delle barre. Nella versione originale la barra aveva sempre uno spazio a destra di 4 pt. Ora ne definisco due diverse: \barleftbox costruisce una barra grigia con uno spazio a destra; \barrightbox ha lo spazio a sinistra. Quindi forse dovrai scambiarle nelle definizioni di \leftstrip e \rightstrip.

        Ultima cosa sulla numerazione dei teoremi: sapevo già che si faceva così, ma in questo modo mi mette il numero del capitolo e poi del teorema. Io invece intendevo una cosa diversa, e cioè mantenere la numerazione semplice all’interno di ogni capitolo, ma farla ripartire da 1 quando si cambia capitolo. Cmq non è importante… e anche discutibile per le ambiguità che si creerebbero.

        Se i capitoli sono chiaramente indicati nelle testatine si può anche scegliere di numerare i teoremi per capitolo con un solo numero.
        `\newtheorem{xyz}{Foo}[chapter]
        \renewcommand{\thexyz}{\arabic{xyz}}`
        Ciao
        Enrico

    Visualizzazione 7 filoni di risposte
    • Devi essere connesso per rispondere a questo topic.

    Go to top