Daumenkino in Fußzeile

Layout von Seiten, Rändern, Fusszeilen, usw, modifizieren


kFieLd
Forum-Anfänger
Forum-Anfänger
Beiträge: 13
Registriert: Mi 18. Feb 2009, 10:18

Daumenkino in Fußzeile

Beitrag von kFieLd »

Hallo zusammen,

ich würde gerne in meiner Diplomarbeit ein kleines Daumenkino in der Fußzeile einfügen. Dazu habe ich hier schon was gefunden.
Jedoch möchte ich nicht für jede Seite eine eigene Grafik erstellen, sondern nur, sagen wir 4 Bildchen, die nacheinander wiederholt werden.

Dazu habe ich mir eine modulo-Rechnung in Latex programmiert. Jedoch funktioniert die Referenzierung nicht in den geschweiften Klammern bei \includegraphics{}. pdflatex expandiert die Variablen offensichtlich nicht richtig.

Hier mal mein Minimalbeispiel:
\documentclass{scrreprt}
\usepackage{scrpage2}
%Kopfzeilen anzeigen
\pagestyle{scrheadings}

\usepackage{graphicx}

%Einfache Berechnungen mit Latex
\usepackage{calc}
 
%\modulo{a}{b}: Berechnet a mod b
\newcounter{a} \newcounter{b} \newcounter{erg}

