问题很简单,但对我来说似乎有点棘手。我不知道如何重新定义分段,让分配给一个\section{...}
命令的所有内容(包括子部分等)被 / 框起来或遮蔽framed
。mdframed
即使尝试了多次,并且搜索了几个小时,我还是不知道该如何处理,如果能得到帮助,我会非常高兴。
顺便说一句:我正在寻找一个不依赖于 titlesec 或类似软件包的解决方案……如果可能的话,只需进行干净的重新定义。=)
答案1
根据评论,您似乎希望能够将特定部分设置为框架或不框架,而不必找到该部分的末尾来插入其他命令。 一种方法是使用\FramedSection
下面定义的而不是正常的\section
。
开始\FramedSection
并将\begin{mdframed}
设置WithinFramedSection
为真,以便我们知道这个框架部分需要在后续\FramedSection
或正常的时关闭\section
。
mdframed
通过调用 来关闭此环境\EndFramedIfNeeded
。以下情况需要执行此操作:
- 随后
\FramedSection
- 随后
\section
- 并在文档末尾
笔记:
- 我已经使用
newtoggle
过包裹etoolbox
因为我更喜欢那个语法而不是\newif
语法。但如果你不想包含额外的包,那么调整它以使用\newif
或其他一些条件方法。 - 包裹
lipsum
仅用于提供虚拟文本。您的文档中不需要它。
代码:
\documentclass{article}
\usepackage{etoolbox}
\usepackage{mdframed}
\usepackage{lipsum}
\newtoggle{WithinFramedSection}%
\togglefalse{WithinFramedSection}%
\let\OldSection\section%
\def\section{\EndFramedIfNeeded\OldSection}%
\newcommand*{\EndFramedIfNeeded}{%
\iftoggle{WithinFramedSection}{%
\global\togglefalse{WithinFramedSection}%
\end{mdframed}% End previous framed section
}{}%
}%
\newcommand*{\FramedSection}[1]{%
\EndFramedIfNeeded%
\global\toggletrue{WithinFramedSection}%
\begin{mdframed}\OldSection{#1}%
}%
% If the last \section is a \FramedSection, we need to end
% the mdframed environment.
\AtEndDocument{\EndFramedIfNeeded}%
\begin{document}
\FramedSection{Framed Section Name 1}
\subsection{Framed Sub section name 1}
\lipsum[1]
%
\section{Unframed Section}
\lipsum[2]
%
\FramedSection{Framed Section Name 2}
\subsection{Framed Sub section name 2}
\lipsum[3]
\end{document}