
이것은 나의 작은 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
.
흥미롭게도 모든 \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
aux 파일에 저장되므로 두 번 실행해야 합니다. \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}