<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">\iffalse
The tikzoptics library documentation

Copyright (C) 2013-2016 by
  Michel Fruchart &lt;michel.fruchart@ens-lyon.org&gt;

This work may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), version 1.3c, which can be
found at the address:
https://www.latex-project.org/lppl/lppl-1-3c/

Alternatively, it may be distributed and/or modified under the conditions of
the GNU Free Documentation License (GNU FDL), version 1.3, which can be found
at the address:
https://www.gnu.org/licenses/fdl-1.3.en.html
or any later version published by the Free Software Foundation.
\fi
% allow compression of cross references.
\pdfminorversion=5 
\pdfobjcompresslevel=2
\documentclass[a4paper]{ltxdoc}
\usepackage{etex}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}

\usepackage[a4paper,left=2.25cm,right=2.25cm,top=2.5cm,bottom=2.5cm,nohead]{geometry}
\usepackage{amsmath}

%\usepackage{makeidx}
\usepackage[version=3]{mhchem}

\usepackage{csquotes}

\usepackage{xkeyval,calc,listings}
\usepackage[svgnames,x11names]{xcolor}
\usepackage{xxcolor} % tikz

\usepackage{tikz}
\usetikzlibrary{shapes,shapes.misc,shapes.geometric} 
\usetikzlibrary{arrows}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\usetikzlibrary{decorations,decorations.markings,decorations.pathreplacing,decorations.pathmorphing}
\usetikzlibrary{patterns}
\usetikzlibrary{intersections}
\usetikzlibrary{matrix}
\usetikzlibrary{fit}
\usetikzlibrary{ocgx}


\usepackage{fancyvrb}


\usepackage[framemethod=tikz,usetwoside=false]{mdframed}

\usepackage{fourier-orns}
\usepackage{lmodern} 
\usepackage[charter]{mathdesign}
\usepackage{charter}
\def\rmdefault{bch} % not scaled
\def\sfdefault{SourceSansPro-TLF}

\usepackage{textcomp}
\usepackage[detect-all=true]{siunitx}
\sisetup{
        math-micro=\muup,
        math-ohm  =\Omegaup,
        text-micro={\fontfamily{mdbch}\textmu},
        text-ohm  ={\fontfamily{mdbch}\textohm}
}

\usepackage{attachfile2}
\attachfilesetup{color=blue}


\usepackage[protrusion=true,expansion,kerning=true,final,verbose=false,babel=false]{microtype}
\DisableLigatures{encoding=T1,family=tt*}


% corrige l'interaction foireuse entre tikz et babel[french]
\AtBeginEnvironment{tikzpicture}{\shorthandoff{:;!}}
\AtBeginEnvironment{pgfpicture}{\shorthandoff{:;!}}


% This is not the standard way to load a tikzlibrary
% but I want to make sure that the documentation loads
% the corresponding library (and not e.g. the production version).
\input{../tikzlibraryoptics.code.tex}


\usepackage{hyperref}
\usepackage{bookmark}
\hypersetup{%
  colorlinks=true,
  linkcolor=blue,
  filecolor=blue,
  urlcolor=blue,
  citecolor=blue,
  pdfborder=0 0 0,
}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Macros du manuel pgf/tikz (version : texlive 2012)
% cf. http://tex.stackexchange.com/questions/72999/is-there-a-listings-configuration-for-tikz-as-used-in-pgf-tikz-manual
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\pgfautoxrefs{1}
\def\pgfmanual@warning#1{\immediate\write16{! Package pgfmanual Warning: #1}}%

\input{macros/pgfmanual-en-macros}
\input{macros/pgfmanual.prettyprinter.code.tex}
\input{macros/pgfmanual.pdflinks.code.tex}