\newcommand{\modulo}[2]{%
\setcounter{a}{#1}%
\setcounter{b}{#2}%
\setcounter{erg}{\thea / \theb}%
\setcounter{erg}{\theerg * \theb}%
\setcounter{erg}{\thea - \theerg}%
\theerg%
}

%Daumenkino in der Fußzeile

%Hiermit wird richtigerweise kino1 - kinoX in die Fußzeile geschrieben
\ofoot{{{kino\modulo{\thepage}{4}.pdf}}}

%Hier klappt die Refernzierung leider nicht
\ofoot{\includegraphics{kino\modulo{\thepage}{4}.pdf}}


\begin{document}

a\newpage
b\newpage
c\newpage
d\newpage
e\newpage
f\newpage

\end{document}
Ich denke, es liegt an meinem \modulo-Kommando. Leider kenne ich mich mit LateX-Programmierung nicht aus.

Hoffentlich kann mir hier jemand einen Tipp geben.

Viele Grüße,
kFieLd

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Zunächst sei erwähnt, dass man nicht mit \the<Zähler> rechnen sollte. Das ist nämlich bereits die Darstellung des Zähler, nicht dessen Wert. Der Wert eines Zählers ist \value{Zähler}.

Dann sei noch erwähnt, dass es ein grundsätzliches Problem mit \includegraphics im Kopf oder Fuß gibt. graphicx definiert leider diverse Variablen global, wertet diese dann aus, was dann zur Ausgabe führt. Diese Ausgabe wiederum kann noch bevor die eigentliche Ausgabe erfolgt dazu führen, dass eine neue Seite begonnen wird. Hat man dann eine \includegraphics-Anweisung im Kopf, so kommen sich die Variablendefinitionen gegenseitig ins Gehege. Besser wäre es deshalb die vier Abbildungen in vier Boxen abzulegen und diese dann in den Kopf zu setzen. hier zunächst einmal eine Lösung, ohne diesen Zusatz:
\newcommand*{\Dateiname}{}% reserveren, weil wir gleich \edef verwenden
\newcommand*{\kino}[1]{\edef\Dateiname{kino#1}\includegraphics{\Dateiname}}
\ofoot{\kino{\the\numexpr\value{page}-4*(\numexpr(\value{page}+1) / 4\relax-1)\relax}}
Dabei wird mit \numexpr ein e-TeX-Feature verwendet. Das sollte aber kein Problem sein, da e-TeX seit Jahren als Unterbau für LaTeX empfohlen ist und KOMA-Script sich inzwischen ebenfalls darauf verlässt. \edef wird an der Stelle verwendet, um in \Dateiname bereits den fertigen Namen zu haben und nicht noch irgendwelche Anweisungen.

Nun die Lösung, die vier Boxregister verbraucht und deshalb so nur für eine sehr kleine Anzahl an Abbildungen brauchbar ist:
\newsavebox\kinoA
\newsavebox\kinoB
\newsavebox\kinoC
\newsavebox\kinoD
\savebox\kinoA{\includegraphics{kino1}}
\savebox\kinoB{\includegraphics{kino2}}
\savebox\kinoC{\includegraphics{kino3}}
\savebox\kinoD{\includegraphics{kino4}}
\newcommand*{\Dateiname}{}% reserveren, weil wir gleich \edef verwenden
\makeatletter
\newcommand*{\kino}[1]{%
  \@tempcnta#1
  \usebox{\@nameuse{kino\@Alph\@tempcnta}}%
}
\makeatother
\ofoot{\kino{\numexpr\value{page}-4*(\numexpr(\value{page}+1) / 4\relax-1)\relax}}
Der Haupttrick dabei ist, über den temporären Zählerregister \@tempcnta un dmit Hilfe von \@Alph (so etwas ähnliches wie \Alph für Zähler) aus den Zahlen 1 bis 4 die Buchstaben A bis D zu machen und über \@nameuse daraus dann die Boxregister-Namen \kinoA bis \kinoB zu erzeugen. Die Definition von \kino könnte man auch so machen (das nun ungetestet):
\newcounter{kino}
\makeatletter
\newcommand*{\kino}[1]{%
  \setcounter{kino}{#1}%
  \usebox{\@nameuse{kino\Alph{kino}}}%
}
\makeatother

kFieLd
Forum-Anfänger
Forum-Anfänger
Beiträge: 13
Registriert: Mi 18. Feb 2009, 10:18

Beitrag von kFieLd »

Wow, vielen Dank KOMA für die Lösungsvorschläge!

Der erste Vorschlag mit dem \edef funktioniert soweit. Der Zweite scheint mir doch etwas umständlicher, insbesondere wenn ich später doch mal 20 Bildchen im Daumenkino haben möchte.
KOMA hat geschrieben: Dann sei noch erwähnt, dass es ein grundsätzliches Problem mit \includegraphics im Kopf oder Fuß gibt. graphicx definiert leider diverse Variablen global, wertet diese dann aus, was dann zur Ausgabe führt. Diese Ausgabe wiederum kann noch bevor die eigentliche Ausgabe erfolgt dazu führen, dass eine neue Seite begonnen wird. Hat man dann eine \includegraphics-Anweisung im Kopf, so kommen sich die Variablendefinitionen gegenseitig ins Gehege. Besser wäre es deshalb die vier Abbildungen in vier Boxen abzulegen und diese dann in den Kopf zu setzen.
Könntest du das evtl. noch etwas genauer erklären? Ich hab nämlich noch ein zweites Logo in der Fußzeile per \includepraphics eingefügt.

Hab ich das richtig verstanden, dass dadurch unter Umständen eine leere Seite eingefügt werden kann? Wenn ja, wann genau? In meinem bisherigen Dokument (ca. 30 Seiten) hab ich bisher keine Probleme entdeckt.

Ich muss zugeben, so tief bin ich noch nicht in der Latex-Materie, aber willig zu lernen :)

Danke,
kFieLd

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Nicht ganz. Wenn man \includegraphics im Kopf (oder auch im Fuß) der Seite verwendet, dann können sich die Argumente dieser Anweisung mit denen anderer \includegraphics-Anweisungen vermischen. Es kann also sein, dass irgendwo eine falsche Abbildung oder in falscher Größe oder Ausrichtung oder mit falschem Clipping gesetzt wird. Der Trick mit den Box-Registern ist nun, dass bei \savebox\BOX{foo} foo nicht erst expandiert (ausgeführt) wird, wenn die Box mit \usebox\BOX verwendet wird, sondern bereits, wenn die Box mit \savebox gespeichert wird. Damit ist das Problem dann beseitigt.

Wenn man viele Boxregister benötigt, kann man trotzdem diese Lösung verwenden. Man kann sich beispielsweise dann ein Makro schreiben, das eine ganze Reihe an Boxregistern anfordert (ungetestet):
\makeatletter
\newcommand*{\NewSaveBoxes}[2]{%
  \@tempcnta 1
  \@whilenum \@tempcnta<#2 \do{%
    \expandafter\newsavebox\csname #1\the\@tempcnta\endcsname
    \advance\@tempcnta 1
  }%
}
\NewSaveBoxes{kino}{20}
\@tempcnta 1
\@whilenum \@tempcnta<#2 \do{%
  \expandafter\savebox\csname kino\the\@tempcnta\endcsname{%
    \includegraphics{kino\the\@tempcnta}%
  }%
  \advance\@tempcnta 1
}%
\makeatother
Das sollte die Boxregister \kino1 bis \kino20 mit den Bildern kino1 bis kino20 füllen. Ähm, Anfänger nehmen vermutlich besser die while-Geschichte aus dem ifthen-Paket und einen eigenen Zähler, den man dann mit \stepcounter hochzählen kann, an Stelle des Zählerregisters \@tempcnta.

Damit einem dabei dann nicht die Boxregister ausgehen, sollte man noch
\usepackage{etex}
verwenden.

Achso: Das Problem mit graphicx ist bekannt und befindet sich auch schon seit langem in der "bugs database" des LaTeX-Projects.

oliverinspace
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 72
Registriert: Do 1. Jan 2009, 14:05

Re: Daumenkino in Fußzeile

Beitrag von oliverinspace »

kFieLd hat geschrieben:Hallo zusammen,

ich würde gerne in meiner Diplomarbeit ein kleines Daumenkino in der Fußzeile einfügen...
Ich denke auch wenn ihr schon fast die Lösung für das gesamte Problem gefunden habt muss ich hier mal den mahnenden Zeigefinger auspacken.
Überleg dir was du da machst. Da ich auch gerade am Schreiben meiner Diplomarbeit sitze kann ich das nachvollziehen. Man will was spezielles, was ganz besonderes machen, aber du musst auch versuchen keinen Kitsch einzubauen.

Ich weiss auch dass mein Professor nicht sehr glücklich darüber wäre, wenn ich meine wissenschaftliche Ausarbeitung mit nem Comic schmücke. Also vllt überlegst du selbst nochmal ob du das machen willst, bzw. suchst dir eine dritte Person die zu einer entsprechenden Meinung fähig ist (sollte also nicht gerade die Kindergärtnerin von deiner kleinen Schwester sein) und sprichst deine "Innovation" mit der durch.

Wenn einer meiner Kommilitonnen zu mir mit dieser Idee käme, würde ich sagen dass ich es nicht in einem wissenschaftlichen Artikel o.ä. angebracht finde.

Soll kein persönlicher Angriff sein, sondern soll nur zum Nachdenken anregen.
*stecke in meiner Diplomarbeit**

kFieLd
Forum-Anfänger
Forum-Anfänger
Beiträge: 13
Registriert: Mi 18. Feb 2009, 10:18

Beitrag von kFieLd »

Danke KOMA für die Hinweise. Hab jetzt eine lauffähige Version gebastelt:
\documentclass{scrreprt}
\usepackage{scrpage2}
%Kopfzeilen anzeigen
\pagestyle{scrheadings}

\usepackage{graphicx}


%%%Daumenkino Start%%%%

%%%%Variablen%%%

\newcommand*{\AnzBilder}{4}              %<--Variablen anpassen
\newcommand*{\KinoPfad}{daumenkino/kino} %<--Variablen anpassen

%%%%Quelltext%%%
\newcommand*{\SafeboxName}{sbKino}

\usepackage{etex}

\makeatletter

%Erzeugt neue Saveboxen und füllt sie mit includegraphics-Anweisungen
%Aufruf: \NewSaveBoxes{sbKino}{5}{daumenkino/kino}
\newcommand*{\NewSaveBoxes}[3]{%
  \@tempcnta 1
  \@whilenum \@tempcnta< \numexpr(#2+1) \do{%
    %Savebox anlegen
    \expandafter\newsavebox\csname #1\the\@tempcnta\endcsname
    %Savebox mit Leben füllen
    \expandafter\savebox\csname #1\the\@tempcnta\endcsname{%
      \includegraphics{#3\the\@tempcnta}%
    }%
    \advance\@tempcnta 1
  }%
}

%Berechne (Aktuelle_Seitenzahl modulo Anzahl_Kino_Bilder)
\newcommand*{\bildnr}{\numexpr\value{page}-\AnzBilder*(\numexpr(\value{page}+1) / \AnzBilder\relax-1)\relax}

\newcommand*{\daumenkino}{%
  \usebox{\@nameuse{\SafeboxName\the\bildnr}}%
}

\makeatother
\NewSaveBoxes{\SafeboxName}{\AnzBilder}{\KinoPfad}
%%%%%%%%%%%%%%%%

%%%Aufruf%%%%%%%
\ofoot{\daumenkino} %<-- Eigentlicher Aufruf für Fußzeile

%%%Daumenkino Ende%%%%%


\begin{document}

a\newpage
b\newpage
c\newpage
d\newpage
e\newpage
f\newpage


\end{document}
Viele Grüße,
kFieLd

kFieLd
Forum-Anfänger
Forum-Anfänger
Beiträge: 13
Registriert: Mi 18. Feb 2009, 10:18

Re: Daumenkino in Fußzeile

Beitrag von kFieLd »

oliverinspace hat geschrieben: Soll kein persönlicher Angriff sein, sondern soll nur zum Nachdenken anregen.
Du hast natürlich Recht. Es war auch erstmal eine Idee, deren Umsetzung mich gereizt hat.
Da du ja gerade selber mit deine Diplomarbeit dran bist, kannst du vielleicht nachvollziehen, dass ich mal was anderes zwischendurch machen möchte, um mich etwas abzulenken.
Ich weiß auch, dass ich diese Zeit trotzdem besser in die Bearbeitung der DA hätte investieren müssen :roll:

Endgültig hab ich mich noch nicht entschieden, ob ich dieses Daumenkino wirklich einbauen werde.

Viele Grüße,
kFieLd

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

kFieLd hat geschrieben:Hab jetzt eine lauffähige Version gebastelt:
Ich sehe, Du hast das Prinzip verstanden. Freut mich!

Kai Neumann

Beitrag von Kai Neumann »

Hallo Zusammen,

ich schreibe derzeit meine Dissertation und war auch auf der Suche, wie ich eine Art Daumenkino erstelle.
Vielen Dank für das ausführliche Beispiel hier.

Ich hatte leider das Problem, dass ich nicht nur vier Bilder, sondern sechs brauchte. Dabei gab es ein Problem mit der Modulo-Rechnung, welche meiner Meinung nach falsch implementiert war.

Meine Lösung (getestet und funktioniert mit sechs Bildern) ist, das Paket intcalc zu nutzen und von dort die Funktion intcalcMod:
...
\usepackage{intcalc}
...
\newcommand*{\bildnr}{\numexpr\intcalcMod{\numexpr\value{page}}{\numexpr\AnzBilder}\relax}
...
Also nochmals vielen Dank!
Vielleicht kann dieser Beitrag ja dem Nächsten helfen, der auch mehr als vier Bilder benötigt!

Starship

Beitrag von Starship »

Hallo Kai,

ich würde mir Deine Lösung gerne abgucken (ebenfalls für eine Dissertation), aber mir ist nicht ganz klar, welche Zeilen durch deine beiden ersetzt werden können.

könntest Du vielleicht auch ein komplettes Minimalbeispiel liefern?

Vielen Dank,
Christian

Antworten