定义新型漂浮环境

定义新型漂浮环境

在文档中,我需要提供一些有关特定主题的详细信息,而不会打乱主文档的流程,以便在初次阅读时可以轻松忽略这些详细信息。为此,我认为将相应的段落写在文档正文之外的框架中会很方便。例如,可以使用 轻松完成此操作,mdframed并且我可以将定义框架的命令包装到 中\newenvironment

但是,我觉得如果允许框架浮动,并且可以像图片一样在文档主体中编号和引用,文档的总体布局会更好。有没有简单的方法来创建这样的浮动环境?

到目前为止,我发现的解决方案是figure使用新的计数器劫持环境,并在本地重新定义命令,\theHfigure以便构建的超链接hyperref指向正确的位置。

以下是一个例子:

\documentclass{article}
\usepackage{lipsum}
\usepackage[colorlinks=true]{hyperref}
\usepackage[framemethod=TikZ]{mdframed}
\usepackage{multicol}

\newcounter{framecnt}
\newenvironment{frameenv}[1]
    {\begin{figure}[tb]
    \refstepcounter{framecnt}
    \renewcommand{\theHfigure}{cont.\arabic{framecnt}}
    \begin{mdframed}[roundcorner=10pt,backgroundcolor=blue!10]
    \textbf{\centerline{Frame \arabic{framecnt} --- #1}}
    \smallskip

    \begin{multicols*}{2}
    }
    {\end{multicols*}\end{mdframed}\end{figure}
    }

\begin{document}

\lipsum

\begin{frameenv}{More details}\label{frame1}
\lipsum[1]
\end{frameenv}

See frame \ref{frame1} or figure \ref{fig1}.

\begin{figure}
\caption{A real figure}\label{fig1}
\end{figure}

\end{document} 

及其生成的输出: 在此处输入图片描述

是否存在更“自然”的解决方案?

答案1

有几个软件包可以帮助解决这个问题——我个人会选择newfloat因为它和优秀的caption包,这意味着两个包一起工作非常相处得很好。

下面是原始代码的模型,但使用了这两个包;重要的几行是

\DeclareFloatingEnvironment[fileext=frm,placement={!ht},name=Frame]{myfloat}
\captionsetup[myfloat]{labelfont=bf}

它设置了一个新的浮动环境 - 它还创建了\jobname.frm包含有用信息的内容,如果你想创建一个框架列表,可以使用以下命令

\listofmyfloats

该包为我们创建了它newfloat

我还移动了hyperref要加载的包最后的;这很重要,正如哪些包应该在 hyperref 之后加载而不是之前加载?

\documentclass{article}
\usepackage{newfloat}
\usepackage{caption}
\DeclareFloatingEnvironment[fileext=frm,placement={!ht},name=Frame]{myfloat}

\captionsetup[myfloat]{labelfont=bf}
\usepackage{lipsum}
\usepackage[framemethod=TikZ]{mdframed}
\usepackage{multicol}
\usepackage[colorlinks=true]{hyperref}

\newenvironment{frameenv}[1]
    {\begin{myfloat}[tb]
    \begin{mdframed}[roundcorner=10pt,backgroundcolor=blue!10]
    \caption{#1}
    \begin{multicols*}{2}
    }
    {\end{multicols*}\end{mdframed}\end{myfloat}
    }

\begin{document}

\lipsum

\begin{frameenv}{More details}\label{frame1}
\lipsum[1]
\end{frameenv}

See frame \ref{frame1} or figure \ref{fig1}.

\begin{figure}
\caption{A real figure}\label{fig1}
\end{figure}

\end{document} 

另一个想法是使环境的参数成为可选的,以便您可以拥有一个空的caption。这很容易做到,使用

\newenvironment{frameenv}[1][]
     {\begin{myfloat}[tb]
     ...

这意味着你使用,注意方括号而不是大括号,

\begin{frameenv}[Details for the caption]\label{frame1}

或者

\begin{frameenv}\label{frame2}

您也可以从环境定义中删除caption并每次手动指定它,但这取决于您。

相关内容