\pgfkeys{
  % set this to 'false' to disable auto reference generation.
  % However, a little bit runtime overhead will still remain
  % (and the \pgfmanualpdflabel commands will still be used)
  /pdflinks/codeexample links=true,
  %
  /codeexample/prettyprint/cs arguments/tikzset/.initial=1,
  /codeexample/prettyprint/cs/tikzset/.code 2 args={\pgfmanualpdfref{#1}{#1}\{\pgfmanualprettyprintpgfkeys{#2}\pgfmanualclosebrace},
  /codeexample/prettyprint/cs arguments/usetikzlibrary/.initial=1,
  /codeexample/prettyprint/cs/usetikzlibrary/.code 2 args={\pgfmanualpdfref{#1}{#1}\{\pgfmanualpdfref{#2}{#2}\pgfmanualclosebrace},
  /codeexample/prettyprint/cs arguments/usepgflibrary/.initial=1,
  /codeexample/prettyprint/cs/usepgflibrary/.code 2 args={\pgfmanualpdfref{#1}{#1}\{\pgfmanualpdfref{#2}{#2}\pgfmanualclosebrace},
  %
  %
  %
  % whenever an unqualified key is found, the following key prefix
  % list is tried to find a match.
  /pdflinks/search key prefixes in={/tikz/,/pgf/,/tikz/optics/,/tikz/dim/arrow/,},
  %
  % the link prefix written to the pdf file:
  /pdflinks/internal link prefix=tikzopt,
  %
  /pdflinks/warnings=false,
  % for debugging:
  /pdflinks/show labels=false,
}%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Global styles from pgf/tikz manual (version : texlive 2012)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\tikzset{
  every plot/.style={prefix=plots/pgf-},
  shape example/.style={
    color=black!30,
    draw,
    fill=yellow!30,
    line width=.5cm,
    inner xsep=2.5cm,
    inner ysep=0.5cm}, 
  line shape example/.style={
    color=black!30,
    draw,
%    fill=black!30, % utile Ă&nbsp; quoi ?
    line width=.5cm,
    inner xsep=2.5cm,
    inner ysep=0.5cm}
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Specific environnements
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Environnement |example only| : aspect similaire Ă&nbsp; codeexample, mais avec seulement l'exemple (quand le code est trop long)
\newmdenv[
  backgroundcolor=graphicbackground,
  linewidth=0pt,
  innerleftmargin=0.09cm,innerrightmargin=0.09cm,innertopmargin=0.09cm,
  leftmargin=0pt,rightmargin=0pt,
  skipabove=5pt, skipbelow=-2pt,
  ]{example only}

% Environnement |warning|
\colorlet{warningbackground}{red!30}
\makeatletter
\newenvironment{warning}{%
\mdfsetup{%
  backgroundcolor=warningbackground,
  skipabove=5pt,
  topline=false,bottomline=false,rightline=false,
  innerbottommargin=4pt,innertopmargin=0.18cm,
  leftmargin=0cm, innerleftmargin=0.3cm
    rightmargin=0cm,innerrightmargin=0.3cm,
    linewidth=1pt,linecolor=none, topline=false, bottomline=false,
    }%
\begin{mdframed}%
\setlength{\parindent}{0pt}%
\danger\,%
}%
{%
\end{mdframed}%
}%

% Environnement |update|
\colorlet{updatebackground}{blue!30}
\newenvironment{update}{%
\mdfsetup{%
  backgroundcolor=updatebackground,
  skipabove=5pt,
  topline=false,bottomline=false,rightline=false,
  innerbottommargin=4pt,innertopmargin=0.18cm,
  leftmargin=0cm, innerleftmargin=0.3cm
    rightmargin=0cm,innerrightmargin=0.3cm,
    linewidth=1pt,linecolor=none, topline=false, bottomline=false,
    }%
\begin{mdframed}%
\setlength{\parindent}{0pt}%
\danger\,%
}%
{%
\end{mdframed}%
}%
\makeatother

\begin{document}

\VerbatimFootnotes

\title{optics --- une bibliothĂ¨que tikz pour les schĂŠmas d'optique}
\author{Michel Fruchart \\
\href{mailto:michel (dot) fruchart [at] ens-lyon (dot) org}{\texttt{michel (dot) fruchart [at] ens-lyon (dot) org}}}

\date{\tikzopticsversiondate{} -- version \tikzopticsversion \\[0.15cm]
\large\href{https://github.com/fruchart/tikz-optics}{\texttt{https://github.com/fruchart/tikz-optics}}}

\maketitle

\section{Introduction}

Le but de cette bibliothĂ¨que est de permettre de facilement faire des schĂŠmas optiques avec tikz, c'est-Ă&nbsp;-dire de dessiner lentilles, miroirs, etc. Le tracĂŠ gĂŠomĂŠtriquement correct (ou non) des rayons est laissĂŠ Ă&nbsp; l'utilisateur.


\subsection{Legal matters}

Cette bibliothĂ¨que peut ĂŞtre distribuĂŠe et modifiĂŠe sous les conditions de la licence LaTeX Project Public License (LPPL), version 1.3c\footnote{\url{http://latex-project.org/lppl/lppl-1-3c.txt}}. Elle peut aussi ĂŞtre distribuĂŠe et modifiĂŠe sous les conditions de la licence GNU General Public License (GNU GPL), soit la version 2\footnote{\url{http://www.gnu.org/licenses/gpl-2.0.en.html}}, soit toute version ultĂŠrieure publiĂŠe par la Free Software Foundation. Sa documentation, que vous ĂŞtes en train de lire, peut ĂŞtre distribuĂŠe sous les conditions de la licence LaTeX Project Public License (LPPL), version 1.3c\footnote{\url{http://latex-project.org/lppl/lppl-1-3c.txt}}. Elle peut aussi ĂŞtre distribuĂŠe et modifiĂŠe sous les conditions de la licence GNU Free Documentation License (GNU FDL), soit la version 1.3\footnote{\url{https://www.gnu.org/licenses/fdl-1.3.en.html}}, soit toute version ultĂŠrieure publiĂŠe par la Free Software Foundation.

\subsection{Installation de la bibliothĂ¨que}

Cette bibliothĂ¨que est une \enquote{bibliothĂ¨que tikz}. Il y a deux faĂ§ons de l'utiliser : 
\begin{itemize}
  \item en ajoutant le fichier |tikzlibraryoptics.code.tex| dans un dossier oĂš \TeX{} peut le trouver, par exemple dans votre dossier |TEXMFHOME|\footnote{Pour savoir oĂš il se trouve, on peut utiliser la commande \verb|kpsewhich -var-value TEXMFHOME|. }, puis en utilisant la commande |\usetikzlibrary{optics}| ;
  \item en incluant directement le fichier |tikzlibraryoptics.code.tex| contenant la bibliothĂ¨que grĂ˘ce Ă&nbsp; la commande |\input|.
\end{itemize}

Si la bibliothĂ¨que est placĂŠe dans un dossier |TEXMF|, disons |/home/agamemnon/texmf/|, il faut respecter la structure TDS de ces rĂŠpertoires\footnote{Voir par exemple \url{https://www.ctan.org/TDS-guidelines}}. En pratique, le fichier |tikzlibraryoptics.code.tex| doit ĂŞtre placĂŠ dans le dossier |home/agamemnon/texmf/tex/latex/|, ou dans un sous-dossier comme |home/agamemnon/texmf/tex/latex/tikzoptics|. Le plus simple est d'utiliser le contenu de l'archive |tikzoptics.tds.zip|, qui est structurĂŠ comme il se doit et peut directement ĂŞtre ajoutĂŠ dans le dossier |TEXMF| (comme |/home/agamemnon/texmf/|).

\subsection{Utilisation de la bibliothĂ¨que}

\begin{key}{/tikz/use optics}
AprĂ¨s avoir installĂŠ la bibliothĂ¨que, il suffit de la charger grace Ă&nbsp; la commande |\usetikzlibrary{optics}|, puis d'utiliser l'option |use optics| sur une |tikzpicture| pour pouvoir utiliser les commandes\footnote{L'option \texttt{use optics} charge les ĂŠlĂŠments pertinents de \texttt{/tikz/optics/} dans \texttt{/tikz/}, ce qui permet de les utiliser directement. SĂŠparer a priori les commandes dans des espaces de noms diffĂŠrents permet de rĂŠduire le risque de collision de noms.}

\begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics]
  \node[lens] at (0,0) {};
  \node[mirror] at (1cm,0) {};
\end{tikzpicture}
\end{codeexample}

Si l'option |use optics| n'est pas utilisĂŠe, le code plantera lamentablement (dans les cas favorables) ou aura un comportement inattendu (dans les cas moins favorables).
\end{key}

\subsection{Ălements sur les \texttt{node} de tikz et leur placement}

\emph{Pour plus de dĂŠtails, lire le manuel de tikz.}

En deux mots, une |node| est en gros un objet, qui peut avoir une certaine forme (|shape|). Ă diffĂŠrents endroits de cette |node| sont dĂŠfinies des ancres (|anchor|). Au contraire d'une |node| qui est en quelque sorte ĂŠtendue spatialement, ces ancres reprĂŠsentent des points prĂŠcis sur le canevas de dessin. La |node| a un nom (facultatif) qui permet d'y faire rĂŠfĂŠrence dans la suite du dessin, par exemple pour accĂŠder aux coordonnĂŠes d'une ancre. 

La syntaxe minimale pour crĂŠer une |node| est |\node {};|, mais cela n'est pas trĂ¨s utile. Il faut spĂŠcifier oĂš se trouve la |node| en ĂŠcrivant |\node at |\meta{position}| {};| (oĂš \meta{position} est une coordonnĂŠe, comme |(0,1cm)|). Cela n'est toujours pas trĂ¨s utile car rien n'est dessinĂŠ. C'est le rĂ´le des |shape| que de dĂŠterminer ce qui est dessinĂŠ.

Dessinons ainsi un rectangle rouge en |(0,0)| (ici, c'est le centre du canevas), et de cĂ´tĂŠ |1cm|\footnote{Dans cette documentation, les longueurs ne sont gĂŠnĂŠralement pas ĂŠcrites avec les conventions du systĂ¨me international, mais avec les conventions habituelles pour du code tikz.}

%
\begin{codeexample}[width=5cm]
\begin{tikzpicture}
  \draw[style=help lines,gray!50] (-2cm,-2cm) grid[step=0.5cm] (2cm,2cm);
  \node[rectangle,minimum height=1cm,minimum width=1cm,draw=red] at (0,0) {};
\end{tikzpicture}
\end{codeexample}
%
J'ai ajoutĂŠ une grille de pas |0.5cm| pour mieux voir les coordonnĂŠes. Dans cet exemple, c'est le centre du rectangle qui est placĂŠ au point |(0,0)|. Pour ĂŞtre plus prĂŠcis, il s'agit de son ancre |center|. C'est le comportement par dĂŠfaut, mais tout l'intĂŠrĂŞt est qu'on peut placer les autres ancres dĂŠfinies par la |shape| au point spĂŠcifiĂŠ. Ajoutons donc Ă&nbsp; ce dessin un rectangle bleu dont le bas est situĂŠ en |(0,0)|. Comme nous allons avoir plusieurs |node| qui partagent les caractĂŠristiques |rectangle,minimum height=1cm,minimum width=1cm|, je les ai placĂŠes dans un \emph{style} que j'ai appelĂŠ |joli rectangle| (il ne faudrait pas l'appeler |rectangle| car cela existe dĂŠjĂ&nbsp;). Comme le bas est reprĂŠsentĂŠ par l'ancre |south|, il faut ajouter l'option |anchor=south| Ă&nbsp; la |node|:
%
\begin{codeexample}[width=5cm]
\begin{tikzpicture}
  \draw[style=help lines,gray!50] (-2cm,-2cm) grid[step=0.5cm] (2cm,2cm);
  \tikzstyle{joli rectangle}=[rectangle,minimum height=1cm,minimum width=1cm]
  \node[joli rectangle,draw=red] at (0,0) {};
  \node[joli rectangle,draw=blue,anchor=south] at (0,0) {};
\end{tikzpicture}
\end{codeexample}
%
J'aimerais maintenant tracer un trait noir entre coin en haut Ă&nbsp; gauche du carrĂŠ bleu et le coin en bas Ă&nbsp; droite du carrĂŠ rouge. Pour cela, il faut pouvoir accĂŠder aux ancres |north west| (en haut Ă&nbsp; gauche) et |south east| (en bas Ă&nbsp; droite) des deux |nodes|. Nous allons donc donner un nom Ă&nbsp; chacune de ces |nodes|, par exemple |Esther| et |Athalie|:
%
\begin{codeexample}[width=5cm]
\begin{tikzpicture}
  \draw[style=help lines,gray!50] (-2cm,-2cm) grid[step=0.5cm] (2cm,2cm);
  \tikzstyle{joli rectangle}=[rectangle,minimum height=1cm,minimum width=1cm]
  \node[joli rectangle,draw=red] 
    (Esther) at (0,0) {};
  \node[joli rectangle,draw=blue,anchor=south]
    (Athalie) at (0,0) {};
\end{tikzpicture}
\end{codeexample}
%
Pour le moment, cela ne change absolument rien au dessin, mais on peut dĂŠsormais accĂŠder aux ancres nĂŠcessaires par |(Athalie.north west)| et |(Esther.south east)| et dessiner le trait voulu.
%
\begin{codeexample}[width=5cm]
\begin{tikzpicture}
  \draw[style=help lines,gray!50] (-2cm,-2cm) grid[step=0.5cm] (2cm,2cm);
  \tikzstyle{joli rectangle}=[rectangle,minimum height=1cm,minimum width=1cm]
  \node[joli rectangle,draw=red]
    (Athalie) at (0,0) {};
  \node[joli rectangle,draw=blue,anchor=south]
    (Esther) at (0,0) {};
  \draw (Esther.north west) --(Athalie.south east);
\end{tikzpicture}
\end{codeexample}
%

Pour placer les points, il est possible d'utiliser une options du genre |left=of (autre node)|, ou encore |above=5mm of (Esther)|. C'est ce qu'on fait dans l'exemple \ref{sec:exemple_dispersion} p.~\pageref{sec:exemple_dispersion}.

\subsection{Programmer des images : faire des calculs avec tikz}

\emph{Pour plus de dĂŠtails, lire le manuel de tikz.}

Un des principaux avantages\footnote{Un des principaux inconvĂŠnients est que cela demande un peu plus de travail, surtout au dĂŠbut.} d'utiliser du code pour gĂŠnĂŠrer des schĂŠmas est que cela permet de concevoir les schĂŠmas comme un programme informatique. Ainsi, on gagne plusieurs choses :
\begin{itemize}
  \item en utilisant des variables pour reprĂŠsenter les longueurs et angles du schĂŠma, on peut facilement l'ajuster immĂŠdiatement ainsi que le modifier plus tard au besoin ;
  \item en utilisant des styles pour l'aspect visuel (couleurs, hachures, etc.), il est plus facile de maintenir une cohĂŠrence visuelle entre diffĂŠrents schĂŠmas. La modification du style se rĂŠpercutant sur tous les schĂŠmas (tant qu'il n'est pas dĂŠfini Ă&nbsp; nouveau), on peut facilement dĂŠcider de changer le bleu reprĂŠsentant l'eau, ou bien, si on veut distribuer un document en noir et blanc, de la reprĂŠsenter par un motif (|pattern|) appropriĂŠ ;
  \item on peut utiliser les diverses ressources de la programmation que sont les boucles, les conditions, et les calculs pour effectuer des tĂ˘ches rĂŠpĂŠtitives ou complexes ;
  \item il est possible de rĂŠutiliser\footnote{J'aimerais ajouter \enquote{facilement} ici, mais Ă§a n'est hĂŠlas pas le cas. Le plus simple est de dĂŠfinir une macro contenant le bout de schĂŠma, et cette mĂŠthode marche trĂ¨s bien, mais elle a certaines limites.} des bouts de schĂŠma
\end{itemize}

Le but de cette section est de rappeler rapidement comment faire des calculs avec |pgfmath|. Une rĂŠfĂŠrence complĂ¨te se trouve dans le manuel de |tikz|. Les commandes principales que nous allons utiliser sont la boucle |\foreach|, et les commandes de calcul |\pgfmathcalc| et |\pgfmathresult|, |\pgfmathdef|, et |\pgfmathsetlength|.

\subsubsection{Calculs}

La commande |\pgfmathcalc{&lt;expression&gt;}| parse calcule l'|&lt;expression&gt;| qui lui est donnĂŠe (selon des rĂ¨gles qui sont spĂŠcifiĂŠes dans le manuel de tikz) et enregistre le rĂŠsultat dans la macro |\pgfmathresult|. Si on a besoin de garder ce rĂŠsultat, il faut le copier dans une autre macro (disons par exemple |\reflexionAngle|) en utilisant |\let\reflexionAngle\pgfmathresult|. La syntaxe des expressions mathĂŠmatiques est assez naturelle. Pour les dĂŠtails, je vous renvoie au manuel tikz ; voici nĂŠanmoins quelques exemples\footnote{Pour essayer une expression mathĂŠmatique, le plus simple est d'ĂŠcrire \verb-\pgfmathparse{2+2}\pgfmathresult-
dans le corps d'un document tex : cela affichera \texttt{\pgfmathparse{2+2}\pgfmathresult} dans le pdf. Ici, j'ai omis les \verb+\pgfmathresult+ pour plus de claretĂŠ, mais la commande \verb+\pgfmathparse+ n'affiche rien toute seule !
} :

\begin{codeexample}[post={\pgfmathresult}]
\pgfmathparse{5*6+3}
\end{codeexample}

\begin{codeexample}[post={\pgfmathresult}]
\pgfmathparse{(4^2 + 4)/2}
\end{codeexample}

\begin{codeexample}[post={\pgfmathresult}]
\pgfmathparse{factorial(4)}
\end{codeexample}

\begin{codeexample}[post={\pgfmathresult}]
% les angles sont en degres !
\pgfmathparse{cos(45)}
\end{codeexample}

\begin{codeexample}[post={\pgfmathresult}]
% r convertit les degres en radians
\pgfmathparse{cos(pi/4 r)}
\end{codeexample}

\begin{codeexample}[post={\pgfmathresult}]
\pgfmathparse{abs(-sqrt(2)/2)}
\end{codeexample}

Des fonctions comme |acos|, |sinh|, |ln|, etc. sont disponibles\footnote{Des outils rudimentaires pour travailler avec des vecteurs et un gĂŠnĂŠrateur de nombres pseudo-alĂŠatoires existent aussi.}. Il est possible de dĂŠfinir des fonctions via la commande |\pgfmathdeclarefunction| ou la clĂŠ |/pgf/declare function|, en fournissant ĂŠventuellement une implĂŠmentation bas niveau :


\begin{example only}
\shorthandoff{;:}
\pgfkeys{/pgf/declare function={f(\x)=1.7280+0.01345/(\x^2);}}
\pgfmathparse{f(1)}
\pgfmathresult
\end{example only}

\begin{codeexample}[code only]
\pgfkeys{/pgf/declare function={f(\x)=1.7280+0.01345/(\x^2);}}
\pgfmathparse{f(1)}
\pgfmathresult
\end{codeexample}

Ă partir de tikz 3.0, la bibliothĂ¨que tikz |math| permet de simplifier l'ĂŠcriture des calculs.

Il existe aussi des fonctions logiques, et les opĂŠrateurs boolĂŠens habituels (|not(x)=!x|, \verb+or(x,y)=x||y+, |and(x,y)=x&amp;&amp;y|). Par convention, le boolĂŠen |true| est reprĂŠsentĂŠ par |1| et |false| par |0|. On a alors divers outils avec plusieurs syntaxes :


\begin{codeexample}[post={\pgfmathresult}]
\pgfmathparse{2 &lt;= 4}
\end{codeexample}

\begin{codeexample}[post={\pgfmathresult}]
\pgfmathparse{greater(1,2)}
\end{codeexample}

\begin{codeexample}[post={\pgfmathresult}]
\pgfmathparse{not(1.5 == 0 &amp;&amp; 1.5 &lt;= 2)}
\end{codeexample}

La commande |\pgfmathsetmacro{&lt;macro&gt;}{&lt;expression&gt;}| parse l'|&lt;expression&gt;| mathĂŠmatique de la mĂŞme maniĂ¨re que |\pgfmathcalc|, et enregistre le rĂŠsultat du calcul dans |&lt;macro&gt;|. Par exemple, |\pgfmathsetmacro{\transitionProbability}{0.5+0.1}| enregistre |0.6| dans |\transitionProbability|. Par contre, si le rĂŠsultat du calcul est une chaĂŽne de caractĂ¨res, il faut utiliser quelque chose comme |\pgfmathparse{&lt;expression&gt;}\let&lt;macro&gt;\pgfmathresult|.

La commande |\pgfmathtruncatemacro| s'utilise comme |\pgfmathsetmacro|, mais elle renvoie un entier (le rĂŠsultat tronquĂŠ), qui peut ĂŞtre utilisĂŠ dans une boucle, ou dans une condition. Par exemple, |\pgfmathtruncatemacro\nmax{5/4}| stocke |1| dans |\nmax|.

\paragraph{Une remarque sur les dĂŠfinitions et les groupes.} |\pgfmathsetmacro| et les commandes assimilĂŠes utilisent la primitive TeX |\def| pour dĂŠfinir les macros, ce qui fait qu'on peut redĂŠfinir une macro sans se prĂŠoccuper de savoir si elle existait dĂŠjĂ&nbsp; ou non. De maniĂ¨re gĂŠnĂŠrale, je prĂŠfĂ¨re utiliser |\def| plutĂ´t que |\newcommand| pour dĂŠfinir et modifier des variables, car elles peuvent devoir changer lors du tracĂŠ du dessin. Cela implique de veiller Ă&nbsp; ne pas redĂŠfinir des commandes existantes par erreur, mais cela ĂŠvite aussi beaucoup de tracas. Dans la mesure oĂš le contenu d'une |tikzpicture| est contenu Ă&nbsp; l'intĂŠrieur d'un groupe, les ĂŠventuelles redĂŠfinitions intempestives n'ont de consĂŠquences qu'Ă&nbsp; l'intĂŠrieur du dessin. Cela veut aussi dire que pour accĂ¨der Ă&nbsp; une variable dĂŠfinie dans une |tikzpicture|, il faut ajouter un |\global| quelque part.

\subsubsection{Conditions}

Quelques mots sur les fonctions logiques de tikz et leur utilisation.

Une expression comme |greater(\x,pi)| est ĂŠvaluĂŠe Ă&nbsp; |1| si |\x| est plus grand que $\pi$, et Ă&nbsp; |0| sinon. Toutes les fonctions logiques se comportent de cette maniĂ¨re. Cela permet de dĂŠfinir des fonctions par morceaux, etc. Pour exĂŠcuter du code latex sous condition, une mĂŠthode (parmi d'autres) consiste en ce qui suit :


\begin{example only}
\foreach \x in {1,2,3,4}
{
\pgfmathparse{greater(\x,pi)}
\ifnum\pgfmathresult=1
\x{} est plus grand que $\pi$ ; 
\else
\x{} est plus petit que $\pi$ ; 
\fi
}
\end{example only}
%
\begin{codeexample}[code only]
\foreach \x in {1,2,3,4}
{
  \pgfmathparse{greater(\x,pi)}
  \ifnum\pgfmathresult=1
    \x{} est plus grand que $\pi$ ; 
  \else
    \x{} est plus petit que $\pi$ ; 
  \fi
}
\end{codeexample}


%
Il peut ĂŞtre nĂŠcessaire de stocker le rĂŠsultat de |\pgfmathresult| dans une macro ; la commande |\pgfmathsetmacro| stockerait |1.0| ou |0.0| (des flottants au lieu d'entiers), qui ne peuvent pas ĂŞtre traitĂŠs par |\ifnum| : il faut donc faire appel Ă&nbsp; |\pgfmathtruncateresult|. Ainsi, le code suivant reproduit le mĂŞme rĂŠsultat :
%
\begin{example only}
\foreach \x in {1,2,3,4}
{
  \pgfmathtruncatemacro\plusGrandQuePi{greater(\x,pi)}
  \ifnum\plusGrandQuePi=1
    \x{} est plus grand que $\pi$ ; 
  \else
    \x{} est plus petit que $\pi$ ; 
  \fi
  }
\end{example only}
%
\begin{codeexample}[code only]
\foreach \x in {1,2,3,4}
{
  \pgfmathtruncatemacro\plusGrandQuePi{greater(\x,pi)}
  \ifnum\plusGrandQuePi=1
    \x{} est plus grand que $\pi$ ; 
  \else
    \x{} est plus petit que $\pi$ ; 
  \fi
}
\end{codeexample}

On peut aussi vouloir spĂŠcifier un aspect visuel selon une condition. Une mĂŠthode consiste Ă&nbsp; dĂŠfinir des styles, qu'on assigne selon la condition. Ici, nous tirons un certain nombre de points au hasard dans un carrĂŠ. Nous voulons distinguer les points qui se trouvent dans un certain cercle des autres. Pour cela, on dĂŠfinit deux styles |inside| et |outside|. Pour le moment, nous allons colorer les points dedans en rouge et deux dehors en bleu :

\begin{codeexample}[code only]
\tikzset{inside/.style={red},outside/.style={blue}}
\end{codeexample}

Ensuite, il suffit d'utiliser la fonction |ifthenelse| pour dĂŠfinir une macro |\pointStyle| qui vaut |inside| ou |outside|, selon la position du point situĂŠ en |(\posx,\posy)|. Dans l'exemple qui suit, je me suis rendu compte que les couleurs ne se voient pas quand on imprime en noir et blanc, et j'ai donc dessinĂŠ des croix rouges ainsi que des plus bleus en modifiant les styles |inside| et |outside| :

\begin{codeexample}[]
\begin{tikzpicture}
  \tikzset{inside/.style={red,mark=x},outside/.style={blue,mark=+}}
  \newdimen\radius
  \pgfmathsetlength\radius{1cm}
  \pgfmathsetmacro\k{2}
  \pgfmathtruncatemacro\NumberOfPoints{15}

  \draw (0,0) circle(\radius);
  \draw (-\k*\radius,-\k*\radius) rectangle (\k*\radius,\k*\radius);

  \newdimen\posx
  \newdimen\posy
  \foreach \nil in {1,2,...,\NumberOfPoints}
  {
    \pgfmathsetlength\posx{\k*\radius*rand}
    \pgfmathsetlength\posy{\k*\radius*rand}
    \pgfmathparse{ifthenelse(veclen(\posx,\posy)&lt;\radius,"inside", "outside")}
    \let\pointStyle\pgfmathresult
    \draw[\pointStyle] plot (\posx,\posy);
  }
\end{tikzpicture}
\end{codeexample}

\subsubsection{Boucles \texttt{foreach}}

La boucle |\foreach| s'utilise grossiĂ¨rement de la maniĂ¨re suivante : 
%
\begin{codeexample}[]
\foreach \x in {1,2,...,10} {\x,}
\end{codeexample}
%
\begin{codeexample}[]
\foreach \x in {0.42,0.5,12.56} {\x,}
\end{codeexample}
%
Il y a un certain nombre de subtilitĂŠs dans la syntaxe qui permettent de faire des choses ĂŠlaborĂŠes : je vous renvoie au manuel de tikz qui y consacre un chapitre entier ainsi qu'aux exemples. Remarquez que les boucles peuvent ĂŞtre imbriquĂŠes.

Dans l'exemple (inutile) suivant, nous voulons placer une barre tous les |\shift| sur un trait de longueur |\length|. De plus, on veut qu'un trait sur deux soit rouge, et l'autre bleu. On calcule donc le nombre |\imax| de traits Ă&nbsp; dessiner, puis on utilise une boucle. Dans la boucle, on utilise la paritĂŠ de la variable de boucle |\i| pour savoir si la barre doit ĂŞtre rouge ou bleue.

\begin{codeexample}[]
\begin{tikzpicture}
  \pgfmathsetmacro\length{4}
  \pgfmathsetmacro\shift{0.5}
  \pgfmathtruncatemacro\imax{\length/\shift}
  
  \draw (0,0) -- (\length,0);
  \foreach \i in {0,1,2,...,\imax}
  {
    \pgfmathparse{ifthenelse(equal(mod(\i,2),0),"red","blue")}
    \let\chunkStyle\pgfmathresult
    \draw[\chunkStyle] (\i*\shift cm,-0.3cm) -- (\i*\shift cm,0.3cm);
  }
\end{tikzpicture}
\end{codeexample}

\subsubsection{Les longueurs}

En tikz, on travaille toujours, de maniĂ¨re implicite ou explicite, avec des longueurs (et des angles). Par exemple, la coordonnĂŠe |(1,2)| signifie gĂŠnĂŠralement |(1cm,2cm)| (en fait, |(1,2)| est vu comme une coordonnĂŠe dans un systĂ¨me dont les vecteurs unitĂŠ ont, par dĂŠfaut, une longueur d'un centimĂ¨tre, mais qui peuvent ĂŞtre modifiĂŠs).
Le plus souvent, il est raisonnable de prĂŠciser explicitement les unitĂŠs et donc de travailler avec des longueurs.

En (la)tex, les longueurs doivent ĂŞtre dĂŠclarĂŠes avant d'ĂŞtre utilisĂŠes, et contrairement aux macros, il n'est pas d'usage de les dĂŠclarer et de les dĂŠfinir en mĂŞme temps. La commande |\newdimen{&lt;longueur&gt;}| permet de dĂŠclarer une longueur\footnote{Pour la mĂŞme raison que je prĂŠfĂ¨re \texttt{\textbackslash{}def} Ă&nbsp; \texttt{\textbackslash{}newcommand} pour dĂŠfinir des variables dans les dessins, je prĂŠfĂ¨re \texttt{\textbackslash{}newdimen} Ă&nbsp; \texttt{\textbackslash{}newlength}.}. Pour lui donner une valeur, le plus simple est d'utiliser la commande |\pgfmathsetlength{&lt;longueur&gt;}{&lt;expression math&gt;}|, qui parse l'|&lt;expression math&gt;| et l'enregistre dans |&lt;longueur&gt;|. Ainsi,

\begin{codeexample}[]
\begin{tikzpicture}
  \newdimen\hauteurFente
  \pgfmathsetlength\hauteurFente{3cm}
  \newdimen\largeurFente
  \pgfmathsetlength\largeurFente{0.25cm}
  \newdimen\ecartFentes
  \pgfmathsetlength\ecartFentes{0.5cm}

  \coordinate (L) at (-\ecartFentes/2,0);
  \coordinate (R) at (\ecartFentes/2,0);
  \foreach \x in {L,R}
  \draw[shift={(\x)}] (-\largeurFente/2,-\hauteurFente/2)
    rectangle (\largeurFente/2,\hauteurFente/2);
\end{tikzpicture}
\end{codeexample}

La commande |\pgfmathsetlength| suppose qu'une grandeur sans unitĂŠ est donnĂŠe en points (|pt|). Ainsi, |\pgfmathsetlength\hauteurFente{3}| ĂŠquivaut Ă&nbsp; |\pgfmathsetlength\hauteurFente{3pt}|. NĂŠanmoins, il n'est pas une bonne idĂŠe de ne pas spĂŠcifier l'unitĂŠ.

Les fonctions de comparaison de |pgfmath| (comme |greater|, |less|, |equal|) peuvent ĂŞtre utilisĂŠes avec des longueurs : par exemple, |\pgfmathparse{2cm &lt;= 4cm}| donne |1|, alors que |\pgfmathparse{2cm &lt;= 4pt}| donne |0|.

\subsubsection{Un prisme}

ArmĂŠs de ces outils, nous pouvons dessiner le parcours de rayons lumineux Ă&nbsp; travers un prisme en verre. Quelques calculs d'optique gĂŠomĂŠtrique permettent de dĂŠterminer les coordonnĂŠes nĂŠcessaires au tracĂŠ, et on obtient ainsi la figure suivante :

\begin{example only}
\begin{center}
\begin{tikzpicture}
  \newdimen\hauteurVerre
  \newdimen\largeurVerre
  \newdimen\distanceSource
  \newdimen\hauteurSource
  \newdimen\distanceEcran
  \pgfmathsetlength\hauteurVerre{2cm}
  \pgfmathsetlength\largeurVerre{1cm}
  \pgfmathsetlength\distanceSource{1cm}
  \pgfmathsetlength\hauteurSource{1cm}
  \pgfmathsetmacro\glassIndex{1.74}
  \pgfmathsetlength\distanceEcran{1cm}

  \coordinate (A) at (0,\hauteurVerre);
  \coordinate (B) at (0,0);
  \coordinate (C) at (\largeurVerre,0);

  % couleur des rayons
  \colorlet{current ray color}{red}

  % dessin du prisme
  \draw (A) -- (B) -- (C) -- cycle;

  % source
  \coordinate (S) at (-\distanceSource,\hauteurSource);

  % tracĂŠ des rayons
  \foreach \x in {-0.1,0,0.1,0.2,...,1}
  {
    \pgfmathsetmacro\inAngle{atan((\hauteurSource-\x*\hauteurVerre)/\distanceSource)}
    % si le rayon ne croise pas le prisme, pas de dĂŠflexion du rayon
    \pgfmathtruncatemacro\noDeflexion{or(notgreater(\x,0),notless(\x,1))}
    \ifnum\noDeflexion=1
      \draw[dashed,current ray color] (S)
        -- (\distanceEcran,{tan(\inAngle)*(\distanceEcran+\largeurVerre+\distanceSource)});
    \else
      \pgfmathsetmacro\midAngle{asin((1/\glassIndex)*sin(\inAngle))}
      \pgfmathsetmacro\y{\x*(1+\largeurVerre/\hauteurVerre*tan(\midAngle))^(-1)}
      \pgfmathsetmacro\appexAngle{atan(\largeurVerre/\hauteurVerre)}
      \pgfmathsetmacro\snellSine{\glassIndex*sin(-\appexAngle+\midAngle)}

      % est-ce que le rayon coupe le bas du prisme ?
      \pgfmathtruncatemacro\goesOut{greater(\y,1)}
      \ifnum\goesOut=1
        % je ne dessine pas les rayons qui couperaient le bas du prisme
      \else
        % est-ce qu'il y a rĂŠflexion totale ?
        \pgfmathtruncatemacro\totalReflexion{notgreater(abs(\snellSine),1)}
        \ifnum\totalReflexion=1
          \newdimen\screenY
          \pgfmathsetlength\screenY{
          (1-\y)*\hauteurVerre + tan(asin(\snellSine)+\appexAngle)*
              (\largeurVerre+\distanceEcran - \largeurVerre*\y)
          }
          \draw[current ray color] (S) -- (\largeurVerre*0,{(1-\x)*\hauteurVerre})
            -- (\largeurVerre*\y,{(1-\y)*\hauteurVerre})
            -- (\largeurVerre+\distanceEcran,\screenY);
        \else
          \draw[dotted,current ray color] (S) -- (\largeurVerre*0,{(1-\x)*\hauteurVerre})
            -- (\largeurVerre*\y,{(1-\y)*\hauteurVerre});
        \fi
      \fi
    \fi
  }
\end{tikzpicture}
\end{center}
\end{example only}

Comme nous avons utilisĂŠ des paramĂ¨tres ajustables, il est trĂ¨s facile d'adapter le code de maniĂ¨re Ă&nbsp; tracer les rayons pour plusieurs longueurs d'ondes (en utilisant la loi de Cauchy) :

\begin{example only}
\begin{center}
\input{prisme_dispersion.pgf}
\end{center}
\end{example only}
%
Le code servant Ă&nbsp; gĂŠnĂŠrer cette figure ĂŠtant un peu long, je ne l'ai pas inclus dans le corps du document, mais en piĂ¨ce jointe : \textattachfile[]{prisme_dispersion.pgf}{prisme\_dispersion.pgf}.


\section{Exemples}

\subsection{Image d'une fente sur un ĂŠcran}

Reproduisons un schĂŠma optique simple (qu'il faudrait que je scanne).

La premiĂ¨re ĂŠtape est de placer tous les ĂŠlĂŠments. On commence de maniĂ¨re trĂ¨s logique par la lampe, qu'on place en |(0,0)|. Ensuite, tous les ĂŠlĂŠments sont placĂŠ Ă&nbsp; droite les uns des autres. Par exemple, l'anticalorique est placĂŠ Ă&nbsp; |0.5cm| de la sortie de la lampe (ancre |aperture east| de la |node| |QI|) par l'option |right=0.5cm of (QI.aperture east)|. L'ĂŠcran et la lentille sont situĂŠs relativement Ă&nbsp; la fente parce que j'ai jugĂŠ Ă§a plus pratique pour les modifier indĂŠpendamment, mais ce genre de choix dĂŠpend de l'humeur et de la situation. J'ai nommĂŠ les diffĂŠrents ĂŠlĂŠments de maniĂ¨re peu cohĂŠrente pour souligner que les noms des |nodes| sont trĂ¨s libres : on peut y mettre des espaces, des accents\footnote{Vous remarquerez que je n'utilise pas d'accents dans les exemples de code. C'est parce que le code qui traite ces exemples n'est pas capable de les traiter. Par contre, il n'y a aucun problĂ¨me Ă&nbsp; les utiliser dans tikz (une |node| peut s'appeler \texttt{(ĂŠcran)} sans aucun problĂ¨me, par exemple).}, etc. Il faut juste ĂŠviter d'y mettre de point, virgule, double-point, etc. qui ont un sens particulier (le point sĂŠpare le nom d'une |node| de celui de l'ancre visĂŠe, par exemple).

\begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics]
  \node[halogen lamp] (quartz iode) at (0,0) {Q.I.};
  \node[heat filter,right=0.5cm of quartz iode.aperture east] (AC) {};
  \node[slit,right=0.75cm of AC] (fente) {};
  \node[lens,right=2cm of fente] (L) {};
  \node[screen,right=5cm of fente] (screen) {};
\end{tikzpicture}
\end{codeexample}

%
Une deuxiĂ¨me ĂŠtape consiste Ă&nbsp; tracer les rayons lumineux. Ici, on a de la chance car toutes les positions nĂŠcessaires sont des ancres des diffĂŠrentes |node|. Par exemple, |(L.lens south)| est situĂŠe juste avant le bas de |L| de maniĂ¨re Ă&nbsp; ce que le dessin soit joli (mais on peut quand mĂŞme accĂŠder Ă&nbsp; ce bas via |(L.south)| - l'idĂŠe est qu'il s'agit alors du bas du support annulaire de la lentille). On relie donc les ancres par des |--| dans une commande |\draw|.
%
\begin{codeexample}[]
\begin{tikzpicture}[use optics]
  \node[halogen lamp] (quartz iode) at (0,0) {Q.I.};
  \node[heat filter,right=0.5cm of quartz iode.aperture east] (AC) {} ;
  \node[slit,right=0.75cm of AC] (fente) {};
  \node[lens,right=2cm of fente] (L) {};
  \node[screen,right=5cm of fente] (screen) {};

  \draw[red] (fente.slit north) -- (L.lens north) -- (screen.center)
  (fente.slit south) -- (L.lens south) -- (screen.center);
\end{tikzpicture}
\end{codeexample}
%
Il faut ensuite ajouter les ĂŠtiquettes des diffĂŠrents ĂŠlĂŠments. Cela est fait via l'option \verb|label|, de la forme \verb|label=|\meta{texte}, ou plus gĂŠnĂŠralement \verb|label=[|\meta{opts}\verb|]|\meta{pos}\verb|:|\meta{texte}. En particulier, pour pouvoir sauter une ligne, il faut par exemple utiliser l'option |align=center|.

\begin{codeexample}[]
\begin{tikzpicture}[use optics]
  \node[halogen lamp] (quartz iode) at (0,0) {Q.I.};
  \node[heat filter,right=0.5cm of quartz iode.aperture east,label={below:AC}] (AC) {} ;
  \node[slit,right=0.75cm of AC,label={below:fente}] (fente) {};
  \node[lens,right=2cm of fente,label={[align=center]below:achromat \\ $(L)$}] (L) {};
  \node[screen,right=5cm of fente,label={below:\'ecran}] (screen) {};

  \draw[red] (fente.slit north) -- (L.lens north) -- (screen.center)
  (fente.slit south) -- (L.lens south) -- (screen.center);
\end{tikzpicture}
\end{codeexample}

Enfin, on ajoute les flĂ¨ches. Pour ce faire, je dĂŠfinis une coordonnĂŠe (c'est une |node| qui n'a qu'une seule ancre et qui ne dessine rien) et j'utilise la position verticale de cette coordonnĂŠe (point 1) ainsi que les positions horizontales des (centres des) divers objets (point 2), grace Ă&nbsp; la syntaxe \texttt{(point 1 -\textbar{} point 2)}.


\begin{codeexample}[]
\begin{tikzpicture}[use optics]
  \node[halogen lamp] (quartz iode) at (0,0) {Q.I.};
  \node[heat filter,right=0.5cm of quartz iode.aperture east,label={below:AC}] (AC) {} ;
  \node[slit,right=0.75cm of AC,label={below:fente}] (fente) {};
  \node[lens,right=2cm of fente,label={[align=center]below:achromat \\ $(L)$}] (L) {};
  \node[screen,right=5cm of fente,label={below:\'ecran}] (screen) {};

  \draw[red] (fente.slit north) -- (L.lens north) -- (screen.center)
  (fente.slit south) -- (L.lens south) -- (screen.center);

  \coordinate (arrow origin) at (0,1.5cm);

  \draw[&gt;=technical,&lt;-&gt;] (arrow origin -| fente) -- (arrow origin -| L) node[midway,above] {$d$};
  \draw[&gt;=technical,&lt;-&gt;] (arrow origin -| L) -- (arrow origin -| screen) node[midway,above] {$D$};
\end{tikzpicture}
\end{codeexample}

Quand le style sera au point, il sera possible d'utiliser |dim arrow| pour indiquer les dimensions au lieu de cette mĂŠthode lĂŠgĂ¨rement plus laborieuse.



\subsection{Des interfĂŠrences}

Ici, je n'ai pas utilisĂŠ |right=of| et ses amis pour placer les |nodes|, mais des calculs de coordonnĂŠes.


\begin{codeexample}[]
\begin{tikzpicture}[use optics]
  \node[laser] (L) at (0,0) {\ce{HeNe}};
  \node[semi-transparent mirror,rotate=45] (ST) at ($(L)+(3cm,0)$) {};
  \node[above] at (ST.north) {s\'eparatrice};
  \node[mirror,rotate=-135] (M1) at ($(ST)+(0,-3cm)$) {};
  \node[mirror,rotate=-45] (M2) at ($(M1)+(5cm,0)$) {};
  \node[sensor line,rotate=45,anchor=pixel 3 west,label={[label distance=0.5cm]above right:Caliens}]
    (Caliens) at ($(ST)+(5cm,0)$) {};
  \draw[red] (L.aperture east) -- (ST.center) -- (M1.center) -- (M2.center) -- (Caliens.pixel 3 west);
  \draw[red] (L.aperture east) -- (ST.center) -- (Caliens.pixel 3 west);
\end{tikzpicture}
\end{codeexample}

On a utilisĂŠ |anchor=pixel 3 west| pour que le centre du capteur soit placĂŠ au point |($(ST)+(5cm,0)$)|. 

Plusieurs possibilitĂŠs pour ajouter un label sont illustrĂŠes : crĂŠer une |node| au bon endroit avec le texte voulu (ici \emph{sĂŠparatrice}), et utiliser la clĂŠ \verb|label| (cf. manuel pgf/tikz).

\subsection{De la dispersion}
\label{sec:exemple_dispersion}

La syntaxe |($(A)!0.6!(B)$)| (\emph{partway modifiers}, lisez le manuel tikz pour les dĂŠtails) permet de dĂŠterminer un point situĂŠ Ă&nbsp; la distance |0.6| entre les points |(A)| et |(B)| (|0| correspond Ă&nbsp; |(A)| et |1| Ă&nbsp; |(B)|).

\begin{codeexample}[]
\begin{tikzpicture}[use optics]
  % [align=center] permet les labels multiligne
  % [font=\footnotesize] fait un texte plus petit
  \tikzset{every label/.style={align=center,font=\footnotesize}}
   
  \node[halogen lamp] (S) at (0,0) {QI};
  \node[heat filter, right=of S] (AC) {};
  \node[diaphragm, right=0.1cm of AC] (diaphragme) {};
  \node[slit, right=0.5cm of diaphragme,label={south:{trou \\ \SI{5}{\milli\meter}}}] (T) {};
  \node[lens,right=2cm of T] (L) {};
  \node[screen,right=2cm of L] (ecran) {};

  \draw[red]
  (T.slit north) -- (L.lens north) -- (ecran.center)
  (T.slit south) -- (L.lens south) -- (ecran.center);

  \draw[blue]
  (T.slit north) -- (L.lens north) -- ($(ecran.north)!0.6!(ecran.south)$)
  (T.slit south) -- (L.lens south) -- ($(ecran.north)!0.4!(ecran.south)$);
\end{tikzpicture}
\end{codeexample}


\subsection{Un tĂŠlĂŠscope de Cassegrain}

Pour dessiner un miroir trouĂŠ, on utilise la commande |\clip| de tikz (qu'on place dans un |scope| dont le seul contenu est affectĂŠ par le |\clip|). On trace alors les rayons Ă&nbsp; la main, sans se soucier de l'exactitude du schĂŠma.

\begin{codeexample}[]
\begin{tikzpicture}[use optics]
% mirror with hole
\begin{scope}
  \clip (-0.75cm,-2.2cm) rectangle (1cm,0-0.33cm) (-0.75cm,2.2cm) rectangle (1cm,0+0.33cm);
  \node[spherical mirror, object height=4cm, spherical mirror angle=50] (M1) at (0cm,0) {};
\end{scope}

% small mirror
\node[convex mirror, spherical mirror orientation=rtl,
    object height=1cm, spherical mirror angle=90] (M2) at (-4cm,0) {};

% convergence point
\coordinate (F) at (1cm,0);

% red ray
\begin{scope}[red]
  \draw[-&lt;-] (M1.22) coordinate (P1) -- +(-5cm,0);
  \draw[-&gt;-] (P1) -- (M2.30) coordinate (Q1);
  \draw[-&gt;-] (Q1) -- ($(Q1)!1.25!(F)$) coordinate (R1);
\end{scope}

% blue ray
\begin{scope}[blue]
  \draw[-&lt;&lt;-] (M1.-22) coordinate (P2) -- +(-5cm,0);
  \draw[-&gt;&gt;-] (P2) -- (M2.-30) coordinate (Q2);
  \draw[-&gt;&gt;-] (Q2) -- ($(Q2)!1.25!(F)$) coordinate (R2);
\end{scope}

% violet ray
\begin{scope}[violet]
  \draw[-&lt;-] (M1.22) coordinate (P3) -- +(175:5cm);
  \draw (P3) -- (M2.22) coordinate (Q3);
  \draw (Q3) -- ($(Q3)!1.25!($(F)+(0,-0.15cm)$)$) coordinate (R3);
\end{scope}

% sensor
\node[generic sensor, anchor=aperture west] at ($(R1)!0.5!(R2)$) {};
\end{tikzpicture}
\end{codeexample}

\subsection{De l'optique gĂŠomĂŠtrique et des calculs}

\begin{codeexample}[]
\begin{tikzpicture}[use optics]
  \node[lens,draw focal points,focal length=1.5cm,object height=2cm] (L) at (0,0) {};
  \coordinate (P) at (-2cm,0.5cm);
  \coordinate (Q) at (-2cm,-0.5cm);
  \draw[red,shorten &gt;=-1cm] (P) -- ($(L.north)!(P)!(L.south)$) -- (L.east focus);
  \draw[red,shorten &gt;=-1cm] (Q) -- ($(L.north)!(Q)!(L.south)$) -- (L.east focus);
  \node[screen] at (2.45cm,0) {};
\end{tikzpicture}
\end{codeexample}

  Cet exemple n'est pas trĂ¨s propre, car j'ai dĂť allonger manuellement les rayons pour qu'ils aillent jusqu'Ă&nbsp; l'ĂŠcran. La mĂŠthode suivante, qui consiste Ă&nbsp; calculer le point d'intersection grĂ˘ce Ă&nbsp; une fonction |\toVerticalProjection|, est beaucoup plus propre:

\begin{codeexample}[]
\begin{tikzpicture}[use optics]
  \node[lens,draw focal points,focal length=1.5cm,object height=2cm] (L) at (0,0) {} ;
  \coordinate (P) at (-2cm,0.5cm) ;
  \coordinate (Q) at (-2cm,-0.5cm) ;
  \node[screen] (S) at (2.5cm,0) {};

  \def\toVerticalProjection#1#2#3{let \p{1} = #1, \p{2} = #2, \p{3} = #3 in
   -- (\x{3},{\y{1}+(\y{2}-\y{1})/(\x{2}-\x{1})*(\x{3}-\x{1})})}

  \draw[red] (P) -- ($(L.north)!(P)!(L.south)$) coordinate (Plens)
  \toVerticalProjection{(Plens)}{(L.east focus)}{(S)};

  \draw[red] (Q) -- ($(L.north)!(Q)!(L.south)$) coordinate (Qlens)
  \toVerticalProjection{(Qlens)}{(L.east focus)}{(S)};

\end{tikzpicture}
\end{codeexample}

\subsection{De la birĂŠfringence avec un interfĂŠromĂ¨tre de Michelson}

\input{birefringence_michelson.pgf}

Cet exemple utilise des intersections pour tracer des rayons lumineux : la syntaxe n'est pas la plus agrĂŠable et concise qu'on puisse concevoir, mais elle marche. 
Cet exemple est aussi l'occasion de montrer l'utilisation du package \texttt{ocgx} avec \texttt{tikz}.
Le code de la figure est dans le fichier \textattachfile[]{birefringence_michelson.pgf}{birefringence\_michelson.pgf}.


\section{RĂŠfĂŠrence}

\subsection{GĂŠnĂŠralitĂŠs}

\subsubsection{Options communes}

Certaines options sont communes Ă&nbsp; beaucoup des |shapes| (Ă&nbsp; l'exception notable des lampes et capteurs).

\begin{key}{/tikz/optics/object height=\meta{length} (initially \pgfkeysvalueof{/tikz/optics/object height})}
    L'option |object height| contrĂ´le la hauteur de la plupart des objets (c'est le cas si rien n'est prĂŠcisĂŠ).

\begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[lens, object height=1cm] (L1) at (0,0) {};
  \node[lens, object height=2cm] (L2) at (3cm,0) {};
\end{tikzpicture}
\end{codeexample}
\end{key}

\begin{key}{/tikz/optics/object aspect ratio=\meta{number or length} (initially \pgfkeysvalueof{/tikz/optics/object aspect ratio})}
    L'option |object aspect ratio| contrĂ´le le rapport d'aspect de la plupart des objets ayant une largeur. Si \meta{number} vaut |1|, la largeur de l'objet est ĂŠgale Ă&nbsp; sa hauteur.
    Si \meta{number}|=1/2|, la largeur de l'objet vaut la moitiĂŠ de sa hauteur. 
    Quand \meta{number or length} est un nombre sans dimension (e.g. |0.5|), il est interprĂŠtĂŠ comme un rapport d'aspect, relatif Ă&nbsp; la hauteur. Quand il s'agit d'une longueur dimensionnĂŠe (e.g. |1cm|), il est directement interprĂŠtĂŠ comme la largeur (\emph{width}) de l'objet.

\begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[polarizer, object aspect ratio=0.2] (L1) at (0,0) {};
  \node[polarizer, object aspect ratio=0.5] (L2) at (4cm,0) {};
\end{tikzpicture}
\end{codeexample}
\end{key}

\begin{stylekey}{/tikz/optics/object width}
    L'option |object width| est un alias pour |object aspect ratio|.
\end{stylekey}

\subsubsection{Longueurs absolues et relatives}

Les divers ĂŠlĂŠments ont plusieurs longueurs ajustables. La plupart du temps, il n'est nĂŠcessaire de spĂŠcifier qu'une seule longueur (gĂŠnĂŠralement la hauteur de l'objet) de maniĂ¨re absolue, c'est-Ă&nbsp;-dire avec une unitĂŠ de longueur (|cm|, |pt|, |em|, etc.). Les autres longueurs peuvent ĂŞtre spĂŠcifiĂŠes en unitĂŠ de cette longueur absolue de rĂŠfĂŠrence (il faut alors spĂŠcifier un nombre), ou, si cela s'avĂ¨re plus pratique, comme des longueurs absolues (il faut alors spĂŠcifier une unitĂŠ). Voici un exemple avec |slit height|, qui peut ĂŞtre spĂŠcifiĂŠ relativement Ă&nbsp; |object height|.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics]
  \draw[style=help lines,gray!50]
    (-3cm,-2cm) grid[step=0.5cm] (2cm,2cm);
  \node[slit,object height=2cm,slit height=0.5,red,very thick]
    at (-2cm,0) {};
  \node[slit,object height=2cm,slit height=0.25,blue,very thick]
    at (-1cm,0) {};
  \node[slit,object height=2cm,slit height=0.5cm,violet,very thick]
    at (0cm,0) {};
  \node[slit,object height=2cm,slit height=1cm,orange,very thick]
    at (1cm,0) {};
\end{tikzpicture}
\end{codeexample}

L'intĂŠrĂŞt d'utiliser des longueurs \emph{relatives} est que la \emph{forme gĂŠnĂŠrale} d'un objet n'est pas modifiĂŠe par un changement d'ĂŠchelle (il n'y a qu'Ă&nbsp; changer la longueur absolue de rĂŠfĂŠrence).

Les ĂŠlĂŠments optiques ont plusieurs \enquote{hauteurs}. La hauteur totale est toujours appelĂŠe |objet height|, mais par exemple la taille d'une fente est appelĂŠe |slit height|, la taille (sans consĂŠquence sur le dessin, mais qui affecte les ancres) d'une lentille sur son support est appelĂŠe |lens height|, etc. 

% Note : je ne sais pas si je change les |aspect ratio| par un |object width| qui accepte un \meta{number or length} ...
% =&gt; C'est fait pour un bon nombre de trucs.


\subsection{ĂlĂŠments optiques}

\subsubsection{Lentille}

\begin{shape}{lens}
Dessine une lentille.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[lens] (L) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}


\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[lens,draw focal points] (L) at (0,0) {};
\end{tikzpicture}
\end{codeexample}

  \begin{stylekey}{/tikz/optics/draw focal points=\meta{style} (default empty)}
  On peut tracer les foyers avec |draw focal points|. En donnant \meta{style} en argument Ă&nbsp; la clĂŠ |draw docal points|,
  on peut dĂŠterminer comment sont tracĂŠs les foyers. Par exemple \texttt{draw focal points={red}} les trace en rouge, et \texttt{draw focal points={circle,draw=none,fill=blue}} trace un cercle rempli en bleu.
  \end{stylekey}

  \begin{codeexample}[width=6cm]
  \begin{tikzpicture}[use optics,scale=.5]
    \node[lens,draw focal points={red}]
    (L1) at (0,0) {};
    \node[lens,draw focal points={circle,draw=none,fill=blue}]
    (L2) at (3cm,0) {};
  \end{tikzpicture}
\end{codeexample}

\begin{key}{/tikz/optics/object height=\meta{length} (initially \pgfkeysvalueof{/tikz/optics/object height})}
    L'option |object height| est applicable.
\end{key}

\begin{key}{/tikz/optics/focal length=\meta{length} (initially \pgfkeysvalueof{/tikz/optics/focal length})}
    L'option |focal length| contrĂ´le la distance focale de la lentille.

    \begin{codeexample}[width=6cm,pre={\tikzset{every lens node/.append style={optics,draw focal points}}}]
\begin{tikzpicture}[use optics,scale=.5]
  \node[lens, focal length=1cm] (L1) at (0,0) {};
  \node[lens, focal length=2cm] (L2) at (0,5cm) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}


\begin{key}{/tikz/optics/lens height=\meta{number or length} (initially \pgfkeysvalueof{/tikz/optics/lens height})}
    L'option |lens height| contrĂ´le la hauteur de la lentille. Il s'agit soit une longueur abolue (avec unitĂŠ), soit d'une longueur relative mesurĂŠe par rapport Ă&nbsp; la hauteur totale de la lentille avec support.

    \begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[lens] (L1) at (1cm,0) {};
  \node[lens, lens height=0.5] (L2) at (-1cm,0) {};
  \draw[red] (0,0) -- (L1.lens north) (0,0) -- (L1.lens south);
  \draw[green] (0,0) -- (L2.lens north) (0,0) -- (L2.lens south);
\end{tikzpicture}
    \end{codeexample}

    % Serait-il plus judicieux d'avoir un systĂ¨me de coordonnĂŠes sur la lentille, genre |(L1.0)| pour le centre, |(L1.1)| pour le haut, |(L1.0.5)| pour un point en haut, Ă&nbsp; mi-lentille, |(L1.-1)| pour le bas, etc. ? Ou est-ce que |($(L1.north)!0.1!(L1.south)$)| suffit amplement ?
\end{key}


\begin{key}{/tikz/optics/lens type}
    L'option |lens type| contrĂ´le le type de lentille. Utiliser |lens type=converging| permet de dessiner une lentille convergente (c'est l'option par dĂŠfaut), alors que |lens type=diverging| permet de dessiner une lentille divergente.

    \begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[lens,lens type=converging] (L1) at (-1cm,0) {};
  \node[lens,lens type=diverging] (L2) at (1cm,0) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}


La figure suivante rĂŠcapitule les ancres dĂŠfinies par |lens|.


\begin{codeexample}[]
\Huge
\begin{tikzpicture}[use optics]
\node[name=s,lens,object height=7cm,focal length=3cm,
lens height=0.5,line shape example] {};
\foreach \anchor/\placement in
{north/above,south/below,lens north/right,lens south/right,center/right,
east focus/above,west focus/above}
\draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
node[\placement] {\scriptsize\texttt{(s.\anchor)}};
\end{tikzpicture}
\end{codeexample}

Les clĂŠs |east focus| et |west focus| ont pour synonyme |east focal point| et |west focal point|, respectivement.


On peut utiliser la clĂŠ \texttt{tikz} \texttt{anchor=} pour placer les lentilles les unes par rapport aux autres.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[lens,draw focal points={red}]
  (L1) at (0,0) {};
  \node[lens,draw focal points={circle,draw=blue},
  focal length=0.5cm,anchor=west focus]
  (L2) at (L1.east focus) {};
\end{tikzpicture}
\end{codeexample}

\end{shape}

\subsubsection{Fente}

\begin{shape}{slit}
Dessine une fente.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[slit] (S) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}

\begin{key}{/tikz/optics/object height=\meta{length} (initially \pgfkeysvalueof{/tikz/optics/object height})}
    L'option |object height| est applicable.
\end{key}


\begin{key}{/tikz/optics/slit height=\meta{number or length} (initially \pgfkeysvalueof{/tikz/optics/slit height})}
La clĂŠ |slit height| dĂŠfinit la hauteur de la fente (s'il s'agit d'une longueur relative, elle est exprimĂŠe en unitĂŠs de la hauteur de l'objet). 
Par exemple, \meta{number}|=0.5| donne une fente faisant la moitiĂŠ de la hauteur du support. De mĂŞme, \meta{length}|=1cm| donne une fente de |1cm|. Les valeurs de \meta{number} doivent ĂŞtre infĂŠrieures Ă&nbsp; l'unitĂŠ, et celles de \meta{length} infĂŠrieures Ă&nbsp; celles de |object height|, sans quoi les rĂŠsultats ne sont pas garantis.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[slit, slit height=0.5] (S) at (0,0) {};
  \node[slit, slit height=0.3] (S) at (1cm,0) {};
  \node[slit, slit height=0.1] (S) at (2cm,0) {};
\end{tikzpicture}  
\end{codeexample}
\end{key}

La figure suivante rĂŠcapitule les ancres dĂŠfinies par |slit|.

\begin{codeexample}[]
\Huge
\begin{tikzpicture}[use optics]
\node[name=s,slit,object height=8cm,
slit height=0.2,line shape example] {};
\foreach \anchor/\placement in
{north/above,south/below,slit north/right,slit south/right,center/left,
slit center/right}
\draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
node[\placement] {\scriptsize\texttt{(s.\anchor)}};
\end{tikzpicture}
\end{codeexample}

\end{shape}

\subsubsection{Double fente}


\begin{shape}{double slit}
Dessine une fente double.

\begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[double slit] (S) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}

\begin{key}{/tikz/optics/object height=\meta{length} (initially \pgfkeysvalueof{/tikz/optics/object height})}
    L'option |object height| est applicable.
\end{key}


\begin{key}{/tikz/optics/slit height=\meta{number or length} (initially \pgfkeysvalueof{/tikz/optics/slit height})}
La clĂŠ |slit height| dĂŠfinit la hauteur d'une fente (s'il s'agit d'une longueur relative, elle est en unitĂŠs de la hauteur de l'objet). 
Chacune des fentes a une hauteur \meta{number or length}. 

\begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics,scale=.5,optics/slit separation=0.5]
  \node[double slit, slit height=0.075] (S) at (0,0) {};
  \node[double slit, slit height=0.1] (S) at (1cm,0) {};
  \node[double slit, slit height=0.2] (S) at (2cm,0) {};
\end{tikzpicture}  
\end{codeexample}
\end{key}

\begin{key}{/tikz/optics/slit separation=\meta{number or length} (initially \pgfkeysvalueof{/tikz/optics/slit separation})}
La clĂŠ |slit separation| dĂŠfinit la distance entre les deux fentes (s'il s'agit d'une longueur relative, elle est en unitĂŠs de la hauteur de l'objet).

\begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[double slit, slit separation=0.1] (S) at (0,0) {};
  \node[double slit, slit separation=0.2] (S) at (1cm,0) {};
  \node[double slit, slit separation=0.3] (S) at (2cm,0) {};
\end{tikzpicture}  
\end{codeexample}
\end{key}



La figure suivante rĂŠcapitule les ancres dĂŠfinies par |double slit|.

\begin{codeexample}[]
\Huge
\begin{tikzpicture}[use optics]
\node[double slit,name=s,object height=8cm, slit height=0.15,
slit separation=0.5, line shape example] {};
\foreach \anchor/\placement in
{north/above,south/below,center/left,
slit 1 north/right,slit 1 south/right,slit 1 center/right,
slit 2 north/right,slit 2 south/right,slit 2 center/right}
\draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
node[\placement] {\scriptsize\texttt{(s.\anchor)}};
\end{tikzpicture}
\end{codeexample}

\end{shape}


\subsubsection{Miroir}


\begin{shape}{mirror}
Dessine un miroir plan.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[mirror] (S) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}

\begin{key}{/tikz/optics/object height=\meta{length} (initially \pgfkeysvalueof{/tikz/optics/object height})}
    L'option |object height| est applicable.
\end{key}

\begin{key}{/tikz/optics/mirror decoration separation=\meta{number or length} (initially \pgfkeysvalueof{/tikz/optics/mirror decoration separation})}
Correspond Ă&nbsp; la clĂŠ |/pgf/decoration/segment length| pour la dĂŠcoration |border| utilisĂŠe pour dessiner le miroir (cf. manuel de pgf/tikz). 
La valeur correspondant Ă&nbsp; |/pgf/decoration/segment length| est obtenue en multipliant \meta{number} par la hauteur du miroir.
\end{key}

\begin{key}{/tikz/optics/mirror decoration amplitude=\meta{number or length} (initially \pgfkeysvalueof{/tikz/optics/mirror decoration amplitude})}
Correspond Ă&nbsp; la clĂŠ |/pgf/decoration/amplitude| pour la dĂŠcoration |border| utilisĂŠe pour dessiner le miroir (cf. manuel de pgf/tikz).
La valeur correspondant Ă&nbsp; |/pgf/decoration/amplitude| est obtenue en multipliant \meta{number} par la hauteur du miroir.
\end{key}


La figure suivante rĂŠcapitule les ancres dĂŠfinies par |mirror|.

\begin{codeexample}[]
\Huge
\begin{tikzpicture}[use optics]
\node[mirror,name=s,object height=8cm,line shape example,
mirror decoration separation=0.141, mirror decoration amplitude=0.2] {};
\foreach \anchor/\placement in
{north/above,south/below,center/right}
\draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
node[\placement] {\scriptsize\texttt{(s.\anchor)}};
\end{tikzpicture}
\end{codeexample}

La clĂŠ |focus| a pour synonyme |focal point|.

\end{shape}

\subsubsection{Miroir sphĂŠrique}

\begin{shape}{spherical mirror}
Dessine un miroir sphĂŠrique (concave ou convexe).

\begin{warning}
  Cette partie n'est pas encore au point et peut changer sans prĂŠavis.
\end{warning}

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[spherical mirror] (M) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}

\begin{key}{/tikz/optics/object height=\meta{length} (initially \pgfkeysvalueof{/tikz/optics/object height})}
    La clĂŠ |object height| est applicable.
\end{key}

\begin{key}{/tikz/optics/spherical mirror angle=\meta{angle} (initially \pgfkeysvalueof{/tikz/optics/spherical mirror angle})}
    La clĂŠ |spherical mirror angle| contrĂ´le l'angle d'ouverture du miroir sphĂŠrique (un arc de cercle de hauteur spĂŠcifiĂŠe par |object height| et d'ouverture angulaire \meta{angle} est dessinĂŠ).
    Attention Ă&nbsp; ne pas choisir $\meta{angle}=0$ : utiliser un miroir plat |mirror| Ă&nbsp; la place.
\begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics]
  \node[spherical mirror, spherical mirror angle=60] at (0,0) {};
  \node[spherical mirror, spherical mirror angle=120] at (2cm,0) {};
  \node[spherical mirror, spherical mirror angle=180] at (4cm,0) {};
\end{tikzpicture}
\end{codeexample}

\begin{warning}
  La fonction |from_radius| est expĂŠrimentale.
\end{warning}

Il peut ĂŞtre utile de spĂŠcifier non pas l'angle d'ouverture, mais le rayon de courbure du miroir ; dans ce but, une fonction |from_radius(R)| calcule l'angle d'ouverture correspondant au rayon |R|, Ă&nbsp; hauteur |/tikz/optics/object height| imposĂŠe. Bien entendu, il n'est pas possible que la hauteur soit supĂŠrieure au double du rayon du miroir.
\begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics]
  \node[spherical mirror, object height=2cm, 
  spherical mirror angle=from_radius(3cm),
  draw mirror focus, draw mirror center={red}] (M) {};
\end{tikzpicture}
\end{codeexample}
\end{key}

\begin{key}{/tikz/optics/spherical mirror type}
    La clĂŠ |spherical mirror type| contrĂ´le le type de miroir : utiliser |spherical mirror type=concave| donne un miroir concave (c'est l'option par dĂŠfaut), alors que |spherical mirror type=convex| donne un miroir convexe.
    Il est plus commode d'utiliser les styles |convex mirror| et |concave mirror|, qui sont des raccourcis pour cette clĂŠ.

\begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics]
  \node[convex mirror, label={[label distance=0.25cm]south:convex mirror}] at (0cm,0) {};
  \node[concave mirror, label={[label distance=0.25cm]south:concave mirror}] at (4cm,0) {};
\end{tikzpicture}
\end{codeexample}
\end{key}

\begin{stylekey}{/tikz/optics/concave mirror}
    Le style |concave mirror| correspond Ă&nbsp; |spherical mirror, spherical mirror type=concave|, et dessine un miroir concave. Voir |spherical mirror type| pour un exemple.
\end{stylekey}

\begin{stylekey}{/tikz/optics/convex mirror}
    Le style |convex mirror| correspond Ă&nbsp; |spherical mirror, spherical mirror type=convex|, et dessine un miroir convexe. Voir |spherical mirror type| pour un exemple.
\end{stylekey}


\begin{key}{/tikz/optics/spherical mirror orientation=\meta{type} (initially |ltr|)}
    La clĂŠ |spherical mirror orientation| contrĂ´le l'orientation de miroir (i.e. dans quel sens on suppose que la lumiĂ¨re se propage). Les valeurs possibles sont |ltr| (\enquote{left to right}) et |rtl| (\enquote{right to left}).

\begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics]
  \node[spherical mirror, spherical mirror orientation=ltr] at (0cm,0) {};
  \node[spherical mirror, spherical mirror orientation=rtl] at (2cm,0) {};
\end{tikzpicture}
\end{codeexample}
\end{key}

La dĂŠcoration du miroir (hachures) est contrĂ´lĂŠe par les mĂŞmes clĂŠs que celle de |mirror| : |mirror decoration separation| et |mirror decoration amplitude|.


La figure suivante rĂŠcapitule certaines des ancres dĂŠfinies par |spherical mirror|.

\begin{codeexample}[]
\Huge
\begin{tikzpicture}[use optics]
\node[spherical mirror,name=s,object height=8cm,line shape example,
mirror decoration separation=0.141, mirror decoration amplitude=0.2] {};
\foreach \anchor/\placement in
{north/above,south/below,center/below right,
east/below right,
west/below,
north east/above right,
north west/above left,
south east/below right,
south west/below left,
mirror center/left,
arc start/above,
arc end/below,
arc center/right,
27/right,
focus/above}
\draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
node[\placement] {\scriptsize\texttt{(s.\anchor)}};
\end{tikzpicture}
\end{codeexample}

Avec les miroirs sphĂŠriques, les \enquote{border anchor} de tikz sont particuliĂ¨rement utiles. Des ancres numĂŠriques (de la forme |node.27|) sont dĂŠfinies, qui permettent d'accĂ¨der au bord de la |shape| dans la direction angulaire correspondante (ici Ă&nbsp; \ang{27}). Rappelons que dans tikz, les angles sont comptĂŠs dans le sens trigonomĂŠtrique Ă&nbsp; partir de l'axe $Ox$, et exprimĂŠs en degrĂŠs. Suit un exemple, oĂš on a dessinĂŠ le cercle sous-jacent.

\begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics,scale=.5]]
\coordinate (O) at (0,0);
\node[circle,draw, inner sep=0, outer sep=0,minimum height=2cm, densely dashed, gray!60] (C) at (O) {};
\node[spherical mirror,draw,object height=2cm,anchor=mirror center,
    spherical mirror angle=180] (M) at (O) {};
\draw[blue] (O) -- (M.0);
\draw[violet] (O) -- (M.45);
\draw[red] (O) -- (M.90);
\draw[orange] (O) -- (M.135);
\end{tikzpicture}
\end{codeexample}

\begin{warning}
  Pour le moment, les angles supĂŠrieurs Ă&nbsp; $\pm$|spherical mirror angle|$/2$ sont traitĂŠs comme si le miroir ĂŠtait un cercle entier (et pas un arc). Il n'est pas garanti que ce comportement soit maintenu.
\end{warning}

\end{shape}


\begin{stylekey}{/tikz/optics/draw mirror center=\meta{style}}
    Le style |draw mirror center| permet de dessiner le centre du miroir (avec le style \meta{style} s'il est spĂŠcifiĂŠ).

\begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics]
\node[concave mirror,draw mirror center, draw mirror focus={red}] {};
\end{tikzpicture}
\end{codeexample}
\end{stylekey}

\begin{stylekey}{/tikz/optics/draw mirror focus=\meta{style}}
    Le style |draw mirror focus| permet de dessiner le foyer du miroir (avec le style \meta{style} s'il est spĂŠcifiĂŠ). Voir |draw mirror center| pour un exemple.
\end{stylekey}

\subsubsection{Polariseur}

\begin{shape}{polarizer}
Dessine un polariseur.

\begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[polarizer] (S) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}


\begin{key}{/tikz/optics/object height=\meta{length} (initially \pgfkeysvalueof{/tikz/optics/object height})}
    L'option |object height| est applicable.
\end{key}


\begin{key}{/tikz/optics/object aspect ratio=\meta{number} (initially \pgfkeysvalueof{/tikz/optics/object aspect ratio})}
    L'option |object aspect ratio| contrĂ´le le rapport d'aspect du polariseur. Si \meta{number} vaut |1|, la largeur de l'objet est ĂŠgale Ă&nbsp; sa hauteur.
    Si \meta{number}|=1/2|, la largeur du polariseur vaut la moitiĂŠ de sa hauteur

    \begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[polarizer, object aspect ratio=0.2] (L1) at (0,0) {};
  \node[polarizer, object aspect ratio=0.5] (L2) at (4cm,0) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}



La figure suivante rĂŠcapitule les ancres dĂŠfinies par |polarizer|.

\begin{codeexample}[]
\Huge
\begin{tikzpicture}[use optics]
\node[polarizer,name=s,object height=8cm,object aspect ratio=0.4,shape example] {};
\foreach \anchor/\placement in
{north/above,south/below,east/right,west/left,center/below,
north east/right,north west/left,south east/right,south west/left}
\draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
node[\placement] {\scriptsize\texttt{(s.\anchor)}};
\end{tikzpicture}
\end{codeexample}

\end{shape}


\subsubsection{SĂŠparateur de faisceau}

\begin{stylekey}{/tikz/optics/beam splitter}
Dessine un sĂŠparateur de faisceau. Les options et ancres sont les mĂŞmes que pour |polarizer|.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[beam splitter] at (0,0) {};
\end{tikzpicture}  
\end{codeexample}

\end{stylekey}


\subsubsection{Prisme Ă&nbsp; vision directe}

\begin{shape}{double amici prism}
Dessine un prisme Ă&nbsp; vision directe (double prisme d'Amici).

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[double amici prism] (PVD) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}


\begin{key}{/tikz/optics/prism height=\meta{length} (initially \pgfkeysvalueof{/tikz/optics/prism height})}
    La clĂŠ |prism height| contrĂ´le la hauteur des trois prismes identiques constituant le PVD (la longueur d'un cĂ´tĂŠ est donc $2/\sqrt{3}$ fois cette hauteur).

    \begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[double amici prism, prism height=1cm] (PVD1) at (0,0) {};
  \node[double amici prism, prism height=0.5cm] (PVD2) at (4cm,0) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}


\begin{key}{/tikz/optics/prism apex angle=\meta{angle} (initially \pgfkeysvalueof{/tikz/optics/prism apex angle})}
    La clĂŠ |prism apex angle| contrĂ´le l'angle au sommet des trois prismes identiques. \meta{angle} est exprimĂŠ en degrĂŠs. Si \meta{angle} vaut |60|, les prismes sont des triangles isocĂ¨les.

    \begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[double amici prism, prism apex angle=40] (PVD1) at (0,0) {};
  \node[double amici prism, prism apex angle=60] (PVD2) at (4cm,0) {};
  \node[double amici prism, prism apex angle=80] (PVD3) at (10cm,0) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}



La figure suivante rĂŠcapitule les ancres dĂŠfinies par |double amici prism|.

\begin{codeexample}[]
\Huge
\begin{tikzpicture}[use optics]
\node[double amici prism,name=s,prism height=4.5cm,shape example] {};
\foreach \anchor/\placement in
{north/above,south/below,east/right,west/left,center/below,
north east/right,north west/left,south east/right,south west/left}
\draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
node[\placement] {\scriptsize\texttt{(s.\anchor)}};
\end{tikzpicture}
\end{codeexample}

\end{shape}


\subsubsection{ĂlĂŠment gĂŠnĂŠrique fin}

\begin{shape}{thin optics element}
Dessine un ĂŠlement gĂŠnĂŠrique (utilisĂŠ pour des ĂŠlĂŠments plus spĂŠcifiques). 
Cette |shape| peut ĂŞtre utile pour dessiner un objet non prĂŠvu, en lui donnant un style pertinent.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[thin optics element] (S) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}

\begin{key}{/tikz/optics/object height=\meta{length} (initially \pgfkeysvalueof{/tikz/optics/object height})}
    L'option |object height| est applicable.
\end{key}

La figure suivante rĂŠcapitule les ancres dĂŠfinies par |thin optics element|.

\begin{codeexample}[]
\Huge
\begin{tikzpicture}[use optics]
\node[thin optics element,name=s,object height=8cm,line shape example] {};
\foreach \anchor/\placement in
{north/above,south/below,center/right}
\draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
node[\placement] {\scriptsize\texttt{(s.\anchor)}};
\end{tikzpicture}
\end{codeexample}

\end{shape}

\subsubsection{ĂlĂŠment gĂŠnĂŠrique ĂŠpais}

\begin{shape}{thick optics element}
Dessine un ĂŠlĂŠment gĂŠnĂŠrique ĂŠpais.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[thick optics element] at (0,0) {};
\end{tikzpicture}  
\end{codeexample}


\begin{key}{/tikz/optics/object height=\meta{length} (initially \pgfkeysvalueof{/tikz/optics/object height})}
    L'option |object height| est applicable.
\end{key}


\begin{key}{/tikz/optics/object aspect ratio=\meta{number or length} (initially 0.05)}
    L'option |object aspect ratio| contrĂ´le le rapport d'aspect de l'objet.
\end{key}




La figure suivante rĂŠcapitule les ancres dĂŠfinies par |thick optics element|.

\begin{codeexample}[]
\Huge
\begin{tikzpicture}[use optics]
\node[thick optics element,name=s,object height=8cm,shape example,object aspect ratio=0.2] {};
\foreach \anchor/\placement in
{north/above,south/below,east/right,west/left,center/below,
north east/right,north west/left,south east/right,south west/left}
\draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
node[\placement] {\scriptsize\texttt{(s.\anchor)}};
\end{tikzpicture}
\end{codeexample}

\end{shape}

\subsubsection{Anticalorique}

\begin{stylekey}{/tikz/optics/heat filter}
Le style |heat filter| permet de dessiner un filtre anticalorique. Les options de |thick optics element| sont applicables.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[heat filter] (S) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}
\end{stylekey}


\subsubsection{Ăcran}


\begin{stylekey}{/tikz/optics/screen}
Le style |screen| permet de dessiner un ĂŠcran. Les options de |thin optics element| sont applicables.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[screen] (S) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}
\end{stylekey}

\subsubsection{RĂŠseau de diffraction}

\begin{stylekey}{/tikz/optics/diffraction grating}
Le style |diffraction grating| permet de dessiner un rĂŠseau de diffraction. Les options de |thin optics element| sont applicables.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[diffraction grating] (S) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}
\end{stylekey}

\subsubsection{Grille}

\begin{stylekey}{/tikz/optics/grid}
Le style |grid| permet de dessiner une grille. Les options de |thin optics element| sont applicables.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[grid] (S) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}
\end{stylekey}

\subsubsection{Lame semi-rĂŠflĂŠchissante}

\begin{stylekey}{/tikz/optics/semi-transparent mirror}
Le style |semi-transparent mirror| permet de dessiner un miroir semi-rĂŠflĂŠchissant. Les options de |thin optics element| sont applicables.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[semi-transparent mirror] (S) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}
\end{stylekey}

\subsubsection{Diaphragme}

\begin{stylekey}{/tikz/optics/diaphragm}
Le style |diaphragm| permet de dessiner un diaphragme (c'est un |slit| avec une fente large). Les options de |slit| sont applicables.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[diaphragm] (S) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}
\end{stylekey}


\subsection{Lampes et capteurs}

\subsubsection{EntrĂŠe/sortie optique gĂŠnĂŠrique}

\begin{shape}{generic optics io}
Dessine un systĂ¨me entrĂŠe-sortie gĂŠnĂŠrique (utilisĂŠ pour des objets plus spĂŠcifiques).

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[generic optics io] (S) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}


\begin{key}{/tikz/optics/io body height=\meta{length} (initially \pgfkeysvalueof{/tikz/optics/io body height})}
    La clĂŠ |io body height| contrĂ´le la taille de la lampe. En particulier, \meta{length} spĂŠcifie la hauteur du corps de la lampe,
    et les autres longueurs sont spĂŠcifiĂŠes relativement Ă&nbsp; celle-ci. En modifiant \meta{length}, on modifie donc la taille de la lampe
    sans la dĂŠformer.  

    \begin{codeexample}[]
\begin{tikzpicture}[use optics,scale=.5]
  \node[generic optics io, io body height=1cm] (L1) at (0,0) {};
  \node[generic optics io, io body height=2cm] (L2) at (10cm,0) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}

\begin{key}{/tikz/optics/io body aspect ratio=\meta{number or length} (initially \pgfkeysvalueof{/tikz/optics/io body aspect ratio})}
    La clĂŠ |io body aspect ratio| contrĂ´le le rapport d'aspect de la lampe. Si \meta{number} vaut |1|, la largeur de la lampe est ĂŠgale Ă&nbsp; sa hauteur.
    Si \meta{number}|=1/2|, la largeur de la lampe vaut la moitiĂŠ de sa hauteur

    \begin{codeexample}[]
\begin{tikzpicture}[use optics,scale=.5]
  \node[generic optics io, io body aspect ratio=1] (L1) at (0,0) {};
  \node[generic optics io, io body aspect ratio=2] (L2) at (8cm,0) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}

\begin{stylekey}{/tikz/optics/io body width=\meta{number or length}}
La clĂŠ |io body width| est un alias pour |io body aspect ratio|.
\end{stylekey}


\begin{key}{/tikz/optics/io aperture width=\meta{number or length} (initially \pgfkeysvalueof{/tikz/optics/io aperture width})}
    La clĂŠ |io aperture width| contrĂ´le la largeur du systĂ¨me de sortie de la lampe (qui reprĂŠsente un condenseur, une lentille de collimation, etc.), en unitĂŠs de la hauteur du corps de la lampe. Si \meta{number}|=0|, le systĂ¨me de sortie n'est pas affichĂŠ.

    \begin{codeexample}[]
\begin{tikzpicture}[use optics,scale=.5]
  \node[generic optics io, io aperture width=0] at (0,0) {};
  \node[generic optics io, io aperture width=0.1] at (8cm,0) {};
  \node[generic optics io, io aperture width=0.5] at (16cm,0) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}




\begin{key}{/tikz/optics/io aperture height=\meta{number or length} (initially \pgfkeysvalueof{/tikz/optics/io aperture height})}
    La clĂŠ |io aperture width| contrĂ´le la hauteur du systĂ¨me de sortie de la lampe (qui reprĂŠsente un condenseur, une lentille de collimation, etc.), en unitĂŠs de la hauteur du corps de la lampe.

    \begin{codeexample}[]
\begin{tikzpicture}[use optics,scale=.5]
  \node[generic optics io, io aperture height=0.5] at (0,0) {};
  \node[generic optics io, io aperture height=0.8] at (8cm,0) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}


\begin{key}{/tikz/optics/io aperture shift=\meta{number or length} (initially \pgfkeysvalueof{/tikz/optics/io aperture shift})}
    L'option |io aperture shift| contrĂ´le le dĂŠcalage du systĂ¨me de sortie de la lampe par rapport au centre, en unitĂŠs de la hauteur du corps de la lampe.

    \begin{codeexample}[]
\begin{tikzpicture}[use optics,scale=.5,
optics,io body height=2cm,io body aspect ratio=0.5,io aperture height=0.3, io aperture width=0.1]
	\node[generic optics io,io aperture shift=-0.25] at (-5cm,0) {};
  \node[generic optics io,io aperture shift=0] at (0,0) {};
  \node[generic optics io,io aperture shift=0.25] at (5cm,0) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}


On peut afficher du texte dans le corps d'une lampe en utilisant le texte de la |node|.

\begin{codeexample}[]
\begin{tikzpicture}[use optics,scale=.5]
  \node[generic optics io] at (-5cm,0) {Q.I.};
\end{tikzpicture}
\end{codeexample}

\begin{key}{/tikz/optics/io orientation=\meta{type} (initially |ltr|)}
    La clĂŠ |io orientation| dĂŠtermine le sens dans lequel est dessinĂŠ l'objet (avec l'ouverture Ă&nbsp; droite (au niveau de l'ancre |east|) quand elle vaut |ltr| et Ă&nbsp; gauche (au niveau de l'ancre |west|) quand elle vaut |rtl|). Les noms correspondent Ă&nbsp; \enquote{left to right} et \enquote{right to left}.
    Seules les arguments |ltr| et |rtl| sont autorisĂŠs. La diffĂŠrence avec |rotate| est que |io orientation| modifie les ancres.

    \begin{codeexample}[]
\begin{tikzpicture}[use optics,scale=.5]
  \node[generic optics io] at (0,0) {};
  \node[generic optics io,io orientation=ltr] at (5cm,0) {};
  \node[generic optics io,io orientation=rtl] at (10cm,0) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}


