PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem: TikZ + external Lib + \cite



borose
26-08-2010, 15:53
Hallo alle miteinander!

Ich habe einige Grafiken mit TikZ erstellt und möchte gern die External-Bib nutzen, damit die Kompilationsdauer mal deutlich schneller wird.

Dabei habe ich folgendes Problem festgestellt: \cite-Befehle innerhalb der TikZUmgebung verursachen Fehler.

Weiß jemand Rat? Ist das ein Bug? Immerhin handelt es sich ja nicht umsonst um eine Entwicklerversion ... :)

Beispiel:



\documentclass{scrreprt}

\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize

\begin{document}

\begin{tikzpicture}
\node{\cite{atuning}};
\end{tikzpicture}

\cite{atuning}

\begin{thebibliography}{sotief}
\bibitem{atuning}Volker Wollny (Hrsg.): {\it Amiga--Tuning}.
Interest--Verlag, Augsburg, 1996.
\end{thebibliography}

\end{document}


Die sehr interessante Weiterentwicklung ist nur in der 2.0 CVS Version von TiKz/PGF enthalten.

Viele Grüße!

mechanicus
27-08-2010, 22:09
Hi,

in der Doku steht:

It can’t expand macros during this step, so the only requirement is that every picture’s end is directly
reachable from its beginning, without further macro expansion.


Gruß
Marco

borose
30-08-2010, 11:18
Hi,

aber es können doch Makros ausgeführt werden. Oder ist \def\Name{Onkel Tom} keine Makrodefinition? Gibt es evtl. ein (von mir aus auch etwas "unsauber") Workaround? ich hatte daher noch die Idee, den \cite-befehl in eine sbox auszulagern, aber das scheiterte. Aber prinzipiell funktioniert doch eine Makroexpansion mit external?!? Sonst würde "\node {\Name};" und "\node at (0,-1cm) {\usebox{\boxA}};" doch keine Ausgabe liefern?!? Ich habe die Funktionsweise von external so verstanden, dass es während es die zu generierenden Bilder erzeugt immer den gesamten TeX-Code ausführt, aber halt nur nicht ins PDF bringt (kein "ship out"?).


\documentclass{scrreprt}

\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{external}\tikzexternalize

\begin{document}

\newsavebox{\boxA}
\sbox{\boxA}{\cite{atuning}}

\def\Name{Onkel Tom}
%\edef\Name{\cite{atuning}}

\newsavebox{\boxB}
\sbox{\boxB}{\Name}

\usebox{\boxA}

\usebox{\boxB}

\fbox{\begin{tikzpicture}
\node {\Name};
\node at (0,-1cm) {\usebox{\boxA}};
\node at (0,-2cm) {\usebox{\boxB}};

\end{tikzpicture}}

\cite{atuning}

\begin{thebibliography}{sotief}
\bibitem{atuning}Volker Wollny (Hrsg.): {\it Amiga--Tuning}.
Interest--Verlag, Augsburg, 1996.
\end{thebibliography}

\end{document}

mechanicus
30-08-2010, 16:39
Hi,

in der log-Datei findest du folgenden Hinweis:


LaTeX Warning: Reference `atuning' in external picture `test-figure0' could not be resolved\on@line .
This is because the test.aux file is not accessable in this context, you will need to issue the externalize command
\the \toks 0
manually

Mit einem einfachen Makro \def\Hallo{Hallo} klappt es natürlich. Ich habe so verstanden, dass es hier funktioniert, weil keine weitere Expansion stattfindet.

Gruß
Marco

bobmalaria
30-08-2010, 16:44
hi,

im zweifel kannst du eventuell mit dem overpic paket den \cite befehl im nachhinein über die grafik legen.

gruss

voss
30-08-2010, 17:40
Mit einem einfachen Makro \def\Hallo{Hallo} klappt es natürlich. Ich habe so verstanden, dass es hier funktioniert, weil keine weitere Expansion stattfindet.


