% \CheckSum{757} % \iffalse meta-comment % % marginnote.dtx % %% Copyright (c) Markus Kohm 2005-2010 %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3 %% of this license or (at your option) any later version. %% The latest version of this license is in %% http://www.latex-project.org/lppl.txt %% and version 1.3 or later is part of all distributions of LaTeX %% version 2003/12/01 or later. %% %% This work has the LPPL maintenance status "maintained". %% %% The author of the initial version of these work was %% Markus Kohm %% %% This work consists of the files marginnote.dtx, marginnote.ins, %% and REAMDE. %% %% Important Recommendation: %% The LPPL requires that distributions of the Work contain all the files of %% the Work (see ``Important Recommendations'' at lppl.txt). %% % %<*driver> \ProvidesFile{marginnote.dtx}[% % %\ProvidesPackage{marginnote}[% %<*driver|package> 2010/01/05 v1.1f non floating margin notes for LaTeX] % %<*driver> \documentclass{ltxdoc} \usepackage{graphicx}% needed for \reflectbox \providecommand*{\XeTeX}{% X\kern-.1em\lower.5ex\hbox{\reflectbox{E}}\kern-.15em\TeX} \begin{document} \RecordChanges \DocInput{marginnote.dtx} \end{document} % %\fi % % \GetFileInfo{marginnote.dtx} % % \title{Non-Floating Margin Notes with \textsf{marginnote} % Package\thanks{This file has version number \fileversion, last revised % \filedate.}} % \author{Markus Kohm\thanks{Email: \texttt{komascript@gmx.info}}} % \date{\filedate} % \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} % % \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. % \end{description} % % \DescribeMacro{\marginnote} % The command \cs{marginnote}\oarg{left}\marg{right}\oarg{voffset} my 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{\marginnoteleftadjust} % \DescribeMacro{\marginnoterightadjust} % At some environments, e.g. \texttt{framed} from the \textsf{framed} package % the horizontal placement of the margin notes are not correct. In this case % you may redefine \cs{marginnoteleftadjust} and \cs{marginnoterightadjust} to % fix this. Note that these are macros not lengths! So you have to use % \cs{renewcommand}, \cs{def} or \cs{let} to change them. You may e.g. use % \begin{verbatim} % \begingroup % \makeatletter % \g@addto@macro\framed{% % \let\marginnoteleftadjust\FrameSep % \let\marginnoterightadjust\FrameSep % } % \endgroup % \end{verbatim}\vskip-\baselineskip % at your preamble after loading package \textsf{framed} to fix the problem % using \texttt{framed} environment. % % NOTE: \cs{marginnoteleftadjust} and \cs{marginnoterightadjust} will be used % only, if the correct horizontal position cannot be determined using % PDF\TeX{} features (\cs{pdfsavepos} and \cs{pdflastxpos}). So if you are % using PDF\LaTeX{} with PDF output or PDF\LaTeX{} with PDF\TeX-version since % 1.40 or \XeTeX{} you will not need to use the example code above, but you % will need at least two \LaTeX{} runs to get the correct horizontal positions % of the margin notes. % % \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. thos of package % \textsl{framed}) change \cs{textwidth}, \textsl{marginnote} defines it's 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 Problems Using \textsf{marginnote}} % % At double side layout (e.g. using class option \texttt{twoside}) % \cs{marginnote} needs to know the number of the current page to decide % wether the page is odd or even and so wether 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 occure inside a margin note created with \cs{marginnote}. % % \cs{marginnote} 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}. % % % \StopEventually{\PrintIndex\PrintChanges} % % \section{Implementation} % % \iffalse %<*package> % \fi % % First test $\varepsilon$-\TeX. % \begin{macrocode} \begingroup \def\@tempb{}% \def\@tempa{% \PackageError{marginnote}{seems you are not running e-TeX\@tempb}{% Since 2004 the LaTeX team recommends to use e-TeX.\MessageBreak marginnote since version 1.1d uses e-TeX features.\MessageBreak At actual systems `latex' should already use e-TeX.\MessageBreak At deprecated systems it may be called `elatex'.\MessageBreak Use either unsupported marginnote up to version 1.1c or\MessageBreak ask you administrator for LaTeX using e-TeX\@tempb.\MessageBreak Not using e-TeX\@tempb\space is a fatal error!\MessageBreak Processing cannot be continued!}% \endgroup \batchmode \errmessage{}\csname @@end\endcsname\end\relax \csname endinput\endcsname }% \expandafter\ifx\csname eTeXversion\endcsname\relax\else \ifnum\eTeXversion <2 \def\@tempb{ V 2}% \else \let\@tempa\endgroup \fi \fi \@tempa % \end{macrocode} % % 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 provocates 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} % % \begin{macrocode} \ExecuteOptions{verbose,fulladjust} \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}% % \changes{v1.1a}{2008/11/10}{PDF\TeX\ since 1.40 allows \cs{pdfsavepos} in % DVI mode too}% % \changes{v1.1b}{2009/02/16}{if level fixed}% % \changes{v1.1c}{2009/02/26}{\protect\XeTeX has working \cs{pdflastxpos} % but no \cs{pdftexversion}}% % We need to know, wether or not PDF\TeX{} and which version of PDF\TeX{} is % used. With PDF\TeX{} the horizontal output position may be detected using % \cs{pdfsavepos} and \cs{pdflastxpos}. So the relative position of the margin % may be calculated. Without PDF\TeX{} only manual adjustment is % available. While PDF mode or not may change before start of the document, % setting up the switch is delayed. % \begin{macrocode} \newif\if@mn@pdfmode\@mn@pdfmodefalse \AtBeginDocument{% \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname pdflastxpos\endcsname\relax\else % bg or 1 \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname pdftexversion\endcsname\relax % bg 2 \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname pdfoutput\endcsname\relax % bg 3 \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname XeTeXrevision\endcsname\relax\else % bg 4 \@mn@pdfmodetrue \fi % ed 4 \else % or 3 \ifcase\pdfoutput\else\@mn@pdfmodetrue\fi % bg ed 4 \fi % ed 3 \else % or 2 \ifnum \pdftexversion<140 % bg 3 \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname pdfoutput\endcsname\relax % bg 4 \else % or 4 \ifcase\pdfoutput\else\@mn@pdfmodetrue\fi % bg ed 5 \fi % ed 4 \else % or 3 \@mn@pdfmodetrue \fi % ed 3 \fi % ed 2 \fi % ed 1 \if@mn@verbose \if@mn@pdfmode \PackageInfo{marginnote}{% \string\pdfoutput\space not 0 and \string\pdflastxpos\space available.\MessageBreak Extended position detection mode activated\@gobble }% \else \PackageInfo{marginnote}{% either \string\pdflastxpos\space or \string\pdfoutput\space not available\MessageBreak or \string\pdfoutput\space set to 0.\MessageBreak Extended position detection mode deactivated\@gobble }% \fi \fi } % \end{macrocode} % \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 usefull if the user can set it up. Because of % this it is a user command. % \begin{macrocode} \newcommand*{\marginnotetextwidth}{} \let\marginnotetextwidth\textwidth \AtBeginDocument{\if@mn@pdfmode\edef\marginnotetextwidth{\the\textwidth}\fi} % \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 successfull, 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 somehow special. Using PDF\TeX{} the real $x$ % position may be written with the page label and used to calculate the % correct horizontal offset. In this case \cs{marginnoteleftadjust} and % \cs{marginnoterightadjust} will not be used! % \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}}} \newcommand*{\@mn@margintest}{% % \end{macrocode} % 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. % \begin{macrocode} \let\@mn@currpage\relax \let\@mn@currxpos\relax \if@mn@pdfmode \pdfsavepos \protected@write\@auxout{\let\themn@abspage\relax}{% \string\newmarginnote{note.\@mn@thispage.\@mn@atthispage}{% {\themn@abspage}{\noexpand\number\pdflastxpos sp}}% }% \else \protected@write\@auxout{\let\themn@abspage\relax}{% \string\newmarginnote{note.\@mn@thispage.\@mn@atthispage}{% {\themn@abspage}{}}% }% \fi % \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}}% % 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}}% % We use this occasion to take care of \cs{pdfhorigin}, too. % \begin{macrocode} \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\else \ifnum \pdfoutput=1 % \edef\@mn@currxpos{\the\dimexpr \@mn@currxpos -\pdfhorigin +1in\relax}% \fi \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\MessageBreak}% \fi \if@twoside \ifodd\@mn@currpage\relax \@tempswatrue \else \@tempswafalse \fi \else \if@mn@verbose \PackageInfo{marginnote}{right page because not two side mode}% \fi \@tempswatrue \fi \fi } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\marginnote} % \begin{macro}{\@mn@marginnote} % \begin{macro}{\@mn@@marginnote} % \begin{macro}{\@mn@@@marginnote} % \changes{v1.1}{2006/10/23}{new PDF mode feature} % 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}{} \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}{} \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 vbox with zero height and depth and % \cs{vss}. At this box the margin test will be done. If cs{reversemargin} % was used, the logic switchs. 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@currpos} 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} \ifx\@mn@currxpos\relax \kern\marginnoterightadjust \if@mn@verbose \PackageInfo{marginnote}{% xpos not known,\MessageBreak using \string\marginnoterightadjust}% \fi \else\ifx\@mn@currxpos\@empty \kern\marginnoterightadjust \if@mn@verbose \PackageInfo{marginnote}{% xpos not known,\MessageBreak using \string\marginnoterightadjust}% \fi \else \if@mn@verbose \PackageInfo{marginnote}{% xpos seems to be \@mn@currxpos,\MessageBreak \string\marginnoterightadjust \space ignored}% \fi \begingroup \setlength{\@tempdima}{\@mn@currxpos}% \kern-\@tempdima \if@twoside\ifodd\@mn@currpage\relax \kern\oddsidemargin \else \kern\evensidemargin \fi \else \kern\oddsidemargin \fi \kern 1in \endgroup \fi \fi \kern\marginnotetextwidth\kern\marginparsep \vbox to\z@{\kern\marginnotevadjust\kern #3 \vbox to\z@{% \hsize\marginparwidth % \end{macrocode} % Here's the correction of the vertical position. The rest is simple. % \begin{macrocode} \kern-\parskip \marginfont\raggedrightmarginnote\hspace{\z@}\strut#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} % Same like above for left margins. % \begin{macrocode} \kern-\parskip \marginfont\raggedleftmarginnote\hspace{\z@}\strut#1\endgraf \vss}% \vss}% \ifx\@mn@currxpos\relax \kern\marginnoteleftadjust \if@mn@verbose \PackageInfo{marginnote}{% xpos not known,\MessageBreak using \string\marginnoteleftadjust}% \fi \else\ifx\@mn@currxpos\@empty \kern\marginnoteleftadjust \if@mn@verbose \PackageInfo{marginnote}{% xpos not known,\MessageBreak using \string\marginnoteleftadjust}% \fi \else \if@mn@verbose \PackageInfo{marginnote}{% xpos seems to be \@mn@currxpos,\MessageBreak \string\marginnoteleftadjust \space ignored}% \fi \begingroup \kern\@mn@currxpos \if@twoside\ifodd\@mn@currpage\relax \kern-\oddsidemargin \else \kern-\evensidemargin \fi \else \kern-\oddsidemargin \fi \kern-1in \endgroup \fi \fi \kern\marginparsep }% \fi }% }% \endgroup } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\marginnoterightadjust} % \begin{macro}{\marginnoteleftadjust} % These may be used to define an automatic horizontal adjust. The default is % zero. They will be used only if not PDF\TeX{} or PDF\TeX{} before version~1.40 % in DVI mode is used, because in this case the save position features are not % available. % \begin{macrocode} \newcommand*{\marginnoterightadjust}{} \newcommand*{\marginnoteleftadjust}{} \let\marginnoterightadjust\z@ \let\marginnoteleftadjust\z@ % \end{macrocode} % \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