Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Querformat, pdfLaTex und thumbpdf

134 views
Skip to first unread message

Martin Wolf

unread,
Jan 14, 2001, 11:11:58 AM1/14/01
to
Hallo NG,

ich möchte in einem großen Dokument Tabellen im Querformat setzen.
Das klappte mit Hilfe der FAQ (Lob an die fleißigen Schreiber!!)
auch super, bis ich mit Hilfe des Paketes thumbpdf noch die
Thumbnail-Grafiken in die PDF-Ausgabe einbinden wollte. Es
erschienen alle der ersten Querformatseite folgenden Seiten
ebenfalls um 90° gedreht im AcrobatReader. Als Fehlerursache meine
ich herausgefunden zu haben, dass thumbpdf.sty die
\pdfpageattr-Token \global setzt. Wenn man die in der FAQ
angegebenen Befehle folgendermaßen erweitert, ist aber wieder alles
im Lot.

\makeatletter
\@ifundefined{pdfpageattr}
{}{%
\g@addto@macro{\landscape}{\pdfpageattr{/Rotate 90}}%
% Jetzt kommt die neue Zeile
\g@addto@macro{\endlandscape}{\global\pdfpageattr{/Rotate 0}}%
}
\makeatother

Das Problem, das ich jetzt noch habe: Wie bekomme ich die
entsprechenden Thumbnails auch im Querformat angezeigt?

Danke fürs Helfen

Martin

--
## ## Martin Wolf
#### # ## München, Germany
## ## ### ## <mar...@familiewolf.de>
## ### #### http://www.familiewolf.de

Heiko Oberdiek

unread,
Jan 14, 2001, 12:21:26 PM1/14/01
to
"Martin Wolf" <mar...@familiewolf.de> wrote:

>[...] bis ich mit Hilfe des Paketes thumbpdf noch die


>Thumbnail-Grafiken in die PDF-Ausgabe einbinden wollte. Es
>erschienen alle der ersten Querformatseite folgenden Seiten
>ebenfalls um 90° gedreht im AcrobatReader. Als Fehlerursache meine
>ich herausgefunden zu haben, dass thumbpdf.sty die
>\pdfpageattr-Token \global setzt. Wenn man die in der FAQ
>angegebenen Befehle folgendermaßen erweitert, ist aber wieder alles
>im Lot.
>
>\makeatletter
>\@ifundefined{pdfpageattr}
> {}{%
> \g@addto@macro{\landscape}{\pdfpageattr{/Rotate 90}}%
>% Jetzt kommt die neue Zeile
> \g@addto@macro{\endlandscape}{\global\pdfpageattr{/Rotate 0}}%
> }
>\makeatother

Nein, man muss leider erheblich mehr Aufwand
treiben und den Rotate-Eintrag aus
\pdfpageattr entfernen, da du sonst lediglich
die /Rotate-Eintraege vermehrst und die PDf-Datei
unnoetig aufblaest. Wie so etwas geht, kann man
z.B. in hyperref oder thumbpdf (\THB@AddPageAttr)
sehen.

>Das Problem, das ich jetzt noch habe: Wie bekomme ich die
>entsprechenden Thumbnails auch im Querformat angezeigt?

Die neue thumbpdf-Version 2.8, heute auf CTAN gekommen
enthaelt einen Ghostscript-Patch, der das Verhalten
der Ghostscript-Versionen 6.0* korrigiert.

Viele Gruesse
Heiko <ober...@ruf.uni-freiburg.de>

Martin Wolf

unread,
Jan 14, 2001, 4:25:19 PM1/14/01
to
Heiko Oberdiek <ober...@ruf.uni-freiburg.de> schrieb in im
Newsbeitrag: edn36to2vlg7s1vu4...@4ax.com...