\cite braucht zwei LaTeX-Läufe und das geht nicht, wenn es schon beim ersten Mal extern ausgelagert wird.

Herbert

Feuersaenger
31-08-2010, 09:02
Hallo,

ich glaube, ich kann hier etwas helfen: das "es kann bei der Externalisierung keine Makros expandieren" hat hiermit nichts zu tun. Vorneweg: dieser Hinweis bedeuted nur, dass man

\begin{tikzpicture}
...
\end{tikzpicture}

schreiben muss. Im Vergleich:
\newcommand\ENDE{\end{tikzpicture}

\begin{tikzpicture}
...
\ENDE
ist nicht erlaubt, weil die externalisierung nach der Zeichenkette "\end{tikzpicture}" scannt und diese erst nach expandierung von \ENDE sichtbar wird.

Aber zu dem eigentlichen Problem:
Dein \cite Befehl erfordert Zugang zu test.aux . Dieser Zugriff ist aber unmoeglich, wenn die Externalisierung dynamisch durch einen systemcall durchgefuehrt wird. Warum? Naja, es laeuft ja noch
latex -shell-escape test ---> d.h. die Datei test.aux wird erst gerade erstellt. Wenn dann auch noch das test-figure0 erstellt wird, koennen Race Conditions entstehen.

Aus dem Grund meckert die External lib; Du wirst in Deinem log vermutlich eine Warnung der Art

LaTeX Warning: Reference `atuning' in external picture `PPP-figure0' could not be resolved on input line 13.
This is because the PPP.aux file is not accessable in this context, you will need to issue the externalize command
pdflatex -shell-escape -halt-on-error -interaction=batchmode -jobname "PPP-figure0" "\def \tikzexternalrealjob {PPP}\input {PPP}"
manually.

finden (wie schon von jemand anderem gepostet). Die Loesung: Du musst (leider)
pdflatex -shell-escape -halt-on-error -interaction=batchmode -jobname "PPP-figure0" "\def \tikzexternalrealjob {PPP}\input {PPP}"
von Hand aufrufen (ersetze PPP durch test).

Alternativen: 'mode=list and make' und ein Skript oder Make programm. Details dazu stehen auch irgendwo im manual von tikz.

Dein Beispiel hat mich jedoch auf einen kleinen Fehler bei der .aux-file Verwaltung in der external lib gebracht, den ich soeben beheben konnte. Danke :) Kann sein, dass dieser Fehler auch die erfolgreiche Ausfuehrung be-oder verhindert hat.

Mit liebem Gruss

Christian

borose
31-08-2010, 11:11
Vielen Dank für die Antworten!

Christian, dein Lösungsansatz funktioniert! Ich danke Dir im Speziellen!

Kompilierung auf Kommandozeile mit
pdflatex -shell-escape -halt-on-error -interaction=batchmode -jobname "Test-figure0" "\def \tikzexternalrealjob {Test}\input {Test}" für das Erstellen des "problematischen" Bildes funktioniert (nachdem natürlich vorher ohne \tikzexternalize alle Referenzen richtig gesetzt worden sind :) )

borose
31-08-2010, 11:36
Hupps, war ein wenig voreilig ..

Es funktioniert zwar, aber nur für einen weiteren "normalen" Durchlauf.

Folgendes Bsp.



%file: Test.tex
\documentclass{scrreprt}

\usepackage[latin1]{inputenc}
\usepackage{tikz}

%\usetikzlibrary{external}\tikzexternalize

\begin{document}

\begin{tikzpicture}
\node {\cite{atuning}};
\end{tikzpicture}

\begin{thebibliography}{sotief}
\bibitem{atuning}Volker Wollny (Hrsg.): {\it Amiga--Tuning}.
Interest--Verlag, Augsburg, 1996.
\end{thebibliography}

\end{document}

