% !TeX TXS-program:compile = txs:///arara % arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode} % arara: pdflatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)') \documentclass[french,a4paper,11pt]{article} \usepackage[margin=2cm,includefoot]{geometry} \def\TPversion{0.1.2} \def\TPdate{22 juillet 2023} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{amsmath,amssymb} \usepackage{tikz3d-fr} \usepackage{awesomebox} \usepackage{fontawesome5} \usepackage{footnote} \makesavenoteenv{tabular} \usepackage{enumitem} \usepackage{tabularray} \usepackage{fancyvrb} \usepackage{fancyhdr} \fancyhf{} \renewcommand{\headrulewidth}{0pt} \lfoot{\sffamily\small [tikz3d-fr]} \cfoot{\sffamily\small - \thepage{} -} \rfoot{\hyperlink{matoc}{\small\faArrowAltCircleUp[regular]}} %\usepackage{hvlogos} \usepackage{hologo} \providecommand\tikzlogo{Ti\textit{k}Z} \providecommand\TeXLive{\TeX{}Live\xspace} \providecommand\PSTricks{\textsf{PSTricks}\xspace} \let\pstricks\PSTricks \let\TikZ\tikzlogo \newcommand\TableauDocumentation{% \begin{tblr}{width=\linewidth,colspec={X[c]X[c]X[c]X[c]X[c]X[c]},cells={font=\sffamily}} {\LARGE \LaTeX} & & & & &\\ & {\LARGE \hologo{pdfLaTeX}} & & & & \\ & & {\LARGE \hologo{LuaLaTeX}} & & & \\ & & & {\LARGE \TikZ} & & \\ & & & & {\LARGE \TeXLive} & \\ & & & & & {\LARGE \hologo{MiKTeX}} \\ \end{tblr} } \usepackage{hyperref} \urlstyle{same} \hypersetup{pdfborder=0 0 0} \setlength{\parindent}{0pt} \definecolor{LightGray}{gray}{0.9} \usepackage{babel} \AddThinSpaceBeforeFootnotes \FrenchFootnotes \usepackage[most]{tcolorbox} \usetikzlibrary{calc} \tcbuselibrary{minted} \NewTCBListing{PresCodeTex}{ O{cyan} m }{% enhanced,width=0.93\linewidth,flush right,boxrule=0.75pt,colframe=#1!85!black,% sharp corners,top=0mm,bottom=0mm,left=0.4em,right=5mm,% before skip=\baselineskip,after skip=\baselineskip,% colback=white, fontupper=\footnotesize,fontlower=\footnotesize,% watermark text={\faCode},watermark opacity=0.25,watermark zoom=0.50,% title={{\scriptsize\faCode} Code \LaTeX}, lefttitle=0.4em, fonttitle=\bfseries\footnotesize\sffamily,colbacktitle=darkgray!50!#1,% listing engine=minted,minted style=colorful,minted language=tex, minted options={tabsize=4,fontsize=\footnotesize,autogobble,breaklines=true}, #2,% overlay={\draw[#1!85!black] ($(frame.north west)+(-0.035\linewidth,-0.025\linewidth)$) node[scale=1.66] {\faCode} ;} } \NewTCBListing{PresCode}{ O{cyan} m }{% enhanced,width=0.93\linewidth,flush right,boxrule=0.75pt,colframe=#1!85!black,% sharp corners,top=0mm,bottom=0mm,left=0.4em,right=5mm,% before skip=\baselineskip,after skip=\baselineskip,% colback=white, fontupper=\footnotesize,fontlower=\footnotesize,% watermark text={\faCogs},watermark opacity=0.25,watermark zoom=0.50,% title={{\scriptsize\faCogs} Code \LaTeX{} et sortie \LaTeX}, lefttitle=0.4em, fonttitle=\bfseries\footnotesize\sffamily,colbacktitle=darkgray!50!#1,% listing engine=minted,minted style=colorful,minted language=tex, minted options={tabsize=4,fontsize=\footnotesize,autogobble,breaklines=true}, #2,% overlay={% \draw[#1!85!black] ($(frame.north west)+(-0.035\linewidth,-0.025\linewidth)$) node[scale=1.66] {\faCode} ; \draw[#1!85!black] ($(segmentation.west)+(-0.035\linewidth,-0.025\linewidth)$) node[scale=1.66] {\faFilePdf} ; } } \NewTCBListing{PresCodeSortie}{ O{cyan} m }{% enhanced,width=0.93\linewidth,flush right,boxrule=0.75pt,colframe=#1!85!black,% sharp corners,top=0mm,bottom=0mm,left=0.4em,right=5mm,% before skip=\baselineskip,after skip=\baselineskip,% colback=white, fontupper=\footnotesize,fontlower=\footnotesize,% watermark text={\faFilePdf},watermark opacity=0.25,watermark zoom=0.50,% title={{\scriptsize\faFilePdf} Sortie \LaTeX}, lefttitle=0.4em, fonttitle=\bfseries\footnotesize\sffamily,colbacktitle=darkgray!50!#1,% listing engine=minted,minted style=colorful,minted language=tex, minted options={tabsize=4,fontsize=\footnotesize,autogobble,breaklines=true}, #2,% overlay={\draw[#1!85!black] ($(frame.north west)+(-0.035\linewidth,-0.025\linewidth)$) node[scale=1.66] {\faFilePdf} ;} } \NewTCBListing{PresentationCode}{ O{blue} m }{% sharp corners=downhill,enhanced,arc=12pt,skin=bicolor,% colback=#1!1!white,colframe=#1!75!black,colbacklower=white,% attach boxed title to top right={yshift=-\tcboxedtitleheight},title=Code \LaTeX,% boxed title style={% colframe=#1!75!black,colback=#1!15!white,% ,sharp corners=downhill,arc=12pt,% },% top=\baselineskip,% fonttitle=\color{#1!90!black}\itshape\ttfamily\footnotesize,% listing engine=minted,minted style=colorful, minted language=tex,minted options={tabsize=4,fontsize=\small,autogobble}, #2 } \tcbset{vignettes/.style={% nobeforeafter,box align=base,boxsep=0pt,enhanced,sharp corners=all,rounded corners=southeast,% boxrule=0.75pt,left=7pt,right=1pt,top=0pt,bottom=0.25pt,% } } \tcbset{vignetteMaJ/.style={% fontupper={\vphantom{pf}\footnotesize\ttfamily}, vignettes,colframe=ForestGreen!50!black,coltitle=white,colback=purple!25,% overlay={\begin{tcbclipinterior}% \fill[fill=purple!75]($(interior.south west)$) rectangle node[rotate=90]{\tiny \sffamily{\textcolor{Black}{\scalebox{0.85}[0.75]{\textbf{MàJ}}}}} ($(interior.north west)+(5pt,0pt)$);% \end{tcbclipinterior}} } } \newcommand\Cle[1]{{\bfseries\sffamily\textlangle #1\textrangle}} \newcommand\cmaj[1]{\tcbox[vignetteMaJ]{#1}\xspace} \begin{document} \setlength{\aweboxleftmargin}{0.07\linewidth} \setlength{\aweboxcontentwidth}{0.93\linewidth} \setlength{\aweboxvskip}{8pt} \pagestyle{fancy} \thispagestyle{empty} \vspace{2cm} \begin{center} \begin{minipage}{0.75\linewidth} \begin{tcolorbox}[colframe=yellow,colback=yellow!15] \begin{center} \begin{tabular}{c} {\Huge \texttt{tikz3d-fr}}\\ \\ {\LARGE Quelques commandes (fr) pour} \\ \\ {\LARGE un peu de 3D avec \TikZ.} \\ \end{tabular} \bigskip {\small \texttt{Version \TPversion{} -- \TPdate}} \end{center} \end{tcolorbox} \end{minipage} \end{center} \begin{center} \begin{tabular}{c} \texttt{Cédric Pierquet}\\ {\ttfamily c pierquet -- at -- outlook . fr}\\ \texttt{\url{https://github.com/cpierquet/tikz3dfr}} \end{tabular} \end{center} \vspace{0.25cm} {$\blacktriangleright$~~Un environnement avec déclaration des unités.} \smallskip {$\blacktriangleright$~~Une commande pour afficher un pavé, avec personnalisations.} \smallskip {$\blacktriangleright$~~Deux commandes pour afficher des empilements de \og petits cubes \fg.} \vspace{1cm} \begin{center} \begin{tcolorbox}[enhanced,colframe=cyan,colback=cyan!2,center,width=0.95\linewidth,drop fuzzy shadow=lightgray] \begin{EnvTikzEspace} \PaveTikzTriDim[Cube,Largeur=2.5,AffLabel,Couleur=blue!50!black,CouleurSommets=red] \end{EnvTikzEspace} \vspace*{-2cm} \hfill\BlocPetitsCubes[violet]{1,2,3,4,5 / 0,2,1,1,3 / 0,2,1,1,2 / 1,1,1,1,1}\hfill~ \vspace*{-2cm} \hfill \begin{EmpilementCubes} \PlaquePetitsCubes[cyan/red/green/yellow]{ 3111-1-4 / 233123 / 2-1112 } \PlaquePetitsCubes[cyan/red]{ 111 / -21 } \PlaquePetitsCubes[cyan/red/green]{ 3-2 } \end{EmpilementCubes} \end{tcolorbox} \end{center} \vspace{0.5cm} %\hfill{}\textit{Merci à Denis Bitouzé et à Gilles Le Bourhis pour leurs retours et idées !} \smallskip \vfill \hrule \medskip \TableauDocumentation \medskip \hrule \medskip \newpage \phantomsection \hypertarget{matoc}{} \tableofcontents \vfill \part{Historique} \verb|v0.1.2|~:~~~~Option pour l'épaisseur des traits + \textsf{[line join=round]} pour les cubes \verb|v0.1.1|~:~~~~Tracé des segments individuels avec l'option \textsf{[line cap=round]} \verb|v0.1.0|~:~~~~Version initiale \newpage \part{Introduction} \section{Le package tikz3d-fr} \subsection{Introduction} \begin{noteblock} Le package propose des commandes basiques -- et francisées -- pour travailler sur des figures simples en 3D, à l'aide de \TikZ{} en utilisant des coordonnées tridimensionnelles : \begin{itemize} \item un environnement avec gestion des unités $x/y/z$ ; \item une commande pour tracer et personnaliser un cube ; \item des commandes pour créer/afficher/nommer des points de l'espace ; \item des commandes pour tracer un ou plusieurs segments ; \item des commandes et un environnement pour travailler sur des \textit{empilements} de cubes. \end{itemize} \vspace*{-\baselineskip}\leavevmode \end{noteblock} \begin{importantblock} Il existe d'autres solutions pour travailler avec de la 3D en \LaTeX, comme par exemple les packages \textsf{ProfCollege}\footnotemark\footnotetext{\url{https://www.ctan.org/pkg/profcollege}} (de Christophe Poulain, qui utilise \hologo{MetaPost}, et qui est certainement beaucoup plus performant) ou \textsf{pst-ob3d}\footnotemark\footnotetext{\url{https://www.ctan.org/pkg/pst-ob3d}} (de Herbert Voß et Denis Girou, qui utilise \pstricks). \smallskip L'idée est de proposer une utilisation des capacités (natives) 3D de \TikZ, en proposant des commandes \textit{simplifiées} et \textit{francisées} pour des figures simples (tétraèdres, cubes, pyramides, pavés) utilisées fréquemment dans des exercices de géométrie dans l'espace dans l'enseignement secondaires en France. \end{importantblock} \subsection{Chargement du package, packages utilisés} \begin{importantblock} Le package se charge, de manière classique, dans le préambule. Il n'existe pas d'option pour le package, et \texttt{xcolor} n'est pas chargé. \end{importantblock} \begin{PresCodeTex}{listing only} \usepackage{tikz3d-fr} \end{PresCodeTex} \begin{noteblock} \textsf{tikz3d-fr} charge les packages suivantes : \begin{itemize} \item \texttt{tikz}, \texttt{xstring}, \texttt{xintexpr}, \texttt{simplekv} et \texttt{xinttools} et \texttt{listofitems} ; \item les librairies \texttt{\textit{tikz}.calc} et \texttt{\textit{tikz}.babel}. \end{itemize} Il est compatible avec les compilations usuelles en \textsf{latex}, \textsf{pdflatex}, \textsf{lualatex} ou \textsf{xelatex}. \end{noteblock} \vfill~ \pagebreak \part{Environnement 3D et commandes de base} \section{Création de l'environnement} \subsection{Commande} \begin{cautionblock} L'environnement dédié à la création de figures en 3D avec \TikZ{} est \texttt{EnvTikzEspace}. Il permet de définir les unités et \textit{angles} des différents axes. \end{cautionblock} \begin{PresCodeTex}{listing only} \begin{EnvTikzEspace}[Clés] %commandes \end{EnvTikzEspace} \end{PresCodeTex} \subsection{Clés et options} \begin{tipblock} Le premier argument, optionnel et entre \texttt{[...]} propose les \Cle{clés} suivantes : \begin{itemize} \item \Cle{UniteX}, à donner sous la forme \Cle{\{angle\string:longueur\}} pour le vecteur de base $\vec{\imath}$ ; \hfill{}défaut : \Cle{\{-15\string:1cm\}},% \item \Cle{UniteY}, à donner sous la forme \Cle{\{angle\string:longueur\}} pour le vecteur de base $\vec{\jmath}$ ; \hfill{}défaut : \Cle{\{20\string:0.65cm\}} \item \Cle{UniteZ}, à donner sous la forme \Cle{\{angle\string:longueur\}} pour le vecteur de base $\vec{k}$ ; \hfill{}défaut : \Cle{\{90\string:1cm\}} \item Le booléen \Cle{VueClassique} pour un affichage en perspective habituelle.\hfill~défaut : \Cle{false} \end{itemize} \vspace*{-\baselineskip}\leavevmode \end{tipblock} \begin{tipblock} Le second argument, optionnel et entre \texttt{<...>} est quant à lui relatif à des arguments à passer à l'environnement \TikZ{} créé, comme par exemple un alignement vertical, etc \end{tipblock} \begin{PresCode}{} \begin{EnvTikzEspace} \draw[->,>=latex] (0,0,0)--(1,0,0) node[right] {$\vec{\imath}$} ; \draw[->,>=latex] (0,0,0)--(0,1,0) node[right] {$\vec{\jmath}$} ; \draw[->,>=latex] (0,0,0)--(0,0,1) node[above] {$\vec{k}$} ; \end{EnvTikzEspace} \end{PresCode} \begin{PresCode}{} \begin{EnvTikzEspace}[UniteX={-145:1.25cm},UniteY={0:1.75cm},UniteZ={90:1.75cm}] \draw[->,>=latex] (0,0,0)--(1,0,0) node[right] {$\vec{\imath}$} ; \draw[->,>=latex] (0,0,0)--(0,1,0) node[right] {$\vec{\jmath}$} ; \draw[->,>=latex] (0,0,0)--(0,0,1) node[above] {$\vec{k}$} ; \end{EnvTikzEspace} \end{PresCode} \begin{PresCode}{} \begin{EnvTikzEspace}[VueClassique] \draw[->,>=latex] (0,0,0)--(1,0,0) node[right] {$\vec{\imath}$} ; \draw[->,>=latex] (0,0,0)--(0,1,0) node[right] {$\vec{\jmath}$} ; \draw[->,>=latex] (0,0,0)--(0,0,1) node[above] {$\vec{k}$} ; \end{EnvTikzEspace} \end{PresCode} \begin{noteblock} Une fois l'environnement, via son \textit{repère}, est créé, toute commande en \TikZ{} est utilisable avec les coordonnées \texttt{(x,y,z)} ou bien les \texttt{scope} avec les \texttt{canva}. \end{noteblock} \begin{PresCode}{} \begin{EnvTikzEspace}[UniteX={-145:0.575cm},UniteY={0:0.7cm},UniteZ={90:0.7cm}] \filldraw[red] (2,4,3) circle[radius=1pt] ; \draw[red] (0,0,0) -- (2,4,3) ; \draw[thin,->,>=latex] (0,0,0)--(3,0,0) ; \draw[thin,->,>=latex] (0,0,0)--(0,5,0) ; \draw[thin,->,>=latex] (0,0,0)--(0,0,4) ; \draw[->,>=latex] (0,0,0)--(1,0,0) ; \draw[->,>=latex] (0,0,0)--(0,1,0) ; \draw[->,>=latex] (0,0,0)--(0,0,1) ; \draw[dashed] (0,0,3)--(2,4,3)--(2,4,0)--(0,0,0) (2,4,0)--(2,0,0) (2,4,0)--(0,4,0) ; \end{EnvTikzEspace} \end{PresCode} \pagebreak \section{Points et segments} \subsection{Commandes} \begin{cautionblock} Les commandes \textit{simplifiées} et \textit{francisées} disponibles sont : \begin{itemize} \item \texttt{\textbackslash PlacePointEspace} pour placer un point dans l'espace ; \item \texttt{\textbackslash PlacePointsEspace} pour placer des points dans l'espace ; \item \texttt{\textbackslash MarquePointEspace} pour marquer (matérialiser) un point dans l'espace ; \item \texttt{\textbackslash MarquePointsEspace} pour marquer (matérialiser) un point dans l'espace ; \item \texttt{\textbackslash TraceSegmentEspace} pour tracer un segment dans l'espace ; \item \texttt{\textbackslash TraceSegmentsEspace} pour tracer des segments dans l'espace. \end{itemize} \vspace*{-\baselineskip}\leavevmode \end{cautionblock} \begin{PresCodeTex}{listing only} \begin{EnvTikzEspace}[Clés] %créer/placer/nommer un point \PlacePointEspace(*)[clés]{nœud}{coordonnées}