Anzeige:
Ergebnis 1 bis 13 von 13

Thema: Problem: TikZ + external Lib + \cite

  1. #1
    Registrierter Benutzer
    Registriert seit
    10.09.2009
    Beiträge
    98

    Problem: TikZ + external Lib + \cite

    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:

    Code:
    \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!

  2. #2
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    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

  3. #3
    Registrierter Benutzer
    Registriert seit
    10.09.2009
    Beiträge
    98
    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"?).

    Code:
    \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}
    Geändert von borose (30-08-2010 um 11:21 Uhr)

  4. #4
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    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

  5. #5
    Registrierter Benutzer Avatar von bobmalaria
    Registriert seit
    28.11.2006
    Ort
    Düsseldorf
    Beiträge
    4.174
    hi,

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

    gruss
    Mein Ball ist umgefallen

  6. #6
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von mechanicus Beitrag anzeigen
    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

  7. #7
    Registrierter Benutzer
    Registriert seit
    23.07.2010
    Beiträge
    96
    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

  8. #8
    Registrierter Benutzer
    Registriert seit
    10.09.2009
    Beiträge
    98
    Vielen Dank für die Antworten!

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

    Kompilierung auf Kommandozeile mit
    Code:
    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 )

  9. #9
    Registrierter Benutzer
    Registriert seit
    10.09.2009
    Beiträge
    98
    Hupps, war ein wenig voreilig ..

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

    Folgendes Bsp.

    Code:
    %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
    Code:
    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?
    Geändert von borose (31-08-2010 um 11:40 Uhr)

  10. #10
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von Feuersaenger Beitrag anzeigen
    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

  11. #11
    Registrierter Benutzer
    Registriert seit
    23.07.2010
    Beiträge
    96
    Zitat Zitat von borose Beitrag anzeigen
    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?

  12. #12
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von Feuersaenger Beitrag anzeigen
    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

  13. #13
    Registrierter Benutzer
    Registriert seit
    10.09.2009
    Beiträge
    98
    Ich kann mich nur bedanken! Vielen Dank!

    Mit der aktuellen Entwicklerversion aus dem Repository funktioniert es wunderbar

    Viele Grüße!

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •