J'ai un code TikZ très lourd (que je ne reproduis pas ici : plus de 3000 lignes) que je veux reproduire à plusieurs reprises sur un même document latex ; malheureusement, le code est trop lourd et la sentence tombe, irrévocable :

! TeX capacity exceeded, sorry [main memory size=5000000].

Est-il possible de dupliquer une figure via TikZ (ou autre !) à l'intérieur d'un même document sans relancer toute la machine à calculer ?

Posée 03 Fév '21, 22:44

gnut's gravatar image

gnut
7115
Taux d'acceptation : 0%

Modifiée 04 Fév '21, 09:08

denis's gravatar image

denis ♦♦
7.3k1510

1

Bienvenue sur Texnique.fr :-)

(04 Fév '21, 00:45) touhami touhami's gravatar image

Les formules de politesse et les signatures sont à éviter : celle(s) de votre contribution a (ont) été supprimée(s).

(04 Fév '21, 09:06) denis ♦♦ denis's gravatar image

Avec external chaque tikzpicture devient une image et on peut la réutiliser (on a besoin de compilier avec --shell-escape) :

Ouvrir dans l'éditeur Overleaf
% !TeX program = txs:///arara
% arara: pdflatex: {synctex: on, interaction: nonstopmode, shell: yes}
\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize

\begin{document}

\tikzsetnextfilename{foo}
\begin{tikzpicture}
\fill[red] (0,0) rectangle (1,1);
\end{tikzpicture}

text

\includegraphics{foo}

\end{document}
Lien permanent

Publiée 04 Fév '21, 00:32

samcarter's gravatar image

samcarter
8.4k2817
Taux d'acceptation : 56%

Modifiée 04 Fév '21, 00:38

Vous pouvez compiler le code dans un fichier monimage.tex à part

Ouvrir dans l'éditeur Overleaf
\documentclass[tikz]{standalone}

\begin{document}
\begin{tikzpicture}
code de plus de 3000 lignes
\end{tikzpicture}
\end{document}

puis insérer l'image, autant que vous le voulez, via \includegraphics{monimage.pdf}.

Si vous voulez porter le code source de l'image avec le fichier maître, alors vous pouvez essayer quelque chose comme ça.

Ouvrir dans l'éditeur Overleaf
\documentclass[french]{article}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{tikz}

\newif\ifnopdf
\newif\ifnotex
\IfFileExists{monimage.pdf}{}{%
  \IfFileExists{monimage.tex}{}{\notextrue}%
  \nopdftrue}
\ifnopdf
  \ifnotex
    \begin{filecontents}{monimage}
    \documentclass[tikz]{standalone}

    \begin{document}
    \begin{tikzpicture}
    \draw (0,0) rectangle (5,5);
    \end{tikzpicture}
    \end{document}
    \end{filecontents}
  \fi
  \errmessage{Le fichier ``monimage.pdf'' n'existe pas!^^J
  Lancer la commande ``pdflatex monimage.tex'' puis recommencer}%
  \stop
\fi

\begin{document}

Bla bla  
\includegraphics{monimage.pdf}
\end{document}
Lien permanent

Publiée 04 Fév '21, 00:44

touhami's gravatar image

touhami
9.7k410
Taux d'acceptation : 51%

Deux autres possibilités, en complément de ce qui a été proposé :

  • compiler avec lualatex, qui gère la mémoire de façon dynamique.
  • mettre la figure dans une \box :

Par exemple :

Ouvrir dans l'éditeur Overleaf
\documentclass{article}
\usepackage{tikz}   
\begin{document}
\newsavebox{\longtikz}
\savebox\longtikz{\hbox{%
    \begin{tikzpicture}
    [...]
    \end{tikzpicture}}}
\foreach \i in {1,...,100}
  {\usebox\longtikz\par}    
\end{document}

Cette deuxième solution a quand même des limites : si on enlève le \par dans le \foreach, on a à nouveau des problèmes de dépassement de mémoire ; même s'il n'y a pas besoin de refaire les calculs, chaque copie de la \box est quand même lourde, et LaTeX ne peut pas en garder trop en mémoire...

Lien permanent

Publiée 04 Fév '21, 09:18

nmarkey's gravatar image

nmarkey
1.4k29
Taux d'acceptation : 45%

Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.