答案1
我将其作为不同的答案输入,因为它基于该方法\vsplit
并且没有该方法的任何缺点paracol
。请注意,需要两次运行才能计算到文本区域底部的距离。
\marginflow
用来代替\marginpar
。 \marginrepeat
仅用于\afterpage
。
有趣的是,如果没有所有的\newpage
s,这将只能持续 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}