Bonsoir,

J'ai créé cette image alt text pour transcrire des problèmes sous forme de diagramme. J'utilise Metapost et LaTeX pour l'accolade. Existe-t-il, sous LaTeX, des accolades "plus englobantes", c'est-à-dire dans mon cas, des accolades dont les extrêmités remonteraient jusqu'à mi-hauteur des rectangle 2 et 3 ?

Posée 10 Déc '19, 23:35

christophe-poulain's gravatar image

christophe-poulain
8661727
Taux d'acceptation : 37%

Modifiée 16 Déc '19, 22:09

Pathe's gravatar image

Pathe ♦♦
7.5k42204251


Bon, j'ai suivi vos idées en recréant une accolade sous metapost :). J'ai adapté le code trouvé ici : https://tex.stackovernet.com/fr/q/67363

Voici le code :

Ouvrir dans l'éditeur Overleaf
\documentclass{article}

\usepackage[shellescape]{gmp}

\begin{document}
\begin{mpost}
prologues:=2;

u:=1cm;

vardef braceh_label(expr s,a,b) text t_ = 
  save m,theta; pair m; 
  theta := angle (b-a); m := .5[a,b]+(10 up rotated theta); 
  label.top(s,m) rotatedabout(m, theta) t_; 
  draw (a+(1 left + 5 down)){dir (90-theta)}
    .. a+(2 up rotated theta) { dir (60+theta) } 
    .. a+((6,6) rotated theta) 
    -- m+((-6,-4) rotated theta) 
    .. { dir (60+theta) } m { dir (theta-60) } 
    .. m+((+6,-4) rotated theta) 
    -- b+((-6,6) rotated theta) 
    .. { dir (theta-60) } b+(2 up rotated theta)
    .. { dir (theta-90) } b+(1 right+5down)
    withpen pencircle scaled .4 t_; 
enddef;

vardef braceb_label(expr s,a,b) text t_ = 
  save m,theta; pair m; 
  theta := angle (b-a); m := .5[a,b]+(10 down rotated -theta); 
  label.bot(s,m) rotatedabout(m, theta) t_; 
  draw (a+(1 left + 5 up)){dir (-90+theta)}
    .. a+(2 down rotated -theta) { dir (-60-theta) } 
    .. a+((6,-6) rotated -theta) 
    -- m+((-6,4) rotated -theta) 
    .. { dir (-60-theta) } m { dir (-theta+60) } 
    .. m+((+6,4) rotated -theta) 
    -- b+((-6,-6) rotated -theta) 
    .. { dir (-theta+60) } b+(2 down rotated -theta)
    .. { dir (-theta+90) } b+(1 right+5 up)
    withpen pencircle scaled .4 t_; 
enddef;

vardef Bloc(expr tt)=
  save Bb;
  if numeric tt:
    path Bb;
    Bb=u*(-0.5,-0.25)--u*(0.5,-0.25)--u*(0.5,0.25)--u*(-0.5,0.25)--cycle;
  elseif picture tt:
    picture Bb;
    Bb=tt;
  fi;
  Bb
enddef;

boolean visible[];
visible1=false;
visible2=false;
visible3=false;

vardef Groupe(expr base,aa,bb,cc,op)=%base est une paire; a,b,c les composants, op l'opération sous forme classique
  save $;
  picture $;
  pair Base[];
  Base1=base+u*(-1.5,0.85);
  Base2=base+u*(0,0.85);
  Base3=2[Base1,Base2];
  $=image(
    draw Bloc(aa) shifted Base1;
    draw Bloc(bb) shifted Base3;
    draw Bloc(cc) shifted base;
    if op="m":
      label(btex $\times$ etex,Base2);
    fi;
    if op="a":
      label(btex $+$ etex,Base2);
    fi;
    if op="s":
      label(btex $-$ etex,Base2);
    fi;
    if op="d":
      label(btex $\div$ etex,Base2);
    fi;
    if visible1:
      if numeric aa:
    label(""&decimal(aa)&"",Base1);
      fi;
    fi;
    if visible2:
      if numeric bb:
    label(""&decimal(bb)&"",Base3);
      fi;
    fi;
    if visible3:
      if numeric cc:
    label(""&decimal(cc)&"",base);
      fi;
    fi;
    braceb_label("",Base1+u*(-0.6,-0.15),Base3+u*(0.6,-0.15));
    );
  $
enddef;

beginfig(1);
  picture BB[];
  visible1:=true;
  visible2:=true;
  BB1=Groupe(u*(0,0),2,3,6,"m");
  visible1:=false;
  BB2=Groupe(u*(0,0),BB1,5,3,"a");
  BB3=Groupe(u*(0,0),20,BB2,3,"s");
  draw BB3;
endfig;

end
\end{mpost}

\end{document}
Lien permanent

Publiée 11 Déc '19, 22:14

christophe-poulain's gravatar image

christophe-poulain
8661727
Taux d'acceptation : 37%

