\ProvidesPackage{dlfltxbmarkup}[2008/08/05 v0.70 by daleif] % This package 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 Current Maintainer of this work is Lars Madsen (daleif@imf.au.dk). %% \@ifclassloaded{memoir}{}{% \PackageError{felinemarkup}{This package depends on several internal components of the memoir class and therefore need the memoir class}{Use the memoir class} } \RequirePackage{keyval} \RequirePackage{ragged2e} \DeclareOption{loadsampleconfig}{\AtEndOfPackage{ %\InputIfFileExists{dlfltxbmarkup-sample.cfg}{}{} \IfFileExists{dlfltxbmarkupbookkeys.sty}{ \RequirePackage{dlfltxbmarkupbookkeys} }{ \PackageError{dlfltxbmarkup}{Sample configuration package 'dlfltxbmarkupbookkeys' not found, option 'loadsampleconfig' is useless.}{} } }} \ProcessOptions\relax % HISTORY % <2007 this package dates back to at least 2004 % 2007/03/20 added \color{black} to the margin writing devices, since % color at a line boundary may extend out into the margin % 2007/03/21 added inputenc keyword % 2007/03/21 added counter keyword % 2007/03/21 added length keyword % 2007/03/22 added gauss keyword % 2007/03/23 added tabs keyword % 2007/03/23 added nbop keyword % 2007/03/24 fixed a bug in tabs % 2007/03/24 fixed loads more index errors % 2007/04/27 added \hspace{0pt} to \MarkWMargin to activate automatic hyphenation % 2007/04/30 added \feline@MWM@inner to get better source re-use % 2007/05/05 fixed a margin placement problem by adding \leavevmode % in front of \checkoddpage in \feline@MWM@inner, fix % supplied by Peter Wilson, after I submitted a bug report % about it. % 2007/05/10 started adding support for key explanations, planning to % make it possible to print a generated overview of the % regisered keys % 2007/05/14 all keys for my book project have now been moved to % felinemarkup.cfg, which wil be loaded at the end of the % package, if the 'loadfelinemarkupconfig' package option % is given % 2007/05/15 \feline@index@cmd renamed to \felineIndexCmd % 2007/05/16 package renamed to dlfltxbmarkup % 2008/01/10 added a strut inside the macro that writes in the margin, % 2008/10/30 'sample configuration' has been renamed % this boolean is meant to be used for example inside constructions % that will not permit the use of \marginpar, for example the % environments 'framed' and 'shaded', then \MarkWMargin will use % \sidepar instead of \marginpar \@ifundefined{ifNoMarginparAvail}{% \newif\ifNoMarginparAvail \NoMarginparAvailfalse }{} \newcommand\felineMarginAdjustment{% \ifoddpage\RaggedRight\else\RaggedLeft\fi} % typesets the material in the margin % we use \checkoddpage (assuming the use of \strictpagechecktrue) to % perform a rigid test on whether or not we are on an odd page % \RaggedRight \RaggedLeft is used to get the test 'mashed' up against % the text, and to permit hyphenation. If the material in #1 is using % typewriter font, then it is #1's responsability to ensure that % hyphenation is possible in that font \newcommand\feline@MWM@inner[1]{% \parbox[t]{\marginparwidth}{% \leavevmode\checkoddpage% needs \leavevmode since \checkoddpage % leaves a whatsit % \ifoddpage\RaggedRight\else\RaggedLeft\fi% \felineMarginAdjustment% {\slshape\scriptsize\strut\hspace{0pt}\color{black} #1\strut\par}}} % this might not belong here, but we will leave it for now \strictpagechecktrue% \reversesideparfalse% % the main macro to write in the margin with \newcommand\felineWriteInMargin[1]{% \ifNoMarginparAvail% \sidepar{\feline@MWM@inner{#1}}% \else% \if@feline@forcesidepar% \sidepar{\feline@MWM@inner{#1}}% \else% \marginpar{\feline@MWM@inner{#1}}% \fi% \fi% }% % because of a possible babel use, and its active charecters (in % danish, " is an active character, it seems that we cannot directly % add automatic english hyphenation to \cs and \css, in most cases it % can be added by hand to the macros specified in \FelineKeyGenerator % see felinemarkup.cfg \DeclareRobustCommand\cs[1]{% \textnormal{\texttt{\symbol{'134}#1}}} \@ifpackagewith{babel}{english}{ \DeclareRobustCommand\css[1]{% \textnormal{\texttt{% \protect\makebox[0pt][r]{\symbol{'134}}% \foreignlanguage{english}{\cs{\hyphenchar\font=`\-#1}}}}} }{ \DeclareRobustCommand\css[1]{% \textnormal{\texttt{% \protect\makebox[0pt][r]{\symbol{'134}}% {#1}}}} } % indexing commands, first just two alias macros \newcommand\textitindex[1]{\textit{#1}} \newcommand\textbfindex[1]{\textbf{#1}} % then two different indexing macros, one for italic index entries and % one for bold. we use them like this to avoid expansion problems (or % at least try to) \newcommand\itindex[1]{\index{#1|textitindex}} \newcommand\bfindex[1]{\index{#1|textbfindex}} % default indexing command, we change this using the idxit, idxbf keys \newcommand\felineIndexCmd{\index} % --------------------------------------------------------------------------- % just initial definitions \newcommand*\feline@margin[1]{\par margin: #1\par} \newcommand*\feline@index[1]{\par index: #1\par} \newcommand*\feline@text[1]{\par text: #1\par} % just a shortcut, amsmath makes the same one \let\@xp\expandafter \define@key{FelineIndex}{empty}[]{% \renewcommand*\feline@margin[1]{\par margin: ##1\par}% \renewcommand*\feline@index[1]{\par index: ##1\par}% \renewcommand*\feline@text[1]{\par text: ##1\par}% } % whether or not to write the text part \newif\if@feline@txt \@feline@txttrue % whether or not to write in the margin \newif\if@feline@mrgn \@feline@mrgntrue % whether or not to add to the index \newif\if@feline@idx \@feline@idxtrue % force the use of sidepar instead of the usual marginpar \newif\if@feline@forcesidepar % whether or not to let \markup add a \hspace{0pt} in the text % don't know it this is still needed \newif\if@feline@hsp % basically stolen from another package \newcommand*\dlf@M@setbool[2]{% \csname #2\ifx\relax#1\relax true \else #1\fi\endcsname} % switch off keys \define@key{FelineIndex}{notxt} []{\@feline@txtfalse} % = nowr \define@key{FelineIndex}{nowr} []{\@feline@txtfalse} % no writing in text \define@key{FelineIndex}{nomk} []{\@feline@mrgnfalse} % no mark in margin \define@key{FelineIndex}{noidx} []{\@feline@idxfalse} % no adding index \define@key{FelineIndex}{hsp} []{\@feline@hsptrue} % locally use a different index command \define@key{FelineIndex}{idxit} []{\renewcommand\felineIndexCmd{\itindex}} \define@key{FelineIndex}{idxbf} []{\renewcommand\felineIndexCmd{\bfindex}} \define@key{FelineIndex}{idxn} []{\renewcommand\felineIndexCmd{\index}} % \sidepar's are non-floating objects so they does not move by them % self, we need to help if needed, the argument should be a number % (the unit will be \onelineskip) \newlength\feline@spvs@addto \setlength\feline@spvs@addto{0pt} \define@key{FelineIndex}{addtospvrt}{\addtolength{\feline@spvs@addto}{#1\onelineskip}} \define@key{FelineIndex}{vaddtosp} {\addtolength{\feline@spvs@addto}{#1\onelineskip}} % force the use of \sidepar, don't think I've ever used this \define@key{FelineIndex}{forcesidepar}[true]{\dlf@M@setbool{#1}{@feline@forcesidepar}} % by default this macro does nothing, the idea behind it is to use % this in an external document to generate a list of key names and % descriptions (using the first two arguments) \providecommand\felineMarkupDescription[5]{} % key generator macro, has the following arguments % #1: name of the key % #2: description of what this key is for % #3: code for margin command % #4: code for index command % #5: code for text command % and does the following: % * creates \feline@margin@, \feline@index@ and % \feline@text@ % * the \define@key part then performs three \let's: % \let\feline@margin\feline@margin@ etc. % when using \FelineKeyGenerator, #1 refers to the main argument given % to \markup \newcommand\felineKeyGenerator[5]{% \felineMarkupDescription{#1}{#2}{#3}{#4}{#5}% \global\define@key{FelineIndex}{#1}[]{% \global\@xp\@xp\@xp\let\@xp\@xp\@xp\feline@margin\@xp\csname feline@margin@#1\endcsname% \global\@xp\@xp\@xp\let\@xp\@xp\@xp\feline@index\@xp\csname feline@index@#1\endcsname% \global\@xp\@xp\@xp\let\@xp\@xp\@xp\feline@text\@xp\csname feline@text@#1\endcsname% }% \@namedef{feline@margin@#1}##1{#3}% \@namedef{feline@index@#1}##1{#4}% \@namedef{feline@text@#1}##1{#5}% } % standard key er lavet ned i \setkeys, da \markup[notxt]{...} ellers ikke vil % vaere det samme som \markup[macro,notxt]{...} % this is the main macro, take two arguments, a optional argument for % key controls and the mandatory arguments for the think we want to % markup % note the it starts by setting the \feline@std@key which will be the % stadard key used if the optional argument is empty or the other keys % does not alter the \feline@margin, \feline@text and \feline@index \newcommand\markup[2][]{% % \@bsphack \begingroup% \setkeys{FelineIndex}{\felineStandardKey}% \setkeys{FelineIndex}{#1}% \ifdim\feline@spvs@addto>0pt% \addtolength\sideparvshift{\feline@spvs@addto}% \fi% \if@feline@txt\feline@text{#2}\fi% \if@feline@idx\phantomsection\feline@index{#2}\fi% \if@feline@mrgn\if@feline@hsp\hspace{0pt}\fi\feline@margin{#2}\fi% \@feline@txttrue% \@feline@mrgntrue% \@feline@idxtrue% \endgroup% % \@esphack } % default generated key used by \markup, in the example setup 'macro' % is used \def\felineStandardKey{test} % test key \felineKeyGenerator{test} {test key, does not do anything useful}% {\felineWriteInMargin{#1}}% {\felineIndexCmd{#1}}% {\emph{#1}} \InputIfFileExists{dlfltxbmarkup.cfg}{}{}