On peut afficher du texte dans le corps d'une lampe en utilisant le texte de la |node|.

\begin{codeexample}[]
\begin{tikzpicture}[use optics,scale=.5]
	\node[generic optics io] at (-5cm,0) {Q.I.};
\end{tikzpicture}
\end{codeexample}


La figure suivante rĂŠcapitule les ancres dĂŠfinies par |generic optics io|.

\begin{codeexample}[]
\Huge
\begin{tikzpicture}[use optics]
\node[generic optics io,name=s,io body height=4cm,io aperture width=0.7,io body aspect ratio=1.8,shape example] {};
\foreach \anchor/\placement in
{body north/above,body south/below,body east/above right,body west/right,body center/below,
body north east/above,body north west/above,body south east/below,body south west/below,
aperture north/above,aperture south/below,aperture east/right,aperture west/left,aperture center/below,
aperture north east/right,aperture north west/left,aperture south east/right,aperture south west/left}
\draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
node[\placement] {\scriptsize\texttt{(s.\anchor)}};
\end{tikzpicture}
\end{codeexample}

Notons que les ancres |body east| et |aperture west| correspondent au mĂŞme point. Les deux sont dĂŠfinies dans un souci de cohĂŠrence. Une ancre |east| est dĂŠfinie comme |body east| ou |aperture east| en fonction de la valeur de |io orientation| de maniĂ¨re Ă&nbsp; ce que |east| soit la clĂŠ la plus Ă&nbsp; l'est (Ă&nbsp; droite). La mĂŞme chose a lieu pour l'ancre |west|.

