diff options
Diffstat (limited to 'macros/latex/contrib/marginnote/marginnote.dtx')
-rw-r--r-- | macros/latex/contrib/marginnote/marginnote.dtx | 1054 |
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 |