This is a stripped-down version of the code in the parnotes
package.
NOTE to anyone wanting to "do x after every paragraph": The proper way to make long-term changes to \par
is through \@setpar
, or by modifying \@par
along with \par
. Many LaTeX environments reset \par
to \@par
at end; see source2e chapter ltpar.dtx
.
Here's a hack using \g@addto@macro
to collect notes and place them in the main text flow later. Use \parnote{TEXT}
to place a mark, then call \parnotes
to put the notes in manually, anywhere you'd like. For a custom mark, use \parnote[MARK]{TEXT}
.
There's also an autopn
environment which sets parnotes automatically at the end of every paragraph by redefining \par
and \@par
. If you enter another environment while in autopn
and you still want notes, you'll need to nest autopn
within it. (Credit to Ahmed Musa)
\documentclass{article}
\usepackage{multicol}
\makeatletter
% Format for parnotes - \PN@notes@shape is blank (\relax) by default
\providecommand{\parnotefmt}[1]{\footnotesize%
\PN@notes@shape\PN@narrower@optional\noindent #1}
% Format for parnote marks
\providecommand{\parnotemark}[1]{\textsuperscript{#1}}
% Minimum vertical space before and after parnotes
\providecommand{\parnotevskip}{\medskipamount}
% Full command used between parnotes
\providecommand{\parnoteintercmd}{\hspace{1em plus 0.3em minus 0.2em}}
\global\def\PN@text{}
\global\newcount\c@parnotemark
\def\@PN@autopn{autopn}
\newif\ifPN@inparnotes
\def\PN@disable@indent{\@afterindentfalse\@afterheading}
\let\PN@reset@optional\relax
\let\PN@mark@set\@arabic
\let\PN@narrower@optional\relax
\let\PN@notes@shape\relax
\newcommand\parnote{%
\ifx\protect\@typeset@protect
\@ifnextchar [
{\expandafter\PN@parnote@twoargs}%
{\expandafter\PN@parnote@onearg}%
\else
\expandafter\PN@gobble@opt
\fi
}
\DeclareRobustCommand\PN@gobble@opt{%
\@ifnextchar [
\PN@gobble@opt@@
\@gobble
}
\def\PN@parnote@twoargs[#1]#2{\PN@parnote@real{#1}{#2}}
\def\PN@parnote@onearg#1{%
\global\advance\c@parnotemark\@ne
\begingroup\edef\@x{\endgroup\noexpand\PN@parnote@real%
{\PN@mark@set{\c@parnotemark}}}\@x{#1}%
}
\def\PN@gobble@opt@@[#1]#2{}
\long\def\PN@parnote@real#1#2{%
\leavevmode
\ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
\parnotemark{#1}%
\ifhmode\spacefactor\@x@sf\fi\relax
\unless\ifx\PN@text\@empty\g@addto@macro\PN@text{\parnoteintercmd}\fi
\g@addto@macro\PN@text{\parnotemark{#1}\nolinebreak\thinspace#2}%
}
\newcommand\parnotes{%
\unless\ifx\PN@text\@empty
\expandafter\PN@parnotes@real
\fi
}
\def\PN@parnotes@real{%
\PN@inparnotestrue
\unless\ifvmode\par\fi
\nopagebreak\addvspace{\parnotevskip}%
{\parnotefmt{\PN@text}\par}%
\global\def\PN@text{}%
\addvspace{\parnotevskip}%
\PN@disable@indent
\PN@reset@optional
\PN@inparnotesfalse
}
\newenvironment{autopn}{%
\let\PN@par\par
\def\par{\PN@parnotes@auto\PN@par}%
\def\@par{\PN@parnotes@auto\@@par}%
}
{\PN@parnotes@auto}
\def\PN@parnotes@auto{%
\ifx\@currenvir\@PN@autopn
\unless\ifPN@inparnotes
\unless\ifx\PN@text\@empty
\expandafter\PN@parnotes@real
\fi
\fi
\fi
}
\makeatother
\begin{document}
\tableofcontents
\vspace{0.3in}
\begin{autopn}
\noindent%
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer aliquet
quam\parnote{Vitae mauris tempus!} consequat. In nec neque vitae magna
pulvinar pretium.\parnote{Nunc purus augue, egestas vitae lobortis at,
eleifend quis erat. Vestibulum ante ipsum primis in faucibus orci luctus
et ultrices posuere cubilia Curae.} In aliquet tortor sed tellus
\parnote{Porta} et elementum diam sagittis.
\section{On parnotes\parnote{Section note.}}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer aliquet
quam\parnote{Vitae mauris tempus!} consequat. In nec neque vitae magna
pulvinar pretium.\parnote{Nunc purus augue, egestas vitae lobortis at,
eleifend quis erat. Vestibulum ante ipsum primis in faucibus orci luctus
et ultrices posuere cubilia Curae.} In aliquet tortor sed tellus
\parnote{Porta} et elementum diam sagittis.
Ut vel ante eros, in lobortis risus.
Lorem ipsum dolor.
\vspace{0.1in}
\noindent Notes inside \texttt{multicols}:
\begin{multicols}{2}
\begin{autopn} % CHANGED: YOU MUST NEST autopn WITHIN ENVIRONMENTS
\noindent Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Integer aliquet quam\parnote{Vitae mauris tempus!} consequat.
New paragraph vitae magna
pulvinar pretium.\parnote{Nunc purus augue, egestas vitae lobortis at,
eleifend quis erat. Vestibulum ante ipsum primis in faucibus orci luctus
et ultrices posuere cubilia Curae.} In aliquet tortor sed tellus
\parnote{Porta} et elementum diam sagittis.
\end{autopn}
\end{multicols}
\end{autopn}
\noindent Notes outside \texttt{multicols}:
\begin{multicols}{2}
\noindent Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Integer aliquet quam\parnote{Vitae mauris tempus!} consequat.
New paragraph vitae magna
pulvinar pretium.\parnote{Nunc purus augue, egestas vitae lobortis at,
eleifend quis erat. Vestibulum ante ipsum primis in faucibus orci luctus
et ultrices posuere cubilia Curae.} In aliquet tortor sed tellus
\parnote{Porta} et elementum diam sagittis.
\end{multicols}
\parnotes
\vspace{0.1in}
\noindent Notes break pages:\\[0.08in]
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer aliquet
quam\parnote{Vitae mauris tempus consequat. In nec neque vitae magna
pulvinar pretium. Nunc purus augue, egestas vitae lobortis at,
eleifend quis erat. Vestibulum ante ipsum primis in faucibus orci luctus
et ultrices posuere cubilia Curae. In aliquet tortor sed tellus
Porta et elementum diam sagittis. Lorem ipsum dolor sit amet,
pulvinar pretium. Nunc purus augue, egestas vitae lobortis at,
eleifend quis erat. Vestibulum ante ipsum primis in faucibus orci luctus
et ultrices posuere cubilia Curae. In aliquet tortor sed tellus
Porta et elementum diam sagittis. Lorem ipsum dolor sit amet,
consectetur adipiscing elit.} In nec neque vitae magna pulvinar
pretium.
\parnotes
\end{document}

\footnotesize
or otherwise?footmisc
'sside
option.