添加

添加

请原谅我知识不足——我对 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 (出于同样的原因);

  • 浮动环境;

  • 脚注(唉,就是这样!)。

最后一个限制确实很麻烦。

相关内容