我正在使用memoir
类和adjustwidth*
环境将文本的某些部分扩展到外边距之外。这是一个twoside
文档,如果正确理解了changepage
包手册(我相信它已随memoir
类一起加载),则带星号的环境应该会自动处理奇数页和偶数页之间的切换。
它不适用于memoir
手册中所述的连续段落:
事实上,lipsum
为了检查该声明而插入的附加段落(最初认为它仅适用于未加星号的版本adjustwidth
)似乎证明它也适用于加星号的环境。
对于跨页的段落,是否有任何合理的方法可以自动切换正在调整的边距?(我猜如果它很容易的话,它会包含在包中。)
不管怎样,我实际上正在尝试暂时更改shaded
环境内或tcolorbox
跨页面文本的边距。
一个最小的工作示例是
\documentclass[10pt,twoside,onecolumn,openright,extrafontsizes,final]{memoir}
\usepackage{lipsum}
\begin{document}
\lipsum[1-2]
\strictpagecheck
\begin{adjustwidth*}{}{-30mm}
\lipsum[20-25]
\end{adjustwidth*}
\lipsum[3]
\begin{adjustwidth*}{}{-30mm}
\lipsum[4]
\end{adjustwidth*}
\end{document}
第 1 页的结果:
第 2 页:
注意,跨页的段落延伸到了页面的错误一侧。相反,第 2 页的最后一段设置正确。
答案1
tcolorbox
使用无颜色包的解决方案
\documentclass[10pt,twoside,onecolumn,openright,extrafontsizes,final]{memoir}
\usepackage{tcolorbox}
\tcbuselibrary{breakable}
\newtcolorbox{enlargedparbox}[1][30mm]{
parbox=false,
grow to right by=#1,
breakable,
toggle enlargement=evenpage,
size=minimal,
colback=white,
before upper={\indent},
extras={frame empty}}
\usepackage{lipsum}
\begin{document}
\textbf{ Normal paragraph width}
\lipsum[1-2]
\textbf{ Enlarged paragraph width by 30 mm (default value)}
\begin{enlargedparbox}
\lipsum[20-25]
\end{enlargedparbox}
\textbf{ Normal paragraph width}
\lipsum[3]
\textbf{ Enlarged paragraph width by 20mm}
\begin{enlargedparbox}[20mm]
\lipsum[20-25]
\end{enlargedparbox}
\textbf{ Normal paragraph width}
\lipsum[1-2]
\end{document}
答案2
正如 @Werner 所说,这通常是一个未解决的问题,因为 TeX 一次设置一个完整的段落,并且不考虑段落内的分页符和可能的布局变化。
Knuth 写道(TeX 书练习 14.15):... 如果您正在排版某些哲学家或现代小说家的作品(他们写的段落长达 200 行),计算机的内存容量可能会超出。建议一种应对此类作者的方法。
他回答道(TeX 书答案 14.15):... 补救措施是{\parfillskip=0pt\par\parskip=0pt\noindent}
在每 50 行左右的文本后随机插入。(当您距离段落开头足够远时,单词之间的每个空格通常都是可行的断点。)
memoir
我按照以下方式实现了一个宏
\newcommand{\parnopar}{\parfillskip=0pt\par%
\parskip=0pt\noindent}
其目的是将一个长段落无形地分成两段。在我尝试过的测试案例中,当原始段落很长并且我将\parnopar
文本放在中间时,它起作用了。
所以我本来想建议原帖把\parnopar
连续文本放在第一页最后一个单词后面。但是,在对较短的段落进行一些实验后,我发现这不是一个好的解决方案,因为它导致第二个“拆分段落”末尾出现奇怪的间距。
更好的解决方案是将宏定义为
\newcommand{\parnoparc}{\parfillskio=0pt\par%
\parskip=0pt\noindent\parfillskip=0pt plus1fil}
使用时将重置\parfillskip
为以下任何段落的默认值。
将其插入到需要(不可见地)开始新段落的行的最后一个单词之后(或之前)的运行文本中。
也许有人愿意制作有关此内容的包裹,但如果是这样,请提前告知我。