在文档中,我需要提供一些有关特定主题的详细信息,而不会打乱主文档的流程,以便在初次阅读时可以轻松忽略这些详细信息。为此,我认为将相应的段落写在文档正文之外的框架中会很方便。例如,可以使用 轻松完成此操作,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
并每次手动指定它,但这取决于您。