Modifiée 11 Déc '19, 22:20

Et pour finir, la solution avec pstricks:

Ouvrir dans l'éditeur Overleaf
\documentclass[svgnames]{article}%
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{fourier, erewhon}
\usepackage{pstricks-add}
\usepackage{auto-pst-pdf}

\begin{document}

\[
  \pnode[-1em, 1.2ex]{A}\framebox[2em]{2}\hspace{5em}\times \hspace{5em}\framebox[2em]{3} \pnode[1em,1.2ex]{B}
\psset{linejoin=1, braceWidth=1.2pt, braceWidthInner=16pt, braceWidthOuter=6pt, linecolor=RoyalBlue}
\psbrace*[ref=tC, nodesepB=0.2ex](A)(B){\framebox[2em]{\phantom{2}}}
\]
\end{document}

alt text

Lien permanent

Publiée 11 Déc '19, 02:04

Bernard's gravatar image

Bernard
4.6k15
Taux d'acceptation : 35%

merci, je vais voir si c'est compatible avec mon usage de metapost.

(11 Déc '19, 18:23) christophe-poulain christophe-poulain's gravatar image

Avec TikZ : on peut reprendre le code qui crée les accolades (decoration=brace ou, comme ci-dessous, decoration=calligraphic brace) et prolonger (« à la main ») les extrémités :

Ouvrir dans l'éditeur Overleaf
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calligraphy,calc}

\makeatletter
%% cf. tikzlibrarycalligraphy.code.tex
\pgfdeclaredecoration{my calligraphic brace}{brace}
{
  \state{brace}[width=+\pgfdecoratedremainingdistance,next state=final]
  {
    \pgfsyssoftpath@setcurrentpath{\pgfutil@empty}
    \pgfpathmoveto{\pgfpointorigin}
    \pgfpathmoveto{\pgfqpoint{1mm}{-2mm}}   %% cette ligne modifie le point de départ
    \pgfpathcurveto
    {\pgfqpoint{.15\pgfdecorationsegmentamplitude}{.3\pgfdecorationsegmentamplitude}}
    {\pgfqpoint{.5\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
    {\pgfqpoint{\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
    {
      \pgftransformxshift{+\pgfdecorationsegmentaspect\pgfdecoratedremainingdistance}
      \pgfpathlineto{\pgfqpoint{-\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
      \pgfpathcurveto
      {\pgfqpoint{-.5\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
      {\pgfqpoint{-.15\pgfdecorationsegmentamplitude}{.7\pgfdecorationsegmentamplitude}}
      {\pgfqpoint{0\pgfdecorationsegmentamplitude}{1\pgfdecorationsegmentamplitude}}
      \pgfpathmoveto{\pgfqpoint{0\pgfdecorationsegmentamplitude}{1\pgfdecorationsegmentamplitude}}
      \pgfpathcurveto
      {\pgfqpoint{.15\pgfdecorationsegmentamplitude}{.7\pgfdecorationsegmentamplitude}}
      {\pgfqpoint{.5\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
      {\pgfqpoint{\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
    }
    {
      \pgftransformxshift{+\pgfdecoratedremainingdistance}
      \pgfpathlineto{\pgfqpoint{-\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
      \pgfpathcurveto
      {\pgfqpoint{-.5\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
      {\pgfqpoint{-.15\pgfdecorationsegmentamplitude}{.3\pgfdecorationsegmentamplitude}}
      {\pgfqpoint{-1mm}{-2mm}}   %% cette ligne modifie le point d'arrivée
    }
    \tikzset{
      taper width=.5\pgflinewidth,
      taper
    }%
    \pgfsyssoftpath@getcurrentpath\cal@tmp@path
    \MakeSPathList{calligraphy path}{\cal@tmp@path}%
    \SPathListPrepare{calligraphy path}%
    \CalligraphyPathCreate{calligraphy path}{copperplate}%
  }
  \state{final}{}
}
\makeatother

\begin{document}

\begin{tikzpicture}
\draw (0,1) node[draw] (2) {2};
\draw (3,1) node[draw] (3) {3};
\draw[decoration={my calligraphic brace,amplitude=4mm,mirror,raise=-1mm},decorate,line width=1.3pt] ($(2.south west)+(-2mm,0)$) -- ($(3.south east)+(2mm,0)$);
\end{tikzpicture}

\end{document}
Lien permanent

Publiée 11 Déc '19, 00:23

nmarkey's gravatar image

nmarkey
1.4k29
Taux d'acceptation : 45%

Modifiée 30 Déc '19, 21:04

Pathe's gravatar image

Pathe ♦♦
7.5k42204251

Merci. JE vais voir si c'est compatible avec mon usage de metapost.

(11 Déc '19, 18:23) christophe-poulain christophe-poulain's gravatar image

La dernière extension de Metapost devrait aussi permettre de le faire, car elle introduit la notion de nodes.

(16 Déc '19, 16:25) sztruks sztruks'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.