diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/sidenotes/sidenotes.dtx |
Initial commit
Diffstat (limited to 'macros/latex/contrib/sidenotes/sidenotes.dtx')
-rw-r--r-- | macros/latex/contrib/sidenotes/sidenotes.dtx | 504 |
1 files changed, 504 insertions, 0 deletions
diff --git a/macros/latex/contrib/sidenotes/sidenotes.dtx b/macros/latex/contrib/sidenotes/sidenotes.dtx new file mode 100644 index 0000000000..aecb8611f6 --- /dev/null +++ b/macros/latex/contrib/sidenotes/sidenotes.dtx @@ -0,0 +1,504 @@ +% \iffalse meta-comment +% +% sidenotes.dtx +% +% Copyright (C) 2011-2014 by Andy Thomas <andythomas(at)web.de> +% +% 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. +% +% The author of this work is Andy Thomas +% +%<*driver> +\ProvidesFile{sidenotes.dtx}[2016/04/21 v1.00 rich text in the margin for LaTeX]% +%</driver> +%<package>\RequirePackage{l3keys2e}% +%<package>\ProvidesExplPackage{sidenotes}{2016/04/21}{1.00}{rich text in the margin for LaTeX} +%<package>\RequirePackage{marginnote} % provides an offset option for the marginals instead of a float +%<package>\RequirePackage{caption} % handles the captions (in the margin) +%<package>\RequirePackage{xparse} % new LaTeX3 syntax to define macros and environments +%<package>\RequirePackage[strict]{changepage} % Changepage package for symmetric twoside handling +%<*driver> +\documentclass{ltxdoc} +\CodelineIndex +\RecordChanges +\begin{document} + \DocInput{sidenotes.dtx} +\PrintIndex + \PrintChanges +\end{document} +%</driver> +% \fi +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% +% +% \GetFileInfo{sidenotes.dtx} +% +% +% \title{The \textsf{sidenotes} package\thanks{This document +% corresponds to \textsf{sidenotes}~\fileversion, dated \filedate. +% Earlier versions by Oliver Schebaum.}} +% \author{Andy Thomas\\ \texttt{andythomas(at)web.de}} +% +% \maketitle +% +% \changes{v0.51}{2011/10/05}{Extent the documentation of the macros.} +% \changes{v0.90}{2012/06/02}{two opt package is required, the definitions are too confusing otherwise} +% \changes{v0.92}{2012/11/09}{corrected typo in email address} +% \changes{v0.95}{2014/01/23}{cleaned up the documentation.} +% \changes{v0.97}{2014/06/05}{make it a expl package} +% \changes{v0.97}{2014/06/05}{introduce package option oneside } +% \changes{v0.98}{2015/03/04}{compatible with new mhchem version} +% \changes{v0.99}{2015/08/10}{no changes (only in caesar-book.cls)} +% \changes{v1.00}{2016/04/21}{no changes, tag v1.0} +% +% \begin{abstract} +% \noindent This package allows the typesetting of rich content in the margin. +% It includes text, but also figures, captions, tables and citations, +% which is common in science textbooks such as Feynman's +% \textit{Lectures on Physics}. +% \end{abstract} +% +% \tableofcontents +% +% \changes{v0.2}{2011/08/21}{Initial version} +% \changes{v0.7}{2011/11/09}{rewrite without optional offsets} +% \changes{v0.91}{2012/06/03}{deleted marginfullcite} +% +% \section{Usage} +% +% \DescribeMacro{\sidenote} +% The macro is very similar to the footnote macro and tries to emulate +% its behavior. It just puts the notes in the margin instead of the bottom +% of the page, therefore the name \emph{sidenote}. It has the same parameters +% as footnote as well as an additional offset: +% \verb+\sidenote[number][offset]{text}+. All the sidenotes are subsequently +% numbered and float in the margin to avoid overlap. +% The first, optional parameter will manually change the numbering to the given +% value. The second offset parameter will fix the text at a certain position +% in the margin. In particular, there is a difference between not providing an +% offset (floating text) and an offset of 0 (fix text at actual position). +% +% \DescribeMacro{\sidenotemark} +% Sidenote tries to mimic the footnote behavior and, consequently, provides the +% same solutions. Sometimes, it is not possible to directly call a sidenote +% macro, e.g.\ inside of a figure caption. Then, you can use +% \verb+\sidenotemark[number]+ and \verb+\sidenotetext[number][offset]{text}+ +% macros. \verb+\sidenotemark+ puts a mark at the current position. Afterwards, +% outside of the environment that causes the trouble, +% \DescribeMacro{\sidenotetext} +% it is possible the call \verb+\sidenotetext[number][offset]{text}+ to provide +% the text and typeset the sidenote. The optional parameters are similar to the +% sidenote macro. The first, optional parameter will change the numbering and +% the offset will change the position. +% +% \changes{v0.61}{2011/10/17}{documentation of sidetext} +% +%\DescribeMacro{\sidecaption} +% The \verb+\sidecaption[entry][offset]{text}+ macro can be used if the caption +% of a figure or table should be in the margin. The caption has to be adjacent +% to the figure, so a float is not an option here. Therefore, the caption might +% overlap with other marginals. Then, these marginals have to be adjusted with +% offset parameters. The formatting of the caption is done by the \emph{caption} +% package by defining a \emph{sidecaption} style. Please refer to the +% documentation of the caption package for information on styles. The macro can +% be starred, which is analog to the regular starred caption (no numbering, no +% tof entry): \verb+\sidecaption*[offset]{text}+. +% +% \DescribeEnv{marginfigure} +% The marginfigure environment puts a figure and its caption in the margin. +% Instead of \verb+\begin{figure}[htbp]+ use \verb+\begin{marginfigure}[offset]+. +% Again, using an offset value switches the behavior from float to fixed +% position. The marginfigure has its own caption style named \emph{marginfigure}. +% +% \DescribeEnv{margintable} +% The margintable environment works similar to marginfigure, but with table +% environments. Use \verb+\begin{margintable}[offset]+ instead of +% \verb+\begin{table}[htbp]+, its caption style is named \emph{margintable}. +% +% \DescribeEnv{figure*} +% The \verb+figure*+ environment is used to position figures across the full +% page, i.e. the text width plus the margin. The algorithm has to distinguish +% between recto and verso (left and right) pages and might need up to three +% \LaTeX{} runs to provide the desired result. The corresponding caption style +% is called \emph{widefigure}. +% \DescribeEnv{table*} +% The sister environment for tables is \verb+table*+. Use \emph{widetable} to +% change its caption style. +% +% \section{Technical note} +% +% When writing the package, we tried to provide a \emph{minimum} extension to +% standard \LaTeX{} for typesetting rich content in the margin. This means, +% that there are no sensible default values for most things such as page +% geometry, fonts and font sizes. However, the \emph{caesar\textunderscore +% book}-class accompanies this package as an example implementation as well +% as a template we use for our theses. +% +% In addition, we tried to keep compatibility with +% packages the user might want to use later. However, the following packages +% are needed by \emph{sidenotes} and might introduce side effects with other +% packages. +% +% \section{Required packages} +% +% \changes{v0.52}{2011/10/06}{added a section that the package needs marginnote, caption and xifthen.} +% \changes{v0.90}{2012/06/02}{added a section that the package needs twoopt and changepage.} +% \changes{v0.94}{2014/01/22}{start using xparse} +% \changes{v0.97}{2014/06/05}{start using l3keys2e} +% +% \begin{description} +% \item[marginnote] +% supports an alternative to \verb+\marginpar+ and creates notes in the +% margin. The notes are not floats and can be shifted up or down. +% Technically, every time an offset is provided the package uses +% \verb+\marginnote+ and \verb+\marginpar+ otherwise. +% \item[caption] +% allows to set figure and table captions in the margin and allows +% easier formatting of these captions. Please refer to the +% \emph{caption} manual for details on styles. +% \item[xparse] is used to take advantage of the improved \LaTeX3 syntax. +% All macros and environments are defined using this package. +% \item[l3keys2e] provides a key/value mechanism +% \item[changepage] is used to correctly shift figure* and table*. It has +% to use the option [strict] to work properly. This might lead to an +% option clash, if the same package is loaded without this option. +% \end{description}% +% +% \section{Implementation} +% +% \iffalse +%<*package> +% \fi +% +% Process the package options: onside +% +% \begin{macrocode} +\ExplSyntaxOn +% +\keys_define:nn { sidenotes } + { + oneside .bool_set:N = \sidenotes_oneside + } +\ProcessKeysOptions { sidenotes } +% \end{macrocode} +% +% \changes{v0.91}{2012/06/03}{sidenotetextstyle is not needed any more} +% \changes{v0.94}{2014/01/22}{change sidenote counter behavior} +% +% We need a counter similar to the footnote counter. +% +% \begin{macrocode} +\newcounter{sidenote} % make a counter +\setcounter{sidenote}{1} % init the counter +% \end{macrocode} +% +% \noindent The \LaTeX3 parts concerning the optional arguments should not +% distinguish between an empty bracket pair and no optional +% argument. This is required to keep macros with two leading +% optional arguments. +% +% \begin{macrocode} +\DeclareExpandableDocumentCommand{\IfNoValueOrEmptyTF}{ m m m } +{ + \IfNoValueTF{#1} + {#2} + {\tl_if_empty:nTF {#1} {#2} {#3}} +} +% \end{macrocode} +% +% \changes{v0.93}{2012/04/17}{regular ifnextchar gobbles trailing whitespaces, introduce a new one that does not.} +% \changes{v0.97}{2014/05/29}{New mechanism to detect subsequent sidenotemarks} +% \changes{v0.97}{2014/06/05}{New macro to place the superscript mark} +% +% \noindent Put a marker in the horizontal list to detect subsequent sidenotemarks. +% +% \begin{macrocode} +\NewDocumentCommand \@sidenotes@thesidenotemark { m } +{ + \leavevmode + \ifhmode + \edef \@x@sf {\the \spacefactor } + \nobreak + \fi + \hbox {\@textsuperscript {\normalfont #1 }} + \ifhmode + \spacefactor \@x@sf + \fi + \relax +} +% +\NewDocumentCommand \@sidenotes@multisign { } {3sp} +% +\NewDocumentCommand \@sidenotes@multimarker { } +{ + \kern-\@sidenotes@multisign + \kern\@sidenotes@multisign\relax +} +% +\NewDocumentCommand \@sidenotes@multichecker { } +{ + \dim_compare:nNnTF \lastkern = \@sidenotes@multisign + {\@sidenotes@thesidenotemark{,}} + {} +} +% +% \end{macrocode} +% +% \changes{v0.97}{2014/05/27}{introduce an internal macro to place the marginal text} +% +% \noindent Introduce an internal macro to place the marginal text. Use +% margin note in case an offset is given and marginpar otherwise. +% +% \begin{macrocode} +\NewDocumentCommand \@sidenotes@placemarginal { m m } +{ + \IfNoValueOrEmptyTF{#1} + {\marginpar{#2}} + {\marginnote{#2}[#1]} +} +% +% \end{macrocode} +% +% \begin{macro}{\sidenote} +% +% Introduce the \verb+\sidenote+ macro with two optional +% arguments to set the number and the offset. +% +% \changes{v0.53}{2011/10/07}{bugfix, now optional number and offset possible} +% \changes{v0.80}{2011/11/10}{unstar the newcommand.} +% \changes{v0.81}{2011/11/29}{added a comma between subsequent sidenotes} +% \changes{v0.90}{2012/06/02}{add optional offset for sidenote} +% \changes{v0.93}{2012/04/17}{removed mandatory whitespace, new ifnextchar takes care of that} +% \changes{v0.94}{2014/01/11}{use xparse syntax} +% +% \begin{macrocode} +\NewDocumentCommand \sidenote { o o +m } +{ + \sidenotemark[#1] + \sidenotetext[#1][#2]{#3} + \@sidenotes@multimarker +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\sidenotemark} +% +% Sidenotemark is supposed to work similarly to footnotemark. +% +% \changes{v0.94}{2014/01/11}{use xparse syntax, change counter behavior} +% \changes{v0.96}{2014/02/14}{increase the sidenote counter in sidenotetext now} +% +% \begin{macrocode} +\NewDocumentCommand \sidenotemark { o } +{ + \@sidenotes@multichecker + \IfNoValueOrEmptyTF{#1} + {\@sidenotes@thesidenotemark{\thesidenote}} + {\@sidenotes@thesidenotemark{#1}} + \@sidenotes@multimarker +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\sidenotetext} +% +% Sidenotetext is supposed to work similarly to footnotetext. The additional, +% optional argument sets the offset. +% +% \changes{v0.80}{2011/11/10}{unstar the newcommand.} +% \changes{v0.90}{2012/06/02}{add optional offset for sidenotetext} +% \changes{v0.93}{2012/04/17}{add missing comment marks} +% \changes{v0.94}{2014/01/11}{use xparse syntax, change counter behavior} +% +% \begin{macrocode} +\NewDocumentCommand \sidenotetext { o o +m } +{ + \IfNoValueOrEmptyTF{#1} + { + \@sidenotes@placemarginal{#2}{\textsuperscript{\thesidenote}{}~#3} + \refstepcounter{sidenote} + } + {\@sidenotes@placemarginal{#2}{\textsuperscript{#1}~#3}} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\sidecaption} +% +% \changes{v0.91}{2012/06/03}{sidecaption* accompanies sidecaption} +% \changes{v0.94}{2014/01/22}{use xparse syntax} +% +% Sidecaption puts the caption in the margin. It never floats with the other +% text in the margin, since it has to be next to the figure. +% Sidecaption* works similarly to sidecaption, but without an entry. +% +% \begin{macrocode} +\DeclareCaptionStyle{sidecaption}{font=footnotesize} +\NewDocumentCommand \sidecaption {s o o m} +{ + \captionsetup{style=sidecaption} + \IfBooleanTF{#1} + { % starred + \IfNoValueOrEmptyTF{#2} + {\marginnote{\caption*{#4}}} + {\marginnote{\caption*{#4}}[#2]} + } + { % unstarred + \IfNoValueOrEmptyTF{#2} + {\def\@sidenotes@sidecaption@tof{#4}} + {\def\@sidenotes@sidecaption@tof{#2}} + \IfNoValueOrEmptyTF{#3} + {\marginnote{\caption[\@sidenotes@sidecaption@tof]{#4}}} + {\marginnote{\caption[\@sidenotes@sidecaption@tof]{#4}}[#3]} + } +} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{marginfigure} +% +% \changes{v0.3}{2011/09/29}{define the sidefigure enviroment without the environ package} +% \changes{v0.90}{2012/06/02}{the optional offset parameter is back, renamed environment from sidefigure to marginfigure} +% \changes{v0.94}{2014/01/22}{use xparse syntax} +% +% The marginfigure environment is similar to the figure environment. But the +% figure is put in the margin. +% +% \begin{macrocode} +\newsavebox{\@sidenotes@marginfigurebox} +\DeclareCaptionStyle{marginfigure}{font=footnotesize} +\NewDocumentEnvironment{marginfigure} { o } +{ + \begin{lrbox}{\@sidenotes@marginfigurebox} + \begin{minipage}{\marginparwidth} + \captionsetup{type=figure,style=marginfigure} +} +{ + \end{minipage}% + \end{lrbox}% + \@sidenotes@placemarginal{#1}{\usebox{\@sidenotes@marginfigurebox}} +} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{margintable} +% +% \changes{v0.4}{2011/09/30}{define the sidetable enviroment without the environ package} +% \changes{v0.90}{2012/06/02}{the optional offset parameter is back, renamed environment from sidetable to margintable} +% \changes{v0.94}{2014/01/22}{use xparse syntax} +% +% The margintable is similar to the table environment. But the table +% is put in the margin. +% +% \begin{macrocode} +\newsavebox{\@sidenotes@margintablebox} +\DeclareCaptionStyle{margintable}{font=footnotesize} +\NewDocumentEnvironment{margintable} { o } +{ + \begin{lrbox}{\@sidenotes@margintablebox} + \begin{minipage}{\marginparwidth} + \captionsetup{type=table,style=margintable} +} +{ + \end{minipage} + \end{lrbox} + \@sidenotes@placemarginal{#1}{\usebox{\@sidenotes@margintablebox}} +} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{figure*} +% +% \changes{v0.85}{2011/06/01}{added the figure* environment} +% \changes{v0.97}{2014/05/27}{use adjustwidth in figure* environment} +% +% The figure* environment provides a figure environment for figures that +% span across the full page (text plus margin width). +% +% \begin{macrocode} +\AtBeginDocument{% +\newlength{\@sidenotes@extrawidth} +\setlength{\@sidenotes@extrawidth}{\marginparwidth} +\addtolength{\@sidenotes@extrawidth}{\marginparsep}} +% +\NewDocumentEnvironment{autoadjustwidth}{ m m }% +{ + \bool_if:NTF \sidenotes_oneside + { + \begin{adjustwidth}{#1}{#2} + } + { + \begin{adjustwidth*}{#1}{#2} + } +} +{ + \bool_if:NTF \sidenotes_oneside + { + \end{adjustwidth} + } + { + \end{adjustwidth*} + } +} +% +\DeclareCaptionStyle{widefigure}{font=footnotesize} +\RenewDocumentEnvironment{figure*}{ O{htbp} } +{ + \begin{figure}[#1] + \begin{autoadjustwidth}{}{-\@sidenotes@extrawidth} + \captionsetup{style=widefigure} +} +{ + \end{autoadjustwidth} + \end{figure} +} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{table*} +% +% \changes{v0.85}{2011/06/01}{added the table* environment} +% \changes{v0.97}{2014/05/27}{use adjustwidth in table* environment} +% +% The table* environment provides a table environment for figures across +% text and margin width. +% +% \begin{macrocode} +\DeclareCaptionStyle{widetable}{font=footnotesize} +\RenewDocumentEnvironment{table*}{ O{htbp} } +{ + \begin{table}[#1] + \begin{autoadjustwidth}{}{-\@sidenotes@extrawidth} + \captionsetup{style=widetable} +} +{ + \end{autoadjustwidth} + \end{table} +} +\ExplSyntaxOff +% \end{macrocode} +% \end{environment} +% \Finale +\endinput |