Tikz-Externalisierung mit Lualatex in Kombination mit einem automatischen Inkscape-Import

Tikz-Externalisierung mit Lualatex in Kombination mit einem automatischen Inkscape-Import

Ich habe ein riesiges Dokument mit vielen Abbildungen. Für Diagramme verwende ich Matlab und konvertiere das Diagramm mit matlab2tikz in Tikz (und nehme anschließend einige Änderungen vor). Für die meisten anderen Abbildungen bevorzuge ich Inkscape und seinen pdf_tex-Export. Sowohl für Tikz als auch für Inkscape möchte ich, dass die Abbildungen automatisch neu generiert werden, wenn sich an der Abbildung etwas geändert hat. Dafür habe ich zwei benutzerdefinierte Befehle, \includetikz und \includesvg. Alles hat wirklich gut funktioniert, bis ich für die Tikz-Abbildungen von pdflatex zu lualatex wechseln musste. Ich habe einige Diagramme, bei denen ich die Daten nicht weiter reduzieren kann, und ich habe es nicht geschafft, diese Abbildungen mit pdflatex zu setzen (auch bei erhöhten Speichereinstellungen). Mit lualatex hat das ganz gut funktioniert. Das Problem ist jetzt, dass der Befehl \includetikz mit lualatex irgendwie mit meinem Befehl \includesvg in Konflikt gerät.

Ich habe folgendes MWE:

