边注中的虚拟文本不会延续到下一页

边注中的虚拟文本不会延续到下一页

这是我的小 MWE,

\documentclass{book}

\usepackage{blindtext}

\usepackage{geometry}
    \geometry{
        includemp, % or include something else?
        paper=a4paper,
        marginparwidth=45mm
        }

\begin{document}
    Of course \marginpar{\blindtext[7]} \blindtext[7]
\end{document}

输出是,

在此处输入图片描述

为什么边注中的虚拟文本不会延续到下一页?

答案1

我将其作为不同的答案输入,因为它基于该方法\vsplit并且没有该方法的任何缺点paracol。请注意,需要两次运行才能计算到文本区域底部的距离。

\marginflow用来代替\marginpar\marginrepeat仅用于\afterpage

有趣的是,如果没有所有的\newpages,这将只能持续 3 页。

\documentclass{book}
\usepackage[showframe]{geometry}
    \geometry{
        includemp, % or include something else?
        paper=a4paper,
        marginparwidth=45mm
        }

\usepackage{afterpage}
\usepackage{tikzpagenodes}
\newlength{\bottom}
\newsavebox{\marginparbox}

\newcommand{\marginflow}[1]% #1 = text
 {\strut\tikz[remember picture,overlay]% compute distance to bottom of text area
    {\pgfextracty{\bottom}{\pgfpointdiff{\pgfpointanchor{current page text area}{south}}{\pgfpointorigin}}%
    \global\bottom=\bottom}%
    \advance\bottom by 0.4\baselineskip
    \parbox{\marginparwidth}{\global\setbox\marginparbox=\vbox{#1}}%
    \ifdim\bottom>\dimexpr\ht\marginparbox+\dp\marginparbox\relax
      \marginpar{\raisebox{\dimexpr 0.6\baselineskip-\height}{\usebox{\marginparbox}}}%
    \else
      \setbox1=\vsplit\marginparbox to \bottom
      \marginpar{\raisebox{\dimexpr 0.6\baselineskip-\height}{\usebox1}}%
      \ifdim\ht\marginparbox>-\dp\marginparbox
        \afterpage{\marginrepeat}%
      \fi
    \fi\ignorespaces}

\newcommand{\marginrepeat}{\vspace*{-\baselineskip}%
  \ifdim\textheight>\dimexpr\ht\marginparbox+\dp\marginparbox\relax
  \marginpar{\raisebox{\dimexpr 0.6\baselineskip-\height}{\usebox{\marginparbox}}}%
\else
  \setbox1=\vsplit\marginparbox to \textheight
  \marginpar{\raisebox{\dimexpr 0.6\baselineskip-\height}{\usebox1}}%
  \ifdim\ht\marginparbox>-\dp\marginparbox
    \afterpage{\marginrepeat}%
  \fi
\fi}

\usepackage{blindtext}

\begin{document}
So here I am going on and on about absolutely nothing when I happen to mention something which I want to 
describe in the margins HERE  \marginflow{\blindtext[7]} then continue as if nothing had happened.
\null\newpage
\null\newpage
\null\newpage
\null\newpage
\null\newpage
\end{document}

答案2

此解决方案的缺点是您不能直接将“注释”插入句子或段落的中间。

\documentclass{book}
\usepackage[showframe]{geometry}
    \geometry{
        includemp, % or include something else?
        paper=a4paper,
        textwidth=418.25368pt,% \the\dimexpr \textwidth+\marginparsep+\marginparwidth\relax
        marginparsep=0pt,
        marginparwidth=0pt
        }
\usepackage{paracol}
  \setcolumnwidth{\dimexpr \textwidth-45mm-\columnsep\relax,45mm}
  \twosided

\usepackage{blindtext}

\begin{document}
\begin{paracol}{2}
Of course 
\switchcolumn*\blindtext[7]\switchcolumn
as I was saying
\end{paracol}
\end{document}

这用于\everypar在段落开头执行切换(具有垂直偏移)。需要运行两次,因为来自的信息\marginpar存储在辅助文件中。每个段落的限制只有一次\marginpar

\documentclass{book}
\usepackage[showframe]{geometry}
    \geometry{
        includemp, % or include something else?
        paper=a4paper,
        textwidth=418.25368pt,% \the\dimexpr \textwidth+\marginparsep+\marginparwidth\relax
        marginparsep=0pt,
        marginparwidth=0pt
        }
\usepackage{paracol}
  \setcolumnwidth{\dimexpr \textwidth-45mm-\columnsep\relax,45mm}
  \twosided

\makeatletter
\newcounter{absparagraph}
\newlength{\marginpar@offset}
\newif\ifmarginpar
\newif\ifrepeatpar

\newcommand{\newparagraph}[2]% #1 = pragraph, #2 = y location
{\expandafter\gdef\csname paragraph@#1\endcsname{#2}}

\newcommand{\newmarginpar}[3]% #1 = pragraph, #2 = y location, #3 = text
{\expandafter\gdef\csname marginpar@y@#1\endcsname{#2}%
 \expandafter\gdef\csname marginpar@text@#1\endcsname{#3}}

\renewcommand{\marginpar}[1]% #1=text
{\pdfsavepos
 \protected@write\@auxout{}{\string\newmarginpar{\theabs@paragraph}%
   {\noexpand\number\pdflastypos}{#1}}\ignorespaces}%

\newcommand{\AtBeginParagraph}{\ifmarginpar\else
  \ifrepeatpar\repeatparfalse
  \else
    \stepcounter{absparagraph}%
    \xdef\theabs@paragraph{\theabsparagraph}%
    \strut\pdfsavepos
    \protected@write\@auxout{}{\string\newparagraph{\theabs@paragraph}%
      {\noexpand\number\pdflastypos}}%
    \@ifundefined{paragraph@\theabs@paragraph}{}{%
      \@ifundefined{marginpar@text@\theabs@paragraph}{}{%
        \global\marginpar@offset=\csname paragraph@\theabs@paragraph\endcsname sp\relax
        \global\advance\marginpar@offset by -\csname marginpar@y@\theabs@paragraph\endcsname sp\relax
        \vspace{-\baselineskip}%
        \marginpartrue
        \switchcolumn*
        \vspace*{\marginpar@offset}\csname marginpar@text@\theabs@paragraph\endcsname
        \switchcolumn
        \marginparfalse\repeatpartrue}}%
  \fi
\fi}
\makeatother

\AtBeginDocument{\everypar{\AtBeginParagraph}}

\usepackage{blindtext}

\begin{document}
\begin{paracol}{2}
So here I am going on and on about absolutely nothing when I happen do mention somtehing to which I want to 
describe in the margins HERE  \marginpar{\blindtext[7]} then continue as if nothing had happened.
\end{paracol}
\end{document}

相关内容