Como personalizar um ambiente LaTeX existente sem interferir com outros ambientes
-
03-07-2019 - |
Pergunta
Eu estou usando Esfinge para documentar um projeto. Ela produz arquivos LaTeX de reestruturado texto.
Eu gostaria de definir uma cor de fundo cinza ao dicas e notas , então eu personalizado o aviso ambiente depois de criar um 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
Tudo funciona bem, exceto se eu colocar um figura ambiente no interior do aviso ambiente. Nesse caso, eu recebo este erro:
LaTeX erro: não no modo nominal externa
Existe uma maneira de definir um fundo cinza para que aviso ambiente?
Solução 2
Obrigado godbyk e Jouni para responder a minha pergunta.
O problema é que eu não faço código diretamente no LaTeX . Eu escrevo a documentação em texto reestruturado e saída Sphinx o LaTeX arquivos.
Mas eu encontrei uma solução: Eu redefinir o figura ambiente para usar o staticfigure do flowfram pacote:
\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: Eu tive que colocar 6 com o número de argumentos quando redefinindo 'figura': se eu não fizer que ela exiba alguns 'hTBP' nos arquivos pdf (eu não sou um LaTeX especialista. é apenas a solução que eu encontrei para este problema)
Outras dicas
Esta é uma FAQ . Não faz sentido colocar uma figura (ou qualquer outro "float", que pode mudar para outro lugar na saída) dentro de uma caixa cinza; se você quiser a sua figura para conter uma caixa cinza, coloque o ambiente caixa cinza dentro do ambiente figura.
Como Jouni corretamente assinalou, figuras e tabelas (ou seja, carros alegóricos) podem ser movidos ao redor, e seu caixa cinza não pode contê-los. Para conseguir o efeito desejado, você tem duas opções:
- Coloque todo o seu aviso em um ambiente
figure
(de modo que todo o aviso pode ser flutuado na página ou para uma nova página se LaTeX assim o desejar). -
Não use um float (ambiente
figure
) - apenas o uso\includegraphics
estalar sua imagem diretamente no ambientenotice
. Você não será capaz de usar uma legenda com este não figura, no entanto, como legendas único trabalho dentro de um ambiente de figura ou tabela. Se você quiser uma legenda associada com esta imagem, você pode usar o href="http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=caption" rel="nofollow pacotecaption
:\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}
Eu não usei esfinge, então eu tenho medo que eu não posso te ajudar muito com a integração isso em sua produção.