La figure suivante rĂŠcapitule les ancres dĂŠfinies par |generic optics io, io orientation=rtl|.

\begin{codeexample}[]
\Huge
\begin{tikzpicture}[use optics]
\node[generic optics io,name=s,io body height=4cm,io aperture width=0.7,io body aspect ratio=1.8,
io orientation=rtl,shape example] {};
\foreach \anchor/\placement in
{body north/above,body south/below,body east/above right,body west/above right,body center/below,
body north east/above,body north west/above,body south east/below,body south west/below,
aperture north/above,aperture south/below,aperture east/right,aperture west/left,aperture center/below,
aperture north east/right,aperture north west/left,aperture south east/right,aperture south west/left}
\draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
node[\placement] {\scriptsize\texttt{(s.\anchor)}};
\end{tikzpicture}
\end{codeexample}

\end{shape}


\subsubsection{Ligne de capteurs}


\begin{shape}{sensor line}
Dessine une ligne de capteurs (type Caliens).

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[sensor line] (S) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}

\begin{key}{/tikz/optics/sensor line height=\meta{length} (initially \pgfkeysvalueof{/tikz/optics/sensor line height})}
    La clĂŠ |sensor line height| contrĂ´le la taille de la ligne de capteurs. En particulier, \meta{length} spĂŠcifie la hauteur du corps de la ligne,
    et les autres longueurs peuvent ĂŞtre spĂŠcifiĂŠes relativement Ă&nbsp; celle-ci (en ne donnant pas d'unitĂŠ). Dans ce cas, en modifiant \meta{length}, on modifie donc la taille de la ligne de capteurs
    sans la dĂŠformer.  

    \begin{codeexample}[]
\begin{tikzpicture}[use optics,scale=.5]
  \node[sensor line, sensor line height=1cm] (L1) at (0,0) {};
  \node[sensor line, sensor line height=2cm] (L2) at (4cm,0) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}

\begin{key}{/tikz/optics/sensor line aspect ratio=\meta{number} (initially \pgfkeysvalueof{/tikz/optics/sensor line aspect ratio})}
    La clĂŠ |sensor line aspect ratio| contrĂ´le le rapport d'aspect de la ligne de capteurs.

    \begin{codeexample}[]
\begin{tikzpicture}[use optics,scale=.5]
  \node[sensor line, sensor line aspect ratio=0.2] (L1) at (0,0) {};
  \node[sensor line, sensor line aspect ratio=0.4] (L2) at (4cm,0) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}


\begin{key}{/tikz/optics/sensor line pixel number=\meta{number} (initially \pgfkeysvalueof{/tikz/optics/sensor line pixel number})}
    La clĂŠ |sensor line pixel number| contrĂ´le le nombre de pixels \meta{number} de la ligne de capteurs.

    \begin{codeexample}[]
\begin{tikzpicture}[use optics,scale=.5]
  \node[sensor line, sensor line pixel number=2] at (0,0) {};
  \node[sensor line, sensor line pixel number=4] at (4cm,0) {};
  \node[sensor line, sensor line pixel number=10] at (8cm,0) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}


\begin{key}{/tikz/optics/sensor line pixel width=\meta{number or length} (initially \pgfkeysvalueof{/tikz/optics/sensor line pixel width})}
    La clĂŠ |sensor line pixel width| contrĂ´le la largeur des pixels : \meta{number or length} est la largeur d'un pixel (par rapport Ă&nbsp; la largeur du capteur si elle est relative).

    \begin{codeexample}[]
