summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/minipage-marginpar/minipage-marginpar.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/minipage-marginpar/minipage-marginpar.dtx
Initial commit
Diffstat (limited to 'macros/latex/contrib/minipage-marginpar/minipage-marginpar.dtx')
-rw-r--r--macros/latex/contrib/minipage-marginpar/minipage-marginpar.dtx379
1 files changed, 379 insertions, 0 deletions
diff --git a/macros/latex/contrib/minipage-marginpar/minipage-marginpar.dtx b/macros/latex/contrib/minipage-marginpar/minipage-marginpar.dtx
new file mode 100644
index 0000000000..1b49744c84
--- /dev/null
+++ b/macros/latex/contrib/minipage-marginpar/minipage-marginpar.dtx
@@ -0,0 +1,379 @@
+% \iffalse meta-comment
+%
+%% (C) 2006 Paul Ebermann
+%%
+%% Package minipage-marginpar - Randnotizen auch in Minipages
+%%
+%% Die Datei minipage-marginpar.dtx sowie die dazugehörige
+%% minipage-marginpar.ins sowie die damit generierte
+%% minipage-marginpar.sty stehen unter der
+%% "LaTeX Project Public License" (LPPL, zu finden
+%% unter http://www.latex-project.org/lppl/, sowie
+%% auch in den meisten TeX-Distributionen in
+%% texmf/docs/latex/base/lppl*.txt), Version 1.3b oder
+%% später (nach Wahl des Verwenders).
+%%
+%% Der 'maintenance-status' ist (zur Zeit) 'maintained'.
+%%
+%% Das heißt in etwa, die Dateien dürfen frei vertrieben
+%% werden, bei Änderungen (durch andere Personen als Paul Ebermann)
+%% ist aber der Name der Datei zu ändern.
+%%
+%
+% \fi
+%
+% \iffalse
+%
+\NeedsTeXFormat{LaTeX2e}[2003/12/01]
+%<package>\ProvidesPackage{minipage-marginpar}
+%<mpgmpar>\ProvidesPackage{mpgmpar}
+%<*driver>
+\ProvidesFile{minipage-marginpar.dtx}
+%</driver>
+ [2008/04/07 v0.3
+%<package> Randnotizen auch in Minipages (PE)]
+%<mpgmpar> Kompatibilitaets-Datei fuer alte Dokumente (PE)]
+%<*driver>
+ Dokumentation fuer minipage-marginpar.]
+\documentclass[draft,ngerman]{ltxdoc}
+\usepackage{minipage-marginpar}
+\usepackage[final, pdfpagemode=None, pdfstartview=FitH, pdfpagelayout=OneColumn]{hyperref}
+\usepackage{pauldoc}
+\begin{document}
+ \DocInput{minipage-marginpar.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{51}
+%
+% \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 \~}
+%
+% \DoNotIndex{\relax,\end,\begin,\endinput,\global,\let,\newcommand}
+% \DoNotIndex{\newenvironment,\renewcommand,\RequirePackage,\undefined}
+% \DoNotIndex{\@tempa}
+%
+% \changes{v0.0}{2006/05/20}{Erste Fassung}
+% \changes{v0.1}{2006/05/23}{Erste veröffentlichte Fassung}
+% \changes{v0.3}{2008/04/07}{Neuer Name des Packages: \pack{minipage-marginpar}
+% statt \pack{minipage-marginpar}.}
+%
+% \GetFileInfo{minipage-marginpar.sty}
+%
+%
+% \title{Das \pack{minipage-marginpar}-Package -- Randnotizen auch in Minipages\thanks{%
+% Dieses Dokument gehört zu \pack{minipage-marginpar}~\fileversion,
+% vom~\filedate.}}
+% \author{Paul Ebermann\thanks{\texttt{Paul-Ebermann@gmx.de}}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% Innerhalb von Boxen wie etwa einer 'minipage'-Umgebung sind bekanntlich
+% '\marginpar'-Befehle nicht erlaubt -- dieses Package hat eine
+% (Teil"=)Lösung.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Einleitung}
+%
+% Innerhalb von Boxen wie etwa einer 'minipage'-Umgebung sind
+% '\marginpar'-Befehle nicht erlaubt, das heißt, sie bewirken
+% nichts außer einer Fehlermeldung ("`Float(s) lost"').
+%
+% Das Paket \pack{marginnote}\footnote{auf CTAN unter
+% \texttt{macros/latex/contrib/marginnote/}} von Markus Kohm umgeht das,
+% indem nicht-gleitende Marginalien bereitgestellt werden.
+%
+% Dieses Paket verfolgt einen anderen Ansatz:
+% Es wird ein Mechanismus bereitgestellt, mit dem die '\marginpar'-Befehle
+% abgefangen und dann außerhalb dieser Box ausgeführt werden können.
+%
+% \section{Benutzerdoku}
+%
+% \indent\DescribeEnv{minipagewithmarginpars}
+% Diese Umgebung funktioniert wie die 'minipage'-Umgebung aus dem \LaTeX-Kernel,
+% mit dem Unterschied, dass in ihr vorkommende '\marginpar'-Befehle erst am
+% Ende der Umgebung, nach der Minipage selbst, ausgeführt werden.
+%
+%
+% Hier ein Beispiel:
+%
+% \begin{minipagewithmarginpars}{4cm}
+% Text am Anfang\marginpar{Bla}.
+%
+% \vspace{1.5cm}
+% Text am Ende\marginpar[links]{rechts}.
+% \end{minipagewithmarginpars}
+% \begin{minipage}[t]{7cm}\vspace{-1ex}
+%\begin{verbatim}
+%\begin{minipagewithmarginpars}{4cm}
+% Text am Anfang\marginpar{Bla}.
+%
+% \vspace{1.5cm}
+% Text am Ende\marginpar[links]{rechts}.
+%\end{minipagewithmarginpars}
+% \end{verbatim}
+% \end{minipage}
+%
+% Die Randnotizen werden in der durch die (hier zwei, der Code ist auch eine) Minipages
+% gebildeten Zeile abgesetzt -- dabei ist die Default-Ausrichtung hier '[t]' anstatt
+% '[c]'.
+%
+% \subsection{Probleme/Nachteile}
+% \begin{itemize}
+% \item Die Marginalien werden alle ab der selben Zeile (jeweils etwas
+% nach unten verschoben) gesetzt, nicht entsprechend der Zeile (in
+% der Minipage), in der der '\marginpar'-Befehl vorkam.
+%
+% Dies ist prinzipbedingt, ich habe keine Idee, was man dagegen
+% tun könnte. (Je nach Problem gibt \pack{marginnote} wohl bessere
+% Ergebnisse.)
+%
+% \item Wird die 'minipagewithmarginpars' innerhalb einer weiteren Box
+% verwendet (z.B. um noch einen Rahmen zu setzen), funktioniert es
+% weiterhin nicht, da ja dort ebenfalls keine '\marginpar's erlaubt sind.
+%
+% Hierfür gibt es eine Lösung -- die gesicherten '\marginpar's müssen
+% einfach erst nach der äußersten Box (die hoffentlich in einer
+% horizontalen Liste ist) ausgeführt werden. Dazu kann man sich analog
+% zu 'minipagewithmarginpars' eine entsprechende Umgebung definieren,
+% Details sind \ifReferenceExists{sec:minipagewithmarginpars}{in Abschnitt
+% \ref{sec:minipagewithmarginpars} im Implementations-Teil}{in der
+% Implementations"=Beschreibung des Paketes} nachzulesen.
+%
+% \item Befinden sich die '\marginpar'-Befehle innerhalb einer der
+% AMS-Mathe-Umgebungen (wie etwa 'align', 'gather' und ihre
+% '*'-Varianten), so kann es vorkommen, dass die Marginalien doppelt
+% auftauchen.
+% Dies liegt daran, dass diese Umgebungen ihren Inhalt mehrfach
+% auswerten -- und jedesmal wird dann der Inhalt gespeichert.
+% Dieses Problem betrifft auch andere Makros, die ähnlich vorgehen.
+%
+% Ich halte dies für einen Bug (in \pack{minipage-marginpar}), habe
+% aber noch keine Idee, was ich dagegen tun könnte. Wer eine Idee hat,
+% immer her damit.
+%
+% \end{itemize}
+%
+% \StopEventually{\PrintChanges\PrintIndex}
+%
+% \section{Implementation}
+%
+% \subsection{Rückwärtskompatibilitäts-Datei}
+% CTAN hat ja inzwischen seine 8-Buchstaben-pro-Dateiname-Regel aufgehoben.
+% Genauer, sie wurde zwischen meinem ersten Versuch, ein (anderes) Paket
+% mit zu langem Dateinamen hochzuladen, und dem ersten Hochladen dieses
+% Paketes geändert, so dass ich dieses Package noch \pack{mpgmpar} genannt
+% habe, es bei CTAN dann aber in einem Verzeichnis 'minipage-marginpar'
+% gelandet ist, und auch unter diesem Namen im \href{http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=minipage-marginpar}{CTAN-Katalog} zu finden
+% ist. Für Version 0.3 habe ich mich daher entschieden, auch meine
+% Package-Dateien entsprechend zu benennen. Hier aber noch für die
+% Rückwärtskompatibilität eine passende 'mpgmpar.sty':
+% \begin{macrocode}
+%<*mpgmpar>
+\RequirePackage{minipage-marginpar}
+%</mpgmpar>
+% \end{macrocode}
+%
+% Und jetzt geht das eigentliche Package los.
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \subsection{Vorbereitungen}
+% \changes{v0.2}{2006/07/27}{\pack{ifthen} wird nicht mehr benötigt.}
+%
+% \begin{macro}{\mpgmpar@savedmargins}
+% Dieses Makro ist einfach nur ein "`Behälter"' für die aufgesparten
+% '\marginpar'-Befehle. Wir definieren es hier (leer) mittels '\newcommand',
+% um bei Konflikten eine Fehlermeldung zu erhalten.
+% \begin{macrocode}
+\newcommand*{\mpgmpar@savedmargins}{}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mpgmpar@dummy}
+% Diese Kontrollsequenz wird nur verwendet, um einen nicht vorhandenen
+% Parameter erkennen zu können. (Wir definieren es zunächst als Makro,
+% um Konflikte zu erkennen, lassen es nachher aber gleich '\relax' sein.)
+% \begin{macrocode}
+\newcommand*{\mpgmpar@dummy}{}%
+\let \mpgmpar@dummy = \relax
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Interne Kommandos}
+%
+% Unsere beiden Makros '\mpgmpar@savemarginpars' (am Anfang eines Bereiches) und
+% '\mpgmpar@restoremarginpars' (am Ende)
+% machen die eigentliche Arbeit und können auch für die Definition eigener
+% \emph{Box-Making}-Umgebungen verwendet werden, für eine Anleitung dafür
+% siehe Abschnitt \ref{sec:minipagewithmarginpars}.
+%
+% \begin{macro}{\mpgmpar@savemarginpars}
+% Dieses Makro leitet einen Bereich ein, in dem '\marginpar's aufgespart werden
+% (er geht bis zum Ende der aktuellen Gruppe).
+% \begin{macrocode}
+\newcommand*{\mpgmpar@savemarginpars}{%
+% \end{macrocode}
+% Wir definieren '\marginpar' neu.
+% \begin{macro}{\marginpar}
+% Es hat wie das Original-'\marginpar' einen
+% optionalen und einen verpflichtenden Parameter. (Um den Fall, dass der optionale
+% Parameter angegeben wurde, von dem Fall der Nichtangabe zu unterscheiden,
+% nehmen wir als Default '\mpgmpar@dummy' und vergleichen nachher damit.)
+% \begin{macrocode}
+ \renewcommand*{\marginpar}[2][\mpgmpar@dummy]%
+ {%
+% \end{macrocode}
+% Das '\@bsphack' und das dazugehörige '\@esphack' am Ende
+% sind Kernel"=Kommandos, welche (zusammen) dafür sorgen, dass
+% an der Stelle der Verwendung keine Spur des
+% '\marginpar'-Aufrufs bleibt.
+% \begin{macrocode}
+ \@bsphack
+% \end{macrocode}
+% \changes{v0.2}{2006/07/26}{Vergleich jetzt mit \cs{ifx} statt \cs{ifthenelse}.}
+% Jetzt der Vergleich \ldots{} bis zu Version 0.1 hatte ich
+% den mit
+%\begin{verbatim}
+% \ifthenelse{\equal{\mpgmpar@dummy}{##1}}{...
+%\end{verbatim}
+% aus \pack{ifthen} gemacht, aber das hatte Nebenwirkungen (da für
+% den Vergleich '##1' expandiert wurde). Daher direkt mit '\ifx'. In
+% Version 0.2 war dieser '\ifx'-Vergleich kaputt (ergab immer false),
+% wodurch '\marginpar{bla}' nur auf rechten Seiten gedruckt wurde.
+% Jetzt (0.3) sollte es gehen.
+% \changes{v0.3}{2008/04/07}{Fehler im Vergleich gefunden, jetzt korrigiert durch weitere Indirektion beim Vergleich.}
+% \begin{macrocode}
+ \def\temp@a{##1}%
+ \def\temp@b{\mpgmpar@dummy}%
+ \ifx\temp@b\temp@a%
+% \end{macrocode}
+% Dann kopieren wir (global) einfach den '\marginpar'-Aufruf an das Ende unseres
+% "`Speicher-Makros"' '\mpgmpar@savedmargins'.
+% \begin{macrocode}
+ \g@addto@macro{\mpgmpar@savedmargins}{%
+ \marginpar{##2}}%
+ \else%
+ \g@addto@macro{\mpgmpar@savedmargins}{%
+ \marginpar[{##1}]{##2}}%
+ \fi%
+ \@ignorefalse
+ \@esphack
+ }%
+}%
+% \end{macrocode}
+% Das '\@bsphack'-'\@esphack'-Paar ist hier vorhanden, damit sich unser
+% modifiziertes '\marginpar' bezüglich umrundender Leerzeichen o.ä.
+% genauso verhält wie das Original-'\marginpar'.
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\mpgmpar@restoremarginpars}
+% Dieses Makro führt die gespeicherten '\marginpar'-Befehle
+% aus und leert dann die Liste.
+% \begin{macrocode}
+\newcommand*{\mpgmpar@restoremarginpars}{%
+% \end{macrocode}
+% Zuerst merken wir uns die Liste im Makro '\@tempa' (das ist
+% für derartige Sachen gedacht), dann löschen wir (global)
+% '\mpgmpar@savedmargins'.
+% \begin{macrocode}
+ \let \@tempa = \mpgmpar@savedmargins
+ \global\let \mpgmpar@savedmargins = \@empty
+% \end{macrocode}
+% Die eben kopierte Liste führen wir nun aus (falls wir
+% jetzt noch in einer äußeren Umgebung mit unserem
+% Spezial-'\marginpar' sind, wird die Liste dadurch neu angelegt,
+% andernfalls werden die Randnotizen ausgegeben), und
+% löschen dann die Kopie.
+% \begin{macrocode}
+ \@tempa
+ \let \@tempa = \undefined
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Neue \texttt{minipage}-Umgebung}\label{sec:minipagewithmarginpars}
+%
+% Diese Umgebung dient als Beispiel für die Erstellung derartiger
+% Umgebungen mit Hilfe von '\mpgmpar@savemarginpars' und '\mpgmpar@restoremarginpars'.
+% Das Wesentliche dabei ist: '\mpgmpar@savemarginpars' sollte innerhalb einer
+% Gruppe aufgerufen werden (meist nahe am Anfang), '\mpgmpar@restoremarginpars'
+% nach dem Ende dieser Gruppe (an der Stelle, wo die Randnotizen erscheinen sollen).
+%
+% \begin{quotation}\small
+% Mit etwas Eigenarbeit dürfte es auch ohne eine (weitere) Gruppe klappen. Dafür
+% muss man am Anfang '\marginpar' mit '\let' sichern und am Ende wiederherstellen:
+%\begin{verbatim}
+% \let \savedmarginpar = \marginpar
+% \mpgmpar@savemarginpars
+% ...
+% \let \marginpar = \savedmarginpar
+% \mpgmpar@restoremarginpars
+%\end{verbatim}
+% Das ist aber nicht von mir getestet, also ohne Garantie. Und es ist eher nicht
+% robust gegenüber Verschachtelungen derartiger Konstrukte.
+% \end{quotation}
+%
+% \begin{environment}{minipagewithmarginpars}
+% Hier nun unserer neue Minipage-Umgebung. Sie hat einen optionalen
+% (vertikale Ausrichtung~-- Default ist 't') und einen verpflichtenden (Breite) Parameter.
+% \begin{macrocode}
+\newenvironment*{minipagewithmarginpars}[2][t]{%
+% \end{macrocode}
+% Die Implementation ist einfach: Wir beginnen zunächst
+% die Original-'minipage'-Umgebung (mit den selben Parametern)
+% und innerhalb davon rufen wir unser Makro '\mpgmpar@savemarginpars' auf.
+% \begin{macrocode}
+ \begin{minipage}[#1]{#2}%
+ \mpgmpar@savemarginpars
+} {%
+% \end{macrocode}
+% Am Ende beenden wir zunächst die Minipage (wodurch '\marginpar' seine
+% Original-Bedeutung wiedererlangt), und rufen dann
+% '\mpgmpar@restoremarginpars' auf.
+% \begin{macrocode}
+ \end{minipage}%
+ \mpgmpar@restoremarginpars
+}%
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{Ende}
+% ...
+% Das war es.
+% \begin{macrocode}
+\endinput
+%</package>
+% \end{macrocode}
+%
+% \Finale
+%\endinput
+
+
+%%% Folgendes ist nur für meinen Editor.
+%%%
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End: