Posizionare oggetto a una distanza esatta dal margine di pag

  • Creatore
    Topic
  • #110053
    robitex
    Amministratore del forum
      Up
      0
      Down
      ::


      Ciao.
      Vorrei posizionare un rettangolo, che in realtà è un cartiglio di progetto, esattamente al centro della pagina.
      Conosco la larghezza del cartiglio che è di 180mm, quindi il margine effettivo dovrà essere di 15mm da bordo pagina.

      Questo codice funziona, ma chiedo se esiste una soluzione più elegante:
      `\documentclass[a4paper]{article}

      \usepackage[showframe]{geometry}
      \usepackage{tikz}

      \begin{document}
      \noindent pippo

      \noindent
      \hspace{-\hoffset}%
      \hspace{-\oddsidemargin}%
      \hspace{-1in}%
      \hspace{15mm}%
      \rlap{\tikz \draw (0,0) rectangle (180mm, 60mm);}

      \noindent pippo
      \end{document}`

      Grazie.
      R.

    Visualizzazione 4 filoni di risposte
    • Autore
      Risposte
      • #110054
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Non ho provato il codice seguente, ma invece di specificare arretramenti negativi diverse volte, io userei solo un’unica espressione \dimexpr e una scatola di larghezza fissa; Esempio:`\par\\vspace{quel che ti pare}\noindent
          \makebox[\textwidth]{\tikz \draw (0,0) rectangle (180mm, 60mm);}\par\vspace{quel che ti pare}`
          Se i due marigni sono uguali non hai bisogno di aggiungere niente. Se invece il margine interno e il margine esterno sono diversi devi calcolare un certo spostamento; per esempio, visto che il margine interno vale \oddsidemargin (più vari displacement) e la larghezza della pagina – \textwidth -\oddsidemarigin (con ivari displacement) dà \evensidemargin (con i vari sdisplacement uguali a quelli di \oddsidemargin) ti basta spostare il centro del disegno di 180mm di larghezza di quanto basta, cioè metà della differenza fra \oddsidemargin e \evensidemargin; di conseguenza`\par\vspace{quel che ti pare}\noindent
          \makebox[\textwidth]{kern\dimexpr\oddsidemargin-\evensidemargin\relac\tikz \draw (0,0) rectangle (180mm, 60mm);}\par
          \vspace{quel che ti pare}` Questo secondo codice può essere usato sempre, anche si i marigni fossero uguali; infatti in questo caso la differenza fra \oddsidemargin e \evensidemargin sarebbe nulla.

          Siccome non ho testato il codice, non mi stupirei se all’atto pratico fosse necessario cambiare segno alla differenza calcolata con \dimexpr; ci ho pensato su, ma mi pare che quella differenza abbia il segno corretto.

          Invece gli spazi verticali di ammontare “quel che ti pare” puoi anche saltarli se provvedi prima e dopo aver usato questa scatola.

          Noti che i 15mm non compaiono più; qualunque sia la larghezza dell’oggetto che metti dentro la scatola risulta centrato orizzontalmente nella pagina, non centrato nel testo.

        • #110055
          robitex
          Amministratore del forum
            Up
            0
            Down
            ::


            Grande idea Claudio!
            Spostare l’oggetto della defferenza dei margini è geniale!

            R.

          • #110056
            OldClaudio
            Partecipante
              Up
              0
              Down
              ::


              Proabilmente devi coambiare l’espressione mettendoci metà del risultato`0.5\dimexpr\oddsidemargin-\evensidemargin\relax`oppure`\dimexpr(\oddsidemargin-\evensidemargin)/2\relax`

            • #110057
              robitex
              Amministratore del forum
                Up
                0
                Down
                ::

                OldClaudio” post=110289Proabilmente devi coambiare l’espressione mettendoci metà del risultato`0.5\dimexpr\oddsidemargin-\evensidemargin\relax`oppure`\dimexpr(\oddsidemargin-\evensidemargin)/2\relax`

                Ciao.
                Il segno della correzione cambia a seconda della pagina pari o dispari.
                Allora ho scritto questo codice che sembra funzionare:
                `\documentclass[a4paper]{book}
                \usepackage[showframe]{geometry}

                \geometry{hmargin={32mm,20mm}}
                \usepackage{tikz}

                \newcommand\cartiglio{%
                \noindent
                \ifodd\value{page}%
                \kern\dimexpr(\evensidemargin-\oddsidemargin)/2\relax
                \else
                \kern\dimexpr(\oddsidemargin-\evensidemargin)/2\relax
                \fi
                \makebox[\textwidth]{\tikz[red] \draw (0,0) rectangle (210mm,60mm);}}

                \begin{document}
                % odd page
                \noindent pippo

                \cartiglio

                \noindent pippo
                \newpage
                % even page
                \noindent pippo

                \cartiglio

                \noindent pippo
                \end{document}`

                Quello che mi rimane ancora da chiarire è la sicurezza del test \ifodd sul valore di pagina (in questo caso il test può fallire?), e chiarire se è preferibile usare \hskip o \kern per imporre lo spostamento.

                Grazie.
                R

              • #110058
                OldClaudio
                Partecipante
                  Up
                  0
                  Down
                  ::


                  Dato il processo asincrono tra l’interpretazione del codice e dala costruzione delle pagine, la certezza del test \ifodd non c’è. Per rendere certa la disparità dellapagina ci vuole un meccanismo completo che richiede un \label interno da cui ricavare il valore contenuto e prelevabile da \pageref coì da controllare la disparità della pagina in cui il cartiglio è finito nella compilazione precedente. Io non ho mai trovato un pacchetto che lo faccia; ho trovato solo la classe memoir che lo fa con i comandi \strictchechoddpage (o qualcosa del genere — apri la documentazione di memoir e cerca la stringa strict; una delle istanze è quella che ti serve); con memoir funziona benissimo; l’analogo comando senza “strict” nel nome ci piglia abbastanza spesso, ma non cè da fidarsi.

                  L’unico caso in cui \ifodd\value{page} funziona con certezza è quando il test viene eseguito dentro un ambiente figure, perché allora, benche l’oggetto sia mobile, il valore del numero di pagina da associare alla macro interna è quello corretto al momento in cui la figura viene effettivamente spedita al file di uscita, non quando il codice viene letto ed eventualmente trattenuto nella coda degli oggetti mobili.

                  Se potessi mettere il cartiglio dentro una figura che sai per certo che può stare dentro un ambiente figure da piazzare con il codice h, allora potresti usare ]ifodd con tranauillità e certezza del risultato.

                  Incidentalmente non hi bisogno di scrivere tutto quel codice; puoi mettere solo il segno meno dento il costrutto condizionale:`\ifodd\value{page}-\fi
                  \kern\dimexpr(\oddsidemargin-\evensidemargin)/2\relax
                  \makebox[\textwidth]{\tikz[red] \draw (0,0) rectangle (210mm,60mm);}}`

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

              Go to top