\begin{tikzpicture}[use optics,scale=.5]
  \node[sensor line, sensor line pixel width=0.3] at (0,0) {};
  \node[sensor line, sensor line pixel width=0.8] at (4cm,0) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}


\begin{key}{/tikz/optics/sensor line inner ysep=\meta{number or length} (initially \pgfkeysvalueof{/tikz/optics/sensor line inner ysep})}
    La clĂŠ |sensor line inner ysep| contrĂ´le la sĂŠparation entre les bords haut et bas du capteur et les pixels. Si \meta{number or length} est une hauteur relative, elle est comptĂŠe par rapport Ă&nbsp; la hauteur du capteur. La hauteur des pixels est calculĂŠe de maniĂ¨re Ă&nbsp; ce qu'il y en ait un nombre |sensor line pixel number|, en tenant compte de cette sĂŠparation.

    \begin{codeexample}[]
\begin{tikzpicture}[use optics,scale=.5]
  \node[sensor line,sensor line inner ysep=0] at (0,0) {};
  \node[sensor line,sensor line inner ysep=0.1] at (4cm,0) {};
  \node[sensor line,sensor line inner ysep=0.2] at (8cm,0) {};
\end{tikzpicture}
    \end{codeexample}
\end{key}


Les ancres |north|, |south|, |east|, |west|, |center|, |north east|, |north west|, |south east|, |south west|, ainsi que
|pixel &lt;i&gt; &lt;anchor&gt;| oĂš |&lt;anchor&gt;| vaut |north|, |south|, etc. et oĂš |&lt;i&gt;| est le numĂŠro du pixel considĂŠrĂŠ
(allant de |1| Ă&nbsp; |sensor line pixel number|) sont dĂŠfinies. Par exemple, on peut utiliser |pixel 3 west|.

