O título não é tão descritivo. Tento escrever um ambiente remark
de estilo personalizado amsthm
que possa receber argumentos como cabeçalho (não preciso de funcionalidades de referência). Eu queria simplificar o código evitando trivlist
. remark
Os ambientes de teorema de estilo têm .5\topsep
espaço antes e depois do ambiente. Mas isso parece muito estranho em ambientes de lista como itemize
. Aqui está o que eu tenho:
\documentclass{article}
\usepackage{lipsum} % for testing
% paragraph environment, takes one mandatory header text
\newenvironment{para}[1]{
% add space before environment
\par\addvspace{.5\topsep}
% header text
\noindent\textit{#1.}%
% default rubber space after header text and ignore following spaces
\hspace*{5pt plus 1pt minus 1pt}\ignorespaces
}{
% add space after environment
\par\addvspace{.5\topsep}
}
\begin{document}
\lipsum[66]
\begin{para}{Looks good}
\lipsum[66]
\end{para}
\lipsum[66]
\begin{itemize}
\item \lipsum[66]
Compare \verb|\parsep| above and the \verb|\parsep+.5\topsep| below.
\begin{para}{Looks weird}
\lipsum[66]
\end{para}
\lipsum[66]
\end{itemize}
\end{document}
Como você pode ver, em ambientes de lista, o .5\topsep
é adicionado ao diferente de zero \parsep
, criando uma lacuna maior. Os ambientes originais amsthm
evitam isso empregando mecanismos do Latex para listas (configuração \@topsep
e \@topsepadd
espaçamento desejado .5\topsep
). Da mesma forma, prefiro não adicionar nenhum espaço se para
for chamado dentro de ambientes de lista.Existe uma maneira de detectar se alguém está em um ambiente de lista? Ou existe uma solução mais elegante?
Editar:Adicionada imagem do arquivo compilado.
Responder1
ComoDavid Carlisle disse, você não deve usar \topsep
para definir seu ambiente, pois ele é definido e redefinido por ambientes de lista e seu ambiente não fornecerá um comportamento consistente (já que depende de um comprimento que é frequentemente alterado em tempo real). Você provavelmente deseja codificar um valor (faça uma cola, se quiser, mas considerarei apenas 4pt
que essa parece ser a quantidade desejada).
Para lidar com o efeito \parskip
que pode ou não estar presente (em um ambiente de lista, \parskip
é definido como igual a \parsep
), você pode simplesmente cancelá-lo adicionando um vspace adicional. O seguinte provavelmente fará o que você deseja:
\documentclass{article}
\usepackage{lipsum} % for testing
% paragraph environment, takes one mandatory header text
\newenvironment{para}[1]{
% add space before environment
\par\addvspace{4pt}\addvspace{-\parskip}
% header text
\noindent\textit{#1.}%
% default rubber space after header text and ignore following spaces
\hspace*{5pt plus 1pt minus 1pt}\ignorespaces
}{
% add space after environment
\par\addvspace{4pt}\addvspace{-\parskip}
}
\begin{document}
\lipsum[66]
\begin{para}{Looks good}
\lipsum[66]
\end{para}
\lipsum[66]
\begin{itemize}
\item \lipsum[66]
Compare \verb|\parsep| above and the \verb|\parsep+.5\topsep| below.
\begin{para}{Looks weird}
\lipsum[66]
\end{para}
\lipsum[66]
\end{itemize}
\end{document}