1. Durchlauf unter Texnicenter. (externalize ist ausgeklammert -> alles i.O.)
2. Ausklammerung von \usetikzlibrary{external}\tikzexternalize aufheben und abspeichern
3. Aufruf von
pdflatex -shell-escape -halt-on-error -interaction=batchmode -jobname "Test-figure0" "\def \tikzexternalrealjob {Test}\input {Test}" per Kommandozeile -> Test-figure0.pdf wird völlig korrekt erstellt.
3. Wieder im Texniccenter: 1. Kompilation: keine Probleme
4. Wieder im Texniccenter: 2. Kompilation: Fehler "Missing \begin{document}" und als allererstes wird ins PDF "tuning" reingeschrieben. Was ist passiert? Ist das der "kleine Fehler bei der .aux-file Verwaltung in der external lib", von dem Christian sprach?

voss
31-08-2010, 23:12
Aber zu dem eigentlichen Problem:
Dein \cite Befehl erfordert Zugang zu test.aux . Dieser Zugriff ist aber unmoeglich, wenn die Externalisierung dynamisch durch einen systemcall durchgefuehrt wird. Warum? Naja, es laeuft ja noch
latex -shell-escape test ---> d.h. die Datei test.aux wird erst gerade erstellt. Wenn dann auch noch das test-figure0 erstellt wird, koennen Race Conditions entstehen.


die aux-Datei wird erst mit dem \end{document} rausgeschrieben.

Herbert

Feuersaenger
01-09-2010, 15:14
Hupps, war ein wenig voreilig ..

Es funktioniert zwar, aber nur für einen weiteren "normalen" Durchlauf.

4. Wieder im Texniccenter: 2. Kompilation: Fehler "Missing \begin{document}" und als allererstes wird ins PDF "tuning" reingeschrieben. Was ist passiert? Ist das der "kleine Fehler bei der .aux-file Verwaltung in der external lib", von dem Christian sprach?

Hallo Borose, ja genau, das ist der Fehler. Das ist in der neuesten CVS Version behoben. Versehentlich wurde mit \citation tuning statt mit \citation{tuning} gearbeitet (die klammern sind verloren gegangen).

@Herbert: es scheint mir, als ob die .aux Datei Bufferung unterliegt und per Spezifikation allerspaetestens bei \close\filehandle geschrieben werden muss. Dazwischen ist scheinbar alles drin; beispielsweise habe ich ungepufferte .aux file generierung schon gesehen und auch gepufferte - und jetzt auch eine, die erst bei \close schreibt.
In jedem Fall ist der Effekt wie von Dir geschrieben: vor \end{document} kann man nicht an die .aux file informationen ran. Oder habe ich was falsch verstanden und LaTeX puffert alle \write kommandos bis \end{document} mithilfe von TeX makros? Das waere u.U. sehr teuer (wegen Makro-append = O(N^2) ), oder?

voss
01-09-2010, 15:50
In jedem Fall ist der Effekt wie von Dir geschrieben: vor \end{document} kann man nicht an die .aux file informationen ran. Oder habe ich was falsch verstanden und LaTeX puffert alle \write kommandos bis \end{document} mithilfe von TeX makros? Das waere u.U. sehr teuer (wegen Makro-append = O(N^2) ), oder?

Du hast es schon richtig verstanden.
Innerhalb von \def\document{..} werden die Hilfsdateien eingelesen,
dann geöffnet und \relax reingeschrieben.
Innerhalb von \def\enddocument{...} werden alle temporären
Dateien geschrieben. Ob gepuffert wird oder nicht hat nichts mit
TeX, sondern nur mit dem Betriebssystem zu tun. In jedem Fall steht
keine der aktuellen Inhalte von \jobname.aux zur Verfügung.

Herbert

borose
01-09-2010, 17:26
Ich kann mich nur bedanken! Vielen Dank!

Mit der aktuellen Entwicklerversion aus dem Repository funktioniert es wunderbar :)

Viele Grüße!