暂时调整延伸至下一页的段落的文本宽度

暂时调整延伸至下一页的段落的文本宽度

我正在使用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为以下任何段落的默认值。

将其插入到需要(不可见地)开始新段落的行的最后一个单词之后(或之前)的运行文本中。

也许有人愿意制作有关此内容的包裹,但如果是这样,请提前告知我。

相关内容