- Questo topic ha 7 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 10 anni, 11 mesi fa da
diegotex.
-
CreatoreTopic
-
25 Settembre 2015 alle 10:40 #103298::
ciao a tutti
come dice il titolo devo fare una pspicture che occupi la parte del testo (\textwidht) e delle note (marginpar)
sono in classe book e ovviamente le pagine cambiano se pari o dispari
ho trovato questo post però per l’ambiente figure (non lo sto usando, la mia immagine è solo dentro un \begin{center} e \begin{pspicture})http://www.guit.sssup.it/phpbb/viewtopic.php?t=9826&start=0&postdays=0&postorder=asc&highlight=
e questo per le tabelle:
http://www.guit.sssup.it/phpbb/viewtopic.php?t=9408
scusate un po’ di pigrizia (lo ammetto) ma questo codice mi sembra arabo
(so che qualcuno mi risponderà che potrei imparare al posto di fastidiare, ma davvero non ho il tempo e non faccio un uso esagerato di latex tale da giustificare certi investimenti di tempo)vorrei capire da dove parto per risolvere il problema della mia pspicture
ciao e grazie
-
CreatoreTopic
-
AutoreRisposte
-
-
25 Settembre 2015 alle 16:20 #103299::
Il tuo problema non è banale, quindi devi avere pazienza e se quelle due vecchie discussioni ti possono essere utili usale, altrimenti posso mandarti altro codice arabo o cinese con il quale risolvere il problema.
La cosa diventa più facile se metti la tua pspicture in una figure flottante a cui apporrai la didascalia e un label per riferirti a quella figura con un “… mostrato nella figura~\ref{fig:pspicturelarga}…”
la soluzione dunque è questa:`\begin{figure}
\makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+marginparwidth]{\begin{pspicture}…\end{pspicure}}}
\caption{…}\label{fig:…}
\endf{figure}`
Funziona così: ci sono due scatole: quella più esterna è larga esattamente \textwidth e contiene un’altra scatola larga quanto la somma della giustezza del teso più lo spazio fra il testo e le note marignali più la larghezza delle note marginali questa seconda scatola contiene la pspicture; per farla sbordare fuori del margine destro o sinistro, la scatola esterna deve contenere la scatola che contiene la figura accostata a siinstra se la pagina è disperi e a destra se la pagina è pari ecco quindi che nel suo secondo argomento facoltativo c’è il test sul numero della pagina per cui se il numero di pagina è dispari, specifica il codice di posizionamento l altrimenti lo specifica r.Nota questo test sul numero di pagina può essere fatto solo se l’oggetto è flottante: il numero di pagina viene fissato solo nel momento in cui l’oggetto flottante viene messo in una pagina e questa viene accodata al file di uscita.
Data la natura asincrona fra la composizione del testo e la costruzione della pagina che viene inviata al file di uscita il numero di pagina non è noto quando venisse compilato un ambiente center che contenesse la pspicture; quindi il test sul numero di pagina sarebbe verosimilmente errato. Questo problema si può risolvere con la definizione di label di servizio a cui viene assegnato un valore quando quella pagina vien inviata all’uscita: ricompilando l’etichetta del label contiene il numero della pagina e se ne può controllare la parità solo alla seconda passata. le macro da usare sono molto particolari e potrebbero apparire “arabo” o “cinese” e di difficile modifica se non se ne ha completa padronanza.
Esistono classi, come memoir che dispongono di una interfaccia utente, di macro a disposizione dell’utente che permettono di fare queste acrobazie, nascondendo all’utente finale quello che sta sotto il cofano. Non so se hai voglia di usare memoir. In ogni caso le sue macro utente sono descritte nel paragrafo 18.12 della documentazione di memoir.
-
1 Ottobre 2015 alle 20:29 #103300::
molte grazie per la risposta esaustivail codice non fa bene i suoi conti, però
ho provato ad usarlo, ma la figura risulta corretta solo nella pagina dispari, mentre che nelle pari non inverte come vorrei
ti mando il codice di un mini fai che ho usato per prova disegnando un rettangolo
`
\documentclass[10pt,twoside,fleqn]{book}
% \documentclass[10pt,twoside,fleqn,openany]{book}
\usepackage[letterpaper,includehead,includefoot,inner=2cm,outer=1cm,bottom=2cm,top=2cm, marginparwidth=5cm, marginparsep=0.5cm, includemp]{geometry}%Con geometry puoi dare `\newgeometry` e `\restoregeometry`. Il manuale è abbastanza chiaro.
\usepackage{pspicture}
\usepackage{pst-all}
\usepackage{pst-fill}\usepackage{lipsum}
\begin{document}
\begin{figure}
\makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{
\begin{pspicture}(0,-5)(18,5) %la figura è in (-10.5,0)(8,-5)
\psframe(0,-5)(18,5)
\end{pspicture}
}}
% \caption{…}\label{fig:…}
\end{figure}\lipsum[1]
\begin{figure}
\makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{
\begin{pspicture}(0,-5)(18,5) %la figura è in (-10.5,0)(8,-5)
\psframe(0,-5)(18,5)
\end{pspicture}
}}
% \caption{…}\label{fig:…}
\end{figure}\lipsum[1]
\begin{figure}
\makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{
\begin{pspicture}(0,-5)(18,5) %la figura è in (-10.5,0)(8,-5)
\psframe(0,-5)(18,5)
\end{pspicture}
}}
% \caption{…}\label{fig:…}
\end{figure}\lipsum[1]
\begin{figure}
\makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{
\begin{pspicture}(0,-5)(18,5) %la figura è in (-10.5,0)(8,-5)
\psframe(0,-5)(18,5)
\end{pspicture}
}}
% \caption{…}\label{fig:…}
\end{figure}\lipsum[1]
\end{document}
`ma se provi a compilare vedrai che non fa questo calcolo di pari o dispari
(o lo fa, ma il risultato non cambia)ho provato anche a compilare più volte (per vedere se doveva fare calcoli…) ma il risultato non cambia
hai qualche idea?
grazie anticipatamente
-
1 Ottobre 2015 alle 21:02 #103301::
Sì, non è che non funzioni, è che se dalla pagina precedente ci sono ancora figure in coda il meccanismo asincrono di comporre le pagine le piazza, come se appartenessero alla pagina precedente; se fai delle figure più grandi e e specifichi che le vuoi solo al top della pagina, )per esempio, il problema non si pone. Il seguente esempio deriva dal tuo Ho dovuto togliere le figure postscript perché a me dava un errore su un certo comando non definito (la mia installazione è stata aggiornata tre giorni fa, quindi direi che non ho vecchi file …)
Ho usato il semplice ambinete picture epr mettere il rettangolo e la cosa viene benissimo.` \documentclass[10pt,twoside,fleqn]{book}
% \documentclass[10pt,twoside,fleqn,openany]{book}
\usepackage[letterpaper,includehead,includefoot,inner=2cm,outer=1cm,bottom=2cm,top=2cm, marginparwidth=5cm, marginparsep=0.5cm, includemp]{geometry}%Con geometry puoi dare `\newgeometry` e `\restoregeometry`. Il manuale è abbastanza chiaro.
%\usepackage{pspicture}
%\usepackage{pst-all}
%\usepackage{pst-fill}\usepackage{lipsum}
\begin{document}
\unitlength=1cm
\begin{figure}[t]
\makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{%
\begin{picture}(18,10)
\put(0,0){\framebox(18,10)}
\end{picture}
}}
% \caption{…}\label{fig:…}
\end{figure}\lipsum[1-4]
\begin{figure}[t]
\makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{%
\begin{picture}(18,10) %la figura è in (-10.5,0)(8,-5)
\put(0,0){\framebox(18,10)}
\end{picture}
}}
% \caption{…}\label{fig:…}
\end{figure}\lipsum[1-4]
\begin{figure}[t]
\makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{%
\begin{picture}(18,10) %la figura è in (-10.5,0)(8,-5)
\put(0,0){\framebox(18,10)}
\end{picture}
}}
% \caption{…}\label{fig:…}
\end{figure}\lipsum[1-4]
\begin{figure}[t]
\makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{%
\begin{picture}(18,10) %la figura è in (-10.5,0)(8,-5)
\put(0,0){\framebox(18,10)}
\end{picture}
}}
% \caption{…}\label{fig:…}
\end{figure}\lipsum[1-4]
\end{document}
`
-
2 Ottobre 2015 alle 8:32 #103302::
Qui c’è un’altra soluzione molto più complessa, ma che non dovrebbe soffrire dei problemi della soluzione che ti ho dato precedentemente.`\documentclass{article}\usepackage{kantlipsum}
\makeatletter
\newcommand*\sedispari[1]{%
\edef\LRfig{\the\c@page}\ifcsname r@#1\endcsname
\edef\LRfig@{\csname r@#1\endcsname}
\edef\LRfig{\expandafter\@secondoftwo\LRfig@}\fi
\toks@=\expandafter{\LRfig}
\edef\RLfig{\ifodd\the\toks@ l\else r\fi}}\begin{document}\errorcontextlines=9
\kant[1-4]
\unitlength=1cm\begin{figure}\sedispari{fig:primafigura}
\makebox[\textwidth][\RLfig]{%
\begin{picture}(14,3)
\put(0,0){\framebox(14,3){}}
\end{picture}}
\caption{Prima figura}\label{fig:primafigura}
\end{figure}\kant[5-6]
\begin{figure}\sedispari{fig:secondafigura}
\makebox[\textwidth][\RLfig]{%
\begin{picture}(14,3)
\put(0,0){\framebox(14,3){}}
\end{picture}}
\caption{Seconda figura}\label{fig:secondafigura}
\end{figure}\kant[7]
\begin{figure}\sedispari{fig:terzafigura}
\makebox[\textwidth][\RLfig]{%
\begin{picture}(14,3)
\put(0,0){\framebox(14,3){}}
\end{picture}}
\caption{Terza figura}\label{fig:terzafigura}
\end{figure}\end{document}`
È leggermente più laboriosa, ma funziona bene come vedi dall’esempio minimo che ti allego.
Funziona così:
1) il comando \sedispari vuole come argomento lo stesso label che specifichi dopo \caption o altro label a tuo piacimento che sia messo alla fine dell’ambiente flottante; se metti sempre le didascalie soto all’oggetto mostrato, non ci sono problemi; se invece, come con le tabelle, metti la didascalia prima della tabella, o metti il label dopo tabular, o dopo tabular metti un label di tua scelta da ripetere nell’argomento di \sedispari, che invece deve stare comunque all’inizio dell’ambiente flottante.
2) \sedispari cerca di indovinare la parità della pagina alla prima compilazione, ma comunque ne prende il valore esatto alla seconda compilazione.
3) A seconda della parità della pagina viene definito un significato per \LRfig, che viene usato coma codice di allineamento della macro \makebox.
4) Inserisci l’oggetto largo dentro una \makebox larga quanto \textwidth, ma specificano l’allineamento mediante \LRfig.
5) Compili due volte (non occorre farlo quando la figura è già stata esaminata in compilazioni precedenti) e il tuo oggetto largo si trova collocato al punto giusto.La complicazione della definizione della macro \sedispari dipende dal fatto che quanto il comando \label scrive nel file aux è bene nascosto dentro macro il cui nome è ottenuto dal nome dell’etichetta fornita a \label aggiungendoci opportuni prefissi.
È possibile che la macro \sedispari non funzioni correttamente se il tuo file usa hyperref. Non ho fatto questo collaudo; eventualmente fammelo sapere affinché ti possa dare una macro che funzioni correttamente anche con la presenza di hyperref.
-
2 Ottobre 2015 alle 23:30 #103303
-
3 Ottobre 2015 alle 6:14 #103304::
Intanto io ho collaudato con hyperef e le macro che ti ho invito non funzionano. Nel frattempo ho anche cambiato noi ed altro. quindi prima di allegarti il nuovo set di macro con l’esempio di applicazione anche per le tabelle, aspetto iltuo “via libera”.Per ora bisogna solo vedere se funziona bene con qualsiasi oggetto, per esempio con le tue psfigure.
-
3 Ottobre 2015 alle 9:58 #103305::
mi sembra che la prima delle due soluzioni sia buona per me.nel senso che mi sembra che faccia confusione se metto molte immagini “larghe” una in fila all’altra, ma se ne metto una ogni tanto (3-4 pagine) mi sembra che non faccia confusione
la seconda maniera non mi funzionava appunto per le pspicture
molte grazie
ciao
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.