Come personalizzare un ambiente LaTeX esistente senza interferire con altri ambienti
-
03-07-2019 - |
Domanda
Sto usando Sphinx per documentare un progetto. Produce file LaTeX da testo ristrutturato .
Vorrei impostare un colore di sfondo grigio per le punte e le note , quindi ho personalizzato l'ambiente avviso dopo aver creato un ambiente graybox :
\definecolor{MyGray}{rgb}{0.80,0.80,0.80}
\makeatletter\newenvironment{graybox}{%
\begin{lrbox}{\@tempboxa}\begin{minipage}{\columnwidth}}{\end{minipage}\end{lrbox}%
\colorbox{MyGray}{\usebox{\@tempboxa}}
}\makeatother
\makeatletter
\renewenvironment{notice}[2]{
\begin{graybox}
\bf\it
\def\py@noticetype{#1}
\par\strong{#2}
\csname py@noticestart@#1\endcsname
}
{
\csname py@noticeend@\py@noticetype\endcsname
\end{graybox}
}
\makeatother
Tutto funziona bene tranne se inserisco una figure nell'ambiente avviso . In tal caso, visualizzo questo errore:
Errore LaTeX: non in modalità par esterna
C'è un modo per impostare uno sfondo grigio per quell'ambiente avviso ?
Soluzione 2
Grazie godbyk e Jouni per aver risposto alla mia domanda.
Il problema è che non codifico direttamente in LaTeX . Scrivo la documentazione in testo ristrutturato e Sphinx produce i file LaTeX .
Ma ho trovato una soluzione: ho ridefinito l'ambiente figure per usare staticfigure dal pacchetto flowfram :
\usepackage{flowfram}
\definecolor{MyGray}{rgb}{0.80,0.80,0.80}
\makeatletter\newenvironment{graybox}{%
\begin{lrbox}{\@tempboxa}\begin{minipage}{\columnwidth}}{\end{minipage}\end{lrbox}%
\colorbox{MyGray}{\usebox{\@tempboxa}}
}\makeatother
\makeatletter
\renewenvironment{notice}[2]{
\begin{graybox}
\bf\it
\def\py@noticetype{#1}
\par\strong{#2}
\csname py@noticestart@#1\endcsname
}
{
\csname py@noticeend@\py@noticetype\endcsname
\end{graybox}
}
\makeatother
\renewenvironment{figure}[6]{
\begin{staticfigure}
}{
\end{staticfigure}
}
PS: ho dovuto mettere 6 al numero di argomenti per ridefinire 'figura': se non lo faccio, produce un po 'di' htbp 'nei file pdf (non sono un LaTeX expert. è solo la soluzione che ho trovato per questo problema)
Altri suggerimenti
Questa è una FAQ . Non ha senso mettere una figura (o qualsiasi altro "float" che può spostarsi altrove nell'output) all'interno di una casella grigia; se vuoi che la tua figura contenga una casella grigia, inserisci l'ambiente della casella grigia all'interno dell'ambiente della figura.
Come sottolineato correttamente da Jouni, figure e tabelle (cioè float) possono essere spostate e la tua casella grigia non può contenerle. Per ottenere l'effetto desiderato, hai due opzioni:
- Inserisci l'intero avviso in un ambiente
figure
(in modo che l'intero avviso possa essere spostato sulla pagina o su una nuova pagina se LaTeX lo sceglie). -
Non usare un float (ambiente
figure
) - basta usare\ includegraphics
per inserire l'immagine direttamente nell'avvisodidascalia pacchetto :\documentclass{article} \usepackage{caption}% let's us use captions outside of floats \usepackage{lipsum}% provides filler text \begin{document} \lipsum[1] \begin{center} \includegraphics{mypic} \captionof{figure}{This is my picture.}% makes a caption for non-floats \label{fig:mypic} \end{center} \lipsum[2] \end{document}
Non ho usato Sphinx, quindi temo di non poterti aiutare troppo con l'integrazione di questo nel loro output.