PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : example environment wie im LaTex Companion



einheitlix
13-11-2009, 01:36
Hallo Leute,

ich versuche gerade, mir ein example environment zu basteln, a la \begin{example}...\end{example}

Im LaTex Companion sind Beispiele immer ziemlich schoen formatiert, ein bisschen weiter rechts als der Text, und dazu gibt es eine kleine "Example" Box, die die Beispiele schoen durchnummeriert. Auch im LaTex Graphics Companion sieht dies genauso aus.

Ich habe erstmal versucht, etwas aehnliches hinzubekommen, damit ihr wisst was ich meine. Das sieht in etwa so aus:



\documentclass[12pt,a4paper]{article}

\usepackage{pstricks}

\begin{document}

\section{A section}

Some text some text some text some text some text some text
some text some text some text some text some text some text
\vspace{0.5cm}

\psframebox[linestyle=none]{
\begin{minipage}[b]{0.8\linewidth}
\textit{Example:}

%% Anfang Beispiel
Consider this.

A circle.

\begin{pspicture}(4,2)
\pscircle(2,1){1}
\end{pspicture}
%% Ende Beispiel
\end{minipage}
}\hfill
\psframebox[linecolor=lightgray]{
\begin{minipage}[t]{14pt}
\footnotesize
Ex.\\
1.1
\end{minipage}
}

\end{document}


Nun sind hier aber noch drei Problemchen. Also in absteigender Reihenfolge der Wichtigkeit:

Erstens, und am wichtigsten: Das "1.1", das die Beispielnummer sein soll, ist hier ja hardgecodet. Ich moechte natuerlich im Endeffekt so etwas haben, dass ich nur noch \begin{example} und \end{example} schreiben muss. Generiert wird das, was ihr oben seht; den Text, den ich in zwischen begin und end schreibe, soll dann zwischen das %% Anfang Beispiel und das %% Ende Beispiel.

Geht das vielleicht irgendwie mit etwas wie \newtheorem{example}{Example}[section] ? Aber wie bekomme ich LaTeX dazu, das dann so wie ich will zu formatieren, und nicht so wie es LaTeX standardmaessig tut, wenn ich dieses newtheorem definiere?

Zweitens: als besonderes i-Tuepfelchen ist es im LaTeX Companion so gemacht, dass, wenn das Beispiel sich auf einer "linken" Seite befindet, die kleine "Example" Box rechts vom Beispiel erscheint, und wenn es auf einer rechte Seite ist, erscheint sie links vom Beispiel. Nice... sowas will ich auch koennen ;) Leider hab ich aber echt keine Ahnung, wie man sowas hinbekommt...

Drittens: (aber das ist eher kosmetisch). Bei der zweiten minipage gebe ich ja wiederrum hardgecodet "14pt" als width fuer die minipage an. Wie bekomme ich LaTeX dazu, automatisch zu erkennen, wieviel Platz es braucht? Das Problem ist, wenn ich so etwas wie \mbox statt \parbox mache, muss ich die width zwar nicht mehr angeben, dafuer kann ich aber auch keine newlines mehr haben und kann das "Ex." nicht mehr ueber dem Counter darstellen.

Bin schonmal gespannt, ob sowas irgendwie geht. Aber da die es im LaTex (Graphics) Companion ja auch so in etwa gemacht haben, wird es wohl irgendwie moeglich sein... ;)

u_fischer
13-11-2009, 10:57
\documentclass[a4paper,twoside]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{showexpl,xcolor,lipsum}
\lstset{explpreset={wide,pos=o,columns=flexible,}}

\newcounter{myexample}
\newcommand{\titleexample}[1]{%
\refstepcounter{myexample}%
\minisec{Beispiel~\themyexample: #1}}
\begin{document}
\lipsum[1]

\titleexample{Linke Seite}
\begin{LTXexample}
\section{ABC}
\color{red}\rule{0.4\textwidth}{1cm}
\end{LTXexample}

\newpage
\lipsum[1]
\titleexample{Rechte Seite}
\begin{LTXexample}
\section{ABC}
\color{red}\rule{0.4\textwidth}{1cm}
\end{LTXexample}
\end{document}

einheitlix
13-11-2009, 12:59
Hey!

Das package showexpl mit seiner LTXexample Umgebung scheint hervorragend geeignet, um LaTeX Beispiele darzustellen.

Leider moechte ich gar keine LaTeX Beispiele darstellen, sondern Beispiele ganz anderer Natur, also nur bestimmte Texte oder Grafiken, die mir im Kontext als Beispiele dienen. Das heisst, was ich dareinschreibe, soll natuerlich von LaTeX interpretiert und umgesetzt werden, der LaTeX Code selbst sollte nicht auf der Seite erscheinen. Also so etwas wie eine minipage-Umgebung. Nur eine, grosse Box, in die ich reinschreiben kann, was ich moechte.

Ansonsten soll es daneben nur noch die ganz kleine Box geben. Der Counter sollte sich in der kleinen Box befinden, wie bei mir das "Ex 1.1", und nicht ueber dem Beispiel selbst.

Das LTXexample erkennt genau richtig, ob es auf einer linken oder rechten Seite ist und vertauscht die beiden Boxen, die es erzeugt. So etwas in die Richtung schwebt mir auch vor... nur halt nicht fuer LaTeX Beispiele, sondern eher so wie ich es oben erklaert habe :)

einheitlix
25-11-2009, 23:03
Hallo Ulrike,

Indem ich die Informationen aus deinem Beispiel verarbeitet habe, habe ich jetzt fast genau das erreicht, was ich will. Das Layout ist perfekt, und ich habe einen Counter, der den Sections folgt. Mit lipsum sieht das Minimalbeispiel jetzt etwas ansehnlicher aus ;)

Es fehlt nur noch ein kleines, aber wichtiges, Detail. Ich habe einen Macro \leftpageexample und einen Macro \rightpageexample. Diese unterscheiden sich lediglich in der Reihenfolge der beiden psframeboxen, die darin dargestellt werden. Ich weiss aber natuerlich im Allgemeinen nicht, ob ich mich auf einer linken oder auf einer rechten Seite befinde. Ich haette am liebsten ein Macro \myexample, dass automatisch erkennt, ob es sich auf einer linken oder rechten Seite befindet und jenachdem \leftpageexample oder \rightpageexample einsetzt. Wisst ihr, wie das geht? :)

Hier mal das Minimalbeispiel.


\documentclass[12pt,a4paper]{article}

\usepackage{pstricks}
\usepackage{lipsum}

\newcounter{myexample}[section]

% left page example
\newcommand{\leftpageexample}[1]{
\stepcounter{myexample}
\setlength\fboxsep{0cm}
\noindent\makebox[\linewidth]{%
\psframebox[linestyle=dashed]{
\begin{minipage}[b]{0.85\linewidth}
\textit{Example:}

#1
\end{minipage}
}\hfill
\psframebox[linecolor=lightgray]{
\begin{minipage}[t]{14pt}
\footnotesize
Ex.\\
\arabic{section}.\arabic{myexample}
\end{minipage}
}}%
\vspace{12pt}
}

% right page example
\newcommand{\rightpageexample}[1]{
\stepcounter{myexample}
\setlength\fboxsep{0cm}
\noindent\makebox[\linewidth]{%
\psframebox[linecolor=lightgray]{
\begin{minipage}[t]{14pt}
\footnotesize
Ex.\\
\arabic{section}.\arabic{myexample}
\end{minipage}
}\hfill
\psframebox[linestyle=dashed]{
\begin{minipage}[b]{0.85\linewidth}
\textit{Example:}

#1
\end{minipage}
}}%
\vspace{12pt}
}

\begin{document}

\section{A section}
\lipsum[1]
\vspace{0.5cm}
\leftpageexample{
Consider this.

A circle.

\begin{pspicture}(4,2)
\pscircle(2,1){1}
\end{pspicture}
}

\lipsum[2]
\vspace{0.5cm}
\leftpageexample{
This is a another example: a diamond.

\begin{pspicture}(3,2)
\psdiamond(1.5,1)(1,1)
\end{pspicture}
}

\section{Another section}
\lipsum[3]
\vspace{0.5cm}
\rightpageexample{
This is a triangle.

\begin{pspicture}(3,2)
\pstriangle(1.5,0)(1.5,2)
\end{pspicture}
}

\lipsum[4]

\end{document}


Fuer euch LaTeX-Profis ist das doch bestimmt kein Problem ;) Vielen Dank fuer eure Bemuehungen!

Beste Gruesse,

Malte

voss
25-11-2009, 23:19
ich versuche gerade, mir ein example environment zu basteln, a la \begin{example}...\end{example}

Im LaTex Companion sind Beispiele immer ziemlich schoen formatiert, ein bisschen weiter rechts als der Text, und dazu gibt es eine kleine "Example" Box, die die Beispiele schoen durchnummeriert. Auch im LaTex Graphics Companion sieht dies genauso aus.


Die Umgebung für die Beispiele ist ziemlich aufwändig, da auch gleichzeitig
die Indexeinträge erzeugt werden, die dann kursiv gedruckt werden.
Der Inhalt der Example-Umgebung wird noch zu einem vollständigen
Dokument ergänzt und dann mit einem externen Skript laufen gelassen.
Benutzt wird nur das fancyvrb-Paket, welches auf einfache Weise das
Rausschreiben und Wiedereinlesen von Dateien erlaubt.

Herbert

u_fischer
26-11-2009, 10:37
ein Macro \myexample, dass automatisch erkennt, ob es sich auf einer linken oder rechten Seite befindet

http://www.tex.ac.uk/cgi-bin/texfaq2html?label=oddpage