From 9b219d1b664067729034647a4b37626cf2bf5e26 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 26 Dec 2013 23:18:36 +0000 Subject: koma-script (26dec13) git-svn-id: svn://tug.org/texlive/trunk@32489 c570f23f-e606-0410-a88d-b1316a301751 --- .../latex/koma-script/scrlayer-notecolumn.dtx | 1927 ++++++++++++++++++++ 1 file changed, 1927 insertions(+) create mode 100644 Master/texmf-dist/source/latex/koma-script/scrlayer-notecolumn.dtx (limited to 'Master/texmf-dist/source/latex/koma-script/scrlayer-notecolumn.dtx') diff --git a/Master/texmf-dist/source/latex/koma-script/scrlayer-notecolumn.dtx b/Master/texmf-dist/source/latex/koma-script/scrlayer-notecolumn.dtx new file mode 100644 index 00000000000..5c3434b8787 --- /dev/null +++ b/Master/texmf-dist/source/latex/koma-script/scrlayer-notecolumn.dtx @@ -0,0 +1,1927 @@ +% \CheckSum{1577} +% \iffalse^^A meta-comment +% ====================================================================== +% scrlayer-notecolumn.dtx +% Copyright (c) Markus Kohm, 2013 +% +% This file is part of the LaTeX2e KOMA-Script bundle. +% +% 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 and of this work. +% +% This work has the LPPL maintenance status "author-maintained". +% +% The Current Maintainer and author of this work is Markus Kohm. +% +% This work consists of all files listed in manifest.txt. +% ---------------------------------------------------------------------- +% scrlayer-notecolumn.dtx +% Copyright (c) Markus Kohm, 2013 +% +% Diese Datei ist Teil der LaTeX2e KOMA-Script-Sammlung. +% +% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz, +% Version 1.3c. +% Die neuste Version dieser Lizenz ist +% http://www.latex-project.org/lppl.txt +% und Version 1.3c ist Teil aller Verteilungen von LaTeX +% Version 2005/12/01 und dieses Werks. +% +% Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained" +% (allein durch den Autor verwaltet). +% +% Der Aktuelle Verwalter und Autor dieses Werkes ist Markus Kohm. +% +% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien. +% ====================================================================== +% \fi^^A meta-comment +% +% \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 \~} +% +% \iffalse^^A meta-comment +%%%% From File: $Id: scrlayer-notecolumn.dtx 1514 2013-11-15 08:23:09Z mjk $ (identify) +%%%% From File: $Id: scrlayer-notecolumn.dtx 1514 2013-11-15 08:23:09Z mjk $ (init) +%%%% From File: $Id: scrlayer-notecolumn.dtx 1514 2013-11-15 08:23:09Z mjk $ (options) +%%%% From File: $Id: scrlayer-notecolumn.dtx 1514 2013-11-15 08:23:09Z mjk $ (body) +%<*dtx> +\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi +\begingroup + \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#4/#3/#2}} + \filedate$Date: 2013-11-15 09:23:09 +0100 (Fr, 15. Nov 2013) $ + \def\filerevision$#1: #2 ${\gdef\filerevision{v0.1.#2}} + \filerevision$Revision: 1514 $ +\endgroup +\ProvidesFile{scrlayer-notecolumn.dtx}[\filedate\space\filerevision\space +% +%<*identify|doc> +%\NeedsTeXFormat{LaTeX2e}[1995/12/01] +%\ProvidesPackage{scrlayer-notecolumn}[% +%\ProvidesFile{scrlayer-notecolumn.tex}[% +% Sometimes following will be replaced by !KOMASCRIPTVERSION: +%!SCRLAYERVERSION +% package +% +%<*dtx|identify|doc> + (end user interface for scrlayer)] +% +%<*dtx> +\ifx\documentclass\undefined + \input scrdocstrip.tex + \@@input scrkernel-version.dtx + \@@input scrstrip.inc +% Some time we will need: +% \KOMAdefVariable{COPYRIGHTFROM}{2013} + \KOMAdefVariable{SCRLAYERVERSION}{\space\space\filedate\space\filerevision}% + \expandafter\let\csname ifbetawas\expandafter\endcsname + \csname ifbeta\endcsname + \expandafter\let\csname ifbeta\expandafter\endcsname + \csname iftrue\endcsname + \generate{\usepreamble\defaultpreamble + \file{scrlayer-notecolumn.sty}{% + \from{scrlayer-notecolumn.dtx}{interface,trace,notecolumn,identify}% + \from{scrlayer.dtx}{interface,trace,notecolumn,init}% + \from{scrlayer-notecolumn.dtx}{interface,trace,notecolumn,init}% + \from{scrlayer.dtx}{interface,trace,notecolumn,options}% + \from{scrlayer-notecolumn.dtx}{interface,trace,notecolumn,options}% + \from{scrlayer.dtx}{interface,trace,notecolumn,body}% + \from{scrlayer-notecolumn.dtx}{interface,trace,notecolumn,body}% + \from{scrlayer-notecolumn.dtx}{interface,trace,notecolumn,final}% + \from{scrlogo.dtx}{logo}% + }% + \file{scrlayer-notecolumn.tex}{% + \from{scrlayer-notecolumn.dtx}{doc}% + }% + } + \expandafter\let\csname ifbeta\expandafter\endcsname + \csname ifbetawas\endcsname + \@@input scrstrop.inc +\else + \let\endbatchfile\relax +\fi +\endbatchfile +% +%<*driver> + \documentclass{scrdoc} + \addtolength{\textwidth}{-1em} + \addtolength{\marginparwidth}{2em} + \addtolength{\oddsidemargin}{2em} + \usepackage[ngerman,english]{babel} + \usepackage{url,babelbib}\bibliographystyle{babalpha-fl} + \usepackage{listings} + \usepackage{scrhack} + \usepackage{etoolbox} + \pretocmd\DescribeMacro{\ifhmode\else\bigskip\noindent\fi}{}{} + \pretocmd\DescribeEnv{\ifhmode\else\bigskip\noindent\fi}{}{} + \pretocmd\DescribeOption{\ifhmode\else\bigskip\noindent\fi}{}{} + + \CodelineIndex + \RecordChanges + \GetFileInfo{scrlayer-notecolumn.dtx} + \title{The \texttt{scrlayer} interface \texttt{scrlayer-notecolumn}% + \footnote{This is version \fileversion\ of file \texttt{\filename}.}} + \date{\filedate} + \author{Markus Kohm} + + \newenvironment{Explain}{\par}{\par} + \newcommand*{\length}{} + \let\length\Length + \let\endlength\endLength + \let\Macro\cs + \let\Length\Macro + \let\Package\textsf + \let\Class\Package + \let\File\texttt + \let\Option\texttt + \newcommand*{\KOption}[1]{\Option{#1}\texttt{=}} + \newcommand*{\OptionValue}[2]{\Option{#1}\texttt{=}\PValue{#2}} + \let\Counter\texttt + \let\Environment\texttt + \let\ShowOutput\quote + \let\endShowOutput\endquote + \let\Pagestyle\texttt + \newcommand*{\Parameter}[1]{\texttt{\marg{#1}}\linebreak[1]} + \newcommand*{\OParameter}[1]{\texttt{\oarg{#1}}\linebreak[1]} + \newcommand*{\MParameter}[2]{\texttt{(\meta{#1},\meta{#2})}\linebreak[1]} + \providecommand\PParameter[1]{\mbox{\texttt{\{#1\}}}\linebreak[1]} + \let\PName\meta + \let\PValue\texttt + \providecommand*{\autoref}[1]{\expandafter\AUTOREF#1:} + \providecommand*{\AUTOREF}{} + \makeatletter + \def\AUTOREF#1:#2:{% + \edef\@tempa{#1}% + \edef\@tempb{tab}\ifx\@tempa\@tempb table~\fi + \edef\@tempb{sec}\ifx\@tempa\@tempb section~\fi + \ref{#1:#2}% + } + \providecommand*{\IndexCmd}[2][]{} + \providecommand*{\textnote}[2][]{} + \providecommand*\eTeX{\leavevmode\hbox{$\varepsilon$}-\TeX} + \providecommand*\NTS{% + \leavevmode\hbox{$\cal N\kern-0.35em\lower0.5ex\hbox{$\cal T$}% + \kern-0.2emS$}} + + \lstnewenvironment{lstcode}{\lstset{language=[LaTeX]TeX}}{} + \makeatother + \sloppy% YOU SHOULD NOT DO THIS!!! + + \begin{document} + \maketitle + \tableofcontents + \DocInput{\filename} + \PrintChanges + \PrintIndex + \end{document} +% +% \fi^^A meta-comment +% +% \selectlanguage{english} +% +% \changes{v0.0}{2013/04/26}{start of interface} +% \let\restorechapter\chapter +% \let\chapter\section +% \let\section\subsection +% \let\subsection\subsubsection +% \iffalse +%<*dtx|doc> +% \fi + +\chapter[{End User Interface \Package{scrlayer-notecolumn}}]{End User + Interface \Package{scrlayer-notecolumn}\footnote{This is not a translation + of the corresponding chapter of the German \KOMAScript{} manual but the + tentative and primary implementation manual of package + \Package{scrlayer-notecolumn}. As long as \Package{scrlayer-notecolumn} is + primary a proof of concept this doesn't matter. But nevertheless, a + German to English translator would still be welcome.}} +\label{sec:scrlayer.notecolumn} +%\iffalse +\labelbase{scrlayer-notecolumn} +%\fi + +Sometimes documents need an additional notes column beside the main text +column and maybe beside the marginal note column. Problematicly may be +having page breaks inside the notes column. This package provides a +solution based on the layer interface of \Package{scrlayer}. You may +define several notes columns, each of them with page breaks +inside. It supports automatic page break inside of notes and recognises +note collisions and solve them by moving notes. + +The idea of this package raised while an e-mail contact with Heiner +Richter from FH~Stralsund, who told me of a book project, and asked +whether or not such a functionality may be added to another package of +mine easily. It couldn't, but design and implementation of a first test +alpha of \Package{scrlayer-notecolumn} has been done in about three +hours. So maybe it was a really good idea to ask me the question. + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\DeclareNoteColumn} +% \DescribeMacro{\DeclareNewNoteColumn} +% \DescribeMacro{\ProvideNoteColumn} +% \DescribeMacro{\RedeclareNoteColumn} +% The command + \Macro{DeclareNoteColumn}% + \OParameter{option list}\Parameter{note column name}% +%\iffalse^^A meta-comment + \\ + \Macro{DeclareNewNoteColumn}% + \OParameter{option list}\Parameter{note column name}\\%^^A + \Macro{ProvideNoteColumn}% + \OParameter{option list}\Parameter{note column name}\\%^^A + \Macro{RedeclareNoteColumn}% + \OParameter{option list}\Parameter{note column name}% +\end{Declaration} +\BeginIndex{Cmd}{DeclareNoteColumn}% +\BeginIndex{Cmd}{DeclareNewNoteColumn}% +\BeginIndex{Cmd}{ProvideNoteColumn}% +\BeginIndex{Cmd}{RedeclareNoteColumn}% +Command \Macro{DeclareNoteColumn} +%\fi^^A meta-comment +may be used to declare a note column. Each note column is referenced by its +name, defined by the obligatory argument \PName{note column name}. A note +column vertically span the text area. + +By default its horizontal position is the current position of the marginal +note column. It also regards \Macro{reversemarginpar} and +\Macro{normalmarginpar}, while output of a note. Note that this is not the +same like making a margin note. The default width is +\Length{marginparwidth}. But you may use the optional argument \PName{option + list} to change this behaviour. + +The \PName{option list} is a comma-separated list of +\texttt{\PName{key}=\PName{value}} options. Currently the following +\PName{key}s are supported: +\begin{labeling}[\ --]{\KOption{position}\PName{horizontal offset}} +\item [\KOption{font}\PName{font declaration}] set the initial font attributes + to be used for the note column. Everything, that is allowed to be set by + \Macro{setkomafont} or \Macro{addtokomafont} can be used as + \PName{font declaration}. Note, that + \Macro{normalfont}\Macro{normalsize} will be used + before. So you don't need one of them at your own initialisation. +\item [\Option{marginpar}] set up \Option{position} and \Option{width} to use + the marginal note column of \Macro{marginpar}. +\item [\Option{normalmarginpar}] set up \Option{position} and \Option{width} + to use the normal marginal note column and ignore \Macro{reversemarginpar} + and \Macro{normalmarginpar}. +\item [\KOption{position}\PName{horizontal offset}] set up the horizontal + offset of the note column from the left edge of the paper. The + \PName{horizontal offset} can be either a \LaTeX{} length, a \TeX{} + dimension, a \TeX{} skip, a length value, or a dimensional expression using + \texttt{+}, \texttt{-}, \texttt{*}, \texttt{/} and parenthesis (see + \cite[section~3.5]{manual:eTeX} for more information about dimensional + expressions). The value will be calculated at usage time not at definition + time. So you may even use more complex constructs like: +\begin{lstcode} + \ifodd\value{page} + \oddsidemargin+1in + +\textwidth+\marginparsep + \else + \evensidemargin+1in + -\marginparsep + -\marginparwidth + \fi +\end{lstcode} +\item [\Option{reversemarginpar}] set up \Option{position} and \Option{width} + to use the reverse marginal note column and ignore \Macro{reversemarginpar} + and \Macro{normalmarginpar}. +\item [\KOption{width}\PName{size}] set up the horizontal size of the note + column. You can use the same values for \PName{size} like for + \PName{horizontal offset} of option \Option{position}. +\end{labeling} + +You may use as much note columns as \LaTeX{} provides free box registers, +because every note column needs one box register. You may use package +\Package{etex} to increase the normal amount of box registers from 256 to +32768. This should be enough to avoid the ``\texttt{no room for + \Macro{newbox}}'' error. + +The implementation of note columns uses foreground layers from package +\Package{scrlayer}. Every \Macro{DeclareNoteColumn} generates a layer and adds +this layer to the pseudo page style \Pagestyle{@everystyle@}. Theoretically +you may modify the generated layer, but it is recommended not to modify them. + +Overlapping of different note columns is allowed. There's one predefined note +column named ``\texttt{marginpar}''. + +% \iffalse^^A meta-comment +\BeginIndex{FontElement}{notecolumn.\PName{note column name}}% +% \fi^^A meta-comment +Note, that if you change the initial font using +\begin{quote} + \Macro{setkomafont}\linebreak[1]\PParameter{marginnote.\PName{note column + name}}\Parameter{font declaration} +\end{quote} +or +\begin{quote} + \Macro{addtokomafont}\linebreak[1]\PParameter{marginnote.\PName{note column + name}}\Parameter{font declaration} +\end{quote} +the font of all succeeding note column outputs would change. This could make it +hard to find out, which notes will be affected by the change. +% \iffalse^^A meta-comment +See \autoref{sec:maincls.textmarkup}, +\autopageref{desc:maincls.cmd.setkomafont} for more information about +\Macro{setkomafont} and \Macro{addtokomafont}.% +\EndIndex{FontElement}{notecolumn.\PName{note column name}}% +% \fi^^A meta-comment + +The difference between \Macro{DeclareNoteColumn} and the other commands is, +that \Macro{DeclareNoteColumn} defines the note column independent whether a +note column with the same name has already been defined or +not. \Macro{DeclareNewNoteColumn} defined only note columns which names are +not yet used for another note column. It's an error to use it with an already +used \PName{note column name}. \Macro{ProvideNoteColumn} is like +\Macro{DeclareNewNoteColumn}, but if the \PName{note column name} is already +used for a note column nothing happens. \Macro{RedeclareNoteColumn} may be +used to declare a note column with a name, that is already used. Using it with +a new name is an error. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{RedeclareNoteColumn}%^^A +\EndIndex{Cmd}{ProvideNoteColumn}%^^A +\EndIndex{Cmd}{DeclareNewNoteColumn}%^^A +\EndIndex{Cmd}{DeclareNoteColumn}%^^A +%\fi^^A meta-comment + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\makenote} +% The command + \Macro{makenote}% + \OParameter{note column name}\Parameter{note text} +%\iffalse^^A meta-comment +\end{Declaration} +\BeginIndex{Cmd}{makenote}% +This command +%\fi^^A meta-comment +may be used to make a new note. The note will be written to a helper file with +extension \File{.slnc} in this run. In the next run, it will be +typeset. Normally it will be typeset with the same vertical position, that +would be used for a \Macro{parbox[t]}, but horizontally moved to the note +column. Collisions at this position of this note column (but not of other note +columns) will be recognised. In such a case the note may be moved down and +even to another page. Automatic page breaks at the note columns are +supported. This is something different to \Macro{marginpar}, +\Macro{marginline} (\KOMAScript{} classes), or \Macro{marginnote} (package +\Package{marginnote}). + +Note, that after changing the document, at least two \LaTeX{} runs are needed +to move the note to its final position. + +Note, that fragile commands should be protected to avoid error messages while +writing or reading the helper file. + +Note, that \Package{scrlayer-notecolumn} needs only one helper file for all +note columns together. You should not edit or change that helper file, because +the syntax is fragile. It won't be read using \Macro{input} but +\Macro{read}. Because of this, line breaks, empty lines and \Macro{par} should +be avoided. + +Currently it is unknown where you may use \Macro{makenote} and where not. But +you must not use \Macro{makenote} inside of \Macro{makenote}! + +The default for the optional argument \PName{makenote} is \PValue{marginpar}, +that is the \PName{note column name} of the pre-defined note column. +%\iffalse^^A meta-comment +\EndIndex{Cmd}{makenote} +%\fi^^A meta-comment + +%\iffalse^^A meta-comment +\begin{Declaration} + \KOption{autoclearnotecolumns}\PName{simple switch}\\ +%\fi^^A meta-comment +% \DescribeMacro{\clearnotecolumn} +% The commands + \Macro{clearnotecolumn}\OParameter{name of a note column}% +% \iffalse^^A meta-comment + \\ +% \fi^^A meta-comment +% and + \Macro{clearnotecolumns}\OParameter{list of note column names} +%\iffalse^^A meta-comment +\end{Declaration} +\BeginIndex{Cmd}{clearnotcolumn}% +\BeginIndex{Cmd}{clearnotcolumns}% +The commands +%\fi^^A meta-comment +may be used to output all hanging notes for either one or several note +columns. With \Macro{clearnotecolumn} only the notes of the note column with +the given \PName{name of a note column} will be output. If you omit the +optional argument (this is not the same like using an empty value!) note +column \PValue{marginnote} will be used. + +With \Macro{clearnotecolumns} the notes of all note columns of the comma +separated \PName{list of note column names} will be output. If you omit the +optional Argument or if the optional Argument is empty (or start with +\Macro{relax}) the notes of all note columns will be output. + +Macro \Macro{clearpage} will be used to output hanging notes and several +\LaTeX{} runs may be needed to terminate with the correct number of +\Macro{clearpage} for the whole document. You will get the message ``\LaTeX{} +Warning: Label(s) may have changed. Rerun to get cross-references right.'' as +long as the process hasn't been terminated. + +But normally you don't need to us \Macro{clearnotecolum} or +\Macro{clearnotecolumns} yourself. Because by default option +\Option{autoclearnotecolumns} is switched on, which means, that +\Macro{clearnotecolumns} will be done at every \Macro{clearpage}. You may +change this, switching off \Macro{autoclearnotecolumns} using one of the +values for simple switches. + +Note, that it is not allowed to use \Macro{clearnotecolumn} or +\Macro{clearnotecolumns} inside a note. You can use these commands only inside +the main text of the document.% +%\iffalse^^A meta-comment +\EndIndex{Cmd}{clearnotcolumns}% +\EndIndex{Cmd}{clearnotcolumn}% +%\fi^^A meta-comment + +%\iffalse^^A meta-comment +\begin{Declaration} +%\fi^^A meta-comment +% \DescribeMacro{\syncwithnotecolumn} +% The commands + \Macro{syncwithnotecolumn}\OParameter{name of a note column}% +% \iffalse^^A meta-comment + \\ +% \fi^^A meta-comment +% and + \Macro{syncwithnotecolumns}\OParameter{list of note column names}% +%\iffalse^^A meta-comment +\end{Declaration} +\BeginIndex{Cmd}{syncwithnotecolumn}% +\BeginIndex{Cmd}{syncwithnotecolumns}% +These commands +%\fi^^A meta-comment +may be used to synchronise the vertical position of the main text with one or +several note columns. If you use the optional argument of +\Macro{syncwithnotecolumn} it should be one \PName{name of a note column}. If +you omit it, \PValue{marginpar} will be used as the \PName{name of a note + column}. Usage of \Macro{syncwithnotecolumn} is exactly the same like usage +of \Macro{syncwithnotecolumns} with exactly one \PName{name of a note column}. + +The optional argument of \Macro{syncwithnotecolumns} is a comma-separated list +of names of note columns. If you omit this optional argument or if you use an +empty argument or if the argument starts with \Macro{relax} synchronisation +will be done with all declared note columns. + +Synchronisation with a note column means, that the current position of the +main text will be changed to be the current vertical position of the note +column after cleaning the note column. This differs in several point from +cleaning a note column: +\begin{itemize} +\item After cleaning a note column the text position would change to be at a + new page, even if the note column doesn't fill the whole page + before. Synchronisation will change the vertical position just after the + last vertical position of the note column. +\item Cleaning a note column needs less \LaTeX{} runs than synchronising a + note column. +\end{itemize} +Both, cleaning an synchronising a note column, uses the label mechanism of +\LaTeX{} without using \Macro{label}, \Macro{ref}, or \Macro{pageref} itself +(but \Macro{newlabel}). So you should have a look at \LaTeX{} rerun messages, +because of undefined or changed labels. + +Note, that it is not allowed to use \Macro{syncwithnotecolumn} or +\Macro{syncwithnotecolumns} inside a note. If you do so, you need endless +\LaTeX{} runs without reaching a final state. But synchronisation of several +note columns in the main text of a document will also synchronise the notes +columns with each others.% +%\iffalse^^A meta-comment +\EndIndex{Cmd}{syncwithnotecolumns} +\EndIndex{Cmd}{syncwithnotecolumn} +%\fi^^A meta-comment + + +%\iffalse +% +%\fi +% +% \StopEventually{} +% +% \chapter{Implementation of \Package{scrlayer-notecolumn}} +% +% This section if for developers only. +% +% \iffalse +%<*interface> +%<*identify> +% \fi +% +%\iffalse +% +%\fi +% +% +% \section{Initialising some Values before the Options} +% +% \iffalse^^A meta-comment +%<*init> +% \fi^^A meta-comment +% +% Initialisation before all options (even the options from +% \File{scrlayer.dtx}). +% +% Here we test the used pdf\TeX{} primitives. +% \begin{macrocode} +\@tempswatrue +\scr@ifundefinedorrelax{pdfsavepos}{% + \expandafter\@tempswafalse +}{% + \scr@ifundefinedorrelax{pdflastypos}{% + \expandafter\@tempswafalse + }{}% +} +\if@tempswa\else + \PackageError{scrlayer-notecolumn}{missing pdfTeX features}{% + This package needs \string\pdfsavepos\space and + \string\pdflastypos.\MessageBreak + This error is fatal, because usage of the package without these + features\MessageBreak + cannot work!\MessageBreak + You shouldn't continue, but if you'd try, I'll try to abort the LaTeX run + }% + \batchmode\csname @@end\endcsname\end +\fi +% \end{macrocode} +% +% \iffalse^^A meta-comment +% +% \fi^^A meta-comment +% +% \section{Making a Note Column} +% +% The package supports a various number of note columns. Each is referenced by +% a unique name. +% +% \begin{macro}{\DeclareNoteColumn} +% \begin{description} +% \item[\OParameter{option list}:] a comma-separated list of +% \texttt{\meta{key}=\meta{value}} pairs. +% \item[\Parameter{string}:] the name of the note column (must be fully +% expandable and expand to a string only). +% \end{description} +% That's the primary command for note columns. It defines everything, the note +% column needs. +% \begin{macrocode} +%<*body> +\scrlayerAddToInterface\DeclareNoteColumn{% + \newcommand*{\DeclareNoteColumn}[2][]{% +% \end{macrocode} +% First of all we need a box register. The contents of the note column will be +% build inside of this register. Since \eTeX{} registers shouldn't be a +% problem. User should use package \Package{etex}, if he or she runs out of +% registers. Note, that the registers will stay allocated, if the interface +% will be removed! Nevertheless, the name will be destroyed! +% \begin{macrocode} + \@ifundefined{slnc@#2@box}{% + \expandafter\newsavebox\csname slnc@#2@box\endcsname + \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{% + \expandafter\let\csname slnc@#2@box\endcsname\relax + }% + }{}% +% \end{macrocode} +% There's also a kind of item stack of unprocessed notes for each note column. +% \begin{macrocode} + \@ifundefined{slnc@#2@unprocessed}{% + \@namedef{slnc@#2@unprocessed}{}% + \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{% + \expandafter\let\csname slnc@#2@unprocessed\endcsname\relax + }% + }{}% +% \end{macrocode} +% Next we need a horizontal positions and a width for the note column. Neither +% the horizontal position nor the width are stretchable or shrinkable. The +% position should be variable depending on the page. So it's better to use a +% macro instead of a length. The width isn't more variable than, e.g., the +% text width. So we can use a macro too. Both will be initialised to the +% normal marginal note column. +% \begin{macrocode} + \@ifundefined{slnc@#2@pos}{% + \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{% + \expandafter\let\csname slnc@#2@pos\endcsname\relax + }% + }{}% + \@ifundefined{slnc@#2@width}{% + \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{% + \expandafter\let\csname slnc@#2@width\endcsname\relax + }% + }{}% +% \end{macrocode} +% If there isn't a font element for the (new) note column, we define a new one +% and add it to the auto-remove code: +% \begin{macrocode} + \@ifundefined{scr@fnt@notecolumn.#2}{% + \@ifundefined{@notecolumn.#2font}{% + \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{% + \expandafter\let\csname @notecolumn.#2font\endcsname\relax + }% + }{% + \PackageInfo{scrlayer-notecolumn}{using already defined + macro\MessageBreak + `\expandafter\string\csname @notecolumn.#2font\endcsname' for font + element\MessageBreak + `notecolumn.#2'% + }% + }% + \newkomafont{notecolumn.#2}{}% + \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{% + \expandafter\let\csname scr@fnt@notecolumn.#2\endcsname\relax + }% + }{% + \PackageInfo{scrlayer-notecolumn}{using already defined font + element\MessageBreak + `notecolumn.#2'% + }% + }% +% \end{macrocode} +% After the initialisation we process the options, that may change the initial +% values. +% \begin{macrocode} + \newcommand*{\slnc@name}{}% + \edef\slnc@name{#2}% + \FamilyExecuteOptions[.definenotecolumn]{KOMAarg}{marginpar,#1}% + \let\slnc@name\relax +% \end{macrocode} +% The values are set up, so they may be used to declare a layer. +% \begin{macrocode} + \DeclareLayer[% + foreground,% + align=tl,% + voffset=1in+\topmargin+\headheight+\headsep,% + height=\dimexpr\textheight+\topskip\relax,% + hoffset=\csname slnc@#2@pos\endcsname,% + width=\csname slnc@#2@width\endcsname,% + contents=\slnc@processnotes{#2}% + ]{notecolumn.#2} +% \end{macrocode} +% We need to add the layer to every page style. The easiest way to do this is +% to add it to the pseudo layer page style \Pagestyle{@everystyle@}. +% \begin{macrocode} + \AddLayersToPageStyle{@everystyle@}{notecolumn.#2}% +% \end{macrocode} +% On auto-removing the interface, the layer should be removed from +% \Pagestyle{@everystyle@} and should be destroyed. +% \begin{macrocode} + \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{% + \RemoveLayersFromPageStyle{@everystyle@}{notecolumn.#2}% + \DestroyLayer{notecolumn.#2}% + }% +% \end{macrocode} +% Last but not least, we add the new note column to the note column procession +% list. +% \begin{macrocode} + \@cons\slnc@processnotecolumns{{#2}}% + }% +} +% \end{macrocode} +% \begin{macro}{\slnc@processnotecolumns} +% This is a list of all declared note columns in \LaTeX{} syntax (using +% \Macro{@cons} and \Macro{@elt} etc.). +% \begin{macrocode} +\scrlayerAddToInterface\slnc@processnotecolumns{% + \newcommand*{\slnc@processnotecolumns}{}% +} +% \end{macrocode} +% \end{macro}^^A \slnc@processnotecolumns +% \begin{macrocode} +% +% \end{macrocode} +% One note column will be declared by default: +% \begin{macrocode} +%<*final> +\DeclareNoteColumn{marginpar} +% +%<*body> +% \end{macrocode} +% \begin{macro}{\slnc@testforpagestylewarning} +% Not all page styles are layer page styles, but only layer page styles can be +% extended by the note column layers. So we warn, if another page style has +% been selected. +% \begin{macrocode} +\scrlayerAddToInterface\slnc@testforpagestylewarning{% + \newcommand*{\slnc@testforpagestylewarning}{% + \IfLayerPageStyleExists{\currentpagestyle}{}{% + \PackageWarning{scrlayer-notecolumn}{% + output of note columns delayed,\MessageBreak + because with `\currentpagestyle'\MessageBreak + a page style has been selected, that\MessageBreak + isn't a layer page style,% + }% + }% + }% +} +\AfterSelectAnyPageStyle{\slnc@testforpagestylewarning} +% \end{macrocode} +% \end{macro}%^^A \slnc@testforpagestylewarning +% \begin{option}{position} +% \begin{option}{width} +% \begin{option}{font} +% \begin{option}{marginpar} +% \begin{option}{normalmarginpar} +% \begin{option}{reversemarginpar} +% Last but not least we have to define the options for the \PName{option +% list}. +% \begin{macrocode} +\DefineFamilyMember[.definenotecolumn]{KOMAarg} +\DefineFamilyKey[.definenotecolumn]{KOMAarg}{position}{% + \@namedef{slnc@\slnc@name @pos}{\dimexpr #1\relax}% + \FamilyKeyStateProcessed +} +\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@position} +\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@position@default} +\DefineFamilyKey[.definenotecolumn]{KOMAarg}{width}{% + \@namedef{slnc@\slnc@name @width}{\dimexpr #1\relax}% + \FamilyKeyStateProcessed +} +\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@width} +\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@width@default} +\DefineFamilyKey[.definenotecolumn]{KOMAarg}{font}{% + \setkomafont{notecolumn.\slnc@name}{#1}% + \FamilyKeyStateProcessed +} +\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@font} +\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@font@default} +\DefineFamilyKey[.definenotecolumn]{KOMAarg}{marginpar}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{marginpar}{#1}% + \edef\reserved@a{\noexpand\slnc@defpos{\slnc@name}}\reserved@a + \@namedef{slnc@\slnc@name @width}{\marginparwidth}% +} +\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@marginpar} +\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@marginpar@default} +% \end{macrocode} +% \begin{macro}{\slnc@defpos} +% Little helper for option \Option{marginpar}. The argument is the expanded +% name of the note column. +% \begin{macrocode} +\scrlayerAddToInterface\slnc@defpos{% + \newcommand*\slnc@defpos[1]{% + \@namedef{slnc@#1@pos}{% + \ifodd\value{page} + \if@reversemargin +% \end{macrocode} +% The reverse marginal note column on odd pages is at the left margin. +% \begin{macrocode} + \dimexpr \oddsidemargin+1in + -\marginparsep-\csname slnc@#1@width\endcsname\relax + \else +% \end{macrocode} +% The normal marginal note column on odd pages is the right margin. +% \begin{macrocode} + \dimexpr \oddsidemargin+1in + +\textwidth+\marginparsep\relax + \fi + \else + \if@twoside + \if@reversemargin +% \end{macrocode} +% The reverse marginal note column on even pages is the right margin. +% \begin{macrocode} + \dimexpr \evensidemargin+1in + +\textwidth+\marginparsep\relax + \else +% \end{macrocode} +% The normal marginal note column on even pages is at the left margin. +% \begin{macrocode} + \dimexpr \evensidemargin+1in + -\marginparsep-\csname slnc@#1@width\endcsname\relax + \fi + \else +% \end{macrocode} +% \begin{macrocode} +% If not in two-side mode, do the same already done for odd pages. + \if@reversemargin + \dimexpr \oddsidemargin+1in + -\marginparsep-\csname slnc@#1@width\endcsname\relax + \else + \dimexpr \oddsidemargin+1in + +\textwidth+\marginparsep\relax + \fi + \fi + \fi + }% + }% +}% +% \end{macrocode} +% \end{macro}%^^A \slnc@defpos +% \begin{macrocode} +\DefineFamilyKey[.definenotecolumn]{KOMAarg}{normalmarginpar}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{normalmarginpar}{#1}% + \edef\reserved@a{\noexpand\slnc@defnormalpos{\slnc@name}}\reserved@a + \@namedef{slnc@\slnc@name @width}{\marginparwidth}% +} +\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@normalmarginpar} +\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@normalmarginpar@default} +% \end{macrocode} +% \begin{macro}{\slnc@defnormalpos} +% Little helper for option \Option{normalmarginpar}. The argument is the +% expanded name of the note column. +% \begin{macrocode} +\scrlayerAddToInterface\slnc@defnormalpos{% + \newcommand*\slnc@defnormalpos[1]{% + \@namedef{slnc@#1@pos}{% + \ifodd\value{page} +% \end{macrocode} +% The normal marginal note column on odd pages is the right margin. +% \begin{macrocode} + \dimexpr \oddsidemargin+1in + +\textwidth+\marginparsep\relax + \else + \if@twoside +% \end{macrocode} +% The normal marginal note column on even pages is at the left margin. +% \begin{macrocode} + \dimexpr \evensidemargin+1in + -\marginparsep-\csname slnc@#1@width\endcsname\relax + \else +% \end{macrocode} +% \begin{macrocode} +% If not in two-side mode, do the same already done for odd pages. + \dimexpr \oddsidemargin+1in + +\textwidth+\marginparsep\relax + \fi + \fi + }% + }% +}% +% \end{macrocode} +% \end{macro}%^^A \slnc@defnormalpos +% \begin{macrocode} +\DefineFamilyKey[.definenotecolumn]{KOMAarg}{reversemarginpar}[\relax]{% + \FamilyKeyStateProcessed + \scrlayer@testunexpectedarg{reversemarginpar}{#1}% + \edef\reserved@a{\noexpand\slnc@defreversepos{\slnc@name}}\reserved@a + \@namedef{slnc@\slnc@name @width}{\marginparwidth}% +} +\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@reversemarginpar} +\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@reversemarginpar@default} +% \end{macrocode} +% \begin{macro}{\slnc@defreversepos} +% Little helper for option \Option{reversemarginpar}. The argument is the +% expanded name of the note column. +% \begin{macrocode} +\scrlayerAddToInterface\slnc@defreversepos{% + \newcommand*\slnc@defreversepos[1]{% + \@namedef{slnc@#1@pos}{% + \ifodd\value{page} +% \end{macrocode} +% The reverse marginal note column on odd pages is at the left margin. +% \begin{macrocode} + \dimexpr \oddsidemargin+1in + -\marginparsep-\csname slnc@#1@width\endcsname\relax + \else + \if@twoside +% \end{macrocode} +% The reverse marginal note column on even pages is the right margin. +% \begin{macrocode} + \dimexpr \evensidemargin+1in + +\textwidth+\marginparsep\relax + \else +% \end{macrocode} +% \begin{macrocode} +% If not in two-side mode, do the same already done for odd pages. + \dimexpr \oddsidemargin+1in + -\marginparsep-\csname slnc@#1@width\endcsname\relax + \fi + \fi + }% + }% +}% +% \end{macrocode} +% \end{macro}%^^A \slnc@defreversepos +% \begin{macrocode} +% +% \end{macrocode} +% \end{option}%^^A reversemarginpar +% \end{option}%^^A normalmarginpar +% \end{option}%^^A marginpar +% \end{option}%^^A font +% \end{option}%^^A width +% \end{option}%^^A position +% \end{macro}%^^A \DeclareNoteColumn +% +% \begin{macro}{\DeclareNewNoteColumn} +% \begin{macro}{\ProvideNoteColumn} +% \begin{macro}{\RedeclareNoteColumn} +% Like \Macro{DeclareNoteColumn} but with restrictions, if the note column has +% (not) been declared already. +% \begin{macrocode} +%<*body> +\scrlayerAddToInterface\DeclareNewNoteColumn{% + \newcommand*{\DeclareNewNoteColumn}[2][]{% + \scr@ifundefinedorrelax{slnc@#2@box}{}{% + \PackageError{scrlayer-notecolumn}{note column `#2' already defined}{% + You may declare only note columns, that haven't been declared + previously using\MessageBreak + \string\DeclareNewNoteColumn. See also the alternatives + \string\RedeclareNoteColumn,\MessageBreak + \string\ProvideNoteColumn, and \string\DeclareNoteColumn.\MessageBreak + Nevertheless, if you'll continue, declaration will be done.% + }% + }% + \DeclareNoteColumn[{#1}]{#2}% + }% +} +\scrlayerAddToInterface\ProvideNoteColumn{% + \newcommand*{\ProvideNoteColumn}[2][]{% + \scr@ifundefinedorrelax{slnc@#2@box}{}{% + \PackageInfo{scrlayer-notecolumn}{\string\ProvideNoteColumn{#2} + ignored,\MessageBreak + because of already defined\MessageBreak + not column}% + }{% + \DeclareNoteColumn[{#1}]{#2}% + }% + }% +} +\scrlayerAddToInterface\RedeclareNoteColumn{% + \newcommand*{\RedeclareNoteColumn}[2][]{% + \scr@ifundefinedorrelax{slnc@#2@box}{% + \PackageError{scrlayer-notecolumn}{note column `#2' undefined}{% + You may declare only note columns, that have been declared + previously using\MessageBreak + \string\RedeclareNoteColumn. See also the alternatives + \string\DeclareNewNoteColumn,\MessageBreak + \string\ProvideNoteColumn, and \string\DeclareNoteColumn.\MessageBreak + Nevertheless, if you'll continue, declaration will be done.% + }% + }{}% + \DeclareNoteColumn[{#1}]{#2}% + }% +} +% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \section{Setting a Note Column} +% +% We already have commands to declare note columns. But we also need a command +% to put contents into the note columns and to output the note columns. +% +% \begin{macro}{\tf@slnc} +% \begin{macro}{\slnc@initwrite} +% \begin{macro}{\slnc@openwrite} +% First of all we need a file to write the notes to. We use the +% \File{aux}-file to write into the file, because we need to read the file +% while the document will be typeset and the same time we need to write into +% the file. Note, that the file will be still reserved on auto-removing the +% interface! +% \begin{macrocode} +%<*body> +\scrlayerAddToInterface\tf@slnc{% + \newwrite\tf@slnc + \AtBeginDocument{% + \immediate\write\@auxout{% + \noexpand\csname slnc@initwrite\noexpand\endcsname + }% + }% + \AtEndDocument{\let\slnc@initwrite\slnc@openwrite}% +} +\scrlayerAddToInterface\slnc@initwrite{}% +\scrlayerAddToInterface\slnc@openwrite{% + \newcommand*{\slnc@openwrite}{% + \immediate\closeout\slnc@file +%<*trace> + \PackageInfo{scrlayer-notecolumn}{% + Opening `\jobname.slnc'\MessageBreak + for writing}% +% + \immediate\openout\tf@slnc\jobname.slnc + }% +} +\AfterReadingMainAux{% + \immediate\closeout\tf@slnc + \scr@ifundefinedorrelax{pdfmdfivesum}{% + \PackageWarningNoLine{scrlayer-notecolumn}{% + \string\pdfmdfivesum\space unavailable.\MessageBreak + The package needs \string\pdfmdfivesum\space to test\MessageBreak + whether or not one more LaTeX run will\MessageBreak + be needed to make the note columns\MessageBreak + right. If this command is unavailable\MessageBreak + you have to do the decision without\MessageBreak + this help of the package.% + }% + }{% + \begingroup + \edef\reserved@a{\pdfmdfivesum file {\jobname.slnc}}% + \ifx \slnc@mdfivesum\reserved@a +%<*trace> + \PackageInfo{scrlayer-notecolumn}{% + MD5 of current `\jobname.slnc':\MessageBreak + \reserved@a}% +% + \else +%<*trace> + \PackageWarningNoLine{scrlayer-notecolumn}{% + MD5 of slnc-file changed.\MessageBreak + Last: \slnc@mdfivesum\MessageBreak + New: \space \reserved@a\MessageBreak + At least one more LaTeX rerun need to\MessageBreak + make note columns right% + }% +% + \aftergroup\@tempswatrue + \fi + \endgroup + }% +} +% +% \end{macrocode} +% \end{macro}^^A \slnc@openwrite +% \end{macro}^^A \slnc@initwrite +% \end{macro}^^A \tf@slnc +% +% \begin{macro}{\makenote} +% \begin{description} +% \item[\OParameter{string}:] the name of the note column the note should be +% added to (must be fully expandable and expand to a string only). The +% default value is \PValue{marginpar}. +% \item[\Parameter{code}:] the code, that should become par of the note +% column. Note, that this will be written protected to a file. So you have +% to use \Macro{protect} if a macro shouldn't be expanded while writing or +% may break while writing. +% \end{description} +% \begin{macrocode} +%<*body> +\scrlayerAddToInterface\makenote{% + \newcommand{\makenote}[2][marginpar]{% + \@bsphack + \pdfsavepos + \addtocontents{slnc}{% + \string\slnc@note{#1}% + {\noexpand\number\value{slncpage}}% + {\noexpand\number\pdflastypos}% + {#2}% + }% + \@esphack + }% +} +% \end{macrocode} +%^^A \begin{counter}{slncpage} +% This counter should be increased once per page with note column. This may +% be done simply at a once per page executed hook of +% \Pagestyle{@everystyle@}. You should note, that auto-remove wouldn't +% remove the counter. +% \begin{macrocode} +\@ifundefined{c@slncpage}{% + \newcounter{slncpage}% + \AddToLayerPageStyleOptions{@everystyle@}{% + onbackground=\stepcounter{slncpage}% + }% +}{} +% +% \end{macrocode} +%^^A \end{counter}^^A slncpage +% \end{macro}^^A \makenote +% +% \begin{macro}{\slnc@processnotes} +% \begin{description} +% \item[\Parameter{string}:] the name of the note column (must be fully +% expandable an expand to a string only). +% \end{description} +% Each note column typesets the notes with this command. It works in following +% steps: +% \begin{macrocode} +%<*body> +\scrlayerAddToInterface\slnc@processnotes{% + \newcommand*{\slnc@processnotes}[1]{% +% \end{macrocode} +% Read as long notes from the notes file until the number at \#2 of +% \Macro{slnc@note} in the file is greater than \Counter{slncpage}. Put all +% these to the corresponding unprocessed list. +% \begin{macrocode} + \begingroup + \slnc@readnotes{\value{slncpage}}% +% \end{macrocode} +% Process the unprocessed list of the current note column +% \begin{macrocode} + \expandafter\let\expandafter\reserved@a + \csname slnc@#1@unprocessed\endcsname + \expandafter\global + \expandafter\let\csname slnc@#1@unprocessed\endcsname\@empty + \def\slnc@notesyncfonttest##1{% + \ifhmode + \PackageError{scrlayer-notecolumn}{% + illegal font setting for `notecolumn.##1'% + }{% + Current setting of font for `notecolumn.##1' switches + from\MessageBreak + vertical mode to horizontal mode. This is + illegal!\MessageBreak + You have to change the font setting to fix + this.\MessageBreak + If you'll continue vertical alignment of notes may fail% + }% + \par\vskip-\dimexpr \baselineskip+\parskip\relax + \fi + }% + \long\def\slnc@note##1##2##3##4{% + \let\PackageInfo\PackageWarning + \ifnum ##2>\value{slncpage}\relax + \expandafter\g@addto@macro\csname slnc@#1@unprocessed\endcsname{% + \slnc@note{##1}{##2}{##3}{##4}% + }% + \else + \ifnum ##2<\value{slncpage}\relax + \PackageWarning{scrlayer-notecolumn}{note of type `#1' delayed.}% + \fi + \boxmaxdepth\maxdepth + \expandafter\setbox\csname slnc@#1@box\endcsname\vbox{% + \expandafter\hsize\csname slnc@#1@width\endcsname + \normalfont\normalsize + {% +% \end{macrocode} +% Question: Why is it not allowed to set a colour here? +% \begin{macrocode} + \let\color\@gobble + \usekomafont{notecolumn.#1}{% + \slnc@notesyncfonttest{#1}% + \expandafter\ifvoid\csname slnc@#1@box\endcsname + \expandafter\setbox\csname slnc@#1@box\endcsname\vbox{% + \kern\dimexpr\topskip-\baselineskip\relax + }% + \fi + \scr@ifundefinedorrelax{pdfpageheight}{% + \@tempdima=\paperheight + }{% + \@tempdima=\pdfpageheight + }% + \@tempdima=\dimexpr \@tempdima-##3sp + -1in-\topmargin + -\headheight-\headsep + -\baselineskip + \relax + \@tempdimb=\dimexpr \expandafter\ht\csname slnc@#1@box\endcsname + +\expandafter\dp\csname slnc@#1@box\endcsname + \relax + \typeout{Soll: \the\@tempdima^^JIst: \space\the\@tempdimb}% + \ifdim\@tempdima<\@tempdimb +%<*trace> + \PackageInfo{scrlayer-notecolumn}{% + Note moved down from\MessageBreak + \the\@tempdima\space to \the\@tempdimb\MessageBreak + at note box `#1' + }% +% + \else + \ifdim\@tempdima>\@tempdimb +%<*trace> + \PackageInfo{scrlayer-notecolumn}{% + Adding vertical white space from\MessageBreak + \the\@tempdimb\space to \the\@tempdima\MessageBreak + into note box `#1' + }% +% + \expandafter\setbox\csname slnc@#1@box\endcsname + \vbox {% + \expandafter\unvbox\csname slnc@#1@box\endcsname + \kern\dimexpr\@tempdima-\@tempdimb\relax + }% + \fi + \fi + \expandafter\ifvoid\expandafter\csname slnc@#1@box\endcsname + \else + \@tempdima\dimexpr + \dp\strutbox + -\dp\csname slnc@#1@box\endcsname + \relax + \expandafter\unvbox\csname slnc@#1@box\endcsname + \ifdim\@tempdima>\z@ \kern\@tempdima\fi + \fi + \strut\ignorespaces ##4\par + }% + }% + }% + \fi + }% + \def\slnc@sync##1##2##3##4{% + \ifnum ##2>\value{slncpage}\relax + \expandafter\g@addto@macro\csname slnc@#1@unprocessed\endcsname{% + \slnc@sync{##1}{##2}{##3}{}% + }% + \else + \if@filesw + \expandafter\setbox\csname slnc@#1@box\endcsname\vbox{% + \expandafter\unvbox\csname slnc@#1@box\endcsname + \pdfsavepos + \protected@write\@auxout{}{% + \string\newlabel{notecolumn.##1.##3.syncnote.label}{% + {% + \noexpand\number\pdflastypos + }{\thepage}% + }% + }% + }% + \fi + \fi + }% + \reserved@a + \expandafter\ifvoid\csname slnc@#1@box\endcsname +%<*trace> + \PackageInfo{scrlayer-notecolumn}{Note box `#1' empty}% +% + \else + \ifdim \dimexpr \expandafter\ht\csname slnc@#1@box\endcsname + +\expandafter\dp\csname slnc@#1@box\endcsname + \relax >\textheight\relax +%<*trace> + \PackageInfo{scrlayer-notecolumn}{Split note box `#1'}% +% + \splittopskip\topskip + \splitmaxdepth\baselineskip +% \end{macrocode} +% Bring back the colours: +% \begin{macrocode} + \usekomafont{notecolumn.#1}{% + \expandafter\vsplit\csname slnc@#1@box\endcsname to + \textheight\relax + }% + \expandafter\ifvoid\csname slnc@#1@box\endcsname + \else + \expandafter\setbox\csname slnc@#1@box\endcsname\vbox{% + \expandafter\unvbox\csname slnc@#1@box\endcsname + }% + \fi + \else +%<*trace> + \PackageInfo{scrlayer-notecolumn}{Flush note box `#1'}% +% +% \end{macrocode} +% Bring back the colours: +% \begin{macrocode} + \usekomafont{notecolumn.#1}{% + \expandafter\box\csname slnc@#1@box\endcsname% + }% + \fi + \fi + \expandafter\global + \expandafter\setbox\csname slnc@#1@box\expandafter\endcsname + \expandafter\box\csname slnc@#1@box\endcsname + \endgroup + } +} +% \end{macrocode} +% \begin{macro}{\slnc@readnotes} +% Read as long notes from the notes file until the number at \#2 of +% \Macro{slnc@note} or \Macro{slnc@sync} in the file is greater than +% \Counter{slncpage}. Put all these to the corresponding unprocessed list. +% \begin{macrocode} +\scrlayerAddToInterface\slnc@readnotes{% + \newcommand*\slnc@readnotes[1]{% + \ifeof\slnc@file\else + \ifnum \number #1<\slnc@unprocessed\relax + \@tempswafalse + \else + \@tempswatrue + \fi + \@whilesw\if@tempswa\fi{% + \edef\reserved@a{% + \noexpand\makeatletter + \endlinechar\m@ne + \read\noexpand\slnc@file to\noexpand\reserved@a + \endlinechar\the\endlinechar\relax + \catcode`\noexpand\@=\the\catcode`\@\relax + }% + \reserved@a + \expandafter\slnc@iofv\expandafter\reserved@b\reserved@a + \@empty\@empty\@empty\@empty\@empty + \@tempswafalse + \@for\reserved@c :={\slnc@note },{\slnc@sync }\do{% + \ifx\reserved@b\reserved@c \@tempswatrue\fi + }% + \if@tempswa + \@tempswafalse + \expandafter\slnc@iiiofv\expandafter\reserved@b\reserved@a + \@empty\@empty\@empty\@empty\@empty + \ifx\reserved@b\@empty + \PackageError{scrlayer-notecolumn}{internal syntax error}{% + Unexpected syntax of file `\jobname.slnc'.\MessageBreak + Second argument should be a number.\MessageBreak + I don't know what to do with\MessageBreak + \expandafter\detokenize\expandafter{\reserved@a}% + }% + \@tempswatrue + \else + \global\let\slnc@unprocessed\reserved@b + \expandafter\slnc@iiofv\expandafter\reserved@b\reserved@a + \@empty\@empty\@empty\@empty\@empty + \@ifundefined{slnc@\reserved@b @unprocessed}{% + \PackageWarning{scrlayer-notecolumn}{% + column `\reserved@b' undefined.\MessageBreak + You should declare the column before the usage.\MessageBreak + Notes will be lost + }% + }{% + \expandafter\g@addto@macro + \csname slnc@\reserved@b @unprocessed\expandafter\endcsname + \expandafter{% + \reserved@a + }% + }% + \ifnum \number #1<\slnc@unprocessed\relax + \@tempswafalse + \else + \@tempswatrue + \fi + \fi + \else +%<*trace> + \PackageInfo{scrlayer-notecolumn}{% + Ignoring `\expandafter\detokenize\expandafter{\reserved@a}'}% +% + \@tempswatrue + \fi + \ifeof\slnc@file\@tempswafalse\fi + }% + \fi + }% +} +% \end{macrocode} +% \end{macro}^^A \slnc@readnotes +% \begin{macro}{\slnc@iofv} +% \begin{macro}{\slnc@iiofv} +% \begin{macro}{\slnc@iiiofv} +% \begin{macrocode} +\scrlayerAddToInterface\slnc@iofv{% + \newcommand\slnc@iofv[6]{\def#1{#2}}% +} +\scrlayerAddToInterface\slnc@iiofiv{% + \newcommand\slnc@iiofv[6]{\def#1{#3}}% +} +\scrlayerAddToInterface\slnc@iiiofiv{% + \newcommand\slnc@iiiofv[6]{\def#1{#4}}% +} +% \end{macrocode} +% \end{macro}^^A \slnc@iiiofv +% \end{macro}^^A \slnc@iiofv +% \end{macro}^^A \slnc@iofv +% \begin{macro}{\slnc@unprocessed} +% The \#2 of the last read note column from notes file. +% \begin{macrocode} +\scrlayerAddToInterface\slnc@unprocessed{% + \newcommand*{\slnc@unprocessed}{0}% +} +% +% \end{macrocode} +% \begin{macro}{\slnc@file} +% The input file with the unprocessed notes. +% \begin{macro}{\slnc@mdfivesum} +% The MD5 sum of the file before opening it for reading. +% \begin{macrocode} +%<*body> +\scrlayerAddToInterface\slnc@mdfivesum{% + \let\slnc@mdfivesum\@empty +} +\scrlayerAddToInterface\slnc@file{% + \scr@ifundefinedorrelax{pdfmdfivesum}{}{% + \xdef\slnc@mdfivesum{\pdfmdfivesum file {\jobname.slnc}}% +%<*trace> + \PackageInfo{scrlayer-notecolumn}{% + MD5 of last `\jobname.slnc':\MessageBreak + \slnc@mdfivesum}% +% + }% + \newread\slnc@file + \immediate\openin\slnc@file \jobname.slnc + \scrlayerOnAutoRemoveInterface{\immediate\closeout\slnc@file}% +} +% +% \end{macrocode} +% \end{macro}^^A \slnc@mdfivesum +% \end{macro}^^A \slnc@file +% \end{macro}^^A \slnc@unprocessed +% \end{macro}^^A \slnc@processnotes +% +% \begin{option}{autoclearnotecolumns} +% \begin{macrocode} +%<*options> +\KOMA@ifkey{autoclearnotecolumns}{slnc@autoclearnotecolumns}\slnc@autoclearnotecolumnstrue +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @autoclearnotecolumns} +\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @autoclearnotecolumns@default} +% +%<*final> +\let\reserved@a\clearpage +\def\clearpage{% + \ifslnc@autoclearnotecolumns\clearnotecolumns\relax\fi +}% +\expandafter\g@addto@macro\expandafter\clearpage\expandafter{\reserved@a} +% +% \end{macrocode} +% \end{option} +% +% \begin{macro}{\clearnotecolumn} +% \begin{description} +% \item[\OParameter{string}:] the name of the note column (must be fully +% expandable and expand to a string only). Default is \PValue{marginpar}. +% \end{description} +% Output as many (empty) pages as needed to output all unprocessed notes of +% one note column. Note, that the output of the first page may result in more +% unprocessed notes. But the output of the following (empty) pages shouldn't. +% \begin{macrocode} +%<*body> +\scrlayerAddToInterface\c@slnc@clearnote@label{% + \newcounter{slnc@clearnote@label}% +} +\scrlayerAddToInterface\clearnotecolumn{% + \newcommand*\clearnotecolumn[1][marginpar]{% + \begingroup + \slnc@autoclearnotecolumnsfalse +% \end{macrocode} +% First of all we need to know the note column page of this page. +% \begin{macrocode} + \stepcounter{slnc@clearnote@label}% + \if@filesw + \protected@write\@auxout{% + \let\theslncpage\relax + \let\slnc@voidtest\relax + }{% + \string\newlabel{notecolumn.\theslnc@clearnote@label}% + {{\theslncpage}{\slnc@voidtest{#1}}}% + }% + \fi + \scr@ifundefinedorrelax{r@notecolumn.\theslnc@clearnote@label}{% + \PackageInfo{scrlayer-notecolumn}{% + Using estimated to low value for clearing\MessageBreak + note colum `#1'% + } + \edef\slnc@cmp@value{\the\value{slncpage}}% + \let\reserved@a\z@ + }{% + \edef\reserved@a{% + \@nameuse{r@notecolumn.\theslnc@clearnote@label}\@empty\@empty + }% + \edef\slnc@cmp@value{\expandafter\slnc@firstof\reserved@a\@nil}% + \edef\reserved@a{\expandafter\slnc@secondof\reserved@a\@nil}% + }% + \ifnum \reserved@a=\z@ +% \end{macrocode} +% Next we read all notes until the end of the current page, but only +% if a \Macro{clearpage} wouldn't result in a new page. +% \begin{macrocode} + \ifvmode + \ifdim \pagetotal<\topskip + \else + \slnc@readnotes{\slnc@cmp@value}% + \fi + \else + \slnc@readnotes{\slnc@cmp@value}% + \fi + \begingroup + \aftergroup\@tempswafalse + \long\def\slnc@note##1##2##3##4{% + \ifnum ##2>\slnc@cmp@value\relax \else \aftergroup\@tempswatrue\fi + }% + \let\slnc@sync\slnc@note + \csname slnc@#1@unprocessed\endcsname + \endgroup + \else + \PackageInfo{scrlayer-notecolumn}{% + box of note column `#1'\MessageBreak + not empty after page of \string\clearnotecolumn}% + \@tempswatrue + \fi + \if@tempswa +% \end{macrocode} +% Yes, we have! +% \begin{macrocode} + \IfLayerPageStyleExists{\currentpagestyle}{}{% + \PackageWarning{scrlayer-notecolumn}{% + \string\clearnotecolumn\space while active non-layer page + style.\MessageBreak + Activate empty page style until note column\MessageBreak + has been cleared% + }% + \pagestyle{empty}% + }% + \@tempswatrue + \fi + \@whilesw\if@tempswa\fi{% +% \end{macrocode} +% Yes, we have (maybe again)! +% \begin{macrocode} + \clearpage + \expandafter\ifcase \slnc@voidtest{#1}% + \begingroup + \aftergroup\@tempswafalse + \long\def\slnc@note##1##2##3##4{% + \ifnum ##2>\slnc@cmp@value\relax \else \aftergroup\@tempswatrue\fi + }% + \let\slnc@sync\slnc@note + \csname slnc@#1@unprocessed\endcsname + \endgroup + \else + \@tempswatrue + \fi + \if@tempswa +% \end{macrocode} +% And we still have: So we have to output one more page. +% \begin{macrocode} + \null + \fi + }% + \endgroup + }% +} +% \end{macrocode} +% \begin{macro}{\slnc@firstof} +% \begin{macro}{\slnc@secondof} +% We need these little helpers, because some packages like +% \Package{hyperref} extend the label mechanism by additional arguments. +% \begin{macrocode} +\scrlayerAddToInterface{\slnc@firstof}{% + \def\slnc@firstof#1#2\@nil{#1}% +} +\scrlayerAddToInterface{slnc@secondof}{% + \def\slnc@secondof#1#2#3\@nil{#2}% +} +% \end{macrocode} +% \end{macro}^^A \slnc@firstof +% \end{macro}^^A \slnc@secondof +% \begin{macro}{\slnc@voidtest} +% \begin{description} +% \item[\Parameter{string}:] the name of a note column (must be fully +% expandable and expand to a string only). +% \end{description} +% If the box of the note column is empty/void it returns \Macro{z@} otherwise +% \Macro{@ne}. +% \begin{macrocode} +\scrlayerAddToInterface\slnc@voidtest{% + \newcommand*{\slnc@voidtest}[1]{% + \expandafter\ifvoid \csname slnc@#1@box\endcsname \z@\else \@ne\fi + }% +} +% +% \end{macrocode} +% \end{macro}^^A \slnc@voidtest +% \end{macro}^^A \clearnotecolumn +% +% \begin{macro}{\clearnotecolumns} +% \begin{description} +% \item[\OParameter{string list}:] comma separated list of note column names +% (must be fully expandable and each element must expand to a string only, +% that is the name of a note column); if omitted or empty all note columns +% will be used. +% \end{description} +% Output as many (empty) pages as needed to output all unprocessed notes of +% all (given) note columns. Note, that the output of the first page may +% result in more unprocessed notes. But the output of the following (empty) +% pages shouldn't. +% \begin{macrocode} +%<*body> +\scrlayerAddToInterface\clearnotecolumns{% + \newcommand*\clearnotecolumns[1][\relax]{% + \begingroup + \slnc@autoclearnotecolumnsfalse + \ifx\relax#1\relax\else + \let\slnc@processnotecolumns\@empty + \edef\reserved@a{#1}% + \expandafter\@for\expandafter\reserved@a\expandafter:\expandafter=% + \reserved@a\do {% + \ifx\reserved@a\@empty\else + \expandafter\l@addto@macro\expandafter\slnc@processnotecolumns + \expandafter{\expandafter\@elt\expandafter{\reserved@a}}% + \fi + }% + \fi +% \end{macrocode} +% First of all we need to know the note column page of this page. +% \begin{macrocode} + \stepcounter{slnc@clearnote@label}% + \if@filesw + \begingroup + \def\@elt##1{+\slnc@voidtest{##1}}% + \protected@write\@auxout{% + \let\theslncpage\relax + \let\slnc@voidtest\relax + }{% + \string\newlabel{notecolumn.\theslnc@clearnote@label}% + {{\theslncpage}{\numexpr \slnc@processnotecolumns\relax}}% + }% + \endgroup + \fi + \scr@ifundefinedorrelax{r@notecolumn.\theslnc@clearnote@label}{% + \begingroup + \def\@elt##1{, `##1'}% + \PackageInfo{scrlayer-notecolumn}{% + Using estimated to low value for\MessageBreak + clearing note colums\MessageBreak + \expandafter\@gobble\slnc@processnotecolumns + }% + \endgroup + \edef\slnc@cmp@value{\the\value{slncpage}}% + \let\reserved@a\z@ + }{% + \edef\reserved@a{% + \@nameuse{r@notecolumn.\theslnc@clearnote@label}\@empty\@empty + }% + \edef\slnc@cmp@value{\expandafter\slnc@firstof\reserved@a\@nil}% + \edef\reserved@a{\expandafter\slnc@secondof\reserved@a\@nil}% + }% + \ifcase \reserved@a\relax +% \end{macrocode} +% Next we read all notes until the end of the current page, but only +% if a \Macro{clearpage} wouldn't result in a new page. +% \begin{macrocode} + \ifvmode + \ifdim \pagetotal<\topskip + \else + \slnc@readnotes{\slnc@cmp@value}% + \fi + \else + \slnc@readnotes{\slnc@cmp@value}% + \fi + \begingroup + \aftergroup\@tempswafalse + \long\def\slnc@note##1##2##3##4{% + \ifnum ##2>\slnc@cmp@value\relax \else \aftergroup\@tempswatrue\fi + }% + \let\slnc@sync\slnc@note + \def\@elt##1{\csname slnc@##1@unprocessed\endcsname}% + \slnc@processnotecolumns + \endgroup + \else + \PackageInfo{scrlayer-notecolumn}{% + box of at least one note column\MessageBreak + not empty after page of \string\clearnotecolumns}% + \@tempswatrue + \fi + \if@tempswa +% \end{macrocode} +% Yes, we have! +% \begin{macrocode} + \IfLayerPageStyleExists{\currentpagestyle}{}{% + \PackageWarning{scrlayer-notecolumn}{% + \string\clearnotecolumns\space while active non-layer page + style.\MessageBreak + Activate empty page style until note column\MessageBreak + has been cleared% + }% + \pagestyle{empty}% + }% + \@tempswatrue + \fi + \@whilesw\if@tempswa\fi{% +% \end{macrocode} +% Yes, we have (maybe again)! +% \begin{macrocode} + \clearpage + \begingroup + \def\@elt##1{+\slnc@voidtest{##1}}% + \ifcase \numexpr \slnc@processnotecolumns\relax + \aftergroup\@tempswafalse + \long\def\slnc@note##1##2##3##4{% + \ifnum ##2>\slnc@cmp@value\relax \else \aftergroup\@tempswatrue\fi + }% + \let\slnc@sync\slnc@note + \def\@elt##1{\csname slnc@##1@unprocessed\endcsname}% + \slnc@processnotecolumns + \else + \aftergroup\@tempswatrue + \fi + \endgroup + \if@tempswa +% \end{macrocode} +% And we still have: So we have to output one more page. +% \begin{macrocode} + \null + \fi + }% + \endgroup + }% +} +% +% \end{macrocode} +% \end{macro}^^A \clearnotecolumns +% +% +% \section{Syncronisation of Text and Note} +% \label{sec:scrlayer-notecolumn.sync} +% +% Until yet we have the text and we have note columns. Normally note entries +% to a note column are in sync with the text position, that makes the +% note. But if there are collisions the sync may be lost. In this case the +% note may be later (but never earlier), so we need a mechanism to force +% synchronisation of the text with the note. +% +% \begin{macro}{\syncwithnotecolumn} +% \begin{description} +% \item[\OParameter{string}:] the name of the note column to sync with (this +% must be fully expandable and expand to the name of a note column). By +% default sync with note column \PValue{marginpar}. +% \end{description} +% Add at the \LaTeX{} run after the next \LaTeX{} run as much space to the +% text (not the note column!) as needed to reach the next position at the +% note column. This is not the same like \Macro{clearnotecolumn}, because it +% doesn't need to go to the next page, but it needs at least three \LaTeX{} +% runs to terminate. +% \begin{macrocode} +%<*body> +\scrlayerAddToInterface{\c@slnc@syncpoint}{% + \newcounter{slnc@syncpoint}% +} +\scrlayerAddToInterface{\syncwithnotecolumn}{% + \newcommand*{\syncwithnotecolumn}[1][marginpar]{% + \begingroup + \edef\reserved@a{\endgroup\noexpand\syncwithnotecolumns[{#1}]}% + \reserved@a + }% +} +\scrlayerAddToInterface{\syncwithnotecolumns}{% + \newcommand*{\syncwithnotecolumns}[1][\relax]{% + \begingroup + \ifx\relax#1\relax\else + \let\slnc@processnotecolumns\@empty + \edef\reserved@a{#1}% + \expandafter\@for\expandafter\reserved@a\expandafter:\expandafter=% + \reserved@a\do {% + \ifx\reserved@a\@empty\else + \expandafter\l@addto@macro\expandafter\slnc@processnotecolumns + \expandafter{\expandafter\@elt\expandafter{\reserved@a}}% + \fi + }% + \fi + \stepcounter{slnc@syncpoint}% + \def\@elt##1{% + \addtocontents{slnc}{% + \string\slnc@sync{##1}% + {\noexpand\number\value{slncpage}}% + {\theslnc@syncpoint}% + {}% + }% + }% + \slnc@processnotecolumns + \ifvmode + \let\slnc@voffset\@empty% + \expandafter\@firstofone + \else + \PackageWarning{scrlayer-notecolumn}{% + \string\syncwithnotecolumn\space in hmode.\MessageBreak + Using \string\syncwithnotecolumn\space in horizontal\MessageBreak + mode may result in unwanted vertical\MessageBreak + space inside paragraphs and may lost\MessageBreak + colours of text of notes. \space So perhaps you\MessageBreak + should move \string\syncwithnotecolumn\space before\MessageBreak + or after the paragraph% + }% + \let\slnc@voffset\@empty%\def\slnc@voffset{-\number\baselineskip}% + \expandafter\slnc@vadjust + \fi + {% + \if@filesw + \pdfsavepos + \protected@write\@auxout{}{% + \string\newlabel{notecolumn.\theslnc@syncpoint.synctext.label}{% + {% + \noexpand\number + \numexpr \pdflastypos\slnc@voffset\relax + }{\thepage}% + }% + }% + \fi + \@ifundefined{r@notecolumn.\theslnc@syncpoint.synctext.label}{% + \PackageInfo{scrlayer-notecolumn}{% + No text label for \string\syncwithnotecolumn.\MessageBreak + Need rerun to sync position}% + }{% + \edef\reserved@a{% + \@nameuse{r@notecolumn.\theslnc@syncpoint.synctext.label}% + \@empty\@empty + }% + \edef\slnc@textpos{\expandafter\slnc@firstof\reserved@a\@nil}% + \edef\slnc@textpage{\expandafter\slnc@secondof\reserved@a\@nil}% + \let\slnc@notepos\slnc@textpos + \let\slnc@notepage\slnc@textpage + \def\@elt##1{% + \@ifundefined{r@notecolumn.##1.\theslnc@syncpoint.syncnote.label}{% + \PackageInfo{scrlayer-notecolumn}{% + No note label for sync with note column\MessageBreak + `##1'.\MessageBreak + Need rerun to sync position}% + \G@refundefinedtrue + }{% + \edef\reserved@a{% + \@nameuse{r@notecolumn.##1.\theslnc@syncpoint.syncnote.label}% + \@empty\@empty + }% + \edef\reserved@b{\expandafter\slnc@firstof\reserved@a\@nil}% + \edef\reserved@c{\expandafter\slnc@secondof\reserved@a\@nil}% + \ifnum \slnc@notepage<\reserved@c\relax + \let\slnc@notepos=\reserved@b + \let\slnc@notepage=\reserved@c + \else + \ifnum \slnc@notepage=\reserved@c\relax + \ifnum \slnc@notepos>\reserved@b + \let\slnc@notepos=\reserved@b + \let\slnc@notepage=\reserved@c + \fi + \fi + \fi + }% + }% + \slnc@processnotecolumns + \ifnum\slnc@textpage>\slnc@notepage\relax + \PackageInfo{scrlayer-notecolumn}{% + Last note page before last text page.\MessageBreak + Need rerun to sync position}% + \else + \ifnum\slnc@textpage<\slnc@notepage\relax + \@whilenum \slnc@textpage<\slnc@notepage\do {% + \newpage\null\vskip-\dimexpr \baselineskip+\parskip\relax + \edef\slnc@textpage{\the\numexpr\slnc@textpage+1\relax}% + }% + \scr@ifundefinedorrelax{pdfpageheight}{% + \@tempdima=\paperheight + }{% + \@tempdima=\pdfpageheight + }% + \@tempdima=\dimexpr \@tempdima + -\topmargin-1in + -\headheight-\headsep + -\topskip+\baselineskip + \relax + \edef\slnc@textpos{\number\@tempdima}% +%<*trace> + \PackageInfo{scrlayer-notecolumn}{% + Top position is \slnc@textpos% + }% +% + \fi + \ifnum\slnc@notepos>\slnc@textpos\relax + \PackageInfo{scrlayer-notecolumn}{% + Last note position before last text\MessageBreak + position.\MessageBreak + Need rerun to sync position% + }% + \else + \ifnum\slnc@notepos<\slnc@textpos\relax + \@tempdima=\numexpr \slnc@textpos-\slnc@notepos\relax sp + \PackageInfo{scrlayer-notecolumn}{% + skipping \the\@tempdima\space to sync% + }% + \vskip\@tempdima + \fi + \fi + \fi + }% + }% + \endgroup + }% +} +% \end{macrocode} +% \begin{macro}{\slnc@vadjust} +% \begin{macrocode} +\scrlayerAddToInterface\slnc@vadjust{% + \newcommand{\slnc@vadjust}[1]{% + \@bsphack + \vadjust{#1}% + \@esphack + }% +} +% +% \end{macrocode} +% \end{macro}^^A \slnc@vadjust +% \end{macro}^^A \syncwithnotecolumn +% +% +% \iffalse^^A meta-comment +% +% \fi^^A meta-comment +% +% \Finale +% \let\subsection\section +% \let\section\chapter +% \let\chapter\restorechapter +% +\endinput +% +% end of file `scrlayer-notecolumn.dtx' + +%%% Local Variables: +%%% mode: doctex +%%% mode: flyspell +%%% ispell-local-dictionary: "en_GB" +%%% TeX-master: t +%%% End: -- cgit v1.2.3