% \CheckSum{455} % \iffalse^^A meta-comment % ====================================================================== % pfarrei.dtx % Copyright (c) 2013 Markus Kohm % komascript at gmx info % % This work may be distributed and/or modified under the conditions of % the LaTeX Project Public License, version 1.3c of the license. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3c or later is part of all distributions of LaTeX % version 2005/12/01. % % This work has the LPPL maintenance status `unmaintained'. % % This package is currently unmaintained. % % This work consists of the files `README' and `pfarrei.dtx'. % % If you're missing the installation batch file `pfarrei.ins', try % tex pfarrei.dtx % to unpack all files. % The package documentation may be produced repeating % pdflatex pfarrei.dtx % at least three times. % ---------------------------------------------------------------------- % pfarrei.dtx % Copyright (c) 2013 Markus Kohm % komascript at gmx info % % Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz, % Version 1.3c. % Die neuste Version dieser Lizenz ist % http://www.latex-project.org/lppl.txt % und Version 1.3c ist Teil aller Verteilungen von LaTeX % Version 2005/12/01. % % Dieses Wert hat den LPPL-Verwaltungszustand `unmaintained' (verwaltet). % % Autor dieses Werkes ist Markus Kohm. % % Das Werk besteht aus den Dateien `README' und `pfarrei.dtx'. % % Falls Sie die Installations-Batch-Datei `pfarrei.ins' vermissen, % probieren Sie einfach einmal % tex pfarrei.dtx % um alle Dateien auszupacken. % Die Anleitung erhalten Sie durch dreimalige Ausführung von: % pdflatex pfarrei.dtx % ====================================================================== % \fi^^A meta-comment % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % \iffalse^^A meta-comment %<*dtx|tex> \begingroup \def\revisiondate$#1: #2-#3-#4 #5${% \gdef\pfarreirevisiondate{#2/#3/#4}% }\revisiondate$Date: 2023-11-22 20:54:26 +0200 (Mi, 22. Nov 2023) $ \def\revision$#1: #2 #3${% \gdef\pfarreirevision{#2}% }\revision$Revision: 37 $ \endgroup %<*dtx> \def\LaTeXformat{LaTeX2e} \ifx\fmtname\LaTeXformat \makeatletter \let\saved@@end\@@end \def\@@end{\csname fi\endcsname\saved@@end} \makeatother \ProvidesFile{pfarrei.dtx} % %\ProvidesPackage{pfarrei} %\ProvidesFile{a5toa4.tex} [\pfarreirevisiondate\space r\pfarreirevision\space LaTeX2e package (for pastors)] % %<*driver> \documentclass{ltxdoc} \usepackage[english,ngerman]{babel} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{hypdoc} \newcommand*{\StartBlock}[1][2]{% \bigskip\nobreak\vskip#1\baselineskip\pagebreak[1]\vskip-#1\baselineskip \nobreak\noindent } \CodelineIndex \RecordChanges \GetFileInfo{pfarrei.dtx} \begin{document} \title{Das Pfarrei-Paket\footnote{% \protect\foreignlanguage{english}{Sorry if you don't understand German, but currently there's only a German manual, because the idea of this is from a German article at ``Die \TeX nische Komödie''. But at least you may try to call ``\texttt{a5toa4 --help}'' to get some useful information.% }% }% } \date{\filedate\footnote{Version \fileversion}} \author{Markus Kohm\footnote{komascript at gmx info}} \maketitle \DocInput{pfarrei.dtx} \PrintChanges \PrintIndex \end{document} % %<*dtx> \fi % %<*insfile> \def\batchfile{pfarrei.dtx} \input docstrip.tex \ifToplevel{% \keepsilent \askforoverwritefalse } \let\MetaPrefix\relax \declarepreamble\rawpreamble Copyright (c) 2013 Markus Kohm komascript at gmx info This file was generated from file(s) of the work `pfarrei'. ------------------------------------------------------------------ It may be distributed under the conditions of the LaTeX Project Public License in the version distributed together with the work `pfarrei'. You may however distribute the work `pfarrei' without all such generated files. See also for additional information. This work has the LPPL maintenance status `unmaintained'. This package is currently unmaintained. The list of files belonging to the work `pfarrei' is given in the file `pfarrei.dtx'. \endpreamble \let\MetaPrefix\DoubleperCent \edef\texpreamble{\rawpreamble} \generate{% \usepreamble\texpreamble \file{pfarrei.sty}{% \from{pfarrei.dtx}{package,tex}% }% \file{a5toa4.tex}{% \from{pfarrei.dtx}{a5toa4,tex}% }% } \ifToplevel{% \generate{% \usepreamble\texpreamble \file{pfarrei.ins}{% \from{pfarrei.dtx}{insfile,tex}% }% }% } \def\MetaPrefix{--} { { \catcode`\#=11 \gdef\Hash{#}% } \xdef\luapreamble{\Hash!/usr/bin/env texlua^^J% ^^J% \rawpreamble} } \declarepostamble\luapostamble \endpostamble \generate{% \usepreamble\luapreamble\usepostamble\luapostamble \file{a5toa4.tlu}{% \from{pfarrei.dtx}{a5toa4,lua}% }% \file{pfarrei.tlu}{% \from{pfarrei.dtx}{pfarrei,lua}% }% } \ifToplevel{% \Msg{+-------------------------------------------------------------------} \Msg{| To finish the installation copy the files into a TEXMF tree:} \Msg{| \space\space a5toa4.tlu --> scripts/pfarrei/a5toa5.tlu} \Msg{| \space\space pfarrei.tlu --> scripts/pfarrei/pfarrei.tlu} \Msg{| \space\space a5toa4.tex --> tex/latex/pfarrei/a5toa4.tex} \Msg{| \space\space pfarrei.sty --> tex/latex/pfarrei/pfarrei.sty} \Msg{| If you are not using Windows, you should also copy a5toa4.tlu} \Msg{| to the binary directory of your TeX distribution and rename} \Msg{| it into a5toa4.} \Msg{| If you are using MiKTeX 2.9, you should rename file pfarrei.tlu} \Msg{| into a5toa4.tlu, because the outdated texlua of MiKTeX 2.9 doesn't} \Msg{| search for modules like the current vanilla version of texlua.} \Msg{| If you are using Windows, you should make a copy of runscript.exe} \Msg{| (TeX Live) resp. runtexlua.exe (MiKTeX) at the binary directory} \Msg{| of your TeX distribution and rename it into a5toa4.exe.} \Msg{+-------------------------------------------------------------------} } % %<*dtx|doc> \csname endinput\endcsname % \fi^^A meta-comment % % \begin{abstract} % In "`Die \TeX nische Kömdie"', Ausgabe 1/2013 hat Christian Justen über % seinen Einsatz von \LaTeX{} im Pfarrdienst berichtet. Einige der von ihm % verwendeten bash-Scripte und seine Schilderungen dazu haben mich % inspiriert, eine Sammlung zu beginnen, die entsprechende Dinge leisten. % Allerdings habe ich mich entschlossen, keine bash-Script zu verwenden, % sondern die Funktionalität derselben in lua-Scripte für die Ausführung mit % \TeX Lua zu realisieren, da \TeX Lua inzwischen Bestandteil aller % \TeX-Distributionen ist. Somit wurde das ganze besser vom Betriebssystem % unabhängig. % % Ergänzt habe ich das ganze durch einige Befehle und Umgebungen, die für % die Erstellung von Lied- und Gebetsheftchen für den Gottesdienst % praktisch sein könnten. Jedenfalls habe ich selbst Nutzen daraus % gezogen. Weiteres ist geplant. % \end{abstract} % % \tableofcontents % % \section{Die Skripte-Seite} % \label{sec:skripte} % % In besagtem Artikel wurden zwei Skripte, "`\texttt{a5toa}4"' und % "`\texttt{a5toa4bogen}"' vorgestellt. Beide erzeugen aus PDF-Dateien, die im % A5-Format vorliegen, neue PDF-Dateien im A4-quer-Format. % % Das erste, "`a5toa4", arrangiert die A5-Seiten dabei so, dass jeweils zwei % aufeinander folgende A5-Seiten nebeneinandern ausgegeben werden. Das ist vor % allem dann praktisch, wenn man nur einseitig druckt und die Seiten später % geteilt werden sollen. Im folgenden wird diese Ausgabe \emph{side-by-side} % genannt. % % Das zweite, "`a5toa4bogen"', erzeugt hingegen ein sogenanntes Booklet. Dabei % werden die Seiten so angeordnet, dass nach dem beidseitigen Druck, der ganze % Stapel nur noch in der Mitte geknickt werden muss, um eine Art Heft zu % erhalten. Daher wird für diese Ausgabe im Weiteren die Bezeichnung % \emph{booklet} verwendet. % % \StartBlock%^^A % Ich\marginpar{\raggedleft\texttt{a5toa4.tlu}} dachte mir, das könne man in % ein einziges Programm gießen. Dieses heißt bei mir dann schlicht % "`a5toa4.tlu"'. Bei optimaler Installation kann es auch als "`a5toa4"' % angesprochen werden. % % Ruft\marginpar{\raggedleft\texttt{-{}-version}} man das Programm mit der % Option "`\texttt{-V}"' oder "`\texttt{-{}-version}"' auf, so gibt es lediglich % eine Versionsinformation aus. % % Beim\marginpar{\raggedleft\texttt{-{}-help}} Aufruf mit Option % "`\texttt{-h}"' oder "`\texttt{-{}-help}"' wird hingegen eine ausführliche % Hilfe zu den Aufrufmöglichkeiten und den Optionen ausgegeben. % % Man\marginpar{\raggedleft\texttt{-{}-booklet}\\\texttt{-{}-sidebyside}} kann % es aber auch mit einer Reihe von Durchführungsoptionen und Namen von % PDF-Dateien aufrufen. In diesem Fall wird entweder eine booklet- oder eine % side-by-side-Ausgabe erzeugt. Die Wahl, ob eine booklet- oder eine % side-by-side-Ausgabe erfolgen soll, erfolgt über die Optionen % "`\texttt{-b}"' oder "`\texttt{-{}-booklet}"' für booklet % bzw. "`\texttt{-s}"' oder "`\texttt{-{}-sidebyside}"' für % side-by-side. Voreingstellt ist die side-by-side-Ausgabe. % % Für die Durchführung wurde auch ein Verbesserungsvorschlag von Christian % Justen selbst aufgegriffen. Bei ihm haben die Skripte mit einer % Zwischendateien mit dem festen Namen "`\texttt{cj.tmp}"' gearbeitet. Im % Extramfall konnte dies dazu führen, dass Dateien unerwünscht überschrieben % und so vernichtet wurden. % % In meiner Fassung als texlua-Skript wird mit einem temporären Verzeichnis im % aktuellen Arbeitsverzeichnis gearbeitet. Darin wird eine temporäre % \LaTeX-Datei erzeugt und alle Ausgabedateien eines PDF\LaTeX-Laufs % abgelegt. Das PDF-Ergebnis des PDF\LaTeX-Laufs wird dann wieder in das noch % immer aktuelle Arbeitsverzeichnis kopiert. Im Normalfall wird dabei der % Basisname (also ohne Extension) der Ursprungsdatei je nachdem, was erzeugt % wurde, entweder um "`\texttt{-booklet.pdf}"' oder % "`\texttt{-sidebyside.pdf}"' ergänzt. Auch dies ist eine Abweichung von % Christian Justens Original-Skripten, bei denen immer die Ursprungsdatei vom % Ergebnis überschrieben wurde. % % Ein\marginpar{\raggedleft\texttt{-{}-overwrite}} Überschreiben der % Ursprungsdatei wie bei Christian Justens Original-Skripten kann man aber % alternativ ebenfalls erreichen, indem man Option "`\texttt{-o}"' oder % "`\texttt{-{}-overwrite}"' angibt. Nach erfolgreichem PDF\LaTeX-Lauf und dem % Kopieren des Ergebnisses ins aktuelle Arbeitsverzeichnis, wird das temporäre % Verzeichnis samt Inhalt wieder gelöscht. % % Eine weitere Änderung bei mir betrifft die Tatsache, dass man für die % Verarbeitung mehrerer Dateien nicht mehrere Aufrufe benötigt, man kann auch % in einem Aufruf beliebig oft Optionen und Dateien hintereinander anfügen, % die dann nacheinander verarbeitet werden. So würde beispielsweise mit dem % Aufruf: % \begin{verbatim} % a5toa4 -b foo.pdf -s bar.pdf -o bum.pdf % \end{verbatim}\unskip\ignorespaces % sowohl "`\texttt{foo-booklet.pdf}"' als auch "`\texttt{bar-sidebyside.pdf}"' % erzeugt und anschließend "`\texttt{bum.pdf}"' durch eine % side-by-side-Fassung von sich selbst überschrieben werden. % % Es ist zu beachten, dass nach jeder erzeugten Datei die % Überschreibeinstellung von Option "`\texttt{-o}"' oder % "`\texttt{--overwrite}"' aus Sicherheitsgründen wieder aufgehoben wird. Will % man also mehrere Dateien nacheinander bearbeiten und bei mehreren davon soll % die Ursprungsdatei überschrieben werden, so ist vor jeder dieser Dateien die % Option erneut zu setzen. % % Tatsächlich\marginpar{\raggedleft\texttt{pfarrei.tlu}} ist % "`\texttt{a5toa4.tlu}"' aber nur ein Wrapper für % "`\texttt{pfarrei.tlu}"'. Das wurde deshalb so gemacht, damit das % eigentliche Programm leichter durch Versionen in \texttt{TEXMFLOCAL} oder % \texttt{TEXMFHOME} ersetzt werden kann, ohne dass jedes Mal das % \emph{Binary} ersetzt werden muss. % % Eine letzte kleine Änderung meiner Fassung betrifft die Anforderungen an das % Seitenformat der Quelldateien. Im Original wurde mit der \texttt{pdfpages} % Option \texttt{noautoscale} gearbeitet. Damit wurden die Seiten der % Quelldatei nicht an das Seitenformat der Zieldatei angepasst. War die % Quelldatei also nicht im Format A5, sondern beispielsweise A6, dann wurden % zwei A6-Seiten auf einer A4-quer-Seite platziert. War die Quelldatei im Format % A4, passten ihre Seiten nicht einmal auf die A4-quer-Seite. Ich habe diese % Option daher weggelassen. Nun werden die Seiten der Quelldatei automatisch % ins A5-Format gebracht, bevor sie auf der A4-quer-Seite platziert werden. % % % \subsection*{Zusammenfassung\marginpar{\raggedleft\texttt{a5toa4}}} % % Um\marginpar{\raggedleft\texttt{-s}} aus einem Quell-PDF % "`\texttt{foo.pdf}"' ein Ziel-PDF "`\texttt{foo-sidebyside.pdf}"' zu % erzeugen, bei dem die Seiten des Quell-PDF aufeinander folgend, % nebeneinander auf einer A4-quer-Seite platziert sind, verwendet man: % \begin{verbatim} % a5toa4 -s foo.pdf % \end{verbatim}\unskip\ignorespaces % Soll die Ziel-PDF hingegen die Quell-PDF überschreiben, so gibt vor dem % Dateinamen zusätzlich Option "`\texttt{-o}"' an. % % Um\marginpar{\raggedleft\texttt{-b}} aus einem Quell-PDF % "`\texttt{foo.pdf}"' ein Ziel-PDF "`\texttt{foo-booklet.pdf}"' zu erzeugen, % bei dem die Seiten des Quell-PDF so auf einer A4-quer-Seite platziert sind, % dass durch Falten in der Mitte ein Heft entsteht, verwendet man: % \begin{verbatim} % a5toa4 -b foo.pdf % \end{verbatim}\unskip\ignorespaces % % Soll\marginpar{\raggedleft\texttt{-o}} die Ziel-PDF hingegen die Quell-PDF % überschreiben, so gibt vor dem Dateinamen zusätzlich Option "`\texttt{-o}"' % an. % % Informationen\marginpar{\raggedleft\texttt{-V}} über die verwendete Version % von "`\texttt{a5toa4}"' erhält man mit: % \begin{verbatim} % a5toa4 -V % \end{verbatim}\unskip % % Eine\marginpar{\raggedleft\texttt{-h}} Hilfe zum Programm erhält man mit: % \begin{verbatim} % a5toa4 -h % \end{verbatim} % % % \section{Die \LaTeX-Seite} % \label{sec:latex} % % Die \LaTeX-Seite zu den Skripten aus \autoref{sec:skripte} besteht % zunächst einmal aus dem \LaTeX-Dokument "`\texttt{a5toa4.tex}"'. Dieses % lädt wiederum das \LaTeX-Paket "`\texttt{pfarrei.sty}"'. Die eigentliche % Funktionalität verbirgt sich darin. % % \StartBlock%^^A % \DescribeMacro{\AvToAiv}\hspace*{-\marginparsep}\oarg{Original-Datei}\\%^^A % \DescribeMacro{\OriginalFile}%^^A % Die Anweisung \cs{AvToAiv} erledigt die Hauptarbeit für \texttt{a5toa4}. Die % Voreinstellung für das optionale Argument \meta{Original-Datei} ist % \cs{OriginalFile}. Das Skript "`\texttt{a5toa4.tlu}"' setzt dieses Makro % entsprechend. % % \StartBlock[1]%^^A % Man kann das \LaTeX-Paket \textsf{pfarrei} aber auch per % \begin{verbatim} % \usepackage{pfarrei} % \end{verbatim}\unskip % oder % \begin{verbatim} % \usepackage[booklet]{pfarrei} % \end{verbatim}\unskip % direkt in seinem Dokument laden. Dann stellt es Umgebungen und Befehle für % die Erstellung von Textblättern oder Textheften für Pfarrer, Lektoren und % andere Mitwirkende an einem Gottesdienst oder auch für die Gemeinde % bereit. % % \StartBlock%^^A % \DescribeMacro{\ifbooklet} % \hspace*{-\marginparsep}\marg{Dann-Code}\marg{Sonst-Code}\\* % Es kann Code davon abhängig ausgeführt werden, ob ein Booklet erzeugt wird % oder nicht. Im Falle eines Booklets wird der \meta{Dann-Code} ausgeführt, % anderenfalls der \meta{Sonst-Code}. Dies wird auch intern, beispielsweise % innerhalb von \cs{AvToAiv} oder innerhalb der % \texttt{booklet}\dots\texttt{page}-Umgebungen verwendet, um die % entsprechende Entscheidung durchzuführen. % % \StartBlock%^^A % \DescribeEnv{bookletfrontpage}%^^A % \DescribeMacro{\bookletfrontpagestyle}%^^A % Mit der Umgebung \texttt{bookletfontpage} kann eine Titelseite erstellt % werden, die nur bei der Erzeugung eines Booklets ausgegeben wird. Die % Umgebung sollte immer am Anfang des Dokuments stehen, anderenfalls % produziert sie eine Fehlermeldung. Dies geschieht, weil die Titelseite nun % einmal die erste Seite sein sollte. Sollte der Seitenstil \texttt{empty} % einmal nicht für die Titelseite gewünscht werden, kann man % \cs{bookletfrontpagestyle} auf den Namen des gewünschten Stils umdefinieren. % % \StartBlock[6]%^^A % \DescribeMacro{\motto}\hspace*{-\marginparsep}\marg{Motto}\\*%^^A % \DescribeMacro{\titlepicture}\hspace*{-\marginparsep}\marg{Bild}\\*%^^A % \DescribeMacro{\title}\hspace*{-\marginparsep}\marg{Titel}\\*%^^A % \DescribeMacro{\parish}\hspace*{-\marginparsep}\marg{Gemeinde}\\*%^^A % \DescribeMacro{\date}\hspace*{-\marginparsep}\marg{Datum}\\*%^^A % \DescribeMacro{\makebooklettitlepage}%^^A % Ähnlich zu \cs{maketitle} bei den Standard-Klassen kann man für Booklets % (aufbauend auf der oben erklärten Umgebung \texttt{bookletfrontpage} statt % auf \texttt{titlepage}) mit Hilfe von \cs{makebooklettitlepage} eine % Titelseite für ein Booklet erzeugen. Der Titel besteht aus einem Motto (oben % auf der Seite), gefolgt von einem Titelbild, gefolgt von dem Titel, Angaben % zur Gemeinde und zum Schluss das Datum. Es ist zu beachten, dass man % \cs{makebooklettitlepage} \emph{nicht} selbst in eine Umgebung packen % sollte, da diese Anweisung intern die Umgebung \texttt{bookletfrontpage} % verwendet. Darüber hinaus ist zu beachten, dass als Titelbild nicht einfach % ein Dateinamen angegeben wird, sondern die kompletten Anweisungen, um ein % Bild einzuladen oder zu erstellen. Auch muss ggf. ein Grafikpaket selbst % geladen werden. % % \StartBlock%^^A % \DescribeEnv{bookletbackpage}%^^A % \DescribeEnv{bookletemptypage}%^^A % \DescribeMacro{\bookletbackpagestyle}%^^A % \DescribeMacro{\bookletemptypagestyle}%^^A % Für ein Booklet kann mit der Umgebung \texttt{bookletbackpage} außerdem eine % Rückseite definiert werden. Die Definition kann an beliebiger Stelle % erfolgen. Die Ausgabe findet auf einer durch vier teilbaren Seite am Ende % des Dokuments statt. Dazu werden ggf. leere Seiten eingefügt. Den Inhalt der % \emph{leeren Seiten} kann ebenfalls mit einer Umgebung, nämlich % \texttt{bookletemptypage}, definiert werden. Wie bereits beim Seitenstil für % die Vorderseite, kann auch der Seitenstil für die \emph{leeren Seiten} und % die Rückseite umdefiniert werden. % % \StartBlock%^^A % \DescribeEnv{samedoublepage}%^^A % Wenn der Inhalt dieser Umgebung auf die aktuelle Seite passt, wird er % ausgegeben. Passt er nicht auf die aktuelle Seite und die aktuelle Seite ist % eine Seite mit einer ungeraden Seitenzahl, dann wird zunächst ein % Seitenumbruch durchgeführt. Anschließend wird der Inhalt ausgegeben. Dadurch % wird vermieden, dass beispielsweise ein Lektor oder Pfarrer unnötig % innerhalb eines Textes umblättern muss. Es ist zu beachten, dass innerhalb % dieser Umgebung Fußnoten, Marginalien und Gleitumgebungen nicht korrekt % funktionieren. % % \StartBlock%^^A % \DescribeMacro{\setupprayer}\hspace*{-\marginparsep}\marg{Optionen}\\*%^^A % \DescribeEnv{prayer}%^^A % \DescribeMacro{\noresponder}%^^A % Die Umgebung \texttt{prayer} ist für Gebete gedacht. Die Umgebung hat ein % optionales Argument. Dieses ist identisch mit \meta{Optionen} gilt dann aber % nur lokal für diese Gebetsumgebung. Als \meta{Optionen} kann eine % Komma-separierte Liste von \meta{Schlüssel}\texttt{=}\meta{Wert}-Optionen % angegeben werden. Folgende Schlüssel werden verstanden: % \begin{description} % \item[\texttt{leader=}\meta{Vorbeter}:] Setzt die Voreinstellung für das % optionale Argument von \cs{item} auf \meta{Vorbeter}. % \item[\texttt{responder=}\meta{Antwortende(r)}:] Setzt die Voreinstellung % für das optionale Argument des automatisch als Antwort eingefügten % \cs{item} auf \meta{Antwortende(r)}. % \item[\texttt{response=}\meta{Antwort}:] Setzt die automatisch eingefügte % Antwort auf \meta{Antwort}. % \end{description} % Eine automatische Antwort wird nur eingefügt, wenn sowohl \texttt{responder} % als auch \texttt{response} angegeben sind. Soll nur für einzelne \cs{item} % keine automatische Antwort erstellt werden, so ist irgendwo innerhalb des % entsprechenden \cs{item} (\emph{nicht} jedoch innerhalb des optionalen % Arguments von \cs{item}) oder danach ein \cs{noresponder} einzufügen. % % \StopEventually{} % % \iffalse^^A meta-comment % % \fi^^A meta-comment % % \section{Implementierung der \LaTeX-Seite} % % \iffalse^^A meta-comment %<*tex> % \fi^^A meta-comment % % \subsection{Das \LaTeX-Dokument "`\texttt{a5toa4.tex}"'} % % \iffalse^^A meta-comment %<*a5toa4> % \fi^^A meta-comment % % Das ist wirklich geradezu trivial: % \begin{macrocode} \documentclass[a4paper,landscape]{article} \usepackage{pfarrei} \begin{document} \AvToAiv \end{document} % \end{macrocode} % Das war es schon. Trotzdem hat die Verwendung einer solchen zusätzlichen % Datei den Vorteil, dass man bei Bedarf lokal auch ein ganz anderes % "`\texttt{a5toa4.tex}"' speichern kann. % % \iffalse^^A meta-comment % % \fi^^A meta-comment % % \subsection{Das \LaTeX-Paket "`\texttt{pfarrei}"'} % % \iffalse^^A meta-comment %<*package> % \fi^^A meta-comment % % \begin{macro}{\ifbooklet} % \changes{r28}{2013/04/01}{neue Anweisung} % Wir haben eine Option, die bestimmt, ob wir ein Booklet erzeugen oder % nicht. Später wird das schlicht über das Makro \cs{ifbooklet} % festgestellt. Falls ein Booklet erzeugt werden soll wird das erste, sonst % das zweite Argument ausgeführt. % \begin{macrocode} \newcommand*{\ifbooklet}{} \let\ifbooklet\@secondoftwo \DeclareOption{booklet}{\let\ifbooklet\@firstoftwo} \DeclareOption{nobooklet}{\let\ifbooklet\@secondoftwo} % \end{macrocode} % \end{macro} % % Dann werden die Optionen ausgeführt: % \begin{macrocode} \ProcessOptions* % \end{macrocode} % Dann benötigen wir ein paar Pakete: % \begin{macrocode} \RequirePackage{ifpdf} \RequirePackage{pdfpages} % \end{macrocode} % % % \begin{macro}{\AvToAiv} % Der Name des Makros kommt von \texttt{a5toa4}. Es muss sichergestellt sein, % dass dies im PDF-Modus verwendet wird. % \begin{macrocode} \newcommand*{\AvToAiv}[1][\OriginalFile]{% \ifpdf\else \PackageError{pfarrei}{PDF mode needed}{% a5toa4 needs the direct PDF mode.\MessageBreak Usually this may be activated using either pdflatex, lualatex or xelatex.% }% \input{x.tex} \fi \ifbooklet{% \includepdf[pages=-,booklet]{#1}% }{% \includepdf[pages=-,nup=2x1]{#1}% }% } % \end{macrocode} % \end{macro}^^A \AvToAiv % % \begin{environment}{bookletpage} % \changes{r28}{2013/04/01}{neue virtuelle Umgebung} % Da mehrfach eine Umgebung für einzelne Seiten benötigt wird, definieren wir % dafür eine eigene Umgebung, die dann entsprechend individualisiert wird. Es % ist zu beachten, dass diese Umgebung nicht als Umgebung aufgerufen werden % sollte, sondern direkt \cs{bookletpage} und \cs{endbookletpage}. % \begin{macrocode} \newenvironment*{bookletpage}{% \edef\reserved@a{bookletpage}% \ifx\@currenvir\reserved@a \PackageError{pfarrei}{`bookletpage' used as ordinary environment}{% Please note, that `bookletpage' is a virtual environment only.\MessageBreak You should not use it directly as an environment, but use `\string\bookletpage' at the\MessageBreak begin code and `\string\endbookletpage' at the end code of a wrapper environment.\MessageBreak If you'll continue, expect several additional errors% }% \let\bookletpagebox\@tempboxa \let\bookletpagestyle\@empty \else \expandafter\let\expandafter\bookletpagebox \csname \@currenvir box\endcsname \expandafter\let\expandafter\bookletpagestyle \csname \@currenvir style\endcsname \fi \edef\reserved@a{% \noexpand\begin{lrbox}{\bookletpagebox} \noexpand\begin{minipage}[t][\textheight][t]{\textwidth}% \begingroup \def\noexpand\@currenvir{\@currenvir}% \def\noexpand\@currenvline{\@currenvline}% \noexpand\parskip=\the\parskip \noexpand\parindent=\the\parindent \noexpand\parfillskip=\the\parfillskip }\reserved@a }{% % \end{macrocode} % Das Ende wird in zwei Portionen aufgeteilt: % \begin{macrocode} \endbookletpagebox \printbookletpagebox } % \end{macrocode} % \begin{macro}{\endbookletpagebox} % \changes{r28}{2013/04/01}{neue (eigentlich interne) Anweisung} % das Beenden der Erzeugung der Box für die Seite % \begin{macrocode} \def\endbookletpagebox{% \par \endgroup \end{minipage}% \end{lrbox}% \global\setbox\bookletpagebox\box\bookletpagebox } % \end{macrocode} % \end{macro} % \begin{macro}{\printbookletpagebox} % \changes{r28}{2013/04/01}{neue (eigentlich interne) Anweisung} % und die Ausgabe der Box, falls ein Booklet erzeugt wird. % \begin{macrocode} \newcommand*\printbookletpagebox[1][\@currenvir]{% \ifbooklet{% \@ifundefined{bookletpagestyle}{}{% \ifx\bookletpagestyle\@empty\else\thispagestyle{\bookletpagestyle}\fi% }% \clearpage\noindent\usebox\bookletpagebox\clearpage }{% \PackageInfo{pfarrei}{`#1' not printed}% }% } % \end{macrocode} % \end{macro} % \end{environment} % % % \begin{environment}{bookletfrontpage} % \changes{r26}{2013/03/31}{neue Umgebung} % Umgebung, um eine Booklet-Titelseite zu erzeugen. % \begin{macro}{\bookletfrontpagebox} % \changes{r26}{2013/03/31}{neue Box} % \begin{macro}{\bookletfrontpagestyle} % \changes{r26}{2013/03/31}{neues Makro} % Es ist nur eine Seite erlaubt. Also packen wir das ganze in eine Box. Dafür % brauchen wir eine solche: % \begin{macrocode} \newsavebox\bookletfrontpagebox \newcommand*{\bookletfrontpagestyle}{empty} \newenvironment*{bookletfrontpage}{% \bookletpage }{% \endbookletpagebox \clearpage \ifbooklet{% \ifnum\c@page>\@ne \PackageError{pfarrei}{Booklet front page not first page}{% The booklet font page should be the first page, but it seems, that it is\MessageBreak page no. \the\c@page. \space Maybe you should put it immediately after `\string\begin{document}.% Nevertheless, if you'll continue it will be printed here% }% \fi \printbookletpagebox }{% \PackageInfo{pfarrei}{Booklet front page ignored}% }% } % \end{macrocode} % \end{macro} % \end{macro} % \end{environment} % % \begin{environment}{bookletbackpage} % \changes{r26}{2013/03/31}{neue Umgebung}%^^A % \begin{macro}{\bookletbackpagebox} % \changes{r26}{2013/03/31}{neue Box}%^^A % \begin{macro}{\bookletbackpagestyle} % \changes{r26}{2013/03/31}{neues Makro} % Im Prinzip ist die Booklet-Rückseite fast wie bei der Titelseite, % allerdings fügen wir hier so viele Leerseiten ein, dass wir wirklich auf % einer durch 4 teilbaren Seite landen. % \begin{environment}{bookletemptypage} % \changes{r26}{2013/03/31}{neue Box}%^^A % \begin{macro}{\bookletemptypagebox} % \changes{r26}{2013/03/31}{neue Umgebung}%^^A % \begin{macro}{\bookletemptypagestyle} % \changes{r26}{2013/03/31}{neues Makro}%^^A % Die Umgebung für die konfigurierbare \emph{Leerseite}, besitzt keine eigene % Ausgabe, sondern sammelt tatsächlich nur den Inhalt. Die Ausgabe erfolgt % dann bei der Ausgabe der Booklet-Rückseite. % \begin{macrocode} \newsavebox\bookletemptypagebox \newcommand*{\bookletemptypagestyle}{empty} \newenvironment*{bookletemptypage}{% \bookletpage }{% \endbookletpagebox } \newsavebox\bookletbackpagebox \newcommand*{\bookletbackpagestyle}{empty} \newenvironment*{bookletbackpage}{% \bookletpage }{% \endbookletpagebox \if@filesw\immediate\write\@mainaux{\string\printbookletbackpage}\fi }% % \end{macrocode} % \end{macro} % \end{macro} % \end{environment} % \begin{macro}{\printbookletbackpage} % \changes{r26}{2013/03/31}{neue Anweisung}%^^A % \begin{macro}{\@printbookletbackpage} % \changes{r26}{2013/03/31}{neue interne Anweisung}%^^A % Die eigentliche Ausgabe der letzten Seite geschieht über einen Eintrag in % der \texttt{aux}-Datei. Das ist zwar nicht ganz sauber (und % \textsf{scrlfile} meckert deshalb ggf.), aber die Standard-Klasse % \textsf{letter} macht das ähnlich für die Etiketten. Also hoffen wir % einfach, dass es gut geht. % \begin{macrocode} \newcommand*{\printbookletbackpage}{} \newcommand*{\@printbookletbackpage}{% \ifbooklet{% \clearpage \let\bookletpagestyle\bookletemptypagestyle \ifvoid\bookletemptypagebox \let\bookletpagebox\strutbox \else \let\bookletpagebox\bookletemptypagebox \fi \@tempcnta=\c@page \divide\@tempcnta by 4 \multiply\@tempcnta by 4 \ifnum \@tempcnta=\c@page\else \advance\@tempcnta by 4 \@whilenum \c@page<\@tempcnta\do{% \printbookletpagebox }% \fi \let\bookletpagestyle\bookletbackpagestyle \let\bookletpagebox\bookletbackpagebox \printbookletpagebox }{% \PackageInfo{pfarrei}{Booklet back page ignored}% }% } % \end{macrocode} % Das Drucken darf während des Lesens der \texttt{aux}-Datei in % \cs{begin{document}} nicht erfolgen. Daher definieren wir es erst danach % entsprechend um. Dadurch ist es während des Lesens der \texttt{aux}-Datei in % \cs{end{document}} funktionsfähig. % \begin{macrocode} \AtBeginDocument{\let\printbookletbackpage\@printbookletbackpage} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{environment} % % % \begin{macro}{\makebooklettitlepage} % \changes{r26}{2013/03/31}{neue Anweisung}%^^A % \begin{macro}{\motto} % \changes{r26}{2013/03/31}{neue Anweisung}%^^A % \begin{macro}{\@motto} % \changes{r26}{2013/03/31}{neues internes Makro}%^^A % \begin{macro}{\titlepicture} % \changes{r26}{2013/03/31}{neue Anweisung}%^^A % \begin{macro}{\@titlepicture} % \changes{r26}{2013/03/31}{neues internes Makro}%^^A % \begin{macro}{\title} % \changes{r26}{2013/03/31}{neue Anweisung}%^^A % \begin{macro}{\@title} % \changes{r26}{2013/03/31}{neues internes Makro}%^^A % \begin{macro}{\parish} % \changes{r26}{2013/03/31}{neue Anweisung}%^^A % \begin{macro}{\@parish} % \changes{r26}{2013/03/31}{neues internes Makro}%^^A % \begin{macro}{\date} % \changes{r26}{2013/03/31}{neue Anweisung}%^^A % \begin{macro}{\@date} % \changes{r26}{2013/03/31}{neues internes Makro}%^^A % Der Standard-Titel für Booklets besteht aus einem Motto, einem Bild, einem % Titel, der Gemeinde und dem Datum. Wir gehen davon aus, dass die % Klasse bereits \cs{date}, \cs{@date}, \cs{title} und \cs{@title} zur % Verfügung stellt. Allerdings ergibt die Voreinstellung \cs{today} für das % Datum hier wenig Sinn, weshalb die Voreinstellung in einen leeren Wert % geändert wird. Den Rest machen wir komplett selbst: % \begin{macrocode} \newcommand*{\motto}[1]{\gdef\@motto{#1}} \newcommand*{\@motto}{} \newcommand*{\titlepicture}[1]{\gdef\@titlepicture{#1}} \newcommand*{\@titlepicture}{} \providecommand*{\title}[1]{\gdef\@title{#1}} \providecommand*{\@title}{} \newcommand*{\parish}[1]{\gdef\@parish{#1}} \newcommand*{\@parish}{} \providecommand*{\date}[1]{\gdef\@date{#1}} \def\@date{} \newcommand*{\makebooklettitlepage}{% \begin{bookletfrontpage} \parskip.5\baselineskip \parindent\z@ \parfillskip \z@ \@plus 1fil \centering \ifx\@motto\@empty\else{\Huge\@motto\par}\fi \vfill \ifx\@titlepicture\@empty\else\@titlepicture\par\fi \vfill \parskip\z@ \Huge \@title\par \@parish\par \@date\par \ifx\@title\@empty\ifx\@parish\@empty\ifx\@date\@empty\null\fi\fi\fi \end{bookletfrontpage} } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % % \begin{environment}{samedoublepage} % \changes{r28}{2013/03/31}{neue Umgebung}%^^A % \begin{macro}{\samedoublepage@save@hbox} % \changes{r28}{2013/03/31}{neues internes Makro}%^^A % Es wird etwas umständlich eine vertikale Box gespeichert, % \begin{macrocode} \let\samedoublepage@save@hbox\hbox \newenvironment*{samedoublepage}{% \par \let\hbox\vbox \begin{lrbox}{\@tempboxa}% \let\hbox\samedoublepage@save@hbox }{% \end{lrbox}% \let\hbox\samedoublepage@save@hbox % \end{macrocode} % um diese dann in Stücke zu zerschneiden, die auf eine Seite passen, % \begin{macrocode} \@tempdima\ifdim\pagegoal=\maxdimen\textheight \else\dimexpr\pagegoal-\pagetotal\fi \ifdim \@tempdima <\dimexpr\ht\@tempboxa+\dp\@tempboxa\relax \ifodd\c@page % \end{macrocode} % Wobei aber nicht auf ungeraden Seiten mit nur einem Stück des Kuchens % begonnen wird. % \begin{macrocode} \newpage \@tempdima\textheight \else \typeout{even page}% \fi \@whiledim \@tempdima <\dimexpr\ht\@tempboxa+\dp\@tempboxa\relax\do{% \splitmaxdepth\dp\strutbox \splittopskip\topskip \setbox\z@\vsplit\@tempboxa to \@tempdima \usebox\z@ \newpage \@tempdima\textheight }% \fi % \end{macrocode} % Und am Ende nicht vergessen, den Rest der Box auch noch auszugeben. % \begin{macrocode} \ifvoid\@tempboxa\else\usebox\@tempboxa\fi } % \end{macrocode} % \end{macro} % \end{environment} % % \begin{environment}{prayer} % \changes{r28}{2013/04/01}{neue Umgebung} % \begin{macro}{\setupprayer} % \changes{r28}{2013/04/01}{neue Anweisung} % Die Gebetsumgebung wird mit Hilfe von \textsf{keyval} definiert. Sie kann % außer mit dem optionalen Argument auch jederzeit mit \cs{setupprayer} % konfiguriert werden. % \begin{macro}{\prayer@responder} % \changes{r28}{2013/04/01}{neues internes Makro} % \begin{macro}{\prayer@response} % \changes{r28}{2013/04/01}{neues internes Makro} % \begin{macro}{\prayer@leader} % \changes{r28}{2013/04/01}{neues internes Makro} % Dafür werden mehrere interne Makros benötigt, um die gewünschten Werte % aufzunehmen. % \begin{macrocode} \RequirePackage{keyval} \define@key{pfarrei.prayer}{response}{\def\prayer@response{#1}} \define@key{pfarrei.prayer}{responder}{\def\prayer@responder{#1:}} \define@key{pfarrei.prayer}{leader}{\def\prayer@leader{#1:}} \newcommand*{\prayer@responder}{} \newcommand*{\prayer@response}{} \newcommand*{\prayer@leader}{} \newcommand*{\setupprayer}{% \setkeys{pfarrei.prayer}% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \begin{macro}{\ifprayer@firstitem} % \changes{r28}{2013/04/01}{neuer interner Schalter} % \begin{macro}{prayer@response@item} % \changes{r28}{2013/04/01}{neue interne Anweisung} % Da die Antwort beim ersten \cs{item} noch nicht ausgegeben werden darf, % sondern nur nach den nachfolgenden, muss die Information, ob es das erste % \cs{item} ist, über einen Schalter gespeichert werden. % \begin{macrocode} \newif\ifprayer@firstitem \newcommand*{\prayer@response@item}{% \ifprayer@firstitem\else \ifx\prayer@responder\@empty\else \ifx\prayer@response\@empty\else \prayer@save@item[\prayer@responder] \prayer@response \fi \fi \fi } % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\prayer@item} % \changes{r28}{2013/04/01}{neue interne Anweisung} % \begin{macro}{\prayer@save@item} % \changes{r28}{2013/04/01}{neue interne Anweisung} % Die \cs{item}-Anweisung von \texttt{prayer} ist etwas anders als von anderen % Listen-Umgebungen. Sie baut jedoch auf der Originaldefinition auf. Daher % muss die Originaldefinition gespeichert und entsprechend erweitert verwendet % werden. % \begin{macrocode} \newcommand*{\prayer@item}[1][\prayer@leader]{% \prayer@response@item \prayer@firstitemfalse \prayer@save@item[{#1}]% } % \end{macrocode} % \begin{macro}{\noresponder} % \changes{r28}{2013/04/01}{neue Anweisung} % Das Abschalten der nächsten automatischen Antwort geschieht einfach, indem % so getan wird, als wäre das nächste \cs{item} wieder das erste. % \begin{macrocode} \newenvironment*{prayer}[1][]{% \begin{description} \begingroup \def\@currenvir{prayer}% \setupprayer{#1}% \let\prayer@save@item\item \let\item\prayer@item \prayer@firstitemtrue \let\noresponder\prayer@firstitemtrue }{% \prayer@response@item \endgroup \end{description} } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{environment} % % % \iffalse^^A meta-comment % % \fi^^A meta-comment % % % \iffalse^^A meta-comment % % \fi^^A meta-comment % % \section{Implementierung der Skripten} % % \iffalse^^A meta-comment %<*lua> % \fi^^A meta-comment % % \subsection{Der kleine Wrapper "`\texttt{a5toa4.tlu}"'} % % \iffalse^^A meta-comment %<*a5toa4> % \fi^^A meta-comment % \begin{macrocode} -- $Id: pfarrei.dtx 37 2023-11-22 18:54:26Z ps $ kpse.set_program_name(arg[-1], 'a5toa4') require('pfarrei.pfarrei') % \end{macrocode} % \iffalse^^A meta-comment % % \fi^^A meta-comment % % \subsection{Das Haupt-Skript "`\texttt{pfarrei.tlu}"'} % % \iffalse^^A meta-comment %<*pfarrei> % \fi^^A meta-comment % \begin{macrocode} local version_number = string.sub( '$Revision: 37 $', 12, -2 ) local action_version = ' r' .. version_number .. '\n' .. [[ Copyright (c) 2013 Markus Kohm. License: lppl 1.3c or later. See . ]] local action_help = [[ action options: -h, --help Print this help message. -V, --version Print the version information. processing options: -b, --booklet Generate a booklet instead of only two pages side by side onto one page. The whole booklet will be one signature. -s, --sidebyside Generate only two pages side by side onto one page instead of a booklet. -o, --overwrite Write the output to the instead of appending "-sidebyside.pdf" or "--booklet.pdf" to the basename of ]] local action_opts = { ['-h'] = 'help', ['--help'] = 'help', ['-V'] = 'version', ['--version'] = 'version', } local processing_opts = { ['-b'] = 'booklet', ['--booklet'] = 'booklet', ['-s'] = 'sidebyside', ['--sidebyside'] = 'sidebyside', ['-o'] = 'overwrite', ['--overwrite'] = 'overwrite', ['-d'] = 'debug', ['--debug'] = 'debug', } -- detect action options and do action local i = 1 local action while arg[i] do action = action_opts[arg[i]] i = i+1 if action == 'help' then print( arg[0]..action_version ); print( 'Usage: ' .. arg[0] .. ' ' ) print( ' ' .. arg[0] .. ' [] ...\n' ) print( action_help ); os.exit( 0 ); elseif action == 'version' then print( arg[0] .. action_version ); os.exit( 0 ); end end -- process options and parameters local booklet = false local overwrite = false local debug = false i = 1 while arg[i] do action = processing_opts[arg[i]] if action == 'booklet' then booklet = true elseif action == 'sidebyside' then booklet = false elseif action == 'overwrite' then overwrite = true elseif action == 'debug' then debug = true elseif action == nil then -- build the temporary tex file local tmpdir = os.tmpdir("pfarrei.XXXXXX" ) local tmpfile = string.match( arg[i], '.*/(.*)$') or arg[i] -- pdflatex's -output-directory search for source pdf works with path specification but fails -- when simple file name in the current working directory is provided, we need to provide '../' then local local_source='' if tmpfile == arg[i] then local_source = '../' end local basename = string.match( tmpfile,'(.*)%.[^.]*$') or tmpfile tmpfile = tmpdir..'/'..basename..'.tex' local file = assert( io.open( tmpfile, 'w' ) ) if booklet then assert( file:write("\\PassOptionsToPackage{booklet}{pfarrei}\n") ) end assert( file:write("\\def\\OriginalFile{"..local_source,arg[i],"}\n") ) assert( file:write("\\input{a5toa4.tex}\n") ) assert( file:flush() ) file:close() -- call pdflatex assert( os.execute( 'pdflatex -interaction=batchmode -output-directory='..tmpdir..' '..tmpfile ) ) -- copy the resulting pdf file local srcfile = assert( io.open( tmpdir..'/'..basename..'.pdf', 'rb' ) ) if overwrite then tmpfile = arg[i] else tmpfile = string.match( arg[i], '(.*)%.[^.]*$' ) or arg[i] if booklet then tmpfile = tmpfile..'-booklet.pdf' else tmpfile = tmpfile..'-sidebyside.pdf' end end local destfile = assert( io.open( tmpfile, 'wb' ) ) local buffer while true do buffer = srcfile:read(8388608) if buffer==nil then break end assert( destfile:write(buffer) ) end assert( destfile:close() ) srcfile:close() if debug then print('DEBUG: Temporary files in: '..tmpdir); else tmpfile=tmpdir..'/'..basename os.remove( tmpfile..'.aux' ) os.remove( tmpfile..'.tex' ) os.remove( tmpfile..'.log' ) os.remove( tmpfile..'.pdf' ) os.remove( tmpdir ) end overwrite = false end i=i+1 end % \end{macrocode} % \iffalse^^A meta-comment % % \fi^^A meta-comment % % \iffalse^^A meta-comment % % \fi^^A meta-comment % % \Finale % \endinput % % end of file `pfarrei.dtx' % %%% Local Variables: %%% mode: doctex %%% TeX-PDF-mode: t %%% mode: flyspell %%% ispell-local-dictionary: "de_DE" %%% TeX-master: t %%% End: