#+TITLE: LaTeX Configuration for Tikz Figures :DRAWER: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+PROPERTY: header-args:latex+ :tangle config.tex #+PROPERTY: header-args:latex+ :exports code :END: * Packages #+begin_src latex \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage[french, english]{babel} % Last language is main language \usepackage{lmodern} % Latin Modern Font \usepackage{gensymb} % Generic symbols for both text and math mode \usepackage{standalone} % Used to generate standalone Tikz \usepackage{amsmath} % Main math Package \usepackage{mathtools} % Extension package to amsmath \usepackage{amsthm} % Typesetting theorems (AMS style) \usepackage{amsfonts} % More fonts from the AMS \usepackage{textcomp} % provide many text symbols \usepackage{steinmetz} % For phase symbol \usepackage{xstring} % Utils to manipulate strings \usepackage{etoolbox} % Add basic if/then \usepackage{esvect} % Beautyfull vectors \usepackage{graphicx} % Enhanced support for graphics \usepackage{grffile} % Used by matlab2tikz \usepackage{microtype} % typographic tuning \usepackage{setspace} % for line spacing, e.g. \onehalfspacing \usepackage{tabularx} % table features \usepackage{enumitem} % for simple list modifications \usepackage{booktabs} % better table support \usepackage{stackengine} % \usepackage[load-configurations=abbreviations]{siunitx} % SI units \sisetup{ locale = US, detect-all, range-phrase=--, range-units=single } #+end_src * Tikz related packages #+begin_src latex \usepackage{tikz} % Tikz \usepackage{tikzscale} % Used to scale Tikz graphics \usepackage{adjustbox} % Used to proper positioning of tikz pictures \usepackage{circuitikz} % Draw electronic circuits \usepackage{pgfpages} % Needed to use notes \usepackage{pgfplots} % Used to plot functions #+end_src * Tikz Libraries #+begin_src latex \usetikzlibrary{arrows} % Arrow tip library \usetikzlibrary{arrows.meta} % Add some arrows \usetikzlibrary{calc} % The library allows advanced Coordinate Calculations \usetikzlibrary{intersections} % calculate intersections of paths \usetikzlibrary{matrix} % \usetikzlibrary{patterns} % \usetikzlibrary{shapes} % Defines circle and rectangle \usetikzlibrary{shapes.geometric} % Use for the shape diamond and isosceles triangle \usetikzlibrary{snakes} % snake=coil and snake=zigzag using segment amplitude=10pt \usetikzlibrary{positioning} % Additional options for placing nodes \usetikzlibrary{3d} % Plot 3D shapes \usetikzlibrary{spy} % Creating a magnified area \usetikzlibrary{decorations.text} % Used to make text follows a curve \usetikzlibrary{decorations.pathmorphing} % deformation of a path \usetikzlibrary{decorations.markings} % Used for spring and damper \usetikzlibrary{babel} % A tiny library that make the interaction with the babel package easier \usetikzlibrary{plotmarks} % This library defines a number of plot marks \usetikzlibrary{fit} % Used to make rectangle as nodes by specifying two points \usetikzlibrary{backgrounds} % Used to put things under others #+end_src * PGF Plot libraries and config #+begin_src latex \usepgfplotslibrary{patchplots} \usepgfplotslibrary{groupplots} \pgfplotsset{compat=newest} \pgfplotsset{plot coordinates/math parser=false} #+end_src * Setup size of figures #+begin_src latex \newlength{\fheight} \newlength{\fwidth} \setlength{\fwidth}{85mm} \setlength{\fheight}{112mm} #+end_src * Setup Arrows style #+begin_src latex \tikzset{>=Stealth} % Setup default Linewidth \tikzset{every path/.style={line width=1pt}} #+end_src * Colors #+begin_src latex \usepackage{xcolor}% Color extension \definecolor{colorblack}{rgb}{0, 0, 0} \definecolor{colorblue}{rgb}{0, 0.4470, 0.7410} \definecolor{colorred}{rgb}{0.8500, 0.3250, 0.0980} \definecolor{coloryellow}{rgb}{0.9290, 0.6940, 0.1250} \definecolor{colorpurple}{rgb}{0.4940, 0.1840, 0.5560} \definecolor{colorgreen}{rgb}{0.4660, 0.6740, 0.1880} \definecolor{colorcyan}{rgb}{0.3010, 0.7450, 0.9330} \definecolor{colorbordeau}{rgb}{0.6350, 0.0780, 0.1840} % Main color \definecolor{maincolor}{RGB}{89, 9, 38} \definecolor{secondcolor}{RGB}{20, 9, 89} #+end_src * Control ** Blocks #+begin_src latex \tikzset{% block/.style n args={2}{% draw, fill=white, minimum width = #1, minimum height = #2, }, block/.default={1.2cm}{1.0cm} } #+end_src ** TODO Branches #+begin_src latex \tikzstyle{branch}=[fill,shape=circle,minimum size=4pt,inner sep=0pt] \tikzstyle{->top}=[-{Stealth[color=black, scale=0.8]}, draw=white, double=black, double distance=1pt, line width=1pt] \tikzstyle{<-top}=[{stealth[color=black, scale=0.8]}-, draw=white, double=black, double distance=1pt, line width=1pt] #+end_src ** TODO Hand Writen Style Usefull for schematic plots #+begin_src latex \tikzstyle{handwriten}=[decorate,decoration={random steps,amplitude=0.1pt,segment length=0.8pt}] #+end_src ** DAC #+begin_src latex \tikzset{% DAC/.style={% draw, signal, } } #+end_src ** ADC #+begin_src latex \tikzset{% ADC/.style={% draw, signal, signal to = west, } } #+end_src ** TODO Gain Maybe use =isosceles= instead of regular polygon? #+begin_src latex \tikzset{% gain right/.style={% draw, regular polygon, regular polygon sides = 3, inner sep = 2pt, shape border rotate=-90 }, gain left/.style={% draw, regular polygon, regular polygon sides = 3, inner sep = 2pt, shape border rotate=90 }, gain top/.style={% draw, regular polygon, regular polygon sides = 3, inner sep = 2pt, shape border rotate=0 }, gain bottom/.style={% draw, regular polygon, regular polygon sides = 3, inner sep = 2pt, shape border rotate=180 }, } #+end_src ** Add / Substract / Divide / Multiply block #+begin_src latex \tikzset{% Add block with Circled operations addc/.style n args={5}{% draw, fill=white, circle, outer sep = 0pt, inner sep = 0pt, minimum size = 2em, execute at begin node={\LARGE $#1$}, append after command={\pgfextra{\let\mainnode=\tikzlastnode} \ifx#2\empty\else node[draw, circle, outer sep=6pt, inner sep=0pt, above left] at (\mainnode.west) {$#2$}% \fi \ifx#3\empty\else node[draw, circle, outer sep=6pt, inner sep=0pt, above right] at (\mainnode.north) {$#3$}% \fi \ifx#4\empty\else node[draw, circle, outer sep=6pt, inner sep=0pt, below right] at (\mainnode.east) {$#4$}% \fi \ifx#5\empty\else node[draw, circle, outer sep=6pt, inner sep=0pt, below left] at (\mainnode.south) {$#5$}% \fi } }, addc/.default={+}{}{}{}{}, } #+end_src #+begin_src latex \tikzset{% Add Block addb/.style n args={5}{% draw, fill=white, circle, outer sep = 0pt, inner sep = 0pt, minimum size = 2em, execute at begin node={\LARGE $#1$}, append after command={\pgfextra{\let\mainnode=\tikzlastnode} \ifx#2\empty\else node[outer sep=2pt, inner sep=0pt, above left] at (\mainnode.west) {$#2$}% \fi \ifx#3\empty\else node[outer sep=2pt, inner sep=0pt, above right] at (\mainnode.north) {$#3$}% \fi \ifx#4\empty\else node[outer sep=2pt, inner sep=0pt, below right] at (\mainnode.east) {$#4$}% \fi \ifx#5\empty\else node[outer sep=2pt, inner sep=0pt, below left] at (\mainnode.south) {$#5$}% \fi } }, addb/.default={+}{}{}{}{}, } #+end_src * Plots ** Grid #+begin_src latex \pgfplotsset{grid style={black}} \pgfplotsset{major grid style={black!30!white}} \pgfplotsset{minor grid style={black!10!white}} \pgfplotsset{xmajorgrids} \pgfplotsset{ymajorgrids} #+end_src ** Lines #+begin_src latex \pgfplotsset{separate axis lines=false} % draw axis as rectangle and not as 4 lines \pgfplotsset{every outer x axis line/.append style={black}} \pgfplotsset{every outer y axis line/.append style={black}} \pgfplotsset{axis background/.style={fill=white}} \pgfplotsset{axis x line*=bottom} % solid line on the bottom with thin on the top \pgfplotsset{axis y line*=left} % solid line on the left with thin on the right #+end_src ** Ticks #+begin_src latex \pgfplotsset{every y tick label/.append style={font=\color{black}}} \pgfplotsset{every y tick/.append style={black}} \pgfplotsset{every x tick label/.append style={font=\color{black}}} \pgfplotsset{every x tick/.append style={black}} #+end_src ** Size If =scale only axis=false= (the default), pgfplots will try to produce the desired width including labels, titles and ticks. #+begin_src latex \pgfplotsset{scale only axis=true} #+end_src ** Label Used to align all of ylabel of one figure. #+begin_src latex \pgfplotsset{ylabel absolute} #+end_src ** Legend #+begin_src latex % https://tex.stackexchange.com/questions/54794/using-a-pgfplots-style-legend-in-a-plain-old-tikzpicture#54834 % argument #1: any options \newenvironment{customlegend}[1][]{% \begingroup % inits/clears the lists (which might be populated from previous % axes): \csname pgfplots@init@cleared@structures\endcsname \pgfplotsset{#1}% }{% % draws the legend: \csname pgfplots@createlegend\endcsname \endgroup }% % makes \addlegendimage available (typically only available within an % axis environment): \def\addlegendimage{\csname pgfplots@addlegendimage\endcsname} % definition to insert numbers % \pgfkeys{/pgfplots/number in legend/.style={% % /pgfplots/legend image code/.code={% % \node at (0.125,-0.0225){#1}; % <= changed x value % },% % }, % } \pgfplotsset{ every legend to name picture/.style={west} } #+end_src ** Upper and Lower bounds #+begin_src latex \tikzstyle{upperbound}=[line cap=round, postaction={decorate,draw,decoration={border, segment length=0.2cm, amplitude=0.3cm, angle=60}}] \tikzstyle{lowerbound}=[line cap=round, postaction={decorate,draw,decoration={border, segment length=0.2cm, amplitude=0.3cm, angle=-60}}] #+end_src And we add the corresdonding #+begin_src latex \pgfplotsset{ /pgfplots/upperbound/.style 1 args={ legend image code/.code={ \draw[##1, upperbound] plot coordinates { (0cm,0cm) (0.6cm,0cm) } } } } #+end_src ** Pole #+begin_src latex \tikzset{% pole/.style{% color=red, cross out, draw, inner sep=0pt, outer sep=0pt, minimum size=#1pt }, pole/.default={4} } #+end_src ** Zero #+begin_src latex \tikzset{% zero/.style{% color=red, circle, draw, inner sep=0pt, outer sep=0pt, minimum size=#1pt }, zero/.default={4} } #+end_src * Mechanical ** Spring #+begin_src latex \tikzset{% spring/.style={% thick, decoration={ zigzag, pre length = #1cm, post length = #1cm, segment length = 6 }, decorate }, spring/.default={0.2} } #+end_src ** Coil #+begin_src latex \tikzset{% coil/.style n args={2}{% thick, decoration={ coil, pre length = #1cm, post length = #2cm, segment length = 4 }, decorate }, coil/.default={0.3}{0.3} } #+end_src ** Damper #+begin_src latex \tikzset{% damper/.style n args={2}{% thick, decoration={markings, mark connection node=dmp, mark=at position 0.5 with { \node (dmp) [thick, inner sep = 0pt, transform shape, rotate =-90, minimum width = #1pt, minimum height = #2pt, draw=none] {}; \draw [thick] ($(dmp.north east)+(0.6*#2pt,0)$) -- (dmp.south east) -- (dmp.south west) -- ($(dmp.north west)+(0.6*#2pt,0)$); \draw [thick] ($(dmp.north)+(0,-0.3*#1pt)$) -- ($(dmp.north)+(0,0.3*#1pt)$); } }, decorate }, damper/.default={12}{3} } #+end_src ** Actuator #+begin_src latex \tikzset{% actuator/.style n args={2}{% thick, draw=none, decoration={ markings, mark connection node=my node, mark=at position .5 with { \node [draw, inner sep=0pt, minimum width=#1cm, minimum height=#2cm, transform shape, fill=white] (my node) {}; }, mark=at position .0 with { \draw[<-] (0, 0) -- (my node); }, mark=at position 1.0 with { \draw[<-] (0, 0) -- (my node); } }, decorate }, actuator/.default={0.5}{0.2} } #+end_src ** Ground #+begin_src latex \tikzset{% ground/.style n args={2}{% fill, pattern = north east lines, draw = none, anchor = north, minimum width = #1cm, minimum height = #2cm, append after command={ (\tikzlastnode.north west) edge (\tikzlastnode.north east) } }, ground/.default={2.5}{0.3} } #+end_src ** Force Sensor #+begin_src latex \tikzset{% forcesensor/.style n args={2}{% rectangle, outer sep=0pt, inner sep=0pt, draw=black, fill=white!60!black, anchor=south, minimum width =#1cm, minimum height=#2cm, append after command={ [every edge/.append style={ thick, black, }] (\tikzlastnode.north west) edge (\tikzlastnode.south east) (\tikzlastnode.north east) edge (\tikzlastnode.south west) } }, forcesensor/.default={2.0}{0.5} } #+end_src ** Inertial Sensor #+begin_src latex \tikzset{% inertialsensor/.style={% rectangle, outer sep=0pt, inner sep=0pt, draw=black, fill=white!60!black, anchor=south east, minimum size=#1cm, append after command={ [every edge/.append style={ thick, black, }] (\tikzlastnode.north west) edge (\tikzlastnode.south east) (\tikzlastnode.north east) edge (\tikzlastnode.south west) } }, inertialsensor/.default={0.3} } #+end_src ** Axis Rotator #+begin_src latex \newcommand{\AxisRotator}[1][rotate=0]{% \tikz [x=0.1cm,y=0.30cm,-stealth,#1] \draw (0,0) arc (-150:150:1 and 1);% } #+end_src ** Cross #+begin_src latex \tikzstyle{cross}=[path picture={ \draw[black] (path picture bounding box.south east) -- (path picture bounding box.north west) (path picture bounding box.south west) -- (path picture bounding box.north east); }] #+end_src ** Piezoelectric actuator #+begin_src latex \tikzset{% piezo/.style n args={3}{% draw, rectangle, minimum width = #1cm, minimum height = #2cm, fill=blue!10!white, anchor=center, append after command={ [every edge/.append style={ thick, black, }] \foreach \i in {1,...,#3}{ (${\i/(1+#3)}*(\tikzlastnode.north west)+{(1+#3-\i)/(1+#3)}*(\tikzlastnode.south west)+0.1*(#1,0)$) edge (${\i/(1+#3)}*(\tikzlastnode.north east)+{(1+#3-\i)/(1+#3)}*(\tikzlastnode.south east)-0.1*(#1,0)$) } } }, piezo/.default={2}{4}{10} } #+end_src ** Voice coil #+begin_src latex \def\voicecoil#1#2#3{ % ====================== % Parameters % ====================== \def\voicecoilw{#1} % Total Width \def\voicecoilh{#2} % Total Height \def\magnetw{\voicecoilw} % Width of the magnet \def\magneth{\voicecoilh/1.4} % Height of the magnet \def\magnetwb{0.15*\magnetw} % Width of the borders of the magnet \def\magnetmw{0.15*\magnetw} % Width of the middle part of the magnet \def\magnetwg{0.5*\magnetw} % Width of the gap of the magnet \def\magnethl{\magnetwb} % Height of the low part of the magnet \def\magnetmh{0.15*\magneth} % Height of the middle part of the magnet \def\magnethg{0.2*\magneth} % Height of the gap of the magnet % ====================== \begin{scope}[shift={(0.5*\voicecoilw, 0.5*\voicecoilh)}, rotate=#3, shift={(0, -0.5*\voicecoilh)}] % ====================== % Magnet % ====================== \draw[fill=white] (0, 0) -| ++(0.5*\magnetw, \magneth) -| ++(-0.5*\magnetw+0.5*\magnetwg, -\magnethg) -| (0.5*\magnetw-\magnetwb, \magnethl) -| (-0.5*\magnetw+\magnetwb, \magneth-\magnethg) -| (-0.5*\magnetwg, \magneth) -| (-0.5*\magnetw, 0) -- (cycle); \begin{scope}[shift={(0, \magnethl)}] \draw[fill=red] (-0.5*\magnetmw, 0) rectangle (0.5*\magnetmw, \magnetmh); \draw[fill=blue] (-0.5*\magnetmw, \magnetmh) rectangle (0.5*\magnetmw, 2*\magnetmh); % Top conductive Magnet \draw[fill=white] (-0.5*\magnetmw, 2*\magnetmh) -| (0.5*\magnetmw, -\magnethl+\magneth-\magnethg) -| ++(0.1, \magnethg) -| ++(-0.2-\magnetmw, -\magnethg) -| (-0.5*\magnetmw, \magnetmh); \end{scope} % ====================== % ====================== % Coil % ====================== \pgfmathsetmacro{\coilwidth}{0.5*0.5*\magnetmw+0.5*0.1+0.25*\magnetwg}% \draw[] ( \coilwidth, 0.5*\magneth) -- ++(0, 0.7*\magneth); \draw[] (-\coilwidth, 0.5*\magneth) -- ++(0, 0.7*\magneth); % Point on the coil \foreach \x in {0,1,...,9} { \node[circle,inner sep=0.6pt,fill] at ( \coilwidth, \x*0.7*\magneth/10+0.5*\magneth); \node[circle,inner sep=0.6pt,fill] at (-\coilwidth, \x*0.7*\magneth/10+0.5*\magneth); } \draw[fill=white] (-0.5*\magnetw, 1.2*\magneth) rectangle ++(\magnetw, \magnethg); % ====================== % ====================== % Coordinates % ====================== % Force \coordinate[] (vc_force) at (0, \magneth-0.5*\magnethg); % Coil \coordinate[] (vc_coil) at (0, \voicecoilh); % Magnet \coordinate[] (vc_magnet) at (0, 0); % Coil Wires \coordinate[] (vc_wire_one) at ( \coilwidth, 1.2*\magneth); \coordinate[] (vc_wire_two) at (-\coilwidth, 1.2*\magneth); % ====================== \end{scope} } #+end_src * Optics #+begin_src latex \tikzset{% ->-/.style={ decoration={ markings, mark = at position #1 with {\arrow{>} } }, postaction={decorate} } } \tikzset{% -<-/.style={ decoration={ markings, mark = at position #1 with {\arrow{<} } }, postaction={decorate} } } #+end_src * Misc #+begin_src latex \tikzset{% labelc/.style= {% draw, fill=white, shape=circle, inner sep=2pt, outer sep=6pt, } } #+end_src