La figure suivante rĂŠcapitule les ancres dĂŠfinies par |sensor line| dĂŠfinies globalement ainsi que pour le pixel 4 (en rouge).

\begin{codeexample}[]
\Huge
\begin{tikzpicture}[use optics]
\node[sensor line,name=s,sensor line height=10cm,sensor line aspect ratio=0.8,
sensor line inner ysep=0.1,sensor line pixel number=5, shape example] {};
\foreach \anchor/\placement in
{north/above,south/below,east/right,west/left,center/below,
north east/right,north west/left,south east/right,south west/left}

\draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
node[\placement] {\scriptsize\texttt{(s.\anchor)}};

\foreach \anchor/\placement in
{pixel 4 north/above,pixel 4 south/below,pixel 4 east/right,pixel 4 west/left,pixel 4 center/below,
pixel 4 north east/right,pixel 4 north west/left,pixel 4 south east/right,pixel 4 south west/left}
% manque pixel &lt;i&gt; &lt;subanchor&gt;
\draw[red,shift=(s.\anchor)] plot[mark=x,red] coordinates{(0,0)}
node[\placement] {\scriptsize\texttt{(s.\anchor)}};

\end{tikzpicture}
\end{codeexample}

\end{shape}


Remarques :
\begin{itemize}
	\item Quand les ancres |east| et |west| ne sont pas dĂŠfinies explicitement, elles sont en fait des alias pour |center|. Cela permet aux clĂŠs |right=of...| et assimilĂŠes de fonctionner correctement.
\end{itemize}



\subsubsection{Capteur gĂŠnĂŠrique}

\begin{stylekey}{/tikz/optics/generic sensor}
Le style |generic sensor| permet de dessiner un capteur. Les options de |generic optics io| sont applicables.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[generic sensor] (S) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}
\end{stylekey}

\subsubsection{Lampe gĂŠnĂŠrique}

\begin{stylekey}{/tikz/optics/generic lamp}
Le style |generic lamp| permet de dessiner une lampe. Les options de |generic optics io| sont applicables.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[generic lamp] (S) at (0,0) {};
\end{tikzpicture}  
\end{codeexample}
\end{stylekey}

\subsubsection{Lampe QI}

\begin{stylekey}{/tikz/optics/halogen lamp}
Le style |halogen lamp| permet de dessiner une lampe de type \enquote{lampe halogĂ¨ne Quartz Iode}. Les options de |generic optics io| sont applicables.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[halogen lamp] (S) at (0,0) {};
  \node[halogen lamp] (S) at (5cm,0) {QI};
\end{tikzpicture}  
\end{codeexample}
\end{stylekey}

\subsubsection{Lampe spectrale}

\begin{stylekey}{/tikz/optics/spectral lamp}
Le style |spectral lamp| permet de dessiner une lampe de type \enquote{lampe spectrale}. Les options de |generic optics io| sont applicables. Par ailleurs, un style est automatiquement appliquĂŠ pour autoriser le texte multiligne.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[spectral lamp] (S) at (0,0) {};
  \node[spectral lamp] (S) at (5cm,0) {\ce{Hg} \\ BP};
\end{tikzpicture}  
\end{codeexample}
\end{stylekey}

\subsubsection{Laser}

\begin{stylekey}{/tikz/optics/laser}
Le style |laser| permet de dessiner un laser. Les options de |generic optics io| sont applicables.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[laser] (S) at (0,0) {};
  \node[laser] (S) at (5cm,0) {\ce{HeNe}};
\end{tikzpicture}  
\end{codeexample}
\end{stylekey}

\begin{stylekey}{/tikz/optics/laser'}
Le style |laser'| permet de dessiner un laser sans \enquote{orifice de sortie} (i.e. |io aperture width=0pt|). Les options de |generic optics io| sont applicables.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics,scale=.5]
  \node[laser'] (S) at (0,0) {\ce{Nd}:YAG};
  \draw[green] (S.aperture east) -- +(2cm,0);
\end{tikzpicture}  
\end{codeexample}
\end{stylekey}

\subsection{Divers}



\subsubsection{Marquer des rayons}

\begin{update}
  2014-12-07 : cette partie a ĂŠtĂŠ substantiellement modifiĂŠe.
\end{update}

\begin{warning}
  Cette partie n'est pas encore stable. Les raccourcis |-&gt;-|, etc. ne devraient normalement pas changer
\end{warning}

Les flĂ¨ches pour marquer les rayons sont conĂ§ues pour se trouver \emph{vraiment} au milieu du rayon (contrairement Ă&nbsp; ce qui arrive en utilisant simplement |\arrow{&gt;&gt;}| avec |put arrow|).

\begin{stylekey}{/tikz/optics/-&gt;-}
  Ce style ajoute une flĂ¨che au milieu du chemin.
  \begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics]
  \draw[-&gt;-] (0,0) -- (1.5cm,1cm);
\end{tikzpicture}  
  \end{codeexample}
\end{stylekey}

\begin{stylekey}{/tikz/optics/-&lt;-}
  Ce style ajoute une flĂ¨che au milieu du chemin, dans le sens opposĂŠ Ă&nbsp; |-&gt;-|.
  \begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics]
  \draw[-&lt;-] (0,0) -- (1.5cm,1cm);
\end{tikzpicture}  
  \end{codeexample}
\end{stylekey}

\begin{stylekey}{/tikz/optics/-&gt;&gt;-}
  Ce style ajoute une double flĂ¨che au milieu du chemin.
  \begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics]
  \draw[-&gt;&gt;-] (0,0) -- (1.5cm,1cm);
\end{tikzpicture}  
  \end{codeexample}
\end{stylekey}

\begin{stylekey}{/tikz/optics/-&lt;&lt;-}
  Ce style ajoute une double flĂ¨che au milieu du chemin, dans le sens opposĂŠ Ă&nbsp; |-&lt;&lt;-|.
  \begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics]
  \draw[-&lt;&lt;-] (0,0) -- (1.5cm,1.1cm);
\end{tikzpicture}  
  \end{codeexample}
\end{stylekey}

\begin{stylekey}{/tikz/optics/-&gt;n-=\{n=\meta{num}, \meta{specs}\}}
  Ce style ajoute \meta{num} flĂ¨ches au milieu du chemin. Les spĂŠcifications \meta{specs} sont appliquĂŠes aux flĂ¨ches, suivant la syntaxe de |put arrow|.
  \begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics]
  \draw[-&gt;n-={n=4}] (0,0) -- (1.5cm,1cm);
\end{tikzpicture}  
  \end{codeexample}
\end{stylekey}

\begin{stylekey}{/tikz/optics/-&lt;n-={n=\meta{num}, \meta{specs}}}
  Ce style ajoute \meta{num} flĂ¨ches au milieu du chemin, dans le sens opposĂŠ Ă&nbsp; |-&gt;n-|.
  \begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics]
  \draw[-&lt;n-={n=6}] (0,0) -- (1.5cm,1cm);
\end{tikzpicture}  
  \end{codeexample}
\end{stylekey}

Des raccourcis allant de |-&gt;-| Ă&nbsp; |-&gt;&gt;&gt;&gt;-| (idem pour |-&lt;-|) sont disponibles. Les styles |-&gt;-|, |-&lt;-|, etc. utilisent le style |put arrow| avec la flĂ¨che |multiple ray arrow|. Ils peuvent donc ĂŞtre configurĂŠs en suivant la syntaxe de |put arrow|, par exemple

\begin{codeexample}[width=4cm]
\begin{tikzpicture}[use optics]
  \draw[-&gt;&gt;-={at=0.25}, -&gt;-={at=0.75}] (0,0) -- (1.5cm,1cm) -- (3cm, 0);
\end{tikzpicture}
\end{codeexample}

Cela marche aussi avec |-&gt;n-| et |-&lt;n-|.

\begin{codeexample}[width=4cm]
\begin{tikzpicture}[use optics]
  \draw[-&gt;n-={n=5, at=0.2, style=red}] (0,0) -- (1.5cm,1cm);
\end{tikzpicture}
\end{codeexample}

\subsubsection{Placer des choses sur les chemins}

\begin{update}
  2014-12-07 : cette partie a ĂŠtĂŠ substantiellement modifiĂŠe.
\end{update}

\begin{warning}
  Cette partie n'est pas encore stable. Tout risque de changer Ă&nbsp; tout moment.
\end{warning}

\begin{key}{/tikz/put arrow}
La clĂŠ |put arrow| permet d'ajouter facilement une flĂ¨che sur un chemin.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics]
  \draw[put arrow] (0,0) -- (1.5cm,1cm);
