请原谅我知识不足——我对 LaTeX 完全陌生。我想我对某个部分的高度有疑问……更具体地说,我正在编写一本诗集,使用 verse 包。环境设置如下:
\documentclass[12pt,a5paper,twoside]{article}
\pdfpageheight=210mm
\pdfpagewidth=148mm
\usepackage[a5paper]{geometry}
\geometry
{
portrait,
top=2.3cm,
left=2cm,
right=1.3cm,
bottom=2cm
}
\usepackage{verse}
我想知道一首特定的诗是否会分为两页,并且根据答案(以及我当前是否在奇数页)引入分页符。
可以在诗歌开头的某种宏中完成此操作,并将其链接到\poemtitle
?
如果当前页是偶数,我想保留它,如果当前页是奇数(并且诗歌跨越两页),我想引入分页符,这样两页的诗歌之间就不会有翻页。这有可能吗?我注意到这里有一个类似的问题,我认为还没有得到解答:
答案1
此解决方案使用 手动执行分页\vsplit
。奇数页只能在addblock
环境之间分页。缺点是必须在addblock
环境中写入所有内容,否则会造成混乱。
Box\pagebox
用于存储迄今为止的页面(全局)。它会与新块的内容合并并进行测试。如果合并的块超过 2 页,或者超过 1 页且其中一页位于奇数页,则将\pagebox
写入此页面并移至下一个偶数页。当偶数页已填满时,\vsplit
执行分页并写入第一页。
本地寄存器 \box0 和 \box1 不必全局保存。 它们的内容将在 时丢失\end{addblock}
。 注意:\stepcounter
全局更改计数器(在本例中为节号),因此我们只想扩展\BODY
一次。
\documentclass[12pt,a5paper,twoside]{article}
\pdfpageheight=210mm
\pdfpagewidth=148mm
\usepackage[a5paper,showframe]{geometry}
\geometry
{
portrait,
top=2.3cm,
left=2cm,
right=1.3cm,
bottom=2cm
}
\usepackage{verse}
\usepackage{environ}
\usepackage{lipsum}% generic text
\newsavebox{\pagebox}
\newif\ifevenpage
\NewEnviron{addblock}{\setbox1=\vbox{\BODY\par}% only once for counters
\setbox0=\vbox{\unvcopy\pagebox\unvcopy1}%
\ifdim\ht0>2\textheight
\unvbox\pagebox
\newpage
\ifevenpage
\null\newpage
\else
\global\evenpagetrue
\fi
\setbox0=\box1
\fi
\loop\ifdim\ht0>\textheight
\ifevenpage
\setbox1=\vsplit0 to \textheight
\unvbox1
\pagebreak
\global\evenpagefalse
\setbox\pagebox=\copy0
\else
\unvbox\pagebox
\newpage
\global\evenpagetrue
\setbox0=\box1
\fi
\repeat
\global\setbox\pagebox=\box0
\ignorespaces}
\AtEndDocument{\unvbox\pagebox}
\begin{document}
\begin{addblock}
\section{first}
\lipsum[1]
\end{addblock}
\begin{addblock}
\section{second}
\lipsum[1-4]
\end{addblock}
\begin{addblock}
\section{third}
\lipsum[1]
\end{addblock}
\begin{addblock}
\section{fourth}
\lipsum[2]
\end{addblock}
\begin{addblock}
\section{fifth}
\lipsum[1-4]
\end{addblock}
\begin{addblock}
\section{sixth}
\lipsum[2]
\end{addblock}
\end{document}
答案2
好吧,如果所有的问题都归结为有一个\cleardoublepage
总是跳转到偶数页面而不是奇数页面的变体,那么这很容易实现:
\documentclass[%
twoside,% this is crucial!
a4paper% this is not, of course!
]{article}
\usepackage[T1]{fontenc} % Not always necessary, but recommended.
\usepackage{lipsum}
\makeatletter
% Use "\clearevenpage" if you want the possible extra page to *have*
% running heads:
\newcommand*\clearevenpage{\par
\clearpage
\if@twoside \ifodd\c@page
\null\newpage
\fi\fi
}
% Use "\clearevenemptypage" if you want the possible extra page *not* to have
% running heads:
\newcommand*\clearevenemptypage{\par
\clearpage
\if@twoside \ifodd\c@page
\thispagestyle{empty}%
\null\newpage
\fi\fi
}
\makeatother
\begin{document}
\lipsum[1-6]
We should now be on an even-numbered page.
\clearevenpage
This test appears on the next \emph{even} page; an empty page has been
automatically inserted.
\lipsum[7-12]
We should now be on an odd-numbered page.
\clearevenpage
This text appears on the next even page too, but this time no additional empty
page was needed.
\end{document}
编辑:仔细阅读问题后,我意识到这不是你想要的。(因此,我将在 48 小时的宽限期后删除此答案,让它见证我的愚蠢…… ;-) 你想跳转到偶数页仅有的如果接下来的诗跨越两页,对吗?(顺便问一下:如果接下来的诗是更多的长度超过两页,以至于读者无论如何都不得不翻过这一页?)
添加
以下代码定义了一个Poem
环境,用于测量其中的文本,如果满足适当的条件,则跳转到下一个偶数页。更准确地说,如果以下两个条件都为真:
文档正在
twoside
模式下排版;环境的内容超过一页长;
然后内容将从下一个偶数页开始打印;否则,将从下一个偶数页或奇数页开始打印。代码中包含的示例说明了这一点。
\documentclass[%
twoside,% this is crucial!
a4paper% this is not, of course!
]{article}
\usepackage[T1]{fontenc} % Not always necessary, but recommended.
\usepackage{lipsum}
\makeatletter
\newenvironment*{Poem}{%
\setbox\z@ \vbox\bgroup
\boxmaxdepth\maxdepth
\color@begingroup
% the following penalty will be used later, see (*):
\penalty-\@M
}{%
\@@par
\color@endgroup
\global \dimen@i \prevdepth
\egroup
% (*) What follow is a hack to insert the "\topskip" glue atop "\box0";
% nothing will actually be split off to "\box2":
\splitmaxdepth \maxdepth
\splittopskip \topskip
\setbox\tw@ \vsplit\z@ to\z@ % everything actually stays in "\box0"
\clearpage
\if@twoside
\ifdim \ht\z@>\textheight
\ifodd\c@page
% uncomment the following line if you wish so:
% \thispagestyle{empty}% <-- ...but leave this "%" in place
\null\newpage
\fi
\fi
\fi
\unvbox\z@
\prevdepth \dimen@i
}
\makeatother
\begin{document}
The contents of the \texttt{Poem} environment can be ordinary paragraphs as
well as verses.
\begin{Poem}
\section{First poem}
\lipsum[1-6]
\end{Poem}
\begin{Poem}
\section{Second poem}
\lipsum[7-20]
\end{Poem}
\begin{Poem}
\section{Third poem}
\lipsum[20-22]
\end{Poem}
\begin{Poem}
\section{Fourth poem}
\lipsum[22-24]
\end{Poem}
\begin{Poem}
\section{Fifth poem}
\lipsum[24-32]
\end{Poem}
\begin{Poem}
\section{Sixth poem}
\lipsum[33]
\end{Poem}
\begin{Poem}
\section{Seventh poem}
\lipsum[34]
\end{Poem}
\begin{Poem}
\section{Eighth poem}
\lipsum[35-36]
\end{Poem}
\begin{Poem}
\section{Ninth poem}
\lipsum[37-48]
\end{Poem}
And so on\ldots\space (Check for \verb|\prevdepth|.)
\end{document}
请注意,环境的内容Poem
可以由普通段落、章节标题、列表、诗句组成……您应该避免的唯一内容是:
明确的分页符(它们会弄乱文本的测量);
任何暗示分页符的命令,例如
\chapter
(出于同样的原因);浮动环境;
脚注(唉,就是这样!)。
最后一个限制确实很麻烦。