3
1

J'utilise la classe standalone pour mes figures TikZ. Je lui applique le paramètre border = 1 cm pour obtenir des marges d'un centimètre autour de la figure : si ma figure est petite, les marges sont disproportionnées ; si elle est grande, ces marges paraissent bien petites.

Comment faire pour que la dimension de ces marges soit proportionnelle à la taille de la figure ? J'ai essayé border = .1\linewidth mais je n'obtiens pas le résultat désiré.

Ouvrir dans l'éditeur Overleaf
\documentclass[tikz, border = 1 cm]{standalone}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
    \draw[ultra thick] (1, 1) rectangle (2, 2) ; 
\end{tikzpicture}

\end{document}

Posée 15 Sep '17, 17:22

Pathe's gravatar image

Pathe ♦♦
7.5k40202251
Taux d'acceptation : 55%

C'est ainsi que les riches deviennent toujours plus riches, et les pauvres toujours plus pauvres… ;o)

(15 Sep '17, 17:39) Bernard Bernard's gravatar image

Je ne parlais pas de marges financières ! Mais il serait amusant que les marges d'un bilan financier soient fonction du bénéfice qu'il met en valeur.

(15 Sep '17, 18:17) Pathe ♦♦ Pathe's gravatar image

Voici une solution (il faut compiler deux fois).

Ouvrir dans l'éditeur Overleaf
\documentclass[border=5cm]{standalone}
\makeatletter
\AtEndDocument{%
    \setlength{\@tempdima}{.1\dimexpr\paperwidth-\sa@border@left-\sa@border@right\relax}%
    \@settopoint{\@tempdima}%
    \immediate\write\@mainaux{%
        \gdef\string\sa@border@left{\the\@tempdima}%
        \gdef\string\sa@border@right{\the\@tempdima}%
    }%
    \setlength{\@tempdima}{.1\dimexpr\paperheight-\sa@border@top-\sa@border@bottom\relax}%
    \@settopoint{\@tempdima}%
    \immediate\write\@mainaux{%
        \gdef\string\sa@border@top{\the\@tempdima}%
        \gdef\string\sa@border@bottom{\the\@tempdima}%
    }%
}
\makeatother
\begin{document}
\rule{200pt}{10pt}
\end{document}
Lien permanent

Publiée 16 Sep '17, 11:22

touhami's gravatar image

touhami
9.7k410
Taux d'acceptation : 51%

Modifiée 13 Nov '17, 11:53

Pathe's gravatar image

Pathe ♦♦
7.5k40202251

C'est remarquable. J'ai essayé de comprendre le code : à la fin de la première compilation (qui se termine avec des marges de 5 cm), vous donnez à la la variable tempdima une valeur proportionnelle à \paperwidth moins les marges droite et gauche.

Mais je ne comprends pas comment celle-ci est prise en compte lors de la deuxième compilation (qui aboutit au résultat demandé).

(16 Sep '17, 14:41) Pathe ♦♦ Pathe's gravatar image
1

border=5cm est juste pour l'exemple, vous pouvez tout simplement omettre cet option.

On définit les marges avec des commandes de type : \gdef\sa@border@left{valeur de tempdima} ces définition sont écrits au fichier .aux. LaTeX lit le fichier .aux lors de la deuxième compilation au niveau de la commande \begin{document}.

(16 Sep '17, 15:12) touhami touhami's gravatar image

Il est intéressant de comparer le résultat d'une compilation effectuée en l'absence du fichier .aux avec celui d'une compilation effectuée avec.

Ou de modifier la taille de la figure pour voir varier celle des marges et constater que les marges horizontales sont calculées indépendamment des marges verticales — et ce à l'aide de la même variable !

Je suppose que le fonctionnement des commandes utilisées est expliqué dans le TeXbook.

Pour parvenir à ce résultat, avez-vous eu besoin de lire le code de l'extension standalone ?

(16 Sep '17, 16:59) Pathe ♦♦ Pathe's gravatar image

Il y a des primitives TeX : \immediate,\write, \gdef et \string mais aussi des commande LaTeX \setlength, \@settopoint, \@tempdima et \@mainaux.

J'ai lu partiellement le code de l'extension standalone pour savoir les variables utilisées \sa@border@left ...

(16 Sep '17, 17:08) touhami touhami's gravatar image
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.