1
1

Hallo!

Ich möchte in einem Dokument einige Zusätze in einer eigene PDF zusammenfassen extra1.pdf. Ggf. entsteht hier erstmal extra1.tex, was man vll. mit arara kompilieren könnte.

Gibt es hier eine Möglichkeit mit filecontents?

Open in Online-Editor
\documentclass{scrreprt}  
\usepackage{selinput}  
\SelectInputMappings{adieresis={ä},  germandbls={ß}}  
\usepackage[ngerman]{babel}

%=========
\begin{document}  
%=========

Hier ist ein Satz. \par
\texttt{Schreibe diesen Text in die Datei extra1.pdf} \par

Hier ist wieder ein Satz. \par
\texttt{Schreibe diesen Text auch in die Datei extra1.pdf dazu}
%=========  
\end{document}
%=========

gefragt 03 Mär '15, 22:34

cis's gravatar image

cis
9.5k95459491
Akzeptiert-Rate: 29%

bearbeitet 04 Mär '15, 00:42

cgnieder's gravatar image

cgnieder
22.1k253463

Kannst du das noch näher ausführen? Du kannst direkt eine pdf-Schreiben, der Weg über ein tex-Dokument wird aber auf jeden Fall einfacher. Um wie viel Text handelt es sich denn jeweils? Wäre es vielleicht einfacher, plain Text an die normal erstellte pdf anzuhängen?

(03 Mär '15, 23:48) Johannes

Mit filecontents zu arbeiten hätte an der Stelle das Problem, dass filecontents die Datei am Ende der Umgebung immer schließt. Man müsste also jeden externen Text in eine eigene Datei schreiben und am Ende des Dokuments dafür sorgen, dass extra1.pdf aus all diesen Dateien erzeugt wird. Das halte ich für keine wirklich sinnvolle Idee.

Es gibt aber Pakete wie fancyvrb, die es ermöglichen verbatim, also ohne Expansion in eine Datei zu schreiben. Damit kann man recht einfach, Text in einer externen Datei sammeln.

Man kann sich unter Verwendung von e-TeX-Features, die in zwischen Standard für LaTeX sind, aber die tatsächlich benötigte Funktionalität auch recht einfach selbst basteln.

Den LaTeX-Lauf der so erzeugten Datei kann man dann beispielsweise per \write18-Feature (auch bekannt als shell-escapes) ganz am Ende des Hauptdokuments durchführen. Dafür wird dann beim LaTeX-Aufruf des Hauptdokuments Option -shell-escape benötigt.

Open in Online-Editor
\documentclass{scrreprt}
\usepackage{shellesc}
\usepackage{selinput}
\SelectInputMappings{adieresis={ä},  germandbls={ß}}
\usepackage[ngerman]{babel}

\newwrite\extrai% Neues Ausgabehandle (ACHTUNG: Anzahl streng begrenzt!)
\immediate\openout\extrai extra1.tex% Datei direkt öffnen
\immediate\write\extrai{% Präambel schreiben
  \unexpanded{%
    \documentclass{scrreprt}^^J%
    \usepackage{selinput}^^J%
    \SelectInputMappings{adieresis={ä}, germandbls={ß}}^^J%
    \usepackage[ngerman]{babel}^^J%
    % ggf. Präambel erweitern
    \begin{document}
  }%
}
\AfterReadingMainAux{% Am Ende
  \immediate\write\extrai{\unexpanded{\end{document}}}% Datei beenden.
  \immediate\closeout\extrai% Datei schließen
  \ShellEscape{pdflatex extra1.tex}% pdflatex-Aufrufen ggf. wiederholen
}
\newcommand{\verbatimwriteextrai}[1]{\write\extrai{\unexpanded{#1}}}
\newcommand{\verbatimwriteextraipar}[1]{\verbatimwriteextrai{#1\par}}

%=========
\begin{document}  
%=========

Hier ist ein Satz. \par
\verbatimwriteextraipar{Schreibe diesen Text in die äxterne Datei extra1.pdf}

Hier ist wieder ein Satz. \par
\verbatimwriteextraipar{Schreibe diesen Text auch in die Datei extra1.pdf dazu.}
%=========  
\end{document}
%=========

Das Schreiben über einfache eigene Befehle zu machen, hat den Vorteil, dass man sich natürlich auch eine expandierende Anweisung definieren kann:

Open in Online-Editor
\newcommand{\writeextrai}[2][]{\csname protected@write\endcsname\extrai{#1}{#2}}
\newcommand{\writeextraipar}[2][]{\writeextrai[{\let\par\relax#1}]{#2\par}}

Damit kann man dann auch Makros beim Schreiben expandieren lassen, etwa:

Open in Online-Editor
\writeextraipar{Diese Zeile stand auf Seite \thepage, wobei die
  Information mit \protect\texttt{\protect\string\protect\thepage}
  generiert wurde.}

oder mit gleichem Ergebnis aber ohne \protect:

Open in Online-Editor
\writeextrai{Diese Zeile stand auf Seite \thepage,}
\verbatimwriteextraipar{wobei die Information mit \texttt{\string\thepage}
  generiert wurde.}

Natürlich kann man statt über \ShellEscape den Zusatzaufruf auch durch einen externen Prozessor wie arara erledigen lassen.

Permanenter link

beantwortet 04 Mär '15, 08:04

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 07 Jun '16, 15:42

Kann man das Beispiel auch so modifizieren, dass der Text sowohl in die extra1 Datei geschrieben wird, als auch in der Originaldatei zu sehen ist? Bei dem Beispiel sieht man den text in der verbatim-Umgebung ja nur in der extra1-Datei.

(07 Mär '15, 20:08) typ42
2

@typ42: Wo liegt das Problem? Schon das nahe liegende \newcommand{\verbatimwriteextrai}[1]{#1\write\extrai{\unexpanded{#1}}} ausprobiert?

(08 Mär '15, 08:40) saputello

Ich habe quasi saputellos Antwort nochmal in expl3 implementiert. Die Eingabe von \writeextra wird nicht expandiert, sondern direkt so in die Datei geschrieben.

Open in Online-Editor
\documentclass{scrreprt}
\usepackage{selinput}
\SelectInputMappings{adieresis={ä}, germandbls={ß}}
\usepackage[ngerman]{babel}
\usepackage{xparse}

\ExplSyntaxOn

\iow_new:N \l_cis_out_stream
\tex_chardef:D \shell_escape = 18

\iow_open:Nn \l_cis_out_stream { extra1.tex }

\NewDocumentCommand \writeextra { +v }
 {
  \group_begin:
   \tex_endlinechar:D = 10
   \tex_newlinechar:D = 13
   \iow_now:Nn \l_cis_out_stream { #1 }
  \group_end:
 }

\AfterReadingMainAux
 {
  \iow_now:Nn \l_cis_out_stream { \end{document} }
  \iow_close:N \l_cis_out_stream
  \iow_now:Nn \shell_escape { pdflatex ~ extra1.tex }
 }

\writeextra
 {
  \documentclass{scrreprt}
  \usepackage{selinput}
  \SelectInputMappings{adieresis={ä}, germandbls={ß}}
  \usepackage[ngerman]{babel}
  % ggf. Präambel erweitern
  \begin{document}
 }

\ExplSyntaxOff

\begin{document}

Hier ist ein Satz. \par
\writeextra{Schreibe diesen Text in die äxterne Datei extra1.pdf

Sogar mit newlines\par}

Hier ist wieder ein Satz. \par
\writeextra{Schreibe diesen Text auch in die Datei extra1.pdf dazu.}

\end{document}
Permanenter link

beantwortet 04 Mär '15, 10:46

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 04 Mär '15, 12:08

1

Abgesehen davon, dass es mir falsch vorkommt, aus einem N-Argument ein n-Argument zu machen: \cs_generate_variant:Nn \iow_now:Nn { nn } brauchst Du nirgends, oder?

(04 Mär '15, 11:03) cgnieder

@Clemens Sehr richtig. Das war noch bevor ich \chardef für \shell_escape gemacht habe. Da hatte ich \iow_now:nn { 18 } { pdflatex ~ extra1.tex }. Was empfindest Du falsch an N -> n? Unter der Annahme, dass \foo nach abc expandiert sind \some_cs:N \foo und \some_cs:n { abc } doch fast äquivalent.

(04 Mär '15, 12:11) Henri
1

@Henri weil Du bei N davon ausgehen musst, dass die Funktion tatsächlich ein einzelnes Token erwartet und nicht seine Expansion. Z.B. \cs_generate_variant:Nn \cs_new:Npn { n } ergäbe keinerlei Sinn und würde auch nicht gut gehen. Für so eine Variante muss man die Interna der entsprechenden Funktion kennen, was dem Sinn der Varianten-Erstellung etwas widerspricht. Frank Mittelbach: »N denoting that the argument consists of a single token (no braces needed, sometimes not even allowed)«

(04 Mär '15, 12:33) cgnieder
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×44
×11

gestellte Frage: 03 Mär '15, 22:34

Frage wurde gesehen: 10,413 Mal

zuletzt geändert: 07 Jun '16, 15:42