> "Martin Wolf" <mar...@familiewolf.de> wrote:
> Nein, man muss leider erheblich mehr Aufwand
> treiben und den Rotate-Eintrag aus
> \pdfpageattr entfernen, da du sonst lediglich
> die /Rotate-Eintraege vermehrst und die PDf-Datei
> unnoetig aufblaest. Wie so etwas geht, kann man
> z.B. in hyperref oder thumbpdf (\THB@AddPageAttr)
> sehen.

ACK. Habe ich nachvollzogen. Ich habe den Mehraufwand getrieben. Der
funktionierende "Codeschnipsel" sieht jetzt mit Kommentaren so aus:

\makeatletter
% mit diesem Kommando k"onnen neue Tokens zu \pdfpageattr
hinzugef"ugt werden.
% der bestehende Inhalt bleibt unver"andert. Funktioniert auch bei
LaTeX,
% indem es dann nichts macht.
\newcommand{\addpdfpageattr}[1]{%
\ifx\pdfoutput\undefined%
\else%
\begingroup%

\edef\x{\endgroup\global\pdfpageattr{#1^^J\the\pdfpageattr}}%
\x%
\fi%
}
\@ifundefined{pdfpageattr}
{}{%
\def\l@RemRotAttr#1/Rotate#2#3#4^^J#5\END{%
\ifx\\#2\\%
\global\pdfpageattr{#1}%
\else
\l@RemRotAttr#1#5\END
\fi
}
\g@addto@macro{\landscape}{%
% eventuell vorhanden /Rotate Token entfernen.
% Rotate Token d"urfen nur mit \addpdfpageattr hinzugef"ugt
werden,
% sonst werden sie nicht erkannt!
\expandafter\l@RemRotAttr\the\pdfpageattr
/Rotate{}{}{}^^J\END\relax%
% und jetzt den 90 Grad Rotate hinzuf"ugen
\addpdfpageattr{/Rotate 90}%
}%
\g@addto@macro{\endlandscape}{
% den Rotatr Token wieder entfernen
\expandafter\l@RemRotAttr\the\pdfpageattr
/Rotate{}{}{}^^J\END
}%
}
\makeatother

Für die FAQ ist das vielleicht etwas lang, aber könnte man das nicht
in das Paket lscape integrieren?

>
> >Das Problem, das ich jetzt noch habe: Wie bekomme ich die
> >entsprechenden Thumbnails auch im Querformat angezeigt?
>
> Die neue thumbpdf-Version 2.8, heute auf CTAN gekommen
> enthaelt einen Ghostscript-Patch, der das Verhalten
> der Ghostscript-Versionen 6.0* korrigiert.

Super, jetzt funktioniert alles so, wie ich es mir wünsche!
thumbpdf ist Klasse! Danke für die Arbeit, Heiko. Und für die
schnelle Antwort.


Grüße

Heiko Oberdiek

unread,
Jan 15, 2001, 12:33:36 AM1/15/01
to
"Martin Wolf" <mar...@familiewolf.de> wrote:

>Heiko Oberdiek <ober...@ruf.uni-freiburg.de> schrieb in im
>Newsbeitrag: edn36to2vlg7s1vu4...@4ax.com...
>> "Martin Wolf" <mar...@familiewolf.de> wrote:
>> Nein, man muss leider erheblich mehr Aufwand
>> treiben und den Rotate-Eintrag aus
>> \pdfpageattr entfernen, da du sonst lediglich
>> die /Rotate-Eintraege vermehrst und die PDf-Datei
>> unnoetig aufblaest. Wie so etwas geht, kann man
>> z.B. in hyperref oder thumbpdf (\THB@AddPageAttr)
>> sehen.
>
>ACK. Habe ich nachvollzogen. Ich habe den Mehraufwand getrieben. Der
>funktionierende "Codeschnipsel" sieht jetzt mit Kommentaren so aus:

* Kommentierter Code ist immer gut :-)

Zwei nebensaechliche Hinweise:
* Zeilenlaenge: Ich habe gute Erfahrungen damit
gemacht, mich hier zu beschraenken:
* Auf dem Bildschirm kann man problemlos
zwei Code-Fenster mit vollstaendig
sichtbaren Zeilen nebeneinander setzen.
* Umbruchprobleme durch Newsclients
oder beim Ausdruck des Codes gibt es
erst gar nicht.
* Nicht falsch ist das Auskommentieren jeden Zeilenendes,
traegt aber nicht gerade zur Uebersichtlichkeit bei,
insbesondere nach Befehlsnamen ist es nicht noetig:
\ifx\foo\bar
\begingroup

> \ifx\pdfoutput\undefined%

Reicht nicht, wenn man auf PDF-Modus testen will,
sollte man dies alles testen:
\ifx\pdfoutput\undefined
% (z.B., wenn gar nicht pdfTeX laeuft)
\else
\ifx\pdfoutput\relax
% (z.B. nach vorigem \@ifundefined{pdfoutput})
\else
\ifcase\pdfoutput
% (pdfTeX: DVI-Modus)
\else
% Jetzt erst ist der PDF-Modus-Test positiv
\fi
\fi
\fi


> \def\l@RemRotAttr#1/Rotate#2#3#4^^J#5\END{%

Ein Scannen mit
#1/Rotate#2#3^^J#4\END
muesste reichen.

Beim /Rotate-Eintrag kann man sich ziemlich sicher
sein, dass das Argument eine Integer-Zahl ist
(eine Referenz macht nicht so viel Sinn).
Daher kann man den /Rotate-Eintrag auch entfernen
ohne vorher einen speziellen Ende-Marker, das
Zeilenende ^^J, eingefuehrt zu haben.
Um die Technik zu zeigen:

\makeatletter
% #1: 0, +/-90, +/-180, +/-270
\def\pdfpageRotate#1{%
% delete an existing /Rotate entry
\pdfpageRemoveRotate
% set the new /Rotate entry
\global\pdfpageattr\expandafter{%
\the\pdfpageattr
/Rotate #1%
}%
}
\def\pdfpageRemoveRotate{%
\begingroup
\global\pdfpageattr\expandafter{\expandafter}%
\expandafter\@pdfpageRemoveRotate
\the\pdfpageattr /Rotate\@nil
\endgroup
}
\def\@pdfpageRemoveRotate#1/Rotate#2\@nil{%
% append /Rotate free stuff to \pdfpageattr
\global\pdfpageattr\expandafter{\the\pdfpageattr#1}%
\ifx\\#2\\%
% ready, because the detected /Rotate is part of
% the end marker: /Rotate\@nil
\else
% first read in the argument of /Rotate,
% then continue parsing.
\afterassignment\@pdfpageRemoveRotate
\count0=#2\@nil
\fi
}
\makeatother

\pdfpageRemoveRotate entfernt einen /Rotate-Eintrag
aus \pdfpageattr, \pdfpageRotate fuegt einen /Rotate-
Eintrag an, nachdem ein eventueller voriger Eintrag
entfernt wurde. Beide Makros sind aber lediglich
als Low-level-Makros gedacht:
* Das Argument zu \pdfpageRotate muss die fertige
Zahl sein, darf jedoch kein Makro sein.
Laesst sich durch ein zusaetzliches \edef aber
umgehen:
\begingroup
\edef\x{%
\endgroup
\global\pdfpageattr...#1...}%
\x

* Was geschieht mit der Null, dem Default.
Als Default kann man dann den Eintrag weglassen:
\ifnum#1=0
\pdfpageRemoveRotate
\else
\pdfpageRotate{#1}%
\fi
Aber es ist auch folgende Situation denkbar:
Die Seiten eines Dokuments sind in der Mehrzahl
Landscape-Seiten, weshalb ein Eintrag in das
Pages-Objekt mit \pdfpagesattr gemacht wird,
Dann benoetigt man nur noch fuer die wenigen
Portrait-Seiten einen /Rotate-Eintrag der
den Wert aus dem Pages-Objekt mit dem Default
ueberschreibt.
Da pdfTeX fuer das Pages-Objekt den letzen
Wert von \pdfpagesattr nimmt, kennt man
den endgueltigen Wert nicht vor Ende des
Dokuments.

>Für die FAQ ist das vielleicht etwas lang, aber könnte man das nicht
>in das Paket lscape integrieren?

Eigentlich sind das Implementationsdatei spezifisch fuer
einen bestimmten Treiber. Man kann solche /Rotate-Eintraege
auch auf dem pdfmark(dvips)-Weg setzen. Leider sieht
weder das lscape-Paket, noch das graphics-Paket
irgendwelche Hooks in dieser Hinsicht vor, dass man den
Support sauber in den Treibern unterbringen koennte.

Als Moeglichkeit und zum Testen habe ich mal ein
Paket geschrieben, das anstelle von lscape geladen wird:

%%% cut %%% pdflscape.sty %%% cut %%%
% File: pdflscape.sty
% Version: 2001/01/15 v1.0
% Author: Heiko Oberdiek
% Email: <ober...@ruf.uni-freiburg.de>
%
% Copyright: Copyright (C) 2001 Heiko Oberdiek.
%
% This program may be distributed and/or modified under
% the conditions of the LaTeX Project Public License,
% either version 1.2 of this license or (at your option)
% any later version. The latest version of this license
% is in
% http://www.latex-project.org/lppl.txt
% and version 1.2 or later is part of all distributions
% of LaTeX version 1999/12/01 or later.
%
% Function: This package extends package `lscape' by
% adding the /Rotate attribute to output pdf
% pages, that are set in landscape format.
%
% Required: * The package `lscape' is loaded.
% * Supported drivers:
% * pdftex
% * dvips, ... (that define \Gin@PS@raw#1)
%
% Use: If the aim format is pdf, then replace
% package `lscape' by `pdflscape':
% \usepackage{pdflscape}
% Options: same as for `lscape'.
%
% History: 2001/01/15 v1.0:
% first public version,
% published in de.comp.text.tex.
%
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{pdflscape}
[2001/01/15 v1.0 Landscape Pages in PDF (HO)]
\DeclareOption*{\PassOptionsToPackage\CurrentOption{lscape}}
\ProcessOptions
\RequirePackage{lscape}

% Driver stuff:
% * \PLS@AddRotate#1
% it expects the correct rotation number in #1
% and implements the adding of the /Rotation entry
% in the /Page object of the current page.
% * \PLS@RemoveRotate
% it removes a previous /Rotate entry, if necessary.

% Detecting the driver
\def\PLS@temp#1{}%
\ifcase 0\ifnum 1=0\ifx\pdfoutput\@undefined\else
\ifx\pdfoutput\relax\else
\ifnum\pdfoutput>0 1\fi\fi\fi\space
1\else
\ifx\Gin@PS@raw\@undefined\else
\ifx\Gin@PS@raw\relax\else
\ifx\Gin@PS@raw\PLS@temp
\else
2\fi\fi\fi\fi
\relax
% case 0: no pdfTeX, no PostScript
\PackageError{pdflscape}{%
Neither pdfTeX nor PostScript driver found%
}\@ehc
\expandafter\endinput
\or
% case 1: pdfTeX
\def\PLS@AddRotate#1{%
\ifnum#1=0
% already the default
\else
\global\pdfpageattr\expandafter{%
\the\pdfpageattr
/Rotate #1%
}%
\fi
}
% Removes a /Rotate entry. It has to be called inside
% a group.
\def\PLS@RemoveRotate{%
\global\pdfpageattr\expandafter{\expandafter}%
\expandafter\PLS@@RemoveRotate
\the\pdfpageattr /Rotate\@nil
}
\def\PLS@@RemoveRotate#1/Rotate#2\@nil{%
% append /Rotate free stuff to \pdfpageattr
\global\pdfpageattr\expandafter{\the\pdfpageattr#1}%
\ifx\\#2\\%
% ready, because the detected /Rotate is part of
% the end marker: /Rotate\@nil
\else
% first read in the argument of /Rotate,
% then continue parsing.
\afterassignment\PLS@@RemoveRotate
\count0=#2\@nil
\fi
}
\or
% case 2: PostScript
\def\PLS@AddRotate#1{%
\ifnum#1=0
\else
\Gin@PS@raw{%
[{ThisPage}\string<\string</Rotate #1\string>\string>%
/PUT pdfmark%
}%
\fi
}%
\let\PLS@RemoveRotate\relax
\fi

% Driver independent stuff
%
% The landscape environment is extended by
% adding the correct /Rotate entries.
\g@addto@macro{\landscape}{\PLS@Rotate{90}}
\g@addto@macro{\endlandscape}{\PLS@Rotate{0}}

% Main macro, that sets the /Rotate entry.
% Argument: any TeX number or
% nothing, that means zero.
% Driver independent.
\def\PLS@Rotate#1{%
\begingroup
% 1. Check and validate the argument
\PLS@CheckAngle{#1}%
% 2. Delete an existing /Rotate entry
\PLS@RemoveRotate
% 3. Add /Rotate entry
\expandafter\PLS@AddRotate\expandafter{\the\count@}%
\endgroup
}

% Validates the rotation angle.
% The result is stored in the count register \count@.
% Driver independent.
\def\PLS@CheckAngle#1{%
% noting means zero:
\ifx\\#1\\%
\count@=0
\else
\count@=#1\relax
\fi
% normalise to interval -360 < \count@ < 360
\@whilenum\count@>359\do{\addtocounter\count@ -360 }%
\@whilenum\count@<-359\do{\addtocounter\count@ 360 }%
% check values: 0, +/-90, +/-180, +/-270
\ifnum 1=0\ifnum\count@=0 \else
\ifnum\count@=90 \else
\ifnum\count@=-90 \else
\ifnum\count@=180 \else
\ifnum\count@=-180 \else
\ifnum\count@=270 \else
\ifnum\count@=-270 \else
1\fi\fi\fi\fi\fi\fi\fi\relax
\PackageError{pdflscape}{%
Invalid value \the\count@\space for /Rotate%
}\@ehc
\count@=0
\fi
}
\endinput
%%% cut %%% pdflscape.sty %%% cut %%%

Viele Gruesse
Heiko <ober...@ruf.uni-freiburg.de>

Martin Wolf

unread,
Jan 16, 2001, 6:10:03 AM1/16/01
to
Heiko Oberdiek <ober...@ruf.uni-freiburg.de> schrieb in im
Newsbeitrag: gs156t0fdim4qrpar...@4ax.com...

[viel Interessantes und ein super Paket gesnippt]

Hallo Heiko,

vielen Dank zunächst für das Paket pdflscape! Funktioniert wirklich
super! Allerdings verstehe ich nicht ganz, wie du es schaffst, mit
einem Parameter für den Rotationswinkel auszukommen, bei mir hat er
z. B. 90 immer auf #2=9 #3=0 verteilt. Deshalb hatte ich auch
#2#3#4, um 180 und 270 auch noch aufnehmen zu können.

Kommt das Paket auch auf CTAN? Es wäre die einfache Lösung für den
jetzt in def FAQ angegebenen Weg, der ja zusammen mit thumbpdf nicht
funktioniert.

BTW: Gibt es ein Buch, wo man mehr über die Programmierung mit
(La)TeX lernen kann? Was ich bisher mache, ist halt
learning-by-doing und spicken bai anderen Paketen nebst
verzweifeltem Suchen in FAQs und anderer Dokumentation, wenn ich mal
wieder einen Befehl nicht kenne.

Mit besten Grüßen

Heiko Oberdiek

unread,
Jan 16, 2001, 9:25:42 AM1/16/01
to
"Martin Wolf" <mar...@familiewolf.de> wrote:

>Heiko Oberdiek <ober...@ruf.uni-freiburg.de> schrieb in im
>Newsbeitrag: gs156t0fdim4qrpar...@4ax.com...
>
>[viel Interessantes und ein super Paket gesnippt]
>
>Hallo Heiko,
>
>vielen Dank zunächst für das Paket pdflscape! Funktioniert wirklich
>super! Allerdings verstehe ich nicht ganz, wie du es schaffst, mit
>einem Parameter für den Rotationswinkel auszukommen, bei mir hat er
>z. B. 90 immer auf #2=9 #3=0 verteilt. Deshalb hatte ich auch
>#2#3#4, um 180 und 270 auch noch aufnehmen zu können.

In deinem Fall: /Rotate#2#3#4^^J
hast du ja einen Begrenzer: ^^J
Dadurch reicht ein Parameter, der alles bis zu ^^J
bekommt:
/Rotate#2^^J
und dann auch mit -180 etc. zurechtkommt.

In meinem Fall komme ich sogar ohne Begrenzer
aus, da ich TeX die Zahl gleich als Zahl einlesen
lasse:
\def\PLS@@RemoveRotate#1/Rotate#2\@nil{%
...
\afterassignment\PLS@@RemoveRotate
\count0=#2\@nil
...
}
Dabei wird die Zahl, die nach /Rotate kommt und
alles weitere in #2 abgelegt. \count0 liest die
Zahl ein, da dies in einer Gruppe geschieht,
wird die Seitenzahl letztendlich nicht ueberschrieben.
Durch \afterassignment wird zur Weiterverarbeitung
des Rests das Makro \PlS@@RemoveRotate eingeschmuggelt.

>Kommt das Paket auch auf CTAN? Es wäre die einfache Lösung für den
>jetzt in def FAQ angegebenen Weg, der ja zusammen mit thumbpdf nicht
>funktioniert.

Wie ich schon erwaehnt hatte, gibt es viele Moeglichkeiten,
diesen Code irgendwo einzubauen (lscape, pdftex.def, pdflscape).
Ich hatte daher noch gewartet fuer den Fall, dass jemand
noch Vorschlaege oder Ideen hat.
So werde ich das Paket wohl heute abend oder Ende der Woche
auf CTAN stellen.

>BTW: Gibt es ein Buch, wo man mehr über die Programmierung mit
>(La)TeX lernen kann? Was ich bisher mache, ist halt
>learning-by-doing und spicken bai anderen Paketen nebst
>verzweifeltem Suchen in FAQs und anderer Dokumentation, wenn ich mal
>wieder einen Befehl nicht kenne.

Viele Buecher sind in der FAQ erwaehnt, wie z.B.
die "Bibel" von D.E.Knuth: "The TeXbook".

Viele Gruesse
Heiko <ober...@ruf.uni-freiburg.de>

Heiko Oberdiek

unread,
Feb 4, 2001, 1:13:54 PM2/4/01
to
Heiko Oberdiek <ober...@ruf.uni-freiburg.de> wrote:

>>Kommt das Paket auch auf CTAN? Es wäre die einfache Lösung für den
>>jetzt in def FAQ angegebenen Weg, der ja zusammen mit thumbpdf nicht
>>funktioniert.
>

>[...]


> So werde ich das Paket wohl heute abend oder Ende der Woche
>auf CTAN stellen.

Es dauerte zwar etwas laenger, aber jetzt ist pdflscape.sty
im /incoming-Verzeichnis von CTAN gelandet.

Viele Gruesse
Heiko <ober...@ruf.uni-freiburg.de>

0 new messages