Bourbaki (III) — Les-mathematiques.net The most powerful custom community solution in the world

Bourbaki (III)

[large]Bonjour

Voici un code :
\begin{tikzpicture}
\path[draw, line width=4pt, rounded corners=8pt, color=gray](0,1)--(1,1)--(0,0)--(1,0);
\end{tikzpicture}

Dans la mesure du possible, je souhaiterais
  • positionner ce symbole bien connu dans la marge de gauche d'une page, quelle que soit la page concernée ;
  • débuter la partie du texte de la page auquel il se rapporte à partir du sommet dudit symbole ;
  • concevoir un environnement nommé bZ [s'il existe d'autres propositions plus pertinentes, je suis preneur] ;
  • dans la mesure du possible, modifier la taille du symbole.

Je vous remercie par avance.

Bien cordialement,

Thierry[/large]
Le chat ouvrit les yeux, le soleil y entra. Le chat ferma les yeux, le soleil y resta. Voilà pourquoi le soir, quand le chat se réveille, j'aperçois dans le noir deux morceaux de soleil. (Maurice Carême).

Réponses

  • [large]Pour illustrer mes propos, voici un exemple d'utilisation qui ne concerne que la partie "Mais $g_x$ n'est pas nécessairement (...)," extraite du livre de topologie générale.[/large]120914
    Le chat ouvrit les yeux, le soleil y entra. Le chat ferma les yeux, le soleil y resta. Voilà pourquoi le soir, quand le chat se réveille, j'aperçois dans le noir deux morceaux de soleil. (Maurice Carême).
  • Hum, ça change tout. J'avais écrit un truc bien testé en supposant que l'environnement démarre et termine toujours un paragraphe, et qui s'assure qu'il y a toujours assez de lignes de texte avant la fin de la page pour que le symbole spécial ne déborde pas dans la marge du bas.

    Bon. J'ai adapté pour que l'environnement puisse aussi être utilisé en milieu de paragraphe, mais dans ce cas, si ça commence en bas de la page, tant pis. \marginpar pourrait peut-être s'occuper de ce cas, mais je crois qu'il faut bricoler si l'on veut que cela apparaisse toujours à gauche lorsque le document est en mode 'twoside'. Il y a aussi le package marginnote, mais à lire la documentation (Known Issues Using marginnote), je préfère utiliser un truc maison bien maîtrisé.

    Le paramètre scale de la tikzpicture permet de régler la taille du symbole. Mon :
    \clubpenalties=3 \@M\@M\z@
    
    correspond à un symbole qui couvre 3 lignes comme dans mon exemple. Il faut évidemment adapter ça si c'est différent dans ton document. C'est cette affectation qui fait en sorte que, lorsque l'environnement bZ commence en mode vertical (pas dans un paragraphe), il se débrouille pour qu'il y ait au moins 3 lignes de texte avant la prochaine coupure de page.

    Une autre solution consisterait à poser une marque avec \tikzmark ou \pgfmark et à l'utiliser pour :
    • regarder où l'on est par rapport au bas de la page ;
    • placer le symbole spécial : même ordonnée que la marque à un déclalage près, abscisse fixe par rapport à la marge gauche.
    Cette approche-là nécessiterait au moins deux compilations.
    \documentclass{article}
    \usepackage{tikz}
    
    \makeatletter
    \newsavebox{\symboleZ}
    \begin{lrbox}{\symboleZ}
      \begin{tikzpicture}[baseline=(A), scale=1.1]
        \draw[line width=4pt, rounded corners=8pt, color=gray]
          (0,1) coordinate (A) -- (1,1) -- (0,0) -- (1,0);
      \end{tikzpicture}%
    \end{lrbox}
    
    % Inspiré de la solution de l'exercice 14.28 du TeXbook :
    \newcommand*{\bZ@box}[1]{%
      \vtop to #1{%
        \baselineskip=#1\relax
        \vss
        \llap{%
          \raisebox{1ex}[0pt][0pt]{\usebox{\symboleZ}}%
          \hspace{1em}%
        }%
        \null
      }%
    }
    
    \newif\if@bZ@started@in@para
    
    % Argument optionnel : profondeur de la ligne où commence l'environnement.
    \newenvironment{bZ}[1][\dp\strutbox]
      {%
        \relax \ifhmode \@bZ@started@in@paratrue \else \@bZ@started@in@parafalse \fi
        \strut\vadjust{\kern-#1\bZ@box{#1}}%
        % Adapter « \clubpenalties=3 \@M\@M\z@ » en fonction du nombre de lignes
        % occupées par la boîte \symboleZ.
        \if@bZ@started@in@para\else \clubpenalties=3 \@M\@M\z@ \fi
        \ignorespaces
      }
      {%
        \if@bZ@started@in@para
          \unskip
        \else
          \par\clubpenalties=\z@    % reset
        \fi
      }
    \makeatother
    
    % À enlever, évidemment.
    \newcommand*{\bbidon}{%
      Abcd efgh hef zfee zesfe fie iei ei eraee efe earar arzr az aarar.%
    }
    \newcommand*{\bidon}{%
      \bbidon\space\bbidon\space\bbidon\space\bbidon\space\bbidon\space\bbidon
    }
    
    \begin{document}
    
    \begin{bZ}
      \bidon
    \end{bZ}
    
    \bidon
    
    \bbidon\space\bbidon\space\bbidon\space
    \begin{bZ}
      Mais $g_x$ n'est pas nécessairement...
      \bbidon\space\bbidon\space\bbidon\space Zzz % <------ espace ignoré
    \end{bZ} % <-- espace
    bla, bla, bla.
    
    \begin{bZ}[20pt]
      Boîte très profonde (20~points) sur la première ligne :
      \vrule width 0.4pt depth 20pt\ etc. \bidon
    \end{bZ}
    
    \end{document}
    
    120924
  • Bonsoir Brian

    Encore une fois, tu es mon sauveur. Tu as accompli un excellent travail de fond. J'aimerais pouvoir maîtriser la programmation Tex. Veux-tu me rappeler une bonne référence, s'il te plait ?

    Pour ma part, j'avais cherché des solutions sur le net, notamment sur le fameux stackexchange qui est extrêmement riche, mais qui demande souvent de savoir programmer sous [La]Tex. Ton dur travail correspond exactement à ce que je recherchais. Tu devrais écrire un livre.

    Je veux encore te remercier. Ton aide est vraiment précieuse pour tout le monde, d'autant que je ne t'ai pas demandé quelque chose de facile.

    Amicalement,

    Thierry
    Le chat ouvrit les yeux, le soleil y entra. Le chat ferma les yeux, le soleil y resta. Voilà pourquoi le soir, quand le chat se réveille, j'aperçois dans le noir deux morceaux de soleil. (Maurice Carême).
  • Bonsoir Thierry,

    J'ai déjà donné mes références sur (La)TeX ici. Si tu veux un conseil, lit le TeXbook. Tu sembles avoir l'habitude de lire des textes mathématiques, cela ne devrait à mon avis pas te poser de grandes difficultés (mais tu peux m'envoyer un MP quand tu auras bien digéré les annexes B(*), D et G :-D).

    Au début, tu seras peut-être un peu frustré de passer du temps sur du « bas niveau » (pas de TikZ dans le TeXbook !), de chercher les exercices parfois un peu bizarroïdes de Knuth. Mais si tu fais ça sérieusement et que tu pratiques dans la foulée, tu vas voir que ce livre contient toutes les bases nécessaires pour savoir ce que l'on fait. Et contrairement au Lamport, il y a aussi dans le TeXbook tous les détails dans lesquels se cache le diable — certes, que sur TeX, mais il faut commencer par là à mon avis si l'on veut pouvoir écrire des choses non triviales.

    Concernant un livre de moi... il y a en anglais l'expression qui convient : don't hold your breath! C'est simplement impossible en raison de mon état de santé (et d'une grosse saloperie d'origine humaine qui me pourrit la vie depuis presque un an et est loin d'être terminée). J'essaie de me rendre un peu utile, mais je ne peux pas faire tellement plus.

    D'autre part, à mon avis, pour éviter de pondre un livre qui plagie le Lamport et se contente d'effleurer l'aspect programmation, un bonne solution serait de dire que la lecture du TeXbook est un prérequis (sauf éventuellement les annexes et quelques chapitres particuliers, suivant ce que l'on veut faire). Ça ne plairait sans doute pas aux éditeurs. Restons dans la réalité où ce livre hypothétique n'existe pas : quand on a lu les deux prérequis — j'inclus le Lamport qui est pour ainsi dire un roman —, on peut s'entraîner à écrire des petites macros (parsing simple, récursion, automatisations diverses, compréhension et gestion des problèmes de catcodes non standards...), à résoudre ses petits problèmes et ceux des autres, et petit à petit, on progresse. :-)

    (*) L'annexe B est le code commenté de plain TeX. Elle est très lisible et instructive. Il y a juste deux ensembles de macros un peu balaises dont la compréhension est laissée à la sagacité du lecteur :
    • \settabs et ses amis (cela correspond à peu près à l'environnement tabbing de LaTeX) ;
    • \bordermatrix pour écrire des matrices avec des cellules additionnelles à l'extérieur, utilisées à des fins d'annotation (typiquement : $C_1$, $C_2$,..., $L_1$, $L_2$...).
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!