% \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] %\ProvidesPackage{minipage-marginpar} %\ProvidesPackage{mpgmpar} %<*driver> \ProvidesFile{minipage-marginpar.dtx} % [2008/04/07 v0.3 % Randnotizen auch in Minipages (PE)] % 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} % % \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} % % \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 % % \end{macrocode} % % \Finale %\endinput %%% Folgendes ist nur für meinen Editor. %%% %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% End: