Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 9
\immediate\write18 durch \ShellEscape ersetzt

07 Jun '16, 15:42

saputello's gravatar image

saputello
11.1k174365

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. \documentclass{scrreprt} \usepackage{selinput} \documentclass{scrreprt} \usepackage{shellesc} \usepackage{selinput} \SelectInputMappings{adieresis={ä}, germandbls={ß}} 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 \immediate\write18{pdflatex \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: \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: \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`: \writeextrai{Diese Zeile stand auf Seite \thepage,} \verbatimwriteextraipar{wobei die Information mit \texttt{\string\thepage} generiert wurde.} Natürlich kann man statt über `\write18` `\ShellEscape` den Zusatzaufruf auch durch einen externen Prozessor wie `arara` erledigen lassen.
Klicke auf Einblenden/Ausblenden von Überarbeitungen 8

04 Mär '15, 09:16

saputello's gravatar image

saputello
11.1k174365

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. \documentclass{scrreprt} \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 \immediate\write18{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: \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: \writeextraipar{Diese Zeile stand auf Seite \thepage.} \thepage, wobei die Information mit \protect\texttt{\protect\string\protect\thepage} generiert wurde.} oder mit gleichem Ergebnis aber ohne `\protect`: \writeextrai{Diese Zeile stand auf Seite \thepage,} \verbatimwriteextraipar{wobei die Information mit \texttt{\string\thepage} generiert wurde.} Natürlich kann man statt über `\write18` den Zusatzaufruf auch durch einen externen Prozessor wie `arara` erledigen lassen.
Klicke auf Einblenden/Ausblenden von Überarbeitungen 7

04 Mär '15, 09:09

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 6

04 Mär '15, 09:07

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 5

04 Mär '15, 09:06

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 4
\protected@write verwendet, damit \protect wie erwartet funktioniert.

04 Mär '15, 09:02

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

04 Mär '15, 08:57

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

04 Mär '15, 08:07

saputello's gravatar image

saputello
11.1k174365

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

04 Mär '15, 08:04

saputello's gravatar image

saputello
11.1k174365