PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : \g@addto@macro



mechanicus
26-01-2009, 16:06
Hallo,

bevor die Frage kommt, hier das Minimalbeispiel.


\documentclass[a4paper,12pt,ngerman]{scrreprt}
\usepackage{babel}
\usepackage[utf8]{inputenc}

\makeatletter
\newenvironment{testum}{\begin{list}{\bfseries Zeile:}{\itshape\large}
\item[\Large Vorwort:]
}{\end{list}}
\g@addto@macro\testum{\small}%
\makeatother

\begin{document}
\begin{testum}
Hier soll eine eigene Liste hin
\item Nummer 1
\item Nummer 2
\end{testum}

\end{document}

So nun meine Frage:
Mithilfe der Anweisung \g@addto@macro kann ich diverse Sachen in schon definierte Listen schreiben. Jetzt meine Sorge. Ist es Möglich mittels der Anweisung \g@addto@macro auch auf den Befehl \item[\Large Vorwort:] einzuwirken. Also aus Large mache huge?

Ich versuche gerade den Befehl zu verstehen. Die Definition ist in der latex.ltx wie folgt hinterlegt:

\long\def\g@addto@macro#1#2{%
\begingroup
\toks@\expandafter{#1#2}%
\xdef#1{\the\toks@}%
\endgroup}

Danke und Gruß
Marco

voss
26-01-2009, 17:14
So nun meine Frage:
Mithilfe der Anweisung \g@addto@macro kann ich diverse Sachen in schon definierte Listen schreiben. Jetzt meine Sorge. Ist es Möglich mittels der Anweisung \g@addto@macro auch auf den Befehl \item[\Large Vorwort:] einzuwirken. Also aus Large mache huge?

Ich versuche gerade den Befehl zu verstehen. Die Definition ist in der latex.ltx wie folgt hinterlegt:


Es geht, aber damit setzt du die _komplette_ Umgebung auf small.
Beispiel:

\documentclass[a4paper,12pt,ngerman]{scrreprt}
\usepackage{babel}
\usepackage[utf8]{inputenc}

\makeatletter
\newenvironment{testum}{\begin{list}{\bfseries Zeile:}{\itshape\large}
\item[\Large Vorwort:]
}{\end{list}}
\g@addto@macro\testum{\tiny}%
\makeatother

\begin{document}
\begin{testum}
Hier soll eine eigene Liste hin
\item Nummer 1
\item \large Nummer 2
\end{testum}

foo

\end{document}


Das ist ja in diesem Fall nicht dass, was du willst. Außerdem muss man bei Umgebungen,
die eigentlich aus zwei Makros \itemize und \enditemize bestehen, immer ein wenig aufpassen. Die kann man
nicht immer einfach so ergänzen.


\long\def\g@addto@macro#1#2{% long->Parameter können \par enthalten
\begingroup
\toks@\expandafter{#1#2}% expandiere erst #1 (das aktuelle Makro) und hänge #2 dahinter, \toks@ ist ein internes Tokenregister
\xdef#1{\the\toks@}% globale Neudefinition des alten Makros
\endgroup}

Herbert

mechanicus
26-01-2009, 18:01
Das ist ja in diesem Fall nicht dass, was du willst. Außerdem muss man bei Umgebungen,
die eigentlich aus zwei Makros \itemize und \enditemize bestehen, immer ein wenig aufpassen. Die kann man
nicht immer einfach so ergänzen.


\long\def\g@addto@macro#1#2{% long->Parameter können \par enthalten
\begingroup
\toks@\expandafter{#1#2}% expandiere erst #1 (das aktuelle Makro) und hänge #2 dahinter, \toks@ ist ein internes Tokenregister
\xdef#1{\the\toks@}% globale Neudefinition des alten Makros
\endgroup}

Herbert

Das ist ein super Erklärung. Dann kann ich damit noch ein Wenig rumspielen.
Habe ich mir auch wieder ein schwieriges Makro rausgesucht ;)

Das bedeutet aber auch, dass für die Neudefinition von diversen Befehlen nur eine globale Erweiterung stattfinden kann, aber keine Neudefinion von irgendwelchen Befehlen?

Gruß und Danke
Marco

voss
26-01-2009, 19:37
Das bedeutet aber auch, dass für die Neudefinition von diversen Befehlen nur eine globale Erweiterung stattfinden kann, aber keine Neudefinion von irgendwelchen Befehlen?


Neudefinition geht nicht mit \g@addto@macro. Das macht man dann analog
zu latex.ltx meistens mit renewcommand oder eben \def, was allerdungs alles
gnadenlos überbügelt.

Hier ein Beispiel, wo \g@addto@macro in die Hose geht. Du kannst das letzte
Beispiel mit dem vorletzten vertauschen und siehst dann, das \begingroup ...
\endgroup dort keine Wirkung haben und das alles zerschossen ist.

Herbert


\listfiles
\documentclass[12pt,parskip]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{bera,graphicx}

\begin{document}
\begin{description}
\item[Linux] Feine Sache
\item[Windows] Zu kalt, bei dem Wetter
\end{description}

\renewcommand*\descriptionlabel[1]{%
\normalfont\ttfamily\bfseries\reflectbox{#1}}% :-)

\begin{description}
\item[Linux] Feine Sache
\item[Windows] Zu kalt, bei dem Wetter
\end{description}

\renewcommand*\descriptionlabel[1]{%
\normalfont\ttfamily\bfseries#1}

Das folgende geht \emph{nicht} in die Hose und kann lokal gehalten
werden:
\begingroup
\makeatletter
\let\@Item\@item
\def\@item[#1]{\@Item[#1:]}
\makeatother

\begin{description}
\item[Linux] Feine Sache
\item[Windows] Zu kalt, bei dem Wetter
\end{description}
\endgroup

Das folgende geht jetzt aber voll in die Hose:
\makeatletter\g@addto@macro{\item}{:}\makeatother

\begin{description}
\item[Linux] Feine Sache
\item[Windows] Zu kalt, bei dem Wetter
\end{description}

\verb+\item+ ist nicht so einfach zu ergänzen ...

\end{document}

mechanicus
26-01-2009, 20:03
Hallo Herbert,

Dieses Beispiel hilft mir sehr. Danke. Irgendwann muss man ja mal anfangen, sich mit solchen Befehlen auseinander zu setzen, wenn man nicht auf der Stelle treten möchte.

Gruß
Marco