\end{tikzpicture}  
\end{codeexample}

Par dĂŠfaut, la flĂ¨che est |\arrow{&gt;}| et elle est placĂŠe au milieu du chemin.
Pour contrĂ´ler ces paramĂ¨tres, il faut utiliser les sous-clĂŠs suivantes :

\begin{key}{/tikz/put arrow/pos=\meta{pos} (initially \pgfkeysvalueof{/tikz/put arrow/pos})}
  Positionne la flĂ¨che Ă&nbsp; la position \meta{pos} sur le chemin (par exemple, \meta{pos}|=0.5| place la flĂ¨che au milieu du chemin).
\end{key}

\begin{key}{/tikz/put arrow/at}
  Alias pour |/tikz/put arrow/pos|.
\end{key}

\begin{key}{/tikz/put arrow/arrow=\meta{arrow specification}}
  Utilise la flĂ¨che dĂŠfinie par \meta{arrow specification} (par exemple |stealth| ou |latex|).
\end{key}

\begin{key}{/tikz/put arrow/arrow'=\meta{arrow specification}}
  Utilise la flĂ¨che dĂŠfinie par \meta{arrow specification} (par exemple |stealth| ou |latex|), mais avec une flĂ¨che inversĂŠe.
\end{key}

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics]
  \draw[put arrow={arrow'=stealth}] (0,0) -- (1cm,1cm);
  \draw[put arrow={at=0.2}] (2cm,0) -- (3cm,1cm);
\end{tikzpicture}  
\end{codeexample}

\begin{key}{/tikz/put arrow/style=\meta{style}}
  Le |\meta{style}| est passĂŠ Ă&nbsp; |\arrow[|\meta{style}|]| pour dessiner les flĂ¨ches.
\end{key}

\begin{codeexample}[width=5cm]
\begin{tikzpicture}[use optics]
  \draw[red,put arrow={arrow=latex}]
  (0,0) -- (1cm,1cm);
  \draw[red,put arrow={arrow=latex,style={blue}}]
  (1cm,0) -- (2cm,1cm);
\end{tikzpicture}
\end{codeexample}

\begin{stylekey}{/tikz/put arrow/every arrow}
  Il s'agit d'un style passĂŠ Ă&nbsp; toutes les flĂ¨ches dessinĂŠes par |put arrow| (dans la portĂŠe du style). Il faut utiliser |every arrow/.style={|\meta{style}|}| (ou |append style|, etc.).
\end{stylekey}

\begin{codeexample}[width=3cm]
\begin{tikzpicture}[use optics]
  \draw[red,put arrow={arrow=latex}]
  (0,0) -- (1cm,1cm);
  \draw[red, put arrow/every arrow/.style={blue},
    put arrow={at=0.2}, put arrow={at=0.5}, put arrow={at=0.8}]
  (1cm,0) -- (2cm,1cm);
  \draw[red, &gt;=latex, put arrow/every arrow/.style={blue}, 
    put arrow={at=0.2}, put arrow={at=0.5}, put arrow={at=0.8}]
  (2cm,0) -- (3cm,1cm);
\end{tikzpicture}
\end{codeexample}



Les diffĂŠrentes flĂ¨ches utilisables sont dĂŠtaillĂŠes dans le manuel de pgf/tikz.

Pour un contrĂ´le plus fin, il faut utiliser la bibliothĂ¨que tikz |markings|. 

Par ailleurs, pour flĂŠcher des rayons lumineux, des styles spĂŠcifiques |-&gt;-|, |-&lt;-|, |-&gt;&gt;-| et |-&lt;&lt;-| ont ĂŠtĂŠ dĂŠfinis.

\end{key}

\subsubsection{Placer des coordonnĂŠes sur les chemins}

\begin{key}{/tikz/put coordinate=\meta{coordinate} at \meta{position}}

Le style |put coordinate| crĂŠe une coordonnĂŠe nommĂŠe \meta{coordinate}
Ă&nbsp; l'abscisse curviligne \meta{position} sur le chemin auquel est appliquĂŠ le style.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}[use optics]
  \draw[put coordinate=P at 0.3,put coordinate=Q at 0.7] (0,0)
    to[bend left] (2cm,0);
  \draw[red] (P) -- (1cm,-1cm);
  \draw[blue] (Q) -- (1cm,-1cm);
\end{tikzpicture}  
\end{codeexample}

\end{key}

\subsubsection{Indiquer des dimensions sur les schĂŠmas}

\begin{warning}
  Cette partie est expĂŠrimentale et sujette Ă&nbsp; beaucoup de changements brusques sans prĂŠavis.
\end{warning}

CommenĂ§ons par un exemple.

\begin{codeexample}[width=6cm]
\begin{tikzpicture}
\draw[fill=yellow!30]
   (-1cm,0) coordinate (A) -- (1cm,0) coordinate (B)
   -- (1cm,1.5cm) coordinate (B') -- (0.25cm,2.5cm) coordinate (b)
   -- (-0.25cm,2.5cm) coordinate (a) -- (-1cm,1.5cm) coordinate (A')
   -- cycle;

\draw (A) to[dim arrow'={label'=$D$}] (B);
\draw (A) to[dim arrow={label=$H$}] (A');
\draw (a) to[short dim arrow={label=$d$,label near middle}] (b);
\draw (B') to[dim arrow'={label'=$h$}] (b -| B');
\end{tikzpicture}  
\end{codeexample}



\begin{stylekey}{/tikz/dim arrow=\meta{sous-clĂŠs}}
  Le style |dim arrow| permet d'indiquer des dimensions sur les schĂŠmas. Il s'applique Ă&nbsp; un |to path|. Par exemple,

  \begin{codeexample}[width=4cm]
\begin{tikzpicture}[use optics]
  \node[circle,fill=red,inner sep=2pt] (a) at (0,0) {};
  \node[circle,fill=red,inner sep=2pt] (b) at (2cm,0) {};
  \draw (a.center) to[dim arrow={label=$\ell$}] (b.center);
\end{tikzpicture}  
  \end{codeexample}

  La flĂ¨che de dimension est dĂŠcalĂŠe par rapport aux positions de dĂŠpart et d'arrivĂŠe de maniĂ¨re Ă&nbsp; ne pas se superposer
  Ă&nbsp; l'objet dont on veut marquer la dimension.

  Plusieurs sous-clĂŠs permettent de spĂŠcifier des options en ĂŠcriant |dim arrow={|\meta{sous-clĂŠs}|}|.

  \begin{key}{/tikz/dim arrow/label=\meta{text}}
  La clĂŠ |label| permet de spĂŠcifier le \meta{texte} Ă&nbsp; afficher sur la flĂ¨che, qui est positionnĂŠ Ă&nbsp; gauche de la flĂ¨che par rapport au sens du chemin (via |/tikz/auto=left|).
  \end{key}

  \begin{key}{/tikz/dim arrow/label'=\meta{text}}
  La clĂŠ |label'| a le mĂŞme rĂ´le que |label|, mais le \meta{texte} est affichĂŠ Ă&nbsp; droite dans le sens du chemin.
  \end{key}


\begin{codeexample}[]
\begin{tikzpicture}
  \node[rectangle, draw=black, fill=yellow!30, minimum width=1cm, minimum height=1cm] (R) at (0,0) {};

  \draw (R.north east) to[dim arrow'={label'=$\ell'$}] (R.south east);
  \draw (R.north east) to[dim arrow'={label=$\ell$}] (R.south east);
\end{tikzpicture}
\end{codeexample}

  \begin{key}{/tikz/dim arrow/label text=\meta{text}}
  La clĂŠ |label text| permet de spĂŠcifier le \meta{texte} Ă&nbsp; afficher sur la flĂ¨che sans modifier son positionnement.
  \end{key}

  \begin{stylekey}{/tikz/dim arrow/label style}
  La clĂŠ |label style| permet de spĂŠcifier le style avec lequel le label doit ĂŞtre dessinĂŠ.
  Ă moins de le faire exprĂ¨s, il n'est pas conseillĂŠ de remplacer ce style (qui est utilisĂŠ pour placer le label), mais plutĂ´t d'y ajouter des spĂŠcifications grace Ă&nbsp; |/.append style|.

\begin{codeexample}[]
\begin{tikzpicture}
  \node[rectangle, draw=black, fill=yellow!30, minimum width=1cm, minimum height=1cm] (R) at (0,0) {};

  \draw (R.north east) 
    to[dim arrow={label=$L$, label style/.append style=red}] (R.south east);
  \draw (R.north west)
    to[dim arrow'={label'=$L$}, red] (R.south west);
\end{tikzpicture}
\end{codeexample}
  \end{stylekey}

  \begin{key}{/tikz/dim arrow/raise=\meta{length} (initially \pgfkeysvalueof{/tikz/dim arrow/raise})}
  La clĂŠ |raise| permet de spĂŠcifier la distance \meta{length} Ă&nbsp; laquelle doit ĂŞtre dessinĂŠe la flĂ¨che de dimension par rapport au chemin initial.
  \begin{codeexample}[]
\begin{tikzpicture}
  \node[rectangle, draw=black, fill=yellow!30, minimum width=1cm, minimum height=1cm] (R) at (0,0) {};

  \draw (R.north east) 
    to[dim arrow={label=$\ell$, raise=0.5cm}, black] (R.south east);
  \draw (R.north east) 
    to[dim arrow={label=$\ell$, raise=1cm}, red] (R.south east);
\end{tikzpicture}
\end{codeexample}
  \end{key}

  \begin{stylekey}{/tikz/dim arrow/no raise}
  Ăquivalent Ă&nbsp; |raise=0|. (Est-ce bien utile ?)
  \end{stylekey}
\end{stylekey}

\begin{stylekey}{/tikz/dim arrow'=\meta{sous-clĂŠs}}
  Le style |dim arrow'| a le mĂŞme rĂ´le que |dim arrow|, mais la valeur initiale de |/tikz/dim arrow/raise| est de |-|\texttt{\pgfkeysvalueof{/tikz/dim arrow/raise}} au lieu de \texttt{\pgfkeysvalueof{/tikz/dim arrow/raise}}.

\begin{codeexample}[]
\begin{tikzpicture}
  \node[rectangle, draw=black, fill=yellow!30, minimum width=1cm, minimum height=1cm] (R) at (0,0) {};

  \draw (R.north east) to[dim arrow'={label=$\ell$}, black] (R.south east);
  \draw (R.north east) to[dim arrow={label=$\ell$}, red] (R.south east);
\end{tikzpicture}
\end{codeexample}
\end{stylekey}


\begin{stylekey}{/tikz/short dim arrow=\meta{sous-clĂŠs}}
  Le style |short dim arrow| a le mĂŞme but que |dim arrow|, mais dans le cas oĂš la dimension Ă&nbsp; marquer est petite, et oĂš il faut que les flĂ¨ches soient Ă&nbsp; l'extĂŠrieur.

  \begin{codeexample}[width=4cm]
\begin{tikzpicture}[use optics]
  \node[circle,fill=red,inner sep=2pt] (a) at (0,0) {};
  \node[circle,fill=red,inner sep=2pt] (b) at (1cm,0) {};
  \draw (a.center)
  to[short dim arrow={label=$\ell$}]
  (b.center);
\end{tikzpicture}  
  \end{codeexample}

  Les options de |/tikz/dim arrow| s'appliquent, ainsi que quelques options supplĂŠmentaires.

  \begin{key}{/tikz/dim arrow/label near start}
  La clĂŠ |label near start| permet de placer l'ĂŠtiquette donnant la dimension vers le dĂŠbut du chemin.
  C'est le comportement par dĂŠfaut.

\begin{codeexample}[]
\begin{tikzpicture}
  \node[rectangle, draw=black, fill=yellow!30, minimum width=1cm, minimum height=0.5cm] (R) at (0,0) {};

  \draw (R.north east) to[short dim arrow={label=$\ell$}] (R.south east);
\end{tikzpicture}
\end{codeexample}
  \end{key}

  \begin{key}{/tikz/dim arrow/label near end}
  La clĂŠ |label near end| permet de placer l'ĂŠtiquette donnant la dimension vers la fin du chemin.

\begin{codeexample}[]
\begin{tikzpicture}
  \node[rectangle, draw=black, fill=yellow!30, minimum width=1cm, minimum height=0.5cm] (R) at (0,0) {};

  \draw (R.north east)
      to[short dim arrow={label=$\ell$, label near end}] (R.south east);
\end{tikzpicture}
\end{codeexample}
  \end{key}

  \begin{key}{/tikz/dim arrow/label near middle}
  La clĂŠ |label near middle| permet de placer l'ĂŠtiquette donnant la dimension vers le milieu du chemin. 
  Dans ce cas, l'ĂŠtiquette n'est pas dĂŠcalĂŠe par rapport Ă&nbsp; la flĂ¨che (parce qu'il n'y a pas de superposition) ; cela peut ĂŞtre rĂŠtabli en spĂŠcifiant |/tikz/dim arrow/label style| explicitement.

\begin{codeexample}[]
\begin{tikzpicture}
  \node[rectangle, draw=black, fill=yellow!30, minimum width=1cm, minimum height=0.5cm] (R) at (0,0) {};

  \draw (R.north east)
      to[short dim arrow={label=$\ell$, label near middle}] (R.south east);
\end{tikzpicture}
\end{codeexample}
  \end{key}



  \begin{key}{/tikz/dim arrow/arrow length=\meta{length} (initially \pgfkeysvalueof{/tikz/dim arrow/arrow length})}
  La clĂŠ |arrow length| permet spĂŠcifier la taille \meta{length} des flĂ¨ches extĂŠrieures.
  \end{key}
\end{stylekey}

\begin{stylekey}{/tikz/short dim arrow'=\meta{sous-clĂŠs}}
  Le style |short dim arrow'| a le mĂŞme rĂ´le que |short dim arrow|, mais la valeur initiale de |/tikz/dim arrow/raise| est de |-0.5cm| au lieu de |0.5cm|.

  \begin{codeexample}[width=4cm]
\begin{tikzpicture}[use optics]
  \coordinate (a) at (0,0);
  \coordinate (b) at (1cm,0);
  \draw[red,mark=x, draw=none] plot coordinates {(a) (b)};
  \draw (a.center) to[short dim arrow, blue] (b.center);
  \draw (a.center) to[short dim arrow', red] (b.center);
\end{tikzpicture}  
  \end{codeexample}
\end{stylekey}

\section{Remerciements}

Je remercie les collĂ¨gues et amis qui ont essuyĂŠ les plĂ˘tres en utilisant les premiĂ¨res versions de cette bibliothĂ¨que, et en particulier les auteurs du livre \emph{Physique expĂŠrimentale}\footnote{\url{http://www.physique-experimentale.com/}} pour lequel la bibliothĂ¨que a ĂŠtĂŠ dĂŠveloppĂŠe.


\end{document}</pre></body></html>