\documentclass[11pt,a4paper,english]{scrbook}
\usepackage{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\RequirePackage{luatex85}

% inkscape
\usepackage{import}
\newcommand{\executeiffilenewer}[3]{%
    \ifnum\pdfstrcmp{\pdffilemoddate{#1}}%
    {\pdffilemoddate{#2}}>0%
    {#3}\fi%
}
\newcommand{\includesvg}[2]{%
    \immediate\write18{if not exist #1.svg_external/ (mkdir "#1.svg_external/")}%
    \executeiffilenewer{#1#2.svg}{#1.svg_external/#2.pdf}{%
        \immediate\write18{"C:/Program Files (x86)/Inkscape/inkscape.exe" -z -C --file=#1#2.svg --export-pdf=#1.svg_external/#2.pdf --export-latex}}%
    \import{#1.svg_external/}{#2.pdf_tex}%
}

\usepackage{filemod}
\newlength{\figheight}
\newlength{\figwidth}
\usepackage{tikz}
\usepackage{pgf}
\usepackage{pgfplots}
\usepgfplotslibrary{external}
\pgfplotsset{compat=1.14}
\tikzexternalize % activate externalization
\tikzset{external/system call={lualatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"}}
\tikzset{external/figure list=true}
\tikzset{external/up to date check=simple}
\newcommand{\tikzcustomremake}[2]{\tikzset{external/remake next}}
\newcommand{\includetikz}[2]{%
    \tikzsetnextfilename{#1.tikz_external/#2}%
    \filemodCmp{#1#2.tikz}{#1.tikz_external/#2.pdf}%
    {\tikzcustomremake{#1}{#2}}{}%
    \input{#1#2.tikz}%
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


\begin{document}

\figwidth=5cm
\figheight=5cm
\includetikz{fig/ch1/}{plot2}

%\footnotesize\includesvg{fig/ch1/}{inkscape1}

\end{document}

Leider enthält der Inkscape-Befehl einen absoluten Pfad, daher sollten Sie diesen möglicherweise ändern. Der Code für plot2.tikz lautet wie folgt:

\begin{tikzpicture}
\begin{axis}[%
width=\figwidth,
height=\figheight,
xmin=0,xmax=10,
xlabel=\pgfactualjobname,
ymin=-1,ymax=5,
axis background/.style={fill=white}
]
\addplot [color=red,solid,forget plot]
  table[row sep=crcr]{%
0   0\\
10  1\\
};
\end{axis}
\end{tikzpicture}%

Die Datei inkscape1.svg kann jede beliebige SVG-Datei sein, zum Beispiel:https://de.wikipedia.org/wiki/LaTeX#/media/File:LaTeX_logo.svg

mein Problem jetzt: Wenn ich den Code so ausführe wie er ist, funktioniert alles einwandfrei. Das SVG wird auskommentiert und das resultierende PDF enthält nur den Plot. Wenn ich anschließend den Kommentar des \includesvg-Befehls entferne, funktioniert alles wieder einwandfrei. Das pdf_tex wird generiert und im PDF befinden sich beide Abbildungen. Wenn ich jedoch einige Änderungen in der Tikz-Datei vornehme, sodass die Abbildung neu generiert werden muss, schlägt lualatex fehl.

Die Logfiles helfen mir nicht weiter. Im Logfile des Hauptdokuments ist der Fehlerteil folgender:

Writing 'fig/ch1/.tikz_external/plot2' to 'diss01lua.figlist'.
\openout3 = `diss01lua.auxlock'.

===== 'mode=convert with system call': Invoking 'lualatex -shell-escape -halt-o
n-error -interaction=batchmode -jobname "fig/ch1/.tikz_external/plot2" "\def\ti
kzexternalrealjob{diss01lua}\input{diss01lua}"' ========
runsystem(lualatex -shell-escape -halt-on-error -interaction=batchmode -jobname
 "fig/ch1/.tikz_external/plot2" "\def\tikzexternalrealjob{diss01lua}\input{diss
01lua}")...executed.

\openout3 = `diss01lua.auxlock'.


! Package tikz Error: Sorry, the system call 'lualatex -shell-escape -halt-on-e
rror -interaction=batchmode -jobname "fig/ch1/.tikz_external/plot2" "\def\tikze
xternalrealjob{diss01lua}\input{diss01lua}"' did NOT result in a usable output 
file 'fig/ch1/.tikz_external/plot2' (expected one of .pdf:.jpg:.jpeg:.png:). Pl
ease verify that you have enabled system calls. For pdflatex, this is 'pdflatex
 -shell-escape'. Sometimes it is also named 'write 18' or something like that. 
Or maybe the command simply failed? Error messages can be found in 'fig/ch1/.ti
kz_external/plot2.log'. If you continue now, I'll try to typeset the picture.

See the tikz package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.16 \end{tikzpicture}
                      %
This error message was generated by an \errmessage
command, so I can't give any explicit help.
Pretend that you're Hercule Poirot: Examine all clues,
and deduce the truth by order and method.

in den letzten Zeilen der Logdatei für Plot2 stehen:

LaTeX Font Info:    External font `lmex10' loaded for size
(Font)              <10.95> on input line 15.
LaTeX Font Info:    External font `lmex10' loaded for size
(Font)              <8> on input line 15.
LaTeX Font Info:    External font `lmex10' loaded for size
(Font)              <6> on input line 15.
[1

{C:/ProgramData/MiKTeX/2.9/pdftex/config/pdftex.map}])
if not exist fig/ch1/.svg_external/ (mkdir "fig/ch1/.svg_external/")
! Undefined control sequence.
\executeiffilenewer #1#2#3->\ifnum \pdfstrcmp 
                                              {\pdffilemoddate {#1}}{\pdffil...
l.51 \footnotesize\includesvg{fig/ch1/}{inkscape1}


Here is how much of LuaTeX's memory you used:
 25909 strings out of 494568
 100000,953878 words of node,token memory allocated
 1158 words of node memory still in use:
   4 hlist, 1 rule, 7 disc, 1 local_par, 1 dir, 23 glue, 4 kern, 2 penalty, 85 g
lyph, 7 attribute, 47 glue_spec, 7 attribute_list, 1 if_stack nodes
   avail lists: 2:739,3:212,4:5,5:13,7:182,8:2,9:78,10:1
 29028 multiletter control sequences out of 65536+200000
 27 fonts using 1573183 bytes
 65i,11n,111p,8876b,1869s stack positions out of 5000i,500n,10000p,200000b,50000s
!  ==> Fatal error occurred, no output PDF file produced!

was ich interessant finde ist, dass Lualatex das Inkscape-Zeug irgendwie sieht, was ich nicht verstehe.

Ich habe die vollständigen Protokolldateien hier hochgeladen, falls sie hilfreich sind:http://www.uni-ulm.de/~pqa62/tex/

hat jemand eine Idee und weiß, wie man dieses Verhalten beheben kann? Mir hat die Art und Weise, wie ich die Externalisierung und den automatischen Neuaufbau durchgeführt habe, sehr gut gefallen, insbesondere, weil in der vollständigen Umsetzung meiner Include-Befehle einige fortgeschrittenere Dinge abgedeckt sind und auch, weil alles funktioniert hat, bis ich zu Lualatex wechseln musste.

bearbeiten:

Ich habe noch ein paar Tests gemacht und herausgefunden, dass der benutzerdefinierte Befehl \executeiffileneweranscheinend das Problem ist, warum der Fehler auftritt. Irgendwie schaut sich lualatex (das eigentlich nur den Tikz-Plot setzen soll) \includesvgauch den folgenden Befehl an und versucht, ihn auszuführen. Dabei kennt es diesen benutzerdefinierten Befehl nicht, da er in seinem Aufruf nicht definiert ist. Wenn ich den \includesvgBefehl wie folgt ändere:

\newcommand{\includesvg}[2]{%
    \immediate\write18{"C:/Program Files (x86)/Inkscape/inkscape.exe" -z -C --file=#1#2.svg --export-pdf=#1.svg_external/#2.pdf --export-latex}%
    \import{#1.svg_external/}{#2.pdf_tex}%
}

Ich bekomme keinen Fehler mehr. Das Problem ist, dass immer Inkscape ausgeführt wird. Und trotzdem verstehe ich nicht, warum lualatex nicht stoppt, nachdem der Tikz-Plot fertig ist.

Antwort1

Wenn Sie Ihr Dokument ändern -interaction=batchmodeund -interaction=scrollmodeFehler oder \showBefehle hinzufügen, können Sie sehen, dass der luatex-Lauf die gesamte Tex-Datei kompiliert. Und dabei werden Befehle erweitert – da das Bild in \includetikz zu finden ist, muss es natürlich auch in \includesvg nachsehen. Das bedeutet, dass luatex unbekannte Befehle zu Problemen führen können.

\pdfstrcmpist in luatex nicht definiert. Sie können das Paket pdftexcmds laden, um eine Implementierung zu erhaltenhttps://tex.stackexchange.com/a/158612/2388. Achtung: Ich habe nicht überprüft, ob pdftexcmds an luatex 0.95/1.0 angepasst wurde, aber in meinem abgespeckten Beispiel schien es zu funktionieren.

\documentclass[11pt,a4paper,english]{scrbook}
\usepackage{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{ifluatex}
\ifluatex
\RequirePackage{luatex85}
\usepackage{pdftexcmds}
  \makeatletter
  \let\pdfstrcmp\pdf@strcmp
  \let\pdffilemoddate\pdf@filemoddate
  \makeatother
\fi

\newcommand{\includesvg}{\pdfstrcmp{1}{2}}

\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize % activate externalization
\tikzset{external/system call={lualatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"}}
\tikzset{external/force remake}

\newcommand{\includetikz}{%
 \begin{tikzpicture}
  \draw[red](0,0)--(1,1);
 \end{tikzpicture}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


\begin{document}

blub 

\includesvg

\includetikz

\end{document}

verwandte Informationen