PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abfrage, ob beamer handout erstellt



Tusor
09-08-2008, 15:28
Hallo,

ich sitze gerade an meiner ersten Präsentation mit LaTeX und der Beamer-Klasse. Diese unterstützt ja auch die Ausgabe eines Handouts. Nun wollte ich meinen Quelltext so gestalten, dass wenn ein Handout erstellt wird, mit Hilfe von pgfpages diese entsprechend auf einer A4-Seite angeordnet werden. Dazu habe ich folgenden Code eingefügt:

\makeatletter
\if@handout
\usepackage{pgfpages}
\pgfpagesuselayout{2 on 1}[a4paper, shrink=5mm]
\fi
\makeatother
Diesen habe ich mir hier aus dem Forum abgeschaut, wobei dort aber "twoside" oder "oneside" abgefragt wurde.
Auf jeden Fall funktioniert das so nicht, da ich folgende Fehlermeldung bekomme: "! Undefined control sequence.
l.15 \if@handout"
Ich habe auch schon die Dateien der Beamer-Klasse durchsucht, um dort zu schauen, wie die Option handout dort abgefragt wird, aber ich habe keine passende Stelle gefunden.
Also jetzt die Frage an euch: Wie kann man das bewerkstelligen, dass ich meine Folien auf ein A4-Blatt packe, wenn ich die Option "handout" verwende und eine normale Präsentation bekomme, wenn ich das nicht tue.

mfg

Tusor

P.S.: Gibt es irgendwo eine gute Anleitung, für die Programmierung in TeX/LaTeX, wo erklärt wird, wie man derartige Abfragen erstellt? Damit kann man nämlich bestimmt viele lustige Sachen machen.

rais
09-08-2008, 22:02
Moin moin,

Hallo,

ich sitze gerade an meiner ersten Präsentation mit LaTeX und der Beamer-Klasse. Diese unterstützt ja auch die Ausgabe eines Handouts. Nun wollte ich meinen Quelltext so gestalten, dass wenn ein Handout erstellt wird, mit Hilfe von pgfpages diese entsprechend auf einer A4-Seite angeordnet werden. Dazu habe ich folgenden Code eingefügt:

\makeatletter
\if@handout
\usepackage{pgfpages}
\pgfpagesuselayout{2 on 1}[a4paper, shrink=5mm]
\fi
\makeatother
Diesen habe ich mir hier aus dem Forum abgeschaut, wobei dort aber "twoside" oder "oneside" abgefragt wurde.
Auf jeden Fall funktioniert das so nicht, da ich folgende Fehlermeldung bekomme: "! Undefined control sequence.
l.15 \if@handout"

wie kommst Du darauf, daß es einen solchen `\if@handout' gäbe?
Afaik muß ein `\if<irgendwas>' vor einer etwaigen Benutzung per \newif deklariert sein ...

Ich habe auch schon die Dateien der Beamer-Klasse durchsucht, um dort zu schauen, wie die Option handout dort abgefragt wird, aber ich habe keine passende Stelle gefunden.

hmm, nach Öffnen der beamer.cls und schlichter Stringsuche nach `handout' solltest Du hier eigentlich fündig werden:


\def\beamer@currentmode{beamer}
\DeclareOptionBeamer{handout}{\gdef\beamer@current mode{handout}}
\DeclareOptionBeamer{trans}{\gdef\beamer@currentmo de{trans}}

und aus den umliegenden Zeilen sollte auch klar werden, warum es keinen einfachen `\if@handout' gibt: beamer unterstützt mehr als zwei Modi

Also jetzt die Frage an euch: Wie kann man das bewerkstelligen, dass ich meine Folien auf ein A4-Blatt packe, wenn ich die Option "handout" verwende und eine normale Präsentation bekomme, wenn ich das nicht tue.

Ein kleiner Test (einmal mit, einmal ohne die handout-Option kompilieren):


\documentclass[handout]{beamer}
\newcommand*\handoutname{handout}
\makeatletter
\newcommand*\checkmode{%
\ifx\beamer@currentmode\handoutname
foo
\else
bar
\fi
(\beamer@currentmode)
}
\makeatother
\begin{document}
\frame{\checkmode}
\end{document}
An Deine Bedürfnisse wirst Du es sicher anpassen können.


P.S.: Gibt es irgendwo eine gute Anleitung, für die Programmierung in TeX/LaTeX, wo erklärt wird, wie man derartige Abfragen erstellt? Damit kann man nämlich bestimmt viele lustige Sachen machen.
schau mal nach
``The TeXbook'' von Donald Ervin Knuth und http://www.mrunix.de/forums/showthread.php?t=53764

Das Problem dabei ist: Du willst in diesem Fall auf einen Befehl zugreifen, der eigentlich beamer-klassenintern ist (deshalb ja auch das `@' im Namen: der Klassenautor hat gar nicht vorgesehen, daß Du daran herumfummelst bzw. auch nur den entsprechenden Inhalt abfragst) und solche Befehle können sich von einer Version auf die Nächste in der Bedeutung verändern ...

MfG

Tusor
10-08-2008, 06:08
Moin moin,

wie kommst Du darauf, daß es einen solchen `\if@handout' gäbe?
Afaik muß ein `\if<irgendwas>' vor einer etwaigen Benutzung per \newif deklariert sein ...

Hallo und danke für die ausführliche Antwort.

Wie ich darauf kam....naja, ich hab davon noch keine Ahnung, und da habe ich das einfach so probiert.




hmm, nach Öffnen der beamer.cls und schlichter Stringsuche nach `handout' solltest Du hier eigentlich fündig werden:


\def\beamer@currentmode{beamer}
\DeclareOptionBeamer{handout}{\gdef\beamer@current mode{handout}}
\DeclareOptionBeamer{trans}{\gdef\beamer@currentmo de{trans}}

und aus den umliegenden Zeilen sollte auch klar werden, warum es keinen einfachen `\if@handout' gibt: beamer unterstützt mehr als zwei Modi


Diese Zeilen hatte ich schon gefunden, aber so richtig schlau bin ich daraus halt auch nicht geworden. Ich habe dann auch alle weiteren Dateien durchsucht und bin halt nicht so richtig drauf gestoßen, wo dieser Modus überhaupt abgefragt wird. Nur in der beamerbaseoverlay.sty taucht handout nochmal auf, aber leider ohne if, sodass ich mir da nichts abschauen konnte.



Ein kleiner Test (einmal mit, einmal ohne die handout-Option kompilieren):


\documentclass[handout]{beamer}
\newcommand*\handoutname{handout}
\makeatletter
\newcommand*\checkmode{%
\ifx\beamer@currentmode\handoutname
foo
\else
bar
\fi
(\beamer@currentmode)
}
\makeatother
\begin{document}
\frame{\checkmode}
\end{document}
An Deine Bedürfnisse wirst Du es sicher anpassen können.


Das Minimalbeispiel funktioniert ja schon super. Damit werde ich mir das sicherlich ordentlich basteln können. Da ich die Sache aber auch verstehen will, muss ich noch die Frage stellen, warum du dort "\handoutname" verwendest. Wie kommt man darauf, dass die Bezeichnung so lautet? Denn eigentlich heißt der Modus doch nur "handout"

edit: wer lesen kann, ist klar im Vorteil....Ich habe gerade gesehen, dass du dir "\handoutname" selbst definiert hast, aber wieso? Liegt das an der Funktionsweise von \ifx? Soweit ich gerade auf die Schnelle gelesen habe, funktioniert das nur wenn man Makro mit Makro vergleicht und nicht Makro mit Text. Stimmt das soweit?



schau mal nach
``The TeXbook'' von Donald Ervin Knuth und http://www.mrunix.de/forums/showthread.php?t=53764

Das Problem dabei ist: Du willst in diesem Fall auf einen Befehl zugreifen, der eigentlich beamer-klassenintern ist (deshalb ja auch das `@' im Namen: der Klassenautor hat gar nicht vorgesehen, daß Du daran herumfummelst bzw. auch nur den entsprechenden Inhalt abfragst) und solche Befehle können sich von einer Version auf die Nächste in der Bedeutung verändern ...

MfG

Vielen Dank für den Tip, das werde ich mir mal anschauen.

mfg

Tusor

rais
10-08-2008, 08:55
Moin moin,


Diese Zeilen hatte ich schon gefunden, aber so richtig schlau bin ich daraus halt auch nicht geworden. Ich habe dann auch alle weiteren Dateien durchsucht und bin halt nicht so richtig drauf gestoßen, wo dieser Modus überhaupt abgefragt wird. Nur in der beamerbaseoverlay.sty taucht handout nochmal auf, aber leider ohne if, sodass ich mir da nichts abschauen konnte.

Da hab ich gestern gar nicht erst nach gesucht, aber in beamerouterthemedefault.sty wird für handout die Navigationsleiste abgeschaltet. Darauf aufbauend könnte die Unterscheidung mit beamer-Boardmitteln etwa so aussehen:


\documentclass[handout]{beamer}
\newcommand*\checkmode{bar}
\only<handout>{\renewcommand*\checkmode{foo}}
\begin{document}
\frame{\checkmode}
\end{document}

weit eleganter, als sich um Dinge wie \beamer@currentmode selbst kümmern zu müssen.;)


edit: wer lesen kann, ist klar im Vorteil....Ich habe gerade gesehen, dass du dir "\handoutname" selbst definiert hast, aber wieso? Liegt das an der Funktionsweise von \ifx? Soweit ich gerade auf die Schnelle gelesen habe, funktioniert das nur wenn man Makro mit Makro vergleicht und nicht Makro mit Text. Stimmt das soweit?

Probiers aus, dann hast Du die Antwort darauf doch bereits.;-)

MfG

Tusor
10-08-2008, 09:03
Die Stelle in den Themes hatte ich gar nicht gefunden. Offenbar hat mich da die Suche nach enthaltenem Text im Stich gelassen.

Die Variante mit dem \ifx mag zwar komplizierter sein, aber hat den Vorteil, dass man damit auch mal andere Sachen machen kann.

mfg

Tusor

P.S.: meine Handouterstellung klappt mittlerweile super. Jetzt brauch ich einfach nur "handout" bei der Beamer-Klasse mit anzugeben und es kommt so raus, wie ich mir das vorstelle. Macht richtig Spaß:D