
Este é meu pequeno 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}
E a saída é,
Por que o texto fictício na nota marginal não continua nas próximas páginas?
Responder1
Estou inserindo isso como uma resposta diferente, pois é baseada \vsplit
e não tem nenhuma das desvantagens da paracol
abordagem. Observe que são necessárias duas execuções para calcular a distância até a parte inferior da área de texto.
\marginflow
é usado em vez de \marginpar
. \marginrepeat
só é usado em \afterpage
.
Curiosamente, sem todos os \newpage
s, isso ocupará apenas 3 páginas.
\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}
Responder2
A desvantagem desta solução é que você não pode simplesmente inserir a “nota” no meio de uma frase ou parágrafo.
\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}
Isso é usado \everypar
para realizar a troca no início do parágrafo (com deslocamento vertical). São necessárias duas execuções, pois as informações de \marginpar
são armazenadas no arquivo aux. O limite é de apenas um \marginpar
por parágrafo.
\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}