externalização tikz usando lualatex em combinação com uma importação automática do inkscape

externalização tikz usando lualatex em combinação com uma importação automática do inkscape

Tenho um documento enorme com muitos números. Para gráficos, eu uso matlab e converto o gráfico para tikz usando matlab2tikz (e faço algumas modificações depois), para a maioria das outras figuras, prefiro o Inkscape e sua exportação pdf_tex. Para ambos, tikz e Inkscape, gosto de ter as figuras regeneradas automaticamente se algo mudar dentro da figura. Eu tenho dois comandos personalizados para isso, \includetikz e \includesvg. Tudo funcionou muito bem até que tive que mudar de pdflatex para lualatex para as figuras tikz. Tenho alguns gráficos onde não consigo reduzir mais os dados e não consegui compor esses números com pdflatex (também com configurações de memória aumentadas). Com lualatex isso funcionou muito bem. O problema agora é que o comando \includetikz com lualatex de alguma forma interfere no meu comando \includesvg.

Tenho o seguinte 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}

Infelizmente, o comando do Inkscape contém o caminho absoluto, então você pode querer alterá-lo. o código para plot2.tikz é o seguinte:

\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}%

o arquivo inkscape1.svg pode ser qualquer svg, por exemplo:https://de.wikipedia.org/wiki/LaTeX#/media/File:LaTeX_logo.svg

meu problema agora: se eu executar o código como está, tudo funcionará bem. O svg é comentado e o pdf resultante contém apenas o gráfico. Depois, removendo o comentário do comando \includesvg novamente, tudo funciona bem. O pdf_tex é gerado e no pdf constam as duas figuras. No entanto, se eu fizer algumas alterações no arquivo tikz, de modo que a figura precise ser regenerada, o lualatex falhará.

Os arquivos de log não são de nenhuma ajuda para mim. No arquivo de log do documento principal, a parte do erro é a seguinte:

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.

nas últimas linhas do arquivo de log para plot2 estão:

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!

o que acho interessante é que o lualatex de alguma forma vê o material do inkscape, o que não entendo.

Carreguei os arquivos de log completos aqui, se eles ajudarem:http://www.uni-ulm.de/~pqa62/tex/

alguém tem uma idéia e sabe como corrigir esse comportamento? Gostei muito da forma como fiz a externalização e reconstrução automática, principalmente porque na plena realização dos meus comandos include são abordadas algumas coisas mais avançadas e também porque tudo funcionou até que tive que mudar para o lualatex.

editar:

Fiz mais alguns testes e descobri que o comando personalizado \executeiffileneweraparentemente é o problema, por que o erro ocorre. De alguma forma, lualatex (que deveria compor apenas o tikz-plot) \includesvgtambém analisa o comando a seguir e tenta executá-lo. Aqui, ele não conhece este comando personalizado porque não está definido em sua chamada. Se eu modificar o \includesvgcomando assim:

\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}%
}

Não recebo mais nenhum erro. O problema é que ele sempre executa o Inkscape. E ainda assim, não entendo por que o lualatex não para depois que o tikz-plot é concluído.

Responder1

Se você alterar -interaction=batchmodee -interaction=scrollmodeadicionar alguns erros ou \showcomandos ao seu documento, poderá ver que a execução luatex compila todo o arquivo tex. E ele expande os comandos durante isso - ele é capaz de encontrar a imagem dentro de \includetikz, então naturalmente também precisa procurar dentro de \includesvg. Isso significa que comandos não conhecidos pelo luatex podem causar problemas.

\pdfstrcmpnão está definido em luatex. Você pode carregar o pacote pdftexcmds para obter uma implementaçãohttps://tex.stackexchange.com/a/158612/2388. Atenção: não verifiquei se o pdftexcmds foi adaptado para luatex 0.95/1.0, mas no meu exemplo simplificado pareceu funcionar.

\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}

informação relacionada