summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/marginnote/marginnote.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/marginnote/marginnote.dtx')
-rw-r--r--macros/latex/contrib/marginnote/marginnote.dtx1054
1 files changed, 1054 insertions, 0 deletions
diff --git a/macros/latex/contrib/marginnote/marginnote.dtx b/macros/latex/contrib/marginnote/marginnote.dtx
new file mode 100644
index 0000000000..9346c2a1db
--- /dev/null
+++ b/macros/latex/contrib/marginnote/marginnote.dtx
@@ -0,0 +1,1054 @@
+% \CheckSum{787}
+% \iffalse meta-comment
+% ======================================================================
+% marginnote.dtx
+% Copyright (c) Markus Kohm, 2005-2018
+%
+% This file is part of the work marginnote.
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c of the license.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later and of this work.
+%
+% This work has the LPPL maintenance status "unmaintained".
+% If you want to become the new maintainer please contact the author.
+%
+% This work consists of the files marginnote.dtx and the
+% derived files README.txt and marginnote.sty.
+% ----------------------------------------------------------------------
+% Note: This file is not only the source but also the docstrip batch
+% file. To unpack marginnote.sty and README.txt from the source,
+% run:
+%
+% tex marginnote.dtx
+%
+% as usual. You can replace tex by pdftex, luatex or xetex.
+% Usage of latex, pdflatex, lualatex or xelatex produces the
+% manual marginnote.pdf.
+% ======================================================================
+%
+%<package>%%% From File: $Id: marginnote.dtx 27 2018-08-09 09:17:04Z mjk $
+%<*dtx>
+\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
+\begingroup
+ \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
+ \filedate$Date: 2018-08-09 11:17:04 +0200 (Do, 09 Aug 2018) $
+ \def\filerevision$#1: #2 ${\gdef\filerevision{#2}}
+ \filerevision$Revision: 27 $
+\endgroup
+\ProvidesFile{marginnote.dtx}[\filedate\space\filerevision\space
+%</dtx>
+%<package>\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+%<package>\ProvidesPackage{marginnote}[%
+%<README>LaTeX package marginnote
+%<README>Copyright (c) Markus Kohm, 2005-2018
+%<README>-------------------------------------------------------------------
+%<README>Version:
+% \fi^^A meta-comment
+% \newcommand*{\packagedateandversion}{%
+% \iffalse meta-comment
+%<*package|README>
+% \fi^^A meta-comment
+ 2018/08/09 v1.4b
+% \iffalse meta-comment
+%</package|README>
+% \fi^^A meta-comment
+% }
+% \iffalse meta-comment
+%<README>Licence:
+%<README> This work may be distributed and/or modified under the conditions
+%<README> of the LaTeX Project Public License, version 1.3c of the license.
+%<README> The latest version of this license is in
+%<README> http://www.latex-project.org/lppl.txt
+%<README> and version 1.3c or later is part of all distributions of LaTeX
+%<README> version 2005/12/01 or later and of this work.
+%<README>Abstract:
+%<README> This package provides the command \marginnote that may be used
+%<README> instead of \marginpar at almost every place, where \marginpar
+%<README> cannot be used, e.g., inside floats, footnotes, frames made with
+%<README> framed package. See marginnote.pdf for more information.
+%<README>-------------------------------------------------------------------
+%<*dtx|package>
+ non floating margin notes for LaTeX]
+%</dtx|package>
+%<*dtx>
+\ifx\documentclass\undefined
+ \input docstrip.tex
+
+ \keepsilent
+ \askforoverwritefalse
+ \usedir{tex/latex/marginnote}
+
+ \generate{%
+ \file{marginnote.sty}{\from{marginnote.dtx}{package}}%
+ \nopreamble\nopostamble
+ \file{README.txt}{\from{marginnote.dtx}{README}}%
+ }
+
+ \ifToplevel{%
+ \Msg{*********************************************************************}
+ \Msg{*}
+ \Msg{* marginnote}
+ \Msg{* ==========}
+ \Msg{*}
+ \Msg{* To finish the installation run}
+ \Msg{* \space\space pdflatex marginnote.dtx}
+ \Msg{* After this copy}
+ \Msg{* \space\space marginnote.sty to .../tex/latex/marginnote/}
+ \Msg{* \space\space marginnote.pdf to .../doc/latex/marginnote/}
+ \Msg{* \space\space marginnote.dtx to .../source/latex/marginnote/}
+ \Msg{* \space\space README
+ \space\space\space\space\space\space\space\space to
+ .../source/latex/marginnote/}
+ \Msg{* where .../ is your local TDS tree}
+ \Msg{*}
+ \Msg{*********************************************************************}
+ }
+\else
+ \let\endbatchfile\relax
+\fi
+\endbatchfile
+\documentclass{ltxdoc}
+\usepackage{graphicx}% needed for \reflectbox
+\providecommand*{\XeTeX}{%
+ X\kern-.1em\lower.5ex\hbox{\reflectbox{E}}\kern-.15em\TeX}
+\CodelineIndex
+\RecordChanges
+\begin{document}
+\DocInput{marginnote.dtx}
+\end{document}
+%</dtx>
+%\fi
+%
+% \GetFileInfo{marginnote.dtx}
+%
+% \title{Non-Floating Margin Notes with \textsf{marginnote}\thanks{URL:
+% \texttt{https://komascript.de/marginnote}} Package\thanks{This file has
+% revision number \fileversion, last revised \filedate. Please note: Currently
+% this package is unmaintained. A new maintainer would be welcome!}}
+% \author{Markus Kohm\thanks{Email: \texttt{komascript@gmx.info}}}
+% \date{\packagedateandversion}
+% \maketitle
+%
+% \begin{abstract}
+% In \LaTeX{} the command \cs{marginpar}\oarg{left}\marg{right} might be
+% used to create a note in the margin. But there is a problem with this
+% command: it creates a special kind of float. For this it cannot be used
+% e.g., at floats or footnotes. Package \textsl{marginnote} supports another
+% command \cs{marginnote} to create notes in the margin. This does not use a
+% kind of float and for this does not have the disadvantage of
+% \cs{marginpar}. But there might be other problems \dots
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \changes{v1.0b}{2006/14/03}{spelling fixes}
+% \changes{v1.2b}{2017/10/14}{spelling fixes (by Thomas Reuben)}
+%
+% \section{How to Use \textsf{marginnote} Package}
+%
+% First of all you have to load. You may use:
+% \begin{verbatim}
+% \usepackage{marginnote}
+% \end{verbatim}\vskip-\baselineskip
+% to do so. You may also use one of the following options for a global change
+% of the behaviour of \textsf{marginnote}:
+% \begin{description}
+% \item[\texttt{fulladjust}] adjusts the margin note at the height and depth
+% of the current line. Note, that this may sometimes result in extra height
+% and depth of the current line, but results in the best vertical
+% alignment. This is the default.
+% \item[\texttt{heightadjust}] adjusts the margin note at the height of the
+% current line but not the depth. Note, that this may sometimes result in
+% extra height of the current line and in vertical misplacement.
+% \item[\texttt{depthadjust}] adjusts the margin note at the depth of the
+% current line but not height. Note, that this may sometimes result in extra
+% depth of the current line and very often in vertical misplacement.
+% \item[\texttt{noadjust}] does not adjust the margin note at the height or
+% depth of the current line. Note, that this often results in vertical
+% misplacement but seldom in vertical extra space before or after the
+% current line.
+% \item[\texttt{parboxrestore}] uses a reduced \cs{@parboxrestore} to restore
+% the definition of \cs{par} and \cmd\\ and several other commands and sets
+% \cs{parindent} to 0, \cs{parfillskip} to 0\,pt plus 1\,fil and
+% \cs{lineskip} to \cs{normallineskip}, \cs{baselineskip} to
+% \cs{normalbaselineskip} and activates \cs{sloppy} for every margin
+% note. This is the default since release 1.4b of
+% \textsf{marginnote}. Release 1.4 and 1.4a also set \cs{parskip} to 0, but
+% this resulted in a vertical placement issue, e.g., inside lists like
+% \texttt{itemize}.
+% \item[\texttt{noparboxrestore}] does not restore any definition for the
+% margin notes. This was the behaviour before release 1.4.
+% \end{description}
+%
+% \DescribeMacro{\marginnote}
+% The command \cs{marginnote}\oarg{left}\marg{right}\oarg{voffset} may be used
+% to set a margin note using \textsf{marginnote}. The first optional argument
+% and the mandatory argument are same using \cs{marginpar} from the \LaTeX{}
+% kernel. Even \cs{reversemarginpar} will be considered. The note \meta{left}
+% or \meta{right} will be put at the current vertical position. Second
+% optional argument \meta{voffset} may be used to adjust the vertical position
+% of the margin note. Use a negative dimension to move it up or a positive
+% dimension to move it down.
+%
+% \DescribeMacro{\marginnotetextwidth}
+% Package \textsl{marginnote} needs to know the real width of the type area to
+% find the right margin. While some environments (e.g., those of package
+% \textsl{framed}) change \cs{textwidth}, \textsl{marginnote} defines its own
+% text width macro. If you change type area after \cs{begin\{document\}} you
+% should add
+% \begin{verbatim}
+% \edef\marginnotetextwidth{\the\textwidth}
+% \end{verbatim}\vskip-\baselineskip
+% after changing the type area. Maybe you should do this globally using
+% \verb|\xdef| instead of \verb|\edef|. Most users will never need to change
+% \cs{marginnotetextwidth}.
+%
+% \DescribeMacro{\marginnotevadjust}
+% At some environments the vertical adjustment of the margin note will be
+% wrong, e.g., one base line to low. In this case you may use the additional
+% optional argument of \cs{marginnote} at every usage of \cs{marginnote} or
+% redefine \cs{marginnotevadjust} at the begin of the environment. The default
+% definition is \texttt{0pt}.
+%
+% \DescribeMacro{\raggedleftmarginnote}
+% \DescribeMacro{\raggedrightmarginnote}
+% These macros define how the margin note will be aligned. The defaults are:
+% \begin{itemize}
+% \item align margin notes at the left margin right to the margin,
+% \item align margin notes at the right margin left to the margin.
+% \end{itemize}
+% You may change this using \cs{renewcommand}, e.g., use^^A
+% \changes{v1.0a}{2006/02/06}{Example to macros \cs{raggedleftmarginnote} and
+% \cs{raggedrightmarginnote} at documentation fixed [thanks to Susumu
+% Tanimura].}
+% \begin{verbatim}
+% \renewcommand*{\raggedleftmarginnote}{}
+% \renewcommand*{\raggedrightmarginnote}{\centering}
+% \end{verbatim}\vskip-\baselineskip
+% to get justified text at the left and centered text at the right margin.
+%
+% \DescribeMacro{\marginfont}
+% This macro defines the font that will be used to set margin notes. The
+% default is \cs{normalcolor}. You may use \cs{renewcommand} to change this,
+% e.g. use
+% \begin{verbatim}
+% \renewcommand*{\marginfont}{\color{red}\sffamily}
+% \end{verbatim}\vskip-\baselineskip
+% to get red colored margin notes in sans serif font family. You need to load
+% e.g. package \textsf{color} to use \cs{color}.
+%
+%
+% \section{Known Issues Using \textsf{marginnote}}
+%
+% Currently the package lacks of a new maintainer. The author does not longer
+% maintain the package, because originally it was designed to be only a small
+% hack to be used on some cases. But over the years it has grown and became a
+% conglomerate of hacks that hack hacks that are used very widely. A break
+% with a complete revise of the design would be necessary. But nothing I can
+% or want to do currently. If you want to do it, please contact the author
+% (see the footnotes on the first page).
+%
+% You can not use paragraphs with \cs{par} or empty lines inside a margin
+% note. In my opinion this would note make sense. However, if you really need
+% paragraphs you can try to use \cs{endgraf} instead of \cs{par}.
+%
+% From version 1.4a there is a workaround for double-ended documents with
+% consecutive odd pages or consecutive even pages. However it is not
+% recommended to use double-ended documents with such page sequences, because
+% printing such documents could be a mess. \texttt{marginnote} shows a warning
+% message whenever it detects those page sequences.
+%
+% From version 1.3 \texttt{marginnote} does not longer support \TeX{} engines
+% without primitives \cs{pdfsavepos}/\cs{savepos} and
+% \cs{pdflastxpos}/\cs{lastxpos}. The former (manual adjustment) fallback has
+% been removed. You'll get an error message, if you try to use a \TeX{} engine
+% without these primitives. Also $\varepsilon$-\TeX{} primitves are
+% needed. However, with current free \TeX{} distributions like MiK\TeX{} or
+% \TeX Live this shouldn't be a problem.
+%
+% At double side layout (e.g. using class option \texttt{twoside})
+% \cs{marginnote} needs to know the number of the current page to decide
+% whether the page is odd or even and so whether to use left or right
+% margin. \LaTeX{} uses an asynchronous output. Because of this counter
+% \texttt{page} should not be used to get the number of the current page
+% unless you are at page head or foot. To solve the problem
+% \textsf{marginnote} uses a mechanism similar to labels. But this means, that
+% the correct margin won't be known at this \LaTeX{} run but only at the
+% next. So after adding or deleting a margin note or after each change of page
+% break you need two \LaTeX{} runs to get all margins right.
+%
+% The command \cs{marginnote} uses \cs{strut} and \cs{vadjust} to put the
+% margin note at the correct position. But under some circumstances this may
+% fail. You may adjust the vertical position of the margin note using the
+% second optional argument of \cs{marginnote}. Sometimes even the text outside
+% \cs{marginnote} will be moved because of using \cs{marginnote}. You may use
+% one of the package options \texttt{fulladjust}, \texttt{heightadjust},
+% \texttt{depthajust} or \texttt{noajust} to change the global adjustment or
+% a local redefinition of |\mn@strut| or |\mn@zbox|.
+%
+% Note: The margin note will be placed at the current vertical line. This
+% means, if you are using two \cs{marginnote} commands at the same line, they
+% will be put on the same place. This is not a bug but a feature!
+%
+% Since release~1.1b \cs{marginnote} between paragraphs (in vertical mode)
+% will place the note between the paragaphs instead of the end of the previous
+% paragraph. You may use \cs{leavevmode} or the third optional argument of
+% \cs{marginnote} to place it different.
+%
+% No page break may occur inside a margin note created with \cs{marginnote}.
+%
+% \cs{marginnote} is somewhat different from \cs{marginpar} if used immediate
+% after \cs{item}. This is not a bug, it's a feature!
+%
+% With math \cs{marginnote} may work or may not depending on the math
+% environment.
+%
+% If you are using \XeTeX{}, PDF\LaTeX{} since version~1.40 or PDF\LaTeX{}
+% before version~1.40 with PDF output and the horizontal position of
+% a margin note is wrong, do one more PDF\LaTeX{} run.
+%
+% Sometimes lines are stretched vertically using \cs{marginnote}, e.g.\ if
+% you're using \cs{marginnote} at a list \emph{and} upper case umlauts like
+% ``\"U'' or if \verb|\lineskiplimit>0pt|. In this case
+% \verb|\lineskiplimit=0pt| or \verb|\lineskiplimit=-\maxdimen|, or one of the
+% options may help.
+%
+% You should not use \cs{marginnote} at the optional argument of \cs{item}.
+%
+% If \cs{if@twocolumn} is \cs{iftrue}, e.g., because you are using option
+% |twocolumn| or command |\twocolumn|, \cs{marginnote} does decide whether the
+% note should be placed left of the column or right of the columns simply by
+% comaring the current horizontal possition with |\columnwidth+\columnsep|. So
+% if the current horizontal possition is somewhere in the left columns, the
+% note is placed in the left margin. If the current horizontal possition is
+% somewhere right of the left column, the note is placed in the right
+% margin. However, support for twocolumn mode is as problematic as support for
+% reverse margin notes. I do not like it. Maybe it will be changed in
+% future. The current support for twocolumn mode has been implemented only
+% because of a feature request by Florent Chervet.
+%
+% \StopEventually{\PrintIndex\PrintChanges}
+%
+% \section{Implementation}
+%
+% \iffalse
+%<*package>
+% \fi
+%
+% \changes{v1.3}{2018/04/13}{$\varepsilon$-\TeX{} removed}^^A
+%
+% \changes{v1.3}{2018/04/13}{early \cs{pdfsavepos}/\cs{savepos} test}^^A
+% \begin{macro}{\mn@savepos}
+% \changes{v1.3}{2018/04/13}{new internal command}
+% \begin{macro}{\mn@lastxpos}
+% \changes{v1.3}{2018/04/13}{new internal command}
+% Since version 1.3 \texttt{marginnote} does need either \cs{pdfsavepos} and
+% \cs{pdflastxpos} or \cs{savepos} and \cs{lastxpos} and does not longer
+% support engines without these primitives. All these engines also provide
+% $\varepsilon$-\TeX{} extensions. So we do not longer need an explicite
+% $\varepsilon$-\TeX{} test.
+% \begin{macrocode}
+\begingroup
+ \@ifundefined{pdfsavepos}{%
+ \@ifundefined{savepos}{%
+ \PackageError{marginnote}{%
+ neither \string\pdfsavepos\space nor \string\savepos\space
+ available
+ }{%
+ Package `marginnote' depends on extended features of
+ PDFLaTeX,\MessageBreak
+ LuaLaTeX or XeLaTeX. It does not work without those
+ feature.\MessageBreak
+ If you'd continue the package will not provide any feature.
+ }%
+ \aftergroup\endinput
+ }{%
+ \@ifundefined{lastxpos}{%
+ \PackageError{marginnote}{%
+ \string\savepos\space but not \string\lastxpos\space
+ available
+ }{%
+ Package `marginnote' depends on extended features of
+ PDFLaTeX,\MessageBreak
+ LuaLaTeX or XeLaTeX. It does not work without those
+ feature.\MessageBreak
+ If you'd continue the package will not provide any feature.
+ }%
+ \aftergroup\endinput
+ }{%
+ \global\let\mn@savepos\savepos
+ \global\let\mn@lastxpos\lastxpos
+ \global\let\mn@pagewidth\pagewidth
+ }%
+ }%
+ }{%
+ \@ifundefined{pdflastxpos}{%
+ \PackageError{marginnote}{%
+ \string\pdfsavepos\space but not \string\pdflastxpos\space
+ available
+ }{%
+ Package `marginnote' depends on extended features of
+ PDFLaTeX,\MessageBreak
+ LuaLaTeX or XeLaTeX. It does not work without those
+ feature.\MessageBreak
+ If you'd continue the package will not provide any feature.
+ }%
+ \aftergroup\endinput
+ }{%
+ \global\let\mn@savepos\pdfsavepos
+ \global\let\mn@lastxpos\pdflastxpos
+ \global\let\mn@pagewidth\pdfpagewidth
+ }%
+ }%
+\endgroup
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Next declare and process the options.
+%
+% \begin{macro}{\if@mn@verbose}
+% Use verbose output mode by default. But you may change this using option
+% \texttt{quiet}.
+% \begin{macrocode}
+\newif\if@mn@verbose\@mn@verbosetrue
+\DeclareOption{verbose}{\@mn@verbosetrue}
+\DeclareOption{quiet}{\@mn@verbosefalse}
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v1.1e}{2009/06/06}{new options \texttt{fulladjust},
+% \texttt{heightadjust}, \texttt{depthadjust}, and \texttt{noadjust}}
+% \begin{macro}{\mn@strut}
+% \changes{v1.1e}{2009/06/06}{new (semi internal)}
+% The package needs to adjust the margin note at the current line. Sometimes
+% this causes extra vertical line spacing. To avoid this you may redefine
+% \cs{mn@strut}. The default value is \cs{strut}.
+% \begin{macrocode}
+\newcommand*{\mn@strut}{}
+% \end{macrocode}
+% \begin{macro}{\mn@zbox}
+% \changes{v1.1b}{2009/02/16}{new (internal)}
+% This macro is used to set a horizontal box without height, depth and width.
+% \begin{macrocode}
+\newcommand{\mn@zbox}[1]{}
+% \end{macrocode}
+% The options do redefine both, \cs{mn@strut} and \cs{mn@zbox}.
+% \begin{macrocode}
+\DeclareOption{fulladjust}{%
+ \renewcommand*{\mn@strut}{\strut}%
+ \renewcommand{\mn@zbox}[1]{%
+ \bgroup
+ \setbox\@tempboxa\vbox{#1}%
+ \ht\@tempboxa\ht\strutbox
+ \dp\@tempboxa\dp\strutbox
+ \wd\@tempboxa\z@
+ \box\@tempboxa
+ \egroup
+ }%
+}
+\DeclareOption{heightadjust}{%
+ \renewcommand*{\mn@strut}{\begingroup\dp\strutbox\z@\strut\endgroup}%
+ \renewcommand{\mn@zbox}[1]{%
+ \bgroup
+ \setbox\@tempboxa\vbox{#1}%
+ \ht\@tempboxa\ht\strutbox
+ \dp\@tempboxa\dp\z@
+ \wd\@tempboxa\z@
+ \box\@tempboxa
+ \egroup
+ }%
+}
+\DeclareOption{depthadjust}{%
+ \renewcommand*{\mn@strut}{\begingroup\ht\strutbox\z@\strut\endgroup}%
+ \renewcommand{\mn@zbox}[1]{%
+ \bgroup
+ \setbox\@tempboxa\vbox{#1}%
+ \ht\@tempboxa\ht\z@
+ \dp\@tempboxa\dp\strutbox
+ \wd\@tempboxa\z@
+ \box\@tempboxa
+ \egroup
+ }%
+}
+\DeclareOption{noadjust}{%
+ \renewcommand*{\mn@strut}{\relax}%
+ \renewcommand{\mn@zbox}[1]{%
+ \bgroup
+ \setbox\@tempboxa\vbox{\kern-\ht\strutbox #1}%
+ \ht\@tempboxa\ht\z@
+ \dp\@tempboxa\dp\z@
+ \wd\@tempboxa\z@
+ \box\@tempboxa
+ \egroup
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v1.4}{2018/07/01}{new options \texttt{parboxrestore} (default) and
+% \texttt{noparboxrestore}}^^A
+% \begin{macro}{\mn@parboxrestore}
+% \changes{v1.4}{2018/07/01}{new internal command}^^A
+% We can either use \cs{@parboxrestore} inside the margin notes or dont use
+% it. I would recommend to use it, so this will be the new default.
+% \begin{macrocode}
+\newcommand*{\mn@parboxrestore}{}
+\DeclareOption{parboxrestore}{%
+ \renewcommand*{\mn@parboxrestore}{%
+ \@tempskipa\parskip
+ \@parboxrestore
+ \parskip\@tempskipa
+ }%
+}
+\DeclareOption{noparboxrestore}{%
+ \renewcommand*{\mn@parboxrestore}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\ExecuteOptions{verbose,fulladjust,parboxrestore}
+\ProcessOptions\relax
+% \end{macrocode}
+%
+% \begin{macro}{\newmarginnote}
+% We need a macro to define a new note at the \texttt{aux} file. This will
+% be done using the mechanism of \LaTeX{} that is used for
+% \cs{newlabel}. But we use another prefix. This will result in the usual
+% ``Labels(s) may have changed. Rerun to get cross-references right.'' if a
+% margin note is new or have moved to another page.
+% \begin{macrocode}
+\newcommand*{\newmarginnote}{\@newl@bel{mn}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\if@mn@pdfmode}
+% \changes{v1.1}{2006/10/23}{new switch}^^A
+% \changes{v1.1a}{2008/11/10}{PDF\TeX\ since 1.40 allows \cs{pdfsavepos} in
+% DVI mode too}^^A
+% \changes{v1.1b}{2009/02/16}{if level fixed}^^A
+% \changes{v1.1c}{2009/02/26}{\protect\XeTeX has working \cs{pdflastxpos}^^A
+% but no \cs{pdftexversion}}^^A
+% \changes{v1.2}{2016/06/02}{addition for lua\TeX{} from 0.85}^^A
+% \changes{v1.3}{2018/04/13}{removed}^^A
+% \begin{macro}{\@mn@mode@prefix}
+% \changes{v1.2}{2016/06/02}{(new (internal)}^^A
+% \changes{v1.3}{2018/04/13}{removed}^^A
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\marginnotetextwidth}
+% \changes{v1.1}{2006/10/23}{new macro}
+% Some environments change \cs{textwidth}. But at PDF mode we need to know the
+% real text width to find the right margin. So we use our own text width
+% macro. Sometimes it may be useful if the user can set it up. Because of
+% this it is a user command.
+% \begin{macrocode}
+\newcommand*{\marginnotetextwidth}{}
+\let\marginnotetextwidth\textwidth
+\AtBeginDocument{\edef\marginnotetextwidth{\the\textwidth}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@mn@margintest}
+% \changes{v1.1}{2006/10/23}{new PDF mode feature}
+% \begin{macro}{\@mn@thispage}
+% \begin{macro}{\@mn@atthispage}
+% \begin{macro}{\@mn@currpage}
+% \changes{v1.1}{2006/10/23}{new (internal)}
+% \begin{macro}{\@mn@currxpos}
+% \changes{v1.1}{2006/10/23}{new (internal)}
+% \begin{macro}{\mn@abspage}
+% Macro \cs{@mn@margintest} does the complete test, which margin to use. The
+% result may be found at \cs{if@tempswa}. To avoid changes on the last page
+% if there is a new note on the first page, try to count the notes by
+% page. We know that this can not be successful, but never the less it may
+% be a good try. \cs{@mn@thispage} saves the page number of the last usage
+% of \cs{@mn@margintest}. \cs{@mn@atthispage} saves the number of margin
+% note at this page. But we need to know the absolut page number to do
+% this. So we increase the absolut page number \texttt{mn@abspage} at every
+% \cs{@outputpage}. \cs{@mn@currpage} is the page from the page label if
+% found. \cs{@mn@currxpos} is the real $x$ position may be written with the
+% page label and used to calculate the correct horizontal offset.
+% \begin{macrocode}
+\newcommand*{\@mn@thispage}{}
+\newcommand*{\@mn@currpage}{}
+\newcommand*{\@mn@currxpos}{}
+\newcounter{mn@abspage}
+\AtBeginDocument{\setcounter{mn@abspage}{1}%
+ \g@addto@macro\@outputpage{%
+ \stepcounter{mn@abspage}%
+% \end{macrocode}
+% \changes{v1.4a}{2018/07/21}{workaround for screwball page order}^^A
+% From version 1.4a there is a workaround for consecutive odd pages or
+% consecutive even pages in a twoside document.
+% \begin{macrocode}
+ \ifodd\value{mn@abspage}%
+ \ifodd\value{page}%
+ \else
+ \if@twoside
+ \begingroup
+ \advance\c@page\m@ne
+ \PackageWarningNoLine{marginnote}{%
+ Consecutive odd pages found.\MessageBreak
+ Note, it is not recommended to use consecutive\MessageBreak
+ odd pages in a double-ended document.\MessageBreak
+ The pages of your document should always\MessageBreak
+ be a sequence: odd-even-odd-even-...\MessageBreak
+ Maybe you've forgotten a
+ \@ifundefined{KOMAClassName}%
+ {\string\cleardoublepage}%
+ {\string\cleardoubleoddpage}
+ before\MessageBreak
+ changing the page numbering on page \thepage
+ }%
+ \endgroup
+ \fi
+ \PackageInfo{marginnote}{Using workaround for absolute page number}%
+ \stepcounter{mn@abspage}%
+ \fi
+ \else
+ \ifodd\value{page}%
+ \if@twoside
+ \begingroup
+ \advance\c@page\m@ne
+ \PackageWarningNoLine{marginnote}{%
+ Consecutive even pages found.\MessageBreak
+ Note, it is not recommended to use consecutive\MessageBreak
+ even pages in a double-ended document.\MessageBreak
+ The pages of your document should always\MessageBreak
+ be a sequence: odd-even-odd-even-...\MessageBreak
+ Maybe you've forgotten a
+ \@ifundefined{KOMAClassName}%
+ {\string\cleardoublepage}%
+ {\string\cleardoubleevenpage}
+ before\MessageBreak
+ changing the page numbering on page \thepage
+ }%
+ \endgroup
+ \fi
+ \PackageInfo{marginnote}{Using workaround for absolute page number}%
+ \stepcounter{mn@abspage}%
+ \fi
+ \fi
+ }%
+}
+\newcommand*{\@mn@margintest}{%
+% \end{macrocode}
+% \changes{v1.2}{2016/06/02}{addition for lua\TeX{} from 0.85}^^A
+% Number of the next margin note at this page.
+% \begin{macrocode}
+ \expandafter\ifx\csname @mn@thispage\endcsname\@empty
+ \gdef\@mn@atthispage{1}%
+ \else\expandafter\ifnum \@mn@thispage=\value{mn@abspage}%
+ \begingroup
+ \@tempcnta\@mn@atthispage\advance\@tempcnta by \@ne
+ \xdef\@mn@atthispage{\the\@tempcnta}%
+ \endgroup
+ \else
+ \gdef\@mn@atthispage{1}%
+ \fi
+ \fi
+ \xdef\@mn@thispage{\themn@abspage}%
+% \end{macrocode}
+% Use the number of the page and the number of the margin note at this page
+% to save the real number of this page at the \texttt{aux} file. At PDF mode
+% save the current $x$ position too.
+% \changes{v1.3}{2018/04/13}{use new internals \cs{mn@savepos} and
+% \cs{mn@lastxpos}}^^A
+% \changes{v1.3}{2018/04/13}{non PDF mode removed}^^A
+% \begin{macrocode}
+ \let\@mn@currpage\relax
+ \let\@mn@currxpos\relax
+ \mn@savepos
+ \protected@write\@auxout{\let\themn@abspage\relax}{%
+ \string\newmarginnote{note.\@mn@thispage.\@mn@atthispage}{%
+ {\themn@abspage}{\noexpand\number\mn@lastxpos sp}}%
+ }%
+% \end{macrocode}
+% If the margin note label was not defined, it seems to be new. In this case
+% the absolut page number will be used for the test instead of the saved
+% real page number.
+% \begin{macrocode}
+ \expandafter\ifx\csname mn@note.\@mn@thispage.\@mn@atthispage\endcsname\relax
+% \end{macrocode}
+% If we are not in two side mode, we are on a odd page.
+% \begin{macrocode}
+ \if@twoside
+ \if@mn@verbose
+ \PackageInfo{marginnote}{Suggest that margin
+ note \@mn@thispage.\@mn@atthispage\space will be on\MessageBreak
+ absolute page \themn@abspage.\MessageBreak
+ This may be wrong}%
+ \fi
+ \ifodd\value{mn@abspage}\@tempswatrue\else\@tempswafalse\fi
+ \else
+ \if@mn@verbose
+ \PackageInfo{marginnote}{right page because not two side mode}%
+ \fi
+ \@tempswatrue
+ \fi
+ \else
+ \edef\@mn@currpage{\csname
+ mn@note.\@mn@thispage.\@mn@atthispage\endcsname}%
+ \edef\@mn@currxpos{\expandafter\@secondoftwo\@mn@currpage}%
+% \end{macrocode}
+% \changes{v1.1d}{2009/05/06}{take care of \cs{hoffset}}^^A
+% Ulrike Fischer suggested a simple change to take care of \cs{hoffset},
+% e.g., using package \textsf{crop}.
+% \changes{v1.1d}{2009/05/06}{take care of \cs{pdfhorigin}}^^A
+% We use this occasion to take care of \cs{pdfhorigin}, too.
+% \changes{v1.2a}{2016/10/21}{redefine \cs{@mn@currxpos} only if not empty}^^A
+% If \cs{@mn@currxpos} is not empty here, it should be corrected by
+% \cs{hoffset} and maybe by \cs{pdfhorigin}.
+% \begin{macrocode}
+ \ifx\@mn@currxpos\@empty\else
+ \edef\@mn@currxpos{\the\dimexpr \@mn@currxpos -\hoffset\relax}%
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname pdfhorigin\endcsname\relax\else
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname pdfoutput\endcsname\relax
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname outputmode\endcsname\relax\else
+ \ifnum \outputmode=1 %
+ \edef\@mn@currxpos{\the\dimexpr \@mn@currxpos -\pdfhorigin
+ +1in\relax}%
+ \fi
+ \fi
+ \else
+ \ifnum \pdfoutput=1 %
+ \edef\@mn@currxpos{\the\dimexpr \@mn@currxpos -\pdfhorigin
+ +1in\relax}%
+ \fi
+ \fi
+ \fi
+% \end{macrocode}
+% \changes{v1.2b}{2017/04/22}{\textsf{bidi} code added}^^A
+% \changes{v1.3}{2018/04/13}{\texttt{twocolumn} test added}^^A
+% If you are using package \textsf{bidi} and RTL mode is active, the position
+% is from right instead of left. So we have to substract \cs{@mn@currxpos}
+% from \cs{pdfpagewidth} (or \cs{pagewidth} using Lua\TeX, but this cannot be,
+% because \textsf{bidi} is not Lua\TeX-compatible).
+% \begin{macrocode}
+ \ifdefined\mn@pagewidth
+ \@mn@if@RTL{%
+ \PackageInfo{marginnote}{Margin note
+ \@mn@thispage.\@mn@atthispage\space in RTL mode}%
+ \edef\@mn@currxpos{%
+ \the\dimexpr\mn@pagewidth-\@mn@currxpos\relax
+ }%
+ }{}%
+ \fi
+ \fi
+ \edef\@mn@currpage{\expandafter\@firstoftwo\@mn@currpage}%
+ \if@mn@verbose
+ \PackageInfo{marginnote}{Margin note \@mn@thispage.\@mn@atthispage\space
+ is on absolute page \@mn@currpage}%
+ \fi
+ \if@twoside
+ \ifodd\@mn@currpage\relax
+ \@tempswatrue
+ \if@twocolumn
+ \ifdim \@mn@currxpos
+ < \dimexpr\oddsidemargin+\columnwidth+\columnsep\relax
+ \@tempswafalse
+ \fi
+ \fi
+ \else
+ \@tempswafalse
+ \if@twocolumn
+ \ifdim\@mn@currxpos>\dimexpr\evensidemargin+\columnwidth\relax
+ \@tempswatrue
+ \fi
+ \fi
+ \fi
+ \else
+ \if@mn@verbose
+ \PackageInfo{marginnote}{right page because not two side mode}%
+ \fi
+ \@tempswatrue
+ \if@twocolumn
+ \ifdim \@mn@currxpos
+ < \dimexpr\oddsidemargin+\columnwidth+\columnsep\relax
+ \@tempswafalse
+ \fi
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \begin{macro}{@mn@ifRTL}
+% \changes{v1.2b}{2017/04/22}{new internal}
+% Test, whether or not \cs{if@RTL} exists and is true or false.
+% \begin{macrocode}
+\newcommand*{\@mn@if@RTL}{%
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname if@RTL\endcsname\iftrue
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\marginnote}
+% \begin{macro}{\@mn@marginnote}
+% \begin{macro}{\@mn@@marginnote}
+% \changes{v1.1g}{2011/04/11}{missing \cs{long} added}
+% \begin{macro}{\@mn@@@marginnote}
+% \changes{v1.1}{2006/10/23}{new PDF mode feature}
+% \changes{v1.1g}{2011/04/11}{missing \cs{long} added}
+% Command \cs{marginnote} is the main macro of the package. The others are
+% helpers to manage the optional arguments.
+% \begin{macrocode}
+\newcommand*{\marginnote}{%
+ \@dblarg\@mn@marginnote
+}
+\newcommand{\@mn@marginnote}[2][]{%
+ \ifhmode
+ \@bsphack
+ \begingroup
+ \ifdim\@savsk>\z@\else
+ \def\:{\@xifnch}\expandafter\def\: { \futurelet\@let@token\@ifnch}%
+ \fi
+ \else
+ \begingroup
+ \fi
+ \@ifnextchar [{\@mn@@marginnote[{#1}]{#2}}{\@mn@@marginnote[{#1}]{#2}[\z@]}%
+}
+\newcommand{\@mn@@marginnote}{}
+\long\def\@mn@@marginnote[#1]#2[#3]{%
+ \endgroup
+% \end{macrocode}
+% In horizontal mode the space hack of the \LaTeX{} kernel will be used. In
+% vertical mode this should not be used.
+% \begin{macrocode}
+ \ifhmode
+ \@mn@@@marginnote[{#1}]{#2}[{#3}]%
+ \@esphack
+ \else
+ \@mn@@@marginnote[{#1}]{#2}[{#3}]%
+ \fi
+}
+\newcommand{\@mn@@@marginnote}{}
+\long\def\@mn@@@marginnote[#1]#2[#3]{%
+% \end{macrocode}
+% \changes{v1.1b}{2009/02/16}{use \cs{mn@vadjust} instead of \cs{vadjust}}%
+% \changes{v1.1e}{2009/06/06}{use \cs{mn@strut} instead of \cs{strut}}%
+% All changes (but change of counters that are global because of using the
+% \LaTeX{} commands to change them an \cs{gdef} and \cs{xdef}) should be
+% local. In h-mode a \cs{strut} will be used to fix base line. The margin
+% note will be put to vertical list using \cs{vadjust}. This also means that
+% wie are one line to deep. This will be corrected later using negative kern.
+% In v-mode wie use a special kind of vbox to simply set everything. Math
+% mode should behave like v-mode. And if we are just after an item we have
+% to leave v-mode first.
+% \begin{macrocode}
+ \begingroup
+ \ifmmode\mn@strut\let\@tempa\mn@vadjust\else
+ \if@inlabel\leavevmode\fi
+ \ifhmode\mn@strut\let\@tempa\mn@vadjust\else\let\@tempa\mn@vlap\fi
+ \fi
+ \@tempa{%
+% \end{macrocode}
+% Everything will be put upwards using a \cs{vbox} with zero height and depth
+% and \cs{vss}. At this box the margin test will be done. If
+% \cs{reversemarginpar} was used, the logic reverses. Then the note will be
+% places to the margin.
+% \begin{macrocode}
+ \vbox to\z@{%
+ \vss
+ \@mn@margintest
+ \if@reversemargin\if@tempswa
+ \@tempswafalse
+ \else
+ \@tempswatrue
+ \fi\fi
+ \if@tempswa
+ \rlap{%
+% \end{macrocode}
+% If \cs{@mn@currxpos} is neither \cs{relax} nor empty it is the real
+% current $x$ position of the last PDF\LaTeX{} run and may be used to
+% calculate the real horizontal offset.
+% \begin{macrocode}
+ \if@mn@verbose
+ \PackageInfo{marginnote}{xpos seems to be \@mn@currxpos}%
+ \fi
+ \begingroup
+ \ifx\@mn@currxpos\relax\else\ifx\@mn@currxpos\@empty\else
+ \kern-\dimexpr\@mn@currxpos\relax
+ \fi\fi
+ \ifx\@mn@currpage\relax
+ \let\@mn@currpage\@ne
+ \fi
+ \if@twoside\ifodd\@mn@currpage\relax
+ \kern\oddsidemargin
+ \else
+ \kern\evensidemargin
+ \fi
+ \else
+ \kern\oddsidemargin
+ \fi
+ \kern 1in
+ \endgroup
+ \kern\marginnotetextwidth\kern\marginparsep
+ \vbox to\z@{\kern\marginnotevadjust\kern #3
+ \vbox to\z@{%
+ \hsize\marginparwidth
+% \end{macrocode}
+% \changes{v1.1g}{2011/04/11}{set \cs{linewidth}}
+% \begin{macrocode}
+ \linewidth\hsize
+% \end{macrocode}
+% Here's the correction of the vertical position. The remain is simple.
+% \changes{v1.1i}{2012/03/29}{\cs{strut} moved to fix hyphenation (thanks to
+% Ulrike Fischer)}
+% \changes{v1.1i}{2012/03/29}{\cs{ignorespaces} added}^^A
+% \changes{v1.4}{2018/07/01}{\cs{mn@parboxrestore} added}^^A
+% \begin{macrocode}
+ \kern-\parskip
+ \mn@parboxrestore
+ \marginfont\raggedrightmarginnote\strut\hspace{\z@}%
+ \ignorespaces#2\endgraf
+ \vss}%
+ \vss}%
+ }%
+ \else
+% \end{macrocode}
+% Using the left margin.
+% \changes{v1.1f}{2010/01/05}{missing usage of \cs{marginnotevadjust} on
+% left margin fixed}
+% \begin{macrocode}
+ \llap{%
+ \vbox to\z@{\kern\marginnotevadjust\kern #3
+ \vbox to\z@{%
+ \hsize\marginparwidth
+% \end{macrocode}
+% \changes{v1.1g}{2011/04/11}{set \cs{linewidth}}
+% \begin{macrocode}
+ \linewidth\hsize
+% \end{macrocode}
+% Same like above for left margins.
+% \begin{macrocode}
+ \kern-\parskip
+ \mn@parboxrestore
+ \marginfont\raggedleftmarginnote\strut\hspace{\z@}%
+ \ignorespaces#1\endgraf
+ \vss
+ }%
+ \vss
+ }%
+ \if@mn@verbose
+ \PackageInfo{marginnote}{xpos seems to be \@mn@currxpos}%
+ \fi
+ \begingroup
+ \ifx\@mn@currxpos\relax\else\ifx\@mn@currpos\@empty\else
+ \kern\@mn@currxpos
+ \fi\fi
+ \ifx\@mn@currpage\relax
+ \let\@mn@currpage\@ne
+ \fi
+ \if@twoside\ifodd\@mn@currpage\relax
+ \kern-\oddsidemargin
+ \else
+ \kern-\evensidemargin
+ \fi
+ \else
+ \kern-\oddsidemargin
+ \fi
+ \kern-1in
+ \endgroup
+ \kern\marginparsep
+ }%
+ \fi
+ }%
+ }%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\marginnoterightadjust}
+% \changes{v1.3}{2018/04/13}{removed}^^A
+% \begin{macro}{\marginnoteleftadjust}
+% \changes{v1.3}{2018/04/13}{removed}^^A
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\marginnotevadjust}
+% This may be used to define an automatic vertical adjust. The defaul tis
+% zero. Values greater than zero will move the margin note down, values less
+% than zero will move the margin note up.
+% \begin{macrocode}
+\newcommand*{\marginnotevadjust}{}
+\let\marginnotevadjust\z@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mn@vlap}
+% This macro is used to set a vertical box without size at vertical mode.
+% \begin{macrocode}
+\newcommand{\mn@vlap}[1]{%
+ \setbox\@tempboxa\vbox to \ht\strutbox{#1\vss}%
+ \box\@tempboxa\vskip-\baselineskip
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mn@vadjust}
+% \changes{v1.1b}{2009/02/16}{new (internal)}
+% This macro is used to set a vertical box at horizontal mode.
+% \begin{macrocode}
+\newcommand{\mn@vadjust}[1]{%
+ \mn@zbox{\kern-\parskip
+ \leavevmode\vadjust{#1}%
+ \kern\parskip
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\marginfont}
+% \changes{v1.0a}{2006/02/06}{Use \cs{providecommand} to define it.}
+% \begin{macro}{\raggedleftmarginnote}
+% \begin{macro}{\raggedrightmarginnote}
+% These are very simple. A class may also define \cs{marginfont}. Use this
+% if available. I don't use \cs{let} for the definitions of the ragged
+% macros, so the meaning may change loading e.g. package \textsf{ragged2e}.
+% \begin{macrocode}
+\providecommand*{\marginfont}{}
+\newcommand*{\raggedleftmarginnote}{\raggedleft}
+\newcommand*{\raggedrightmarginnote}{\raggedright}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \Finale
+%
+\endinput
+%
+% end of `marginnote.dtx'
+%
+% \iffalse
+%%% Local Variables:
+%%% mode: doc-tex
+%%% TeX-master: t
+%%% End:
+% \fi