From 33361783e2f0682b96e1bc6145f9348eb39b25ab Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 6 Feb 2020 20:52:44 +0000 Subject: euclideangeometry (6feb20) git-svn-id: svn://tug.org/texlive/trunk@53699 c570f23f-e606-0410-a88d-b1316a301751 --- .../latex/euclideangeometry/euclideangeometry.dtx | 1588 ++++++++++++++++++++ 1 file changed, 1588 insertions(+) create mode 100644 Master/texmf-dist/source/latex/euclideangeometry/euclideangeometry.dtx (limited to 'Master/texmf-dist/source/latex') diff --git a/Master/texmf-dist/source/latex/euclideangeometry/euclideangeometry.dtx b/Master/texmf-dist/source/latex/euclideangeometry/euclideangeometry.dtx new file mode 100644 index 00000000000..6078fe5cfae --- /dev/null +++ b/Master/texmf-dist/source/latex/euclideangeometry/euclideangeometry.dtx @@ -0,0 +1,1588 @@ +% \iffalse +% !TEX encoding = UTF-8 Unicode +%<*internal> +\begingroup +\input docstrip.tex +\keepsilent +\preamble + + Copyright (C) 2020 Claudio Beccari all rights reserved. + License information appended + +\endpreamble + +\postamble + +Distributable under the LaTeX Project Public License, +version 1.3c or higher (your choice). The latest version of +this license is at: http://www.latex-project.org/lppl.txt + +This work is "maintained" + +This work consists of files: +1) euclideangeometry.dtx, and the derived files euclideangeometry.sty + and euclideangeometry.pdf, +2) euclideangeometry-man.tex and the derived file euclideangeometry-man.pdf, +3) the auxiliary derived file README.txt + +\endpostamble +\askforoverwritefalse + +\generate{\file{euclideangeometry.sty}{\from{euclideangeometry.dtx}{package}}} +\generate{\file{README.txt}{\from{euclideangeometry.dtx}{readme}}} + +\def\tmpa{plain} +\ifx\tmpa\fmtname\endgroup\expandafter\bye\fi +\endgroup +% +% \fi +% +% \iffalse +%<*driver> +\ProvidesFile{euclideangeometry.dtx}% +% +%\NeedsTeXFormat{LaTeX2e}[2019/01/01] +%\ProvidesPackage{euclideangeometry}% +%File README.txt for package euclideangeometry +%<*package|readme> + [2020-02-02 v.0.1.2 Extension package for curve2e] +% +%<*driver> +\documentclass{ltxdoc}\errorcontextlines=100 +\hfuzz 10pt +\usepackage[utf8]{inputenc} +\usepackage{lmodern,textcomp} +\usepackage{mflogo} +\usepackage{multicol,amsmath,fancyvrb,graphicx,verbatim} +\usepackage{etoolbox,enumitem,xspace,xcolor,euclideangeometry} +\providecommand*\diff{\mathop{}\!\mathrm{d}} +\renewcommand\meta[1]{{\normalfont\textlangle\textit{#1}\textrangle}} +\renewcommand\marg[1]{\texttt{\{\meta{#1}\}}} +\providecommand\Marg{} +\renewcommand*\Marg[1]{\texttt{\{#1\}}} +\providecommand\oarg{} +\renewcommand*\oarg[1]{\texttt{[\meta{#1}]}} +\providecommand\Oarg{} +\renewcommand*\Oarg[1]{\texttt{[#1]}} +\providecommand\aarg{} +\renewcommand*\aarg[1]{\texttt{<\meta{#1}>}} +\providecommand\Aarg{} +\renewcommand*\Aarg[1]{\texttt{<#1>}} +\providecommand\parg{} +\renewcommand*\parg[1]{\texttt{(\meta{#1})}} +\providecommand\Parg{} +\renewcommand*\Parg[1]{\texttt{(#1)}} +\providecommand\pack{} +\renewcommand*\pack[1]{{\textsf{#1}}} +\providecommand\opt{} +\renewcommand*\opt[1]{{\normalfont\textsl{#1}}}\let\opz\opt +\providecommand\env{} +\renewcommand*\env[1]{{\normalfont\textit{\bfseries#1}}}\let\amb\env + +\providecommand\TB{\mbox{\normalfont\slshape TUGboat}\xspace} + +\AfterEndPreamble{% +\apptocmd{\TeX}{{}\xspace}{}{} +\apptocmd{\LaTeX}{{}\xspace}{}{}} + + +\begin{document}\errorcontextlines=100 +\GetFileInfo{euclideangeometry.dtx} +\title{The \textsf{euclideangeometry} package} +\author{Claudio Beccari\\[1ex]\texttt{claudio dot beccari at gmail dot com}} +\date{Version \fileversion~--~Last revised \filedate.} +\maketitle +\columnseprule=0.4pt +\begin{multicols}{2} + \tableofcontents + \end{multicols} + \DocInput{euclideangeometry.dtx} +\end{document} +% +% \fi +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section*{Preface} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% This file contains the documented code of \pack{euclideangeometry}. +% The user manual source file \file{euclideangeometry-man.tex} and the +% readable document is \file{euclideangeometry.pdf}; it should already be +% installed with your updated complete \TeX system installation. + +% Please refer to the user manual before using this package. +% \CheckSum{1557} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%\StopEventually{} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +%\iffalse +%<*package> +%\fi +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{The code} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Checking the date of a sufficiently recent \texttt{curve2e} +% package} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% This package has been already identified by the commands extracted +% by the |docstrip| package, during the |.dtx| file compilation. +% Therefore we start providing the |\GetFileInfo| in case the package +% is used outside a “documented \TeX\ source”; we just provide the +% definition from the |ltxdoc| class code. +% \begin{macrocode} +\makeatletter +\providecommand\GetFileInfo{} +\renewcommand\GetFileInfo[1]{% + \def\filename{#1}% + \def\@tempb##1 v.##2 ##3\relax##4\relax{% + \def\filedate{##1}\def\fileversion{##2}\def\fileinfo{##3}}% + \edef\@tempa{\csname ver@#1\endcsname}% + \expandafter\@tempb\@tempa\relax? ? \relax\relax} +% \end{macrocode} +% +% But in order to make the file date comparison for loading a suitable +% version of |curve2e| we need to strip away its date dash signs, +% so we define the |\cleanfiledate| macro that defines a |\FileDate| macro +% with a purely numerical string, suitable for numerical comparisons; +% if the fetched class file is so old that the date is not in the ISO +% format (for example with slashes instead of dashes) the macro fails +% and the interpreter comparison algorithm produces \TeX\ error messages. +% \begin{macrocode} +\def\cleanfiledate#1-#2-#3!{\unless\ifx#3\empty +\edef\FileDate{#1#2#3}\else\unless\ifx#2\empty +\edef\FileDate{#1#2}\else\edef\FileDate{#1}\fi\fi} +% \end{macrocode} +% In any case, if the test checks that the |curve2e| file date is too old; +% it warns the user with an emphasised error message on the console, +% loading this |euclideangeometry| package is stopped and the whole +% job aborts. The emphasised error message appears like this: +%\begin{flushleft}\ttfamily\obeylines +%************************************************************* +%Package curve2e too old +%Be sure that your TeX installation is complete and up to date +%************************************************************* +%Input of euclideangeometry is stopped and job aborted +%************************************************************* +%\end{flushleft} +% This message should be sufficiently strong in order to avoid using +% this package with a vintage version of \TeXLive or Mik\TeX. +% \begin{macrocode} +\RequirePackage{curve2e} +\GetFileInfo{curve2e.sty} +\expandafter\cleanfiledate\filedate! + +\ifnum\FileDate<20200118 +\typeout{*************************************************************} +\typeout{Package curve2e too old} +\typeout{Be sure that your TeX installation is complete and up to date} +\typeout{*************************************************************} +\typeout{Input of euclideangeometry stopped and job aborted} +\typeout{*************************************************************} +\expandafter\@@end\fi + +% \end{macrocode} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Service macros} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% The following macros are useful for typesetting the manual; but they +% might be useful also for the final user; they mostly define commands +% that classify the various entities of the programming language with +% (generally different) font families, series and shapes; but the commands +% that receive the “name of an argument” enclose this name between math +% angle brackets. +% \begin{macrocode} +\providecommand\file{} +\renewcommand*\file[1]{{\normalfont\texttt{#1}}} +\providecommand\prog{} +\renewcommand*\prog[1]{{\normalfont\texttt{#1}}} +\newcommand*\conta[1]{\texttt{\slshape#1}} +\providecommand\cs{} +\renewcommand\cs[1]{{\normalfont\texttt{\char92#1}}} +\providecommand\meta{} +\renewcommand*\meta[1]{{\normalfont$\langle$\textit{#1}$\rangle$}} +\providecommand\marg{} +\renewcommand*\marg[1]{{\ttfamily \char123\meta{#1}\char125}} +\newcommand*\Marg[1]{{\normalfont\ttfamily\{#1\}}}\let\Arg\Marg +\providecommand\oarg{} +\renewcommand*\oarg[1]{{\ttfamily[\meta{#1}]}} +\newcommand*\Oarg[1]{{\ttfamily[#1]}} +\newcommand*\aarg[1]{{\ttfamily{<\meta{#1}>}}} +\newcommand*\Aarg[1]{{\ttfamily<#1>}} +\newcommand*\Bambiente[1]{\texttt{\char92begin\{#1\}}} +\newcommand*\Eambiente[1]{\texttt{\char92end\{#1\}}} +\newcommand*\garg[1]{\texttt{(\splitgarg#1,!)}}\let\parg\garg +\newcommand*\Garg[1]{\texttt{(#1)}}\let\Parg\Garg + \def\secgarg#1,{#1} + \def\splitgarg#1,#2!{% + \ifstrequal{#2}{}{\meta{#1}}{\meta{#1},\meta{\secgarg#2}}} +\providecommand\pack{} +\renewcommand*\pack[1]{{\normalfont\textsf{#1}}} +\providecommand\opt{} +\renewcommand*\opt[1]{{\normalfont\textsl{#1}}}\let\opz\opt +\providecommand\env{} +\renewcommand*\env[1]{{\normalfont\textit{\bfseries#1}}}\let\amb\env +% \end{macrocode} +% The next commands are defined in the |babel-italian| module for |babel|; +% |\ped| introduces a subscript in math mode, but the command may be used +% also in text mode; the same holds true also for |\ap| that introduces +% a superscript. |\unit| is a shorthand for attaching the units of measure +% in math upright roman font, with an unbreakable space between the measure +% and its units; |\sigla| is the Italian equivalent of |\acronym|, that +% avoids any conflict with other packages; |\iu| (alias|\gei|) typesets +% the imaginary unit in roman font according to the ISO regulations; +% |\eu| defines the roman type “e”, the Neper number, as a math operator; +% we all know that “e” is not an operator, but it is used very often as +% the base of an exponential, therefore, in math mode it is better to +% leave the necessary space before and after it, without any space between +% it and its exponent. +% \begin{macrocode} +\providecommand*\ped[1]{\ensuremath{_{\mathrm{#1}}}} +\providecommand*\ap[1]{\ensuremath{^{\mathrm{#1}}}} +\providecommand*\unit[1]{\ensuremath{\,\mathrm{#1}}} +\providecommand*\sigla[1]{\textsc{\lowercase{#1}}} +\providecommand*\iu{\ensuremath{\mathrm{i}}}\let\gei\iu +\providecommand*\eu{\ensuremath{\mathop{\mathrm{e}}\nolimits}} +% \end{macrocode} +% +% The next code is used to typeset the logo of \Ars logo, and the logo +% of \LyX; the other command |\GuIT| typesets equally well the \GuIT logo; +% if necessary the |\RequirePackage| macro loads the |xspace| package; +% therefore these macros do not require any special terminator of the +% control sequence name, because the |\xspace| command takes care of the +% necessary space; this command avoids inserting any space if macros are +% followed by any reasonable sign different form a space, such as +% punctuation marks, parentheses, quotation marks, and so on. +% +% \begin{macrocode} +\DeclareRobustCommand*{\Ars}{% + \textsf{\lower -.48ex\hbox{\rotatebox{-20}{A}}\kern -.3em{rs}}% + \kern -.05em\TeX\unskip\kern -.17em\lower -.357ex\hbox{nica}\xspace} + +\DeclareRobustCommand*\LyX{% + L\kern-0.2em\raisebox{-0.5ex}{Y}\kern-0.2em{X}\xspace} + +\definecolor{verdeguit}{rgb}{0, 0.40, 0} +\RequirePackage{iftex} +\def\GuIT{\mbox{\color{verdeguit}\def\I{\textcolor{black}{I}}% +\ifPDFTeX + \usefont{T1}{lmr}{m}{sc} +\else + \usefont{TU}{lmr}{m}{sc} +\fi +g\raisebox{-0.715ex}{\kern-0.26em u}\kern-0.13em\I\kern-0.14em t}\xspace} +% \end{macrocode} +% The following macros |\usecs| and |\whilenum| allow the use the internal +% \LaTeX control sequence names that contain a |@| sign. They are not so +% useful in this package, but they might be useful for the end user. +% \begin{macrocode} +\providecommand*\usecs[1]{\csname#1\endcsname} +\providecommand*\whilenum[2]{\usecs{@whilenum}#1\do{#2}} +% \end{macrocode} +% Accordingly the following two macros, and their English aliases, allow +% to delay the output of a (possibly floating) object to a page of the +% desired parity; they are not infallible, because the the |\afterpage| +% command defined by package |afterpage| (loaded if necessary) operates +% on the typesetting program output routine and the object to be delayed +% might be lost on the way, or might get delayed too much; these facts +% take place very seldom, but are not impossible, the solution is to move +% back several paragraphs the command with is argument. +% \begin{macrocode} +\RequirePackage{afterpage} +\providecommand\supaginapari[1]{% + \afterpage{% + \ifodd\value{page}\expandafter\@firstoftwo + \else\expandafter\@secondoftwo + \fi{\supaginapari{#1}}{#1} + } +}\let\onevenpage\supaginapari +\providecommand\supaginadispari[1]{% + \afterpage{% + \ifodd\value{page}\expandafter\@secondoftwo + \else\expandafter\@firstoftwo + \fi{\supaginadispari{#1}}{#1} + } +}\let\onoddpage\supaginadispari +% \end{macrocode} +% The following \LaTeX related logos are provided so as to make them +% coherent with the smart final space we have discussed above. The real +% difference is that it is necessary to use tue |etoolbox| facilities; +% therefore the package is (possibly) loaded. With it we add at the end +% of their original definition the |\xspace| command. But what is the +% “original definition”? Of course |\TeX| and |\LaTeX| macros are defined +% within the \LaTeX kernel, but the user might have loaded other packages +% that have redefined them; therefore these patches are applied only at +% the preamble end, so if other definitions were provided by other +% packages loaded in the preamble, such redefinitions are patched. +% Only |\XeLaTeX| is completely redefined, because the other existing +% definitions work correctly only with OpenType fonts; with Type~1 fonts +% and oblique fonts (italics, slanted, etc.) the reversed “E” generally +% is inclined in the wrong direction; by rotating it, instead of +% reflecting it, the “E” might not be the best, but al least slants in +% the right direction. +% \begin{macrocode} +\RequirePackage{etoolbox} +\AfterEndPreamble{% +\apptocmd{\TeX}{{}\xspace}{}{} +\apptocmd{\LaTeX}{{}\xspace}{}{}} + +\DeclareRobustCommand*\TeXLive{\TeX\ Live\xspace} +\DeclareRobustCommand*\MiKTeX{MiK\TeX} +\DeclareRobustCommand*\MacTeX{Mac\TeX} +\DeclareRobustCommand*\pdfLaTeX{pdf\/\LaTeX} +\DeclareRobustCommand*\LuaLaTeX{Lua\LaTeX} +\DeclareRobustCommand*\XeLaTeX{X\ifdim\fontdimen1\font=0pt\kern-0.15em\fi +\lower.5ex\hbox{\rotatebox[origin=c]{180}{E}}% +\ifdim\fontdimen1\font=0pt\kern-0.15em\else\kern-0.275em\fi +\LaTeX} +\DeclareRobustCommand*\TikZ{Ti\emph{k}Z\xspace} +\DeclareRobustCommand*\TUGboat{\textsl{TUG\-boat}\xspace} +% \end{macrocode} +% The following command is useful to output two column floats when +% typesetting in |twocolumn| mode. +% \begin{macrocode} +\renewcommand\dbltopfraction{1.} +% \end{macrocode} +% This apparently useless command becomes useful to separate a font +% selection command or the |\item| command from the following text so +% as to allow hyphenation in what follows; it is just a very innocent +% dirty trick, but it works. +% \begin{macrocode} +\def\hz{\hskip0pt} +% \end{macrocode} +% Here we have a command that allows to display some framed code; it is +% usable also to display the syntax of some commands; and when doing this +% action the full range of service macros at the beginning of this section +% play the best of their role. The English aliases for the opening and +% closing environments are also provided. Attention: do not use |\\| +% commands to specify new lines, unless you want to produce empty/blank +% lines; within this environment the source code “end of line” characters +% are not treated as spaces, but are actually executed according to their +% name. +% \begin{macrocode} +\newenvironment{ttsintassi}{\begin{lrbox}{0} +\minipage{\dimexpr\linewidth-2\fboxrule-2\fboxsep}\ttfamily\obeylines}% +{\endminipage\end{lrbox}\center\fbox{\box0}\endcenter} +\let\ttsyntax\ttsintassi \let\endttsyntax\endttsintassi +% \end{macrocode} +% The following macro probably will migrate to |curve2e|; meanwhile +% this redefinition is useful in order to save some input and to make +% a more flexible macro. We used it virtually in every picture we +% inserted in the user manual of this package; of course the user does +% not need to have any drawing superimposed onto a red grid. Actually +% the grid is useful while drawing; when the image is complete, the +% grid command may be deleted or its line commented out. The purpose +% of this macro is to avoid the |\put| command to place the grid; and +% since its reference point in the original definition is arbitrary, +% the connection with real coordinates is very small and might become +% confusing or of little help. +% Now the syntax is the following: +%\begin{ttsyntax} +%\cs(GraphGrid)\parg{reference point or dimensions}\parg{overall dimensions} +%\end{ttsyntax} +% where the second argument is optional; if it is missing, the first +% argument contains the \meta{overall dimensions}, otherwise it +% contains the lower left corner coordinate that represent the +% \meta{reference point} that an internal |\put| command will use +% to place the grid; if no \meta{reference point} is specified, the +% reference point is \texttt{0,0}, and the grid is |\put| with its +% lower left corner in the origin of the |picture| coordinates. +% \begin{macrocode} + +\unless\ifcsname Gr@phGrid\endcsname +\let\originalGraphGrid\GraphGrid +\RenewDocumentCommand\GraphGrid{r() d()}{% +\IfValueTF{#2}{\put(#1){\originalGraphGrid(#2)}}% + {\put(0,0){\originalGraphGrid(#1)}}}\fi +% \end{macrocode} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%\subsection{Labelling} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% While doing any graphical geometrical drawing it is necessary to label +% points, lines, angles and other such items. Non measurable labels should +% be in upright sans serif font, according to the ISO regulations, but here +% we are dealing witt point identified by macros the contain their +% (cartesian or polar) coordinates that very often are both labels +% and math variables. +% +% Here we provide a versatile macro that can do several things. Its name +% is |\Pbox| and it produces a box containing the label in math format. By +% default the point label is typeset with the math font variant produced +% by command |\mathsf|, but the macro is sufficiently versatile to allow +% other settings; It accepts several optional arguments, therefore it syntax is particular: +%\begin{ttsyntax} +%\cs{Pbox}\parg{coordinates}\oarg{alignment}\marg{label}\oarg{diameter}\meta{$\star$}\aarg{angle} +%\end{ttsyntax} +% where \meta{coordinates} are the coordinates where to possibly set a +% black dot with the specified \meta{diameter}; in any case it is the +% reference point of the \meta{label}; the \meta{alignment} is formed by +% the usual letters \texttt{t, b, c, l, r} that can be paired in a +% coherent way (for example the couple \texttt{tb} is evidently +% incoherent, as well as \texttt{lr}), but in absence of this optional +% specification, the couple \texttt{cc} is assumed; most often than +% not, the label position becomes such that when the user reviews the +% document drafts, s/he understands immediately that s/he forgot to specify +% some reasonable \meta{alignment} codes. Think of the \meta{alignment} +% letters as the position of the reference point with respect to the +% the \meta{label} optical center. The optional \meta{angle} argument +% produces a rotation of the whole label by that angle; it may be used +% in several circumstances, especially when the label is just text, to +% produce, for example, a sideways legend. It is useful also when the +% labels are produced within a rotated box, in order to counterrotate them. +% +% The optional asterisk draws a frame around the \emph{label}. Notice that +% the separator between the visible or the invisible frame and the box +% contents varies according the the fact the the \meta{alignment} +% specification contains just one or two letter codes; this is useful, +% because the diagonal position of the label should be optically equal +% to the gap that exists between the reference point and the \meta{label} +% box. +% +% If the \meta{diameter} is zero, no dot is drawn, the whole \meta{label} +% is typeset with the |\mathit| math font; otherwise only the first symbol +% of a math expression si typeset in sans serif. The presence of subscripts +% makes the labels appear more distant from their reference point; the same +% is true when math symbols, even without subscripts, are used, because +% of the oblique nature of the math letters alphabet. +% +% If some text has to be printed as a label, it suffices to surround it +% with dollar signs, that switch back to text mode when the default mode +% is the math one. With this kind of textual labels it might be convenient +% to use the optional asterisk to frame the text. +% \begin{macrocode} +\providecommand\Pbox{} +\RenewDocumentCommand\Pbox{D(){0,0} O{cc} m O{0.5ex} s D<>{0}}{% +\put(#1){\rotatebox{#6}{\makebox(0,0){% +\dimendef\Dim=2566\relax +\settowidth\Dim{#2}% +\edef\Rapp{\fpeval{\Dim/{1ex}}}% +\fptest{\Rapp > 1.5}{\fboxsep=0.5ex}{\fboxsep=0.75ex}% +\IfBooleanTF{#5}{\fboxrule=0.4pt}{\fboxrule=0pt}% +\fptest{#4 = 0sp}% + {\makebox(0,0)[#2]{\fbox{$\relax#3\relax$}}}% + {\edef\Diam{\fpeval{(#4)/\unitlength}}% + \makebox(0,0){\circle*{\Diam}}% + \makebox(0,0)[#2]{\fbox{$\relax\mathsf#3\relax$}}% + }}}% +}\ignorespaces} +% \end{macrocode} +% The following command, to be used always within a group, or a +% environment or inside a box, works only with piecewise continuously +% scalable font collection, such as, for example, the Latin Modern +% fonts, or with continuously scalable fonts, such as, for example, +% the Times ones. They let the operator select, for the scope of the +% command ,any size, even fractional so as to fine adjust the text +% width in the space allowed for it; it is particularly useful with +% the monospaced fonts, that forbid hyphenation, and therefore cannot +% be adjusted to the current line width. +% \begin{macrocode} +\DeclareRobustCommand\setfontsize[2][1.2]{% + \linespread{#1}\fontsize{#2}{#2}\selectfont} +% \end{macrocode} +% With OpenType fonts there should not be any problems even with math +% fonts; with Type~1 fonts the only scalable fonts I know of, are the +% LibertinusMath fonts, usable through the LibertinusT1math package, are +% also the only ones that have 8~bit encoded math fonts (256 +% glyph fonts), while the standard default Type~1 math fonts are just +% 7~bit encoded (128 glyphs fonts). +% +% Another useful labelling command is |Zbox|; this command is an +% evolution of a command that I been using for years in several +% documents of mine. It uses some general text, not necessarily +% connected to a particular point of the |picture| environment, +% as a legend; It can draw short text as a simple horizontal box, +% and longer texts as a vertical box of specified width and height +% +% Is syntax is the following: +%\begin{ttsyntax} +%\cs{Zbox}\parg{position}\parg(dimensions)\oarg{alignment}\marg{text} +%\end{ttsyntax} +% where \meta{position} is where the reference point of the box has +% to be put in the picture; \meta{dimensions} are optional; if not +% specified, the box is a horizontal one, and it is as wide as its +% contents; if it is specified, it must be a comma separated list +% of two integer or fractional numbers that are the width and the +% height of the box; if the height is specified as zero, the width +% specifies a horizontal box of that width; \meta{alignment} is optional +% and is formed by one or two coherent letter codes from the usual set +% \texttt{t, b, c, l, r}; if the \meta{alignment} is absent, the +% default alignment letters are \texttt{bl}, i.e. the box reference +% point is the bottom left corner; \meta{text} contains general text, +% even containing some math. +% \begin{macrocode} + +\def\EUGsplitArgs(#1,#2)#3#4{\edef#3{#1}\edef#4{#2}} + +\providecommand\Zbox{} +\RenewDocumentCommand\Zbox{R(){0,0} D(){0,0} O{bl} m}{% +\EUGsplitArgs(#2)\ZboxX\ZboxY % separa la x e la y della scatola +\fboxsep=2\unitlength +\ifnum\ZboxX=\csuse{z@} + \def\ZTesto{\fbox{#4}}% +\else + \ifnum\ZboxY=\csuse{z@} + \def\ZTesto{\fbox{\parbox{\ZboxX\unitlength}{#4}}}% + \else + \def\ZTesto{% + \setbox2560=\hbox{\fbox{% + \parbox[c][\ZboxY\unitlength][c]{\ZboxX\unitlength}{#4}}}% + \dimen2560=\dimexpr(\ht2560 +\dp2560)/2\relax + \ht2560=\dimen2560\relax + \dp2560=\dimen2560\relax + \box2560% + }% + \fi +\fi +\put(#1){\makebox(0,0)[#3]{\ZTesto}}\ignorespaces} +% \end{macrocode} + +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%\subsection{The \texttt{Example} environment} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Another very useful facility is the |Esempio| environment; +% it has an English alias |Example|, but we suggest to use the Italian +% name, because it is safer in order to avoid conflicts with other packages; +% this environment is very handy to typeset a stretch of code side by +% side its typeset result obtained by executing it; it has advantages and +% disadvantages, though. A similar environment was used to show the +% examples in the \emph{The \LaTeX Companion}; another similar environment +% may be used from the |tcolorbox| package (by T.F.~Sturm, read its +% documentation by using the terminal command |texdoc tcolorbox|) +% environment |tcolorbox| and using the keyword |sidebyside| among the +% options; package |fancyvrb| also offers a similar environment. +% The critical disadvantage is that that you cannot use any of these +% environments, not even this |Esempio| one, when typesetting a +% documented \TeX file, such as the one you are reading now. In facts +% the |.dtx| file has all text lines that start with a comment character, +% and the code parts, to be output to a |.sty|, or |.cls|, or whatever +% other file used by the \TeX system to format documents, are explicitly +% marked with the special delimiters \verb*|% \begin{macrocode}| and +% \verb*|% \end{macrocode}|. +% +% Therefore with those packages and with this |Esempio| environment +% the code you want to show appears with all lines with a |%| at the +% beginning. This certainly does not help the description of a software +% and this is the very reason why this package has a separate +% |euclideangeometry-man| manual typeset with the |article| class. +% +% Nevertheless this environment makes use of the facilities of the +% |verbatim| environment. +% +% \begin{macrocode} +\RequirePackage{verbatim} +\newwrite\example@out +\ProvideDocumentEnvironment{Esempio}{s O{\normalsize} D(){0.40}} +{\par\addvspace{3.0ex plus 0.8ex minus 0.5ex}\vskip -\parskip +\dimendef\Wboxu=2570 \dimendef\Wboxd=2572 +\Wboxu=#3\textwidth\relax +\Wboxd=\dimexpr\linewidth-\columnsep-\Wboxu\relax +\begingroup +\@bsphack +\immediate\openout\example@out\jobname-temp.tex +\let\do\@makeother\dospecials\catcode`\^^M\active +\def\verbatim@processline{% + \immediate\write\example@out{\the\verbatim@line}}% +\verbatim@start\relax}% +{\immediate\closeout\example@out\@esphack\endgroup +\begin{minipage}{\textwidth}% +\IfBooleanTF{#1}{\begin{minipage}{\textwidth}}{\begin{minipage}{\Wboxu}}% +#2\relax +\verbatiminput{\jobname-temp.tex} +\end{minipage}% +\IfBooleanTF{#1}{\par\bigskip}{\hfill}% +\IfBooleanTF{#1}{\begin{minipage}{\textwidth}}{\begin{minipage}{\Wboxd}}% +\raggedleft +\input{\jobname-temp} +\end{minipage} +\end{minipage}\par +%\medskip +%\par\addvspace{3.0ex plus 0.8ex minus 0.5ex}\vskip -\parskip +} +% \end{macrocode} + +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Service macros for ellipses} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% The |\ellisse| has a control sequence name in Italian; it differs for +% just one letter from the name |ellipse| English name, but we cannot use +% the latter one because it may conflict with other packages loaded by +% the user; actually this command and the next one are just shortcuts +% for executing more general commands with specific sets of arguments. +% For details and syntax, please refer yourself to +% section~\ref{ssec:ellissi} +% \begin{macrocode} + +\NewDocumentCommand\ellisse{ s m m}{% +\IfBooleanTF{#1}% + {\let\fillstroke\fillpath}% + {\let\fillstroke\strokepath}% +\Sellisse{#2}{#3}% +} + +\NewDocumentCommand\Xellisse{ s D(){0,0} O{0} m m O{} o}{% +\IfBooleanTF{#1}% + {\XSellisse*(#2)[#3]{#4}{#5}[#6][#7]}% + {\XSellisse(#2)[#3]{#4}{#5}[#6][#7]}% +} +% \end{macrocode} +% +% We do not know if the following macro |\polyvector| may be useful for +% euclidean geometry constructions, but it may be useful in block +% diagrams; it is simply a polyline where the last segment is a geometrical +% vector. As in polyline the number of recursions is done until the last +% specified coordinate pair; recognising that it is the last one, instead +% of drawing a segment, the macro draws a vector. +% +% \begin{macrocode} + +\def\polyvector(#1){\roundcap\def\EUGpreviouspoint{#1}\EUGpolyvector} +\def\EUGpolyvector(#1){% +\@ifnextchar({% + \segment(\EUGpreviouspoint)(#1)\def\EUGpreviouspoint{#1}\EUGpolyvector}% + {\VECTOR(\EUGpreviouspoint)(#1)}% +} +% \end{macrocode} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Processing lines and segments} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% The next macros are functional for the geometric constructions we are +% going to make: finding the intersection of lines or segments, +% finding the lengths and arguments of segments, directions, distances, +% distance of a point from a line or a segment, the symmetrical +% point of a another one specified with respect to a given center of +% symmetry; the axes of segments, the solutions of the relationship +% between the semi axes of an ellipse and the semi focal distance, +% and so on. +% +% Most of these commands have delimited arguments; the delimiters +% may be the usual parentheses, but they may be keywords; many +% commands contain the keyword \texttt{to}, not necessarily the +% last one; the arguments before such keyword may be entered as +% ordered comma separated numerical couples, or comma separated +% macros the containing scalar values; or they may be macros that +% contain the ordered couples representing vectors or directions; +% they all may be in cartesian or polar form. Remember that such +% ordered couples are complex numbers, representable by +% vectors applied to the origin of the axes; therefore sometimes it is +% necessary that the underlying commands execute some vector +% differences so as to work with generic vectors. +% +% On the opposite the output values, i.e. the argument after that +% \texttt{to} keyword, should be tokens that can receive a definition, +% in general macros, to which the user should assign a mnemonic name; +% s/he should use such macros for further computations or for drawing +% commands. +% +% The first and principal command is |\IntersectionOfLines| and +% it has the following syntax: +%\begin{ttsyntax} +%\cs{IntersectionOfLines}\parg{point1}\parg{dir1}and\parg{point2}\parg{dir2}to\meta{crossing} +%\end{ttsyntax} +% where \meta{point1} and \meta{dir1} are respectively a point of the +% first line and its \emph{direction}, not a second point, but the +% \emph{direction} — it is important to stress this point; similarly +% for the second line; the output is stored in +% the macro that identifies the \meta{crossing} point. The directions +% do not need to be expressed with unit vectors, but the lines must not +% be parallel or anti parallel (equal directions or differing by +% $180^\circ$); the macro contains a test that checks this anomalous +% situation because an intersection at infinity or too far away +% ($2^{14}-1$ typographical points, approximately 5,758\,m) is of no +% interest; in case, no warning message is issued, the result is +% put to \texttt{0,0}, and the remaining computations become nonsense. +% It is a very unusual situation and I never encountered~it; +% nevertheless\dots + +% \begin{macrocode} + +\def\IntersectionOfLines(#1)(#2)and(#3)(#4)to#5{\bgroup +\def\IntPu{#1}\def\Uu{#2}\def\IntPd{#3}\def\Ud{#4}% + \DirOfVect\Uu to\Du + \DirOfVect\Ud to\Dd + \XpartOfVect\Du to \a \YpartOfVect\Du to \b + \XpartOfVect\Dd to \c \YpartOfVect\Dd to \d + \XpartOfVect\IntPu to \xu \YpartOfVect\IntPu to \yu + \XpartOfVect\IntPd to \xd \YpartOfVect\IntPd to \yd + \edef\Den{\fpeval{-(\a*\d-\b*\c)}}% + \fptest{abs(\Den)<1e-5}{% almost vanishing determinant + \def#5{0,0}% + }{% Determinant OK + \edef\Numx{\fpeval{(\c*(\b*\xu-\a*\yu)-\a*(\d*\xd-\c*\yd))/\Den}}% + \edef\Numy{\fpeval{(\d*(\b*\xu-\a*\yu)-\b*(\d*\xd-\c*\yd))/\Den}}% + \CopyVect\Numx,\Numy to\Paux + \edef\x{\egroup\noexpand\edef\noexpand#5{\Paux}}\x\ignorespaces}} +% \end{macrocode} +% +% The |IntersectionOfSegments| macro is similar but in input it +% contains the end points of two segments: internally it uses +% |\IntersectionOfLines| and to do so it has to determine the +% directions of both segments. The syntax is the following: +%\begin{ttsyntax} +%\cs{IntersectionOfSegments}\parg{point11}\parg{point12}and\parg{point21}\parg{point22} +%\qquad to\meta{crossing} +%\end{ttsyntax} +% The \meta{crossing} point might fall outside one or both segments. +% It is up to the users to find out if the result is meaningful +% or nonsense. Two non parallel lines are infinitely long in both +% directions and any \meta{crossing} point is acceptable; with +% segments the situation might become nonsense. +% \begin{macrocode} + +\def\IntersectionOfSegments(#1)(#2)and(#3)(#4)to#5{% +\SubVect#1from#2to\IoSvectu \DirOfVect\IoSvectu to\DirIoSVecu +\SubVect#3from#4to\IoSvectd \DirOfVect\IoSvectd to\DirIoSVecd +\IntersectionOfLines(#1)(\DirIoSVecu)and(#3)(\DirIoSVecd)to#5\ignorespaces} +% \end{macrocode} +% +% An application of the above intersections is formed by the next +% two macros; they find the axes of a couple of sides of a triangle +% and use their base point and direction to identify two lines the +% intersection of which is the circumcenter; the distance of one +% base point from the circumcenter is the radius of the circumcircle +% that can be drawn with the usual macros. We have to describe +% the macros |\AxisOf| and |CircleWithCenter| and we will do it in +% a little while. Meanwhile the syntax of the whole macro is the +% following: +%\begin{ttsyntax} +%\cs{ThreePointCircle}\meta{$\star$}\parg{vetex1}\parg{vertex2}\parg{vertex3} +%\end{ttsyntax} +% where the three vertices are the three points where the circle +% must pass, but they identify also a triangle. Its side axes +% intersect in one point that by construction is at the same +% distance from the three vertices, therefore it is the center of +% the circle that passes through the three vertices. A sub product +% of the computations is the macro |\C| that contains the center +% coordinates. If the optional asterisk is used the whole drawing +% is executed, while if it is missing, only the |\C| macro remains +% available but the user is responsible to save/copy its value +% into another macro; for this reason another macro should be more +% easy to use; its syntax is the following: +%\begin{ttsyntax} +%\cs{ThreePointCircleCenter}\parg{vetex1}\parg{vertex2}\parg{vertex3} +%\qquad to\meta{center} +%\end{ttsyntax} +% where the vertices have the same meaning, but\meta{center} is +% the user chosen macro that contains the center coordinates. +% +% \begin{macrocode} + +\NewDocumentCommand\ThreePointCircle{s d() d() d()}{% +\AxisOf#2and#3to\Mu\Du \AxisOf#2and#4to\Md\Dd +\IntersectionOfLines(\Mu)(\Du)and(\Md)(\Dd)to\C +\SubVect#2from\C to\R +\IfBooleanTF{#1}{\CircleWithCenter\C Radius\R}{}\ignorespaces} + +\NewDocumentCommand\ThreePointCircleCenter{d() d() d() m}{% +\ThreePointCircle(#1)(#2)(#3)\CopyVect\C to#4} +% \end{macrocode} +% +% There are some useful commands that help creating |picture| +% diagrams in an easier way; for example one of the above described +% commands internally uses |\CircleWithCenter|. It is well known +% that the native |picture| command |\circle| requires the +% specification of the diameter but many |euclideangeometry| +% commands already get the distance of two points, or the magnitude +% of a segment, or similar objects that may be used as a radius, rather +% than the diameter; why should we not have macros that simultaneously +% compute the require diameter and draw the circle. Here there are two +% such macros; they are similar to one another but their names differ in +% capitalisation, but also in the way they use the available input +% information. The syntax is the following: +%\begin{ttsyntax} +%\cs{CircleWithCenter}\meta{center} Radius\meta{Radius} +%\cs{Circlewithcenter}\meta{center} radius\meta{radius} +%\end{ttsyntax} +% where in both cases \meta{center} is a vector/ordered couple +% that points to the circle center. On the contrary \meta{Radius} +% is a vector obtained through previous calculations, while +% \meta{radius} is a scalar containing a previously calculated length. +% \begin{macrocode} +\def\CircleWithCenter#1Radius#2{\put(#1){\ModOfVect#2to\CWR +\circle{\fpeval{2*\CWR}}}\ignorespaces} +% +\def\Circlewithcenter#1radius#2{\put(#1){\circle{\fpeval{2*abs(#2)}}}% +\ignorespaces} +% \end{macrocode} +% +% As announced, here we have a macro to compute the axis of a segment; +% given two points $P_1$ and $P_2$, for example the end points of a +% segment, or better the end point of the vector that goes from +% $P_1$ to $P_2$, the macro determines the segment middle point and +% a second point the lays on the perpendicular at a distance equal to half +% the first two points distance; this second point lays at the left of +% vector $P_2-P_1$, therefore it is important to select the right initial +% vector, in order to have the second axis point on the desired side. +%\begin{ttsyntax} +%\cs{AxisOf}\meta{P1} and\meta{P2} to\meta{Axis1}\meta{Axis2} +%\end{ttsyntax} +% Macros |\SegmentCenter| and |\MiddlePointOf| are alias to one another; +% their syntax is: +%\begin{ttsyntax} +%\cs{SegmentCenter}\parg{P1}\parg{P2}to\meta{center} +%\cs{MiddlePointOf}\parg{P1}\parg{P2}to\meta{center} +%\end{ttsyntax} +% \meta{P1}, \meta{p2} and \meta{center} are all vectors. +% \begin{macrocode} + +\def\AxisOf#1and#2to#3#4{% +\SubVect#1from#2to\Base \ScaleVect\Base by0.5to\Base +\AddVect\Base and#1to#3 \MultVect\Base by0,1to#4} + +\def\SegmentCenter(#1)(#2)to#3{\AddVect#1and#2to\Segm +\ScaleVect\Segm by0.5to#3\ignorespaces} + +\let\MiddlePointOf\SegmentCenter +% \end{macrocode} +% +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Triangle special points} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Here we have the macros to find the special points on a triangle +% side that are the “foot” of special lines from one vertex to the +% opposite side. We already described the circumcircle and the +% circumcenter, but that is a separate case, because the circumcenter +% is not the intersection of special lines from one vertex to the +% opposite base. The special lines we are interested in here are +% the height, the median, and the bisector +% The macros have the same aspect |\Triangle...Base|, where the dots +% are replaced with each of the (capitalised) special line names. +% Their syntaxes are therefore very similar: +%\begin{ttsyntax} +%\cs{TriangleMedianBase}\meta{vertex} on\meta{base1} and\meta{base2} to\meta{M} +%\cs{TriangleHeightBase}\meta{vertex} on\meta{base1} and\meta{base2} to\meta{H} +%\cs{TrinagleBisectorBase}\meta{vertex} on\meta{base1} and\meta{base2} to\meta{B} +%\end{ttsyntax} +% where \meta{vertex} contains one of the vertices coordinates, and +% \meta{base1} and \meta{base2} are the end points of the side +% opposite to that triangle vertex; \meta{M}, meta{H}, and \meta{B} +% are the intersections of these special lines from the \meta{vertex} +% to the opposite side; in order, they are the foot of the median, +% the foot of the height; the foot of the bisector. The construction +% of the median foot \meta{M} is trivial because this foot is the base +% center; the construction of the height foot is a little more +% complicated, because it is necessary to find the exact direction +% of the perpendicular from the vertex to the base in order to +% find the intersection \meta{H}; the construction of the bisector +% base implies finding the exact direction of the two sides starting at the +% \meta{vertex}, and taking the mean direction, which is trivial if +% polar coordinates are used; at this point the bisector line is completely +% determined and the intersection with the base line \meta{B} is +% easily obtained. +% \begin{macrocode} + +\def\TriangleMedianBase#1on#2and#3to#4{% +\SubVect#1from#2to\TMBu \SubVect#1from#3to\TMBd +\SubVect\TMBu from\TMBd to\Base +\ScaleVect\Base by0.5to\TMBm\AddVect#2and\TMBm to#4\ignorespaces} +% +\def\TriangleHeightBase#1on#2and#3to#4{% +\SubVect#2from#3to\Base +\ArgOfVect\Base to\Ang \CopyVect\fpeval{\Ang+90}:1 to\Perp +\IntersectionOfLines(#1)(\Perp)and(#2)(\Base)to#4\ignorespaces} +% +\def\TriangleBisectorBase#1on#2and#3to#4{% +\SubVect#2from#1to\Luno \SubVect#3from#1to\Ldue +\SubVect#2from#3to\Base +\ArgOfVect\Luno to\Arguno \ArgOfVect\Ldue to\Argdue +\edef\ArgBis{\fpeval{(\Arguno+\Argdue)/2}}% +\CopyVect \ArgBis:1to \Bisect +\IntersectionOfLines(#2)(\Base)and(#1)(\Bisect)to#4\ignorespaces} +% \end{macrocode} +% Having defined the previous macros, it becomes very easy to create +% the macros to find the\emph{barycenter}, the \emph{orthocenter}, +% the\emph{incenter}; for the \emph{circumcenter} and the +% \emph{circumcircle} we have already solved the question with the +% |\ThreePointCircleCenter| and the |ThreePointCircle| macros; for +% homogeneity, we create here their aliases with the same form as +% the new “center” macros. Actually, for the “circle” macros, +% once the center is known, there is no problem with the circumcircle, +% while for the incircle it suffices a macro to determine the distance +% of the incenter from one of the triangle sides; such a macro is going to +% be defined in a little while; it is more general than simply to +% determine the radius of the incircle. +% \begin{macrocode} + +\let\TriangleCircumcenter\ThreePointCircleCenter +\let\TriangleCircummcircle\ThreePointCircle +% \end{macrocode} +% +% The other “center” macros are the following; they all consist +% in finding two of the specific triangle lines, and finding their +% intersection. Therefore for the barycenter we intersect two +% median lines; for the orthocenter we intersect two height lines; +% for the incenter we intersect two bisector lines; +% \begin{macrocode} + +\def\TriangleBarycenter(#1)(#2)(#3)to#4{% +\TriangleMedianBase#1on#2and#3to\Pa +\TriangleMedianBase#2on#3and#1to\Pb +\DistanceAndDirOfVect#1minus\Pa to\ModPa and\AngPa +\DistanceAndDirOfVect#2minus\Pb to\ModPb and\AngPb +\IntersectionOfLines(#1)(\AngPa)and(#2)(\AngPb)to#4} + +\def\TriangleOrthocenter(#1)(#2)(#3)to#4{% +\TriangleHeightBase#1on#2and#3to\Pa +\TriangleHeightBase#2on#3and#1to\Pb +\DistanceAndDirOfVect#1minus\Pa to\ModPa and\AngPa +\DistanceAndDirOfVect#2minus\Pb to\ModPb and\AngPb +\IntersectionOfLines(#1)(\AngPa)and(#2)(\AngPb)to#4} + +\def\TriangleIncenter(#1)(#2)(#3)to#4{% +\TriangleBisectorBase#1on#2and#3to\Pa +\TriangleBisectorBase#2on#3and#1to\Pb +\DistanceAndDirOfVect#1minus\Pa to\ModPa and\AngPa +\DistanceAndDirOfVect#2minus\Pb to\ModPb and\AngPb +\IntersectionOfLines(#1)(\AngPa)and(#2)(\AngPb)to#4} +% \end{macrocode} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%\subsection{Other specific service macros}\label{ssec:ellissi} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% And here it comes the general macro to determine the distance +% of a point from a segment or from a line that contains that +% segment; it may be used for determining the radius of the +% incenter, but it is going to be used also for other purposes. +% Its syntax is the following: +%\begin{ttsyntax} +%\cs{DistanceOfPoint}\meta{point} from\parg{P1}\parg{P2}to\meta{distance} +%\end{ttsyntax} +% where \meta{point} is a generic point; \meta{P1} and \meta{P2} +% are a segment end points, or two generic points on a line; +% \meta{distance} is the macro that receives the computed scalar +% distance value. +% \begin{macrocode} + +\def\DistanceOfPoint#1from(#2)(#3)to#4{% +\SubVect#2from#3to\Base \MultVect\Base by0,1to\AB +\IntersectionOfLines(#1)(\AB)and(#2)(\Base)to\D +\SubVect#1from\D to\D +\ModOfVect\D to#4} +% \end{macrocode} +% The following macros are specific to solve other little geometrical +% problems that arise when creating more complicated constructions. +% +% The |\AxisFromAxisAndFocus| is an unhappy name that describes +% the solution of an ellipse relationship between the ellipse axes +% and the focal distance +%\begin{equation} a^2 = b^2 + c^2\label{equ:axes-foci}\end{equation} +% This relation exists between the “semi” values, but it works equally +% well with the full values. Evidently $a$ is the largest quantity and +% refers to the main ellipse axis, the one that passes through the two +% foci; $b$ refers to the other shorter ellipse axis and $c$ refers to +% the foci; $b$ and $c$ are smaller than $a$, but there is no specific +% relationship among these two quantities It goes by itself that +% these statements apply to a veritable ellipse, not to a circle, +% that is the special case where $b=a$ and $c=0$. +% +% Since to solve the above equation we have one unknown and two +% known data, but we do not know what they represent, we have to +% assume some relationship exist between the known data; therefore +% if $a$ is known it must be entered as the first macro argument; +% otherwise $a$ is the unknown and the first Argument has to be the +% smaller one among $b$ and $c$. Since $b$ and$c$ may come from other +% computation the user has a dilemma: which is the smaller one? +% But this is a wrong approach; of course if the user knows which is the +% smaller, s/he can use the macro by entering the data in the proper +% order; but the user is determining the main axis, therefore it better +% that s/he uses directly the second macro |\MainAxisFromAxisAndFocus| +% that directly computes $a$ disregarding the order with which $b$ +% and $c$ are entered; the macro name suggests to enter $b$ first +% and $c$ second, but it is irrelevant thanks to the sum properties. +% Summarising: +%\begin{itemize}[noitemsep] +%\item if the main axis is known use |\AxisFromAxisAndFocus| by +% entering the main axis as the first argument; otherwise +%\item ~ +% \begin{itemize} +% \item if it is known which is smaller among $b$ and $c$, it is +% possible to use |\AxisFromAxisAndFocus| by entering the smaller +% one as the first argument; otherwise +% \item determine the main axis by using |\MainAxisFromAxisAndFocus| +% \end{itemize} +%\end{itemize} +% Their syntaxes of these two commands are basically the following: +%\begin{ttsyntax} +%\cs{AxisFromAxisAndFocus}\meta{main axis} and\meta{axis or focus} to\meta{focus or axis} +%\cs{MainAxisFromAxisAndFocus}\meta{axis or focus} and\meta{focus or axis} to\meta{main axis} +%\end{ttsyntax} +% but it is possible to enter the data in a different way with the +% first command; the described syntax is the suggested one. +% Evidently \meta{axis or focus} and \meta{focus or axis} imply +% that if you specify the focus in one of the two, you have to +% specify the axis in the other one. +% \begin{macrocode} + +\def\AxisFromAxisAndFocus#1and#2to#3{% +\fptest{abs(#1)>abs(#2)}% + {\edef#3{\fpeval{sqrt(#1**2-#2**2)}}}% + {\edef#3{\fpeval{sqrt(#2**2+#1**2)}}}} + +\def\MainAxisFromAxisAndFocus#1and#2to#3{% +\edef#3{\fpeval{sqrt(#2**2+#1**2)}}} +% \end{macrocode} +% The following macros allow to determine some scalar values relative +% to segments; in the second one the order of the segment end points is +% important, because the computed argument refers to the vector $P_2 - P_1$. +% Their syntaxes are the following: +%\begin{ttsyntax} +%\cs{SegmentLength}\parg{P1}\parg{P2}to\meta{length} +%\cs{SegmentArg}\parg{P1}\parg{P2}to\meta{argument} +%\end{ttsyntax} +% Both \meta{length} and \meta{argument} are macros that contain +% scalar quantities; the argument is in the range +% $-180^\circ <\Phi \leq +180^\circ$. +% \begin{macrocode} + +\def\SegmentLength(#1)(#2)to#3{\SubVect#1from#2to\Segm +\ModOfVect\Segm to#3} + +\def\SegmentArg(#1)(#2)to#3{\SubVect#1from#2to\Segm +\GetCoord(\Segm)\SegmX\SegmY\edef#3{\fpeval{atand(\SegmY,\SegmX)}}% +\ignorespaces} +% \end{macrocode} +% +% In the following sections we need some transformations, in +% particular the affine shear one. The macros we define here are +% not for general use, but are specific for the purpose of this package. +% +% The fist macro shears a segment, or better a vector that goes +% from point $P_1$ to point $P_2$ with a horizontal shear +% factor/angle $\alpha$; the origin of the vector does not vary +% and remains $P_1$ but the arrow tip of the vector is moved +% according to the shear factor; in practice this shearing macro +% is valid only for vectors that start from any point laying on +% the $x$ axis. The shear factor $\alpha$ is the angle of the +% \emph{clock wise} rotation vector operator by which the vertical +% coordinate lines get rotated with respect to their original position. +% The syntax is the following: +%\begin{ttsyntax} +%\cs{ShearVect}\parg{P1}\parg{P2}by\meta{shear} to\meta{vector} +%\end{ttsyntax} +% where \meta{P1} and \meta{P2} are the initial and final points of the +% vector to be sheared with the \meta{shear} angle, and the result is put +% in the output \meta{vector} +% \begin{macrocode} + +\def\ShearVect(#1)(#2)by#3to#4{% +\SubVect#1from#2to\AUX +\GetCoord(\AUX)\Aux\Auy +\edef\Aux{\fpeval{\Aux + #3*\Auy}}% +\edef\Auy{\fpeval{\Auy}}% +\AddVect\Aux,\Auy and#1to#4\ignorespaces} + +% \end{macrocode} +% Again we have another different |\ScaleVector| macro that takes in input +% the starting and ending points of a vector, and scales the vector +% independently of the initial point. +% \begin{macrocode} + +\def\ScaleVector(#1)(#2)by#3to#4{% +% Scala per il fattore #3 il vettore da #1 a #2 +\SubVect#1from#2to\AUX +\ScaleVect\AUX by#3to\AUX +\AddVect\AUX and#1to#4\ignorespaces} +% \end{macrocode} +% +% The following macro to draw a possibly sheared ellipse appears +% complicated; but in reality it is not much different from a +% “normal” ellipse drawing command. In oder to do the whole work +% the ellipse center is set in the origin of the axes, therefore +% it is not altered by the shearing process; everything else is +% horizontally sheared by the shear angle $\alpha$. In particular the +% 12~nodes and control point that are required by the Bézier +% splines that draw the four ellipse quarters. It is this multitude +% of shearing commands that makes the macro mach longer and apparently +% complicated. +% The syntax is the following: +%\begin{ttsyntax} +%\cs{Sellisse}\meta{$\star$}\marg{h-axis}\marg{v-axis}\oarg{shear} +% \end{ttsyntax} +% where the optional asterisk is used to mark and label the Bézier +% spline nodes and the control points of the possibly sheared ellipse; +% without the asterisk the ellipse is drawn without any “decoration”; +% the optional \meta{shear} is as usual the angle of the sheared +% vertical coordinate lines; its default value is zero. +% \begin{macrocode} +% +\NewDocumentCommand\Sellisse{s m m O{0}}{\bgroup +\CopyVect#2,#3to\Ptr \ScaleVect\Ptr by-1to\Pbl +\CopyVect#2,-#3to\Pbr \ScaleVect\Pbr by-1to\Ptl +\edef\Ys{\fpeval{tand{#4}}}% +\edef\K{\fpeval{4*(sqrt(2)-1)/3}}% +% +\ShearVect(0,0)(0,#3)by\Ys to\Pmt +\ShearVect(0,0)(0,-#3)by\Ys to\Pmb +\ShearVect(0,0)(#2,0)by\Ys to\Pmr +\ShearVect(0,0)(-#2,0)by\Ys to\Pml +% +\ShearVect(\Pmr)(\Ptr)by\Ys to\Ptr +\ShearVect(\Pml)(\Ptl)by\Ys to\Ptl +\ShearVect(\Pmr)(\Pbr)by\Ys to\Pbr +\ShearVect(\Pml)(\Pbl)by\Ys to\Pbl +% +\IfBooleanTF{#1}{\Pbox(\Ptr)[bl]{P_{tr}}\Pbox(\Pbl)[tr]{P_{bl}}% +\Pbox(\Pbr)[tl]{P_{br}}\Pbox(\Ptl)[br]{P_{tl}}% +\polygon(\Pbr)(\Ptr)(\Ptl)(\Pbl)}{}% +% +\ScaleVector(\Pmr)(\Ptr)by\K to\Crt +\ScaleVector(\Pmr)(\Pbr)by\K to\Crb +\ScaleVector(\Pml)(\Ptl)by\K to\Clt +\ScaleVector(\Pml)(\Pbl)by\K to\Clb +\ScaleVector(\Pmt)(\Ptr)by\K to\Ctr +\ScaleVector(\Pmt)(\Ptl)by\K to\Ctl +\ScaleVector(\Pmb)(\Pbr)by\K to\Cbr +\ScaleVector(\Pmb)(\Pbl)by\K to\Cbl +% +\IfBooleanTF{#1}{% + \Pbox(\Crt)[l]{C_{rt}}\Pbox(\Crb)[l]{C_{rb}} + \Pbox(\Clt)[r]{C_{lt}}\Pbox(\Clb)[r]{C_{lb}} + \Pbox(\Ctr)[b]{C_{tr}}\Pbox(\Ctl)[b]{C_{tl}} + \Pbox(\Cbr)[t]{C_{br}}\Pbox(\Cbl)[t]{C_{bl}} +% +\Pbox(\Pmr)[l]{P_{mr}}\Pbox(\Pmt)[b]{P_{mt}}% +\Pbox(\Pml)[r]{P_{ml}}\Pbox(\Pmb)[t]{P_{mb}}% +% +\polygon(\Pbr)(\Ptr)(\Ptl)(\Pbl)\thicklines}{}% +% +\moveto(\Pmr) +\curveto(\Crt)(\Ctr)(\Pmt) +\curveto(\Ctl)(\Clt)(\Pml) +\curveto(\Clb)(\Cbl)(\Pmb) +\curveto(\Cbr)(\Crb)(\Pmr) +\fillstroke +\egroup} + +% \end{macrocode} +% This user macro is used to call the |\Sellisse| macro with +% the desired parameters, but also to act with it on order +% to fill or stroke the ellipse contour, and to select some +% settings such as the contour line thickness, or the color +% of the ellipse contour or interior. +% the syntax is the following: +%\begin{ttsyntax} +%\cs{XSellisse}\meta{$\star$1}\parg{center}\oarg{angle}\aarg{shear}\marg{h-axis}\marg{v axis}\meta{$\star$2}\oarg{settings1}\oarg{settings2} +%\end{ttsyntax} +% where there are two optional asterisks, \meta{$\star$1} and +% \meta{$\star$2}; the first one controls the coloring of the ellipse: +% if present the interior is filled, if absent the contour is stroked; the +% second one controls the way a possibly sheared ellipse appears: +% if present, the construction is shown, if absent only the final result +% is shown; \meta{center} is optional: if present, the ellipse center is +% specified; if absent, its center is at the origin of the picture axes; +% \meta{angle} is optional with default value zero: if absent, +% the ellipse is not rotated and the \meta{h-axis} remains horizontal, +% while the \meta{v-axis} remains vertical, while if present and with a +% non vanishing value, the ellipse is rotated counterclockwise +% the amount specified, and, of course, if the value is negative, +% the rotation is clockwise. The optional parameter \meta{shear}, +% if present, shears the ellipse paralle the \meta{h-axis} direction; +% the \meta{settings1} and \meta{settings2} operate as described +% for command \cs{Xellisse}. +% \begin{macrocode} + +\NewDocumentCommand\XSellisse{ s D(){0,0} O{0} D<>{0} m m s O{} o }% + {\IfBooleanTF#1{\let\fillstroke\fillpath}% + {\let\fillstroke\strokepath}% + \put(#2){\rotatebox{#3}{#8\relax + \IfBooleanTF{#7}{\Sellisse*{#5}{#6}[#4]}% + {\Sellisse{#5}{#6}[#4]}% + \IfValueTF{#9}{\let\fillstroke\strokepath + #9\Sellisse{#5}{#7}[#4]}{}}}% + \ignorespaces} +% \end{macrocode} +% +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Regular polygons and special ellipses} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% We finally arrive to more complex macros used to create special +% polygons and special ellipses. +% +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsubsection{Regular polygons} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Regular polygons are not that special; it is possible to draw them +% by using the |\multiput| or |\xmultiput| commands, but a single +% command that does everything by itself with more built in +% functionalities is much handier. The new command |\RegPolygon| +% has the following syntax: +%\begin{ttsyntax} +%\cs{RegPoligon}\meta{$\star$}\parg{center}\marg{radius}\marg{number}\oarg{angle}\aarg{settings} +%\end{ttsyntax} +% where \meta{$\star$} is an optional asterisk; its presence means +% that the polygon interior is filled, instead of the polygon +% contour being stroked; the \meta{center} specification of the +% polygon is optional; if it is omitted, the polygon center goes +% to the origin of the |picture| coordinates; \meta{radius} is the +% mandatory radius of the circumscribed circle, or, in other words, +% the distance of each polygon vertex form the \meta{center}; the +% mandatory \meta{number} is an integer that specifies the number of +% polygon sides; the first vertex that is being drawn by this +% command, has an angle of zero degrees with respect to the +% \meta{center}; if a different initial \meta{angle} different from +% zero is desired, it is specified through this optional argument; +% possibly the angle bracketed optional \meta{setting} parameter +% may be used to specify, for example, the line thickness for the +% contour, and/or the color for the polygon contour or interior. +% See the documentation \file{euclideangeometry-man.pdf} for more +% information and usage examples. +% \begin{macrocode} + +\NewDocumentCommand\RegPolygon{s D(){0,0} m m O{0} D<>{\relax} }{{% +\countdef\I=258 \I=0 +\CopyVect#5:#3to\P +\CopyVect\fpeval{360/#4}:1to\R +\put(#2){#6\relax + \moveto(\P)\fpdowhile{\I < #4}% + {\MultVect\P by\R to\P%\GetCoord(\P)\X\Y + \lineto(\P)\advance\I by 1}% + \IfBooleanTF{#1}% + {\fillpath}{#6\strokepath}}}\ignorespaces} +%%%%%%%%% +\def\DirOfVect#1to#2{\GetCoord(#1)\t@X\t@Y +\ModOfVect#1to\@tempa +\unless\ifdim\@tempa\p@=\z@ + \DividE\t@X by\@tempa to\t@X + \DividE\t@Y by\@tempa to\t@Y +\fi\MakeVectorFrom\t@X\t@Y to#2\ignorespaces}% +% \end{macrocode} +% +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsubsection{The Steiner ellipse} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% The construction of the Steiner ellipse is very peculiar; it is +% almost intuitive that any triangle has infinitely many internal +% tangent ellipses; therefore it is necessary to state some other +% constraints to find one specific ellipse out from this unlimited set. +% +% One such ellipse is the Steiner one, obtained by adding the +% constraint that the ellipse be tangent to the median points +% of the triangle sides. But one thing is the definition, and +% another totally different one is to find the parameters of +% such an ellipse; and working with ruler and compass, it is +% necessary to find a procedure to draw such an ellipse. +% +% The construction described here and implemented with the +% |SteinerEllipse| macro is based on the following steps, each +% one requiring the use of some of the commands and/or +% transformations described in the previous sections. +%\begin{enumerate}[noitemsep] +%^^A +%\item Given a generic triangle (the coordinates of its three +% vertices) it is not necessary, but it is clearer to explain, +% if the triangle is shifted and rotated so as to have one of +% its sides horizontal, and the third vertex in the upper part +% of the |picture| drawing. So we first perform the initial +% shift and rotation and memorise the parameters of this +% transformation so that, at the end of the procedure, we can +% put back the triangle (and its Steiner ellipse) in its +% original position. Let us call this shifted and rotated triangle +% with the symbol $T_0$. +%^^A +%\item We transform $T_0$ with an affine shear transformation into an +% isosceles triangle $T_1$ that has the same base and the same +% height as $T_0$. We memorise the shear “angle” so as to proceed +% to an inverse transformation when the following steps are completed: +% let be $\alpha$ this shear angle; geometrically it represents the +% angle of the sheared vertical coordinate lines with respect +% to the original vertical position.\label{enum:shear} +%^^A +%\item With another affine vertical scaling transformation we transform $T_1$ into an equilateral triangle $T_2$; the ratio of the vertical +% transformation equals the ratio between the $T_2$ to the +% $T_1$ heights; we memorise this ratio for the reverse transformation +% at the end of the procedure.\label{enum:ratio} +%^^A +%\item The Steiner ellipse of the equilateral triangle $T_2$ is its +% incircle. We are almost done; we just have to proceed to the +% inverse transformations; getting back from $T_2$ to $T_1$ first implies +% transforming the incircle of $T_2$ into an ellipse with its +% vertical axis scaled by the inverse ratio memorised in +% step~\ref{enum:ratio}. +%^^A +%\item The second inverse transformation by the shear angle is easy +% with the passage from $T_1$ to $T_0$, but it would be more difficult +% for transforming the ellipse into the sheared ellipse. We have already +% defined the |\Sellipse| and the |\XSellipse| macros that may take +% care of the ellipse shear transformation; we already memorised the +% shear angle in step~\ref{enum:shear}, therefore the whole procedure, +% except for putting back the triangle, is almost done. +%^^A +%\item Eventually we perform the last shifting and rotating transformation +% and the whole construction is completed. +%^^A +%\end{enumerate} +% +% The new macro Steiner ellipse has therefore the following syntax: +%\begin{ttsyntax} +%\cs{SteinerEllipse}\meta{$\star$}\parg{P1}\parg{P2}\parg{P3}\oarg{diameter} +%\end{ttsyntax} +% where \meta{P1}, \meta{P2}, \meta{P3} are the vertices of the +% triangle; \meta{$\star$} is an optional asterisk; without it +% the maro draws only the final result, that contains only the +% given triangle and its Steiner ellipse; on the opposite, if the asterisk +% is used the whole construction from $T_0$ to its Steiner ellipse +% is drawn; the labelling of points is done with little dots of +% the default \meta{diameter} or a specified value; by default it is a 1\,pt +% diameter, but sometimes it would be better to use a slightly +% larger value (remembering that 1\,mm — about three points — +% is already too much). +% Please refer to the documentation file \file{euclideangeometry-man.pdf} +% for usage examples and suggestions. +% \begin{macrocode} +% + +\NewDocumentCommand\SteinerEllipse{s d() d() d() O{1}}{\bgroup +% +\IfBooleanTF{#1}{}{\put(#2)}{% + \CopyVect0,0to\Pu + \SubVect#2from#3to\Pd + \SubVect#2from#4to\Pt + \ModAndAngleOfVect\Pd to\M and\Rot + \MultVect\Pd by-\Rot:1 to\Pd \MultVect\Pt by-\Rot:1 to\Pt + \IfBooleanTF{#1}{}{\rotatebox{\Rot}}{\makebox(0,0)[bl]{% + \Pbox(\Pu)[r]{P_1}[#5]<-\Rot>\Pbox(\Pd)[t]{P_2}[#5]<-\Rot> + \Pbox(\Pt)[b]{P_3}[#5]<-\Rot>% + \polygon(\Pu)(\Pd)(\Pt)% + \edef\B{\fpeval{\M/2}}\edef\H{\fpeval{\B*tand(60)}} + \IfBooleanTF{#1}{\Pbox(\B,\H)[b]{H}[#5] + \polygon(\Pu)(\B,\H)(\Pd)}{}% + \edef\R{\fpeval{\B*tand(30)}} + \IfBooleanTF{#1}{\Pbox(\B,\R)[bl]{C}[#5] + \Circlewithcenter\B,\R radius{\R}}{}% + \GetCoord(\Pt)\Xt\Yt\edef\VScale{\fpeval{\Yt/\H}} + \IfBooleanTF{#1}{\polyline(\Pu)(\B,\Yt)(\Pd) + \Pbox(\B,\Yt)[b]{V}[#5]}{}% + \edef\Ce{\fpeval{\R*\VScale}} + \IfBooleanTF{#1}{\Xellisse(\B,\Ce){\R}{\Ce} + \Pbox(\B,\Ce)[r]{C_e}[#5]\Pbox(\B,0)[t]{B}[#5]}{}% + \SubVect\B,0 from\Pt to\SlMedian + \IfBooleanTF{#1}{\Dotline(\B,0)(\Pt){2}[1.5]}{}% + \ModAndAngleOfVect\SlMedian to\Med and\Alfa + \edef\Alfa{\fpeval{90-\Alfa}} + \IfBooleanTF{#1}{\Dotline(\B,\Yt)(\B,0){2}[1.5] + \Pbox(\fpeval{\B+\Ce*tand{\Alfa}},\Ce)[l]{C_i}[#5] + \VectorArc(\B,0)(\B,15){-\Alfa} + \Pbox(\fpeval{\B+2.5},14)[t]{\alpha}[0]}{}% + \edef\a{\R}\edef\b{\Ce}% +\CopyVect\fpeval{\B+\Ce*tand{\Alfa}},\Ce to\CI +\XSellisse(\CI)<\Alfa>{\R}{\Ce} +}}}% +\egroup\ignorespaces} +\let\EllisseSteiner\SteinerEllipse +% \end{macrocode} +% +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%\subsubsection{The ellipse that is internally tangent to a triangle while one of its foci is prescribed} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% We now are going to tackle another problem. As we said before, any +% triangle has an infinite set of internally tangent circles, unless +% some further constraint is specified. +% +% Another problem of this kind is the determination and geometrical +% construction of an internally tangent ellipse when one focus is +% specified; of course since the whole ellipse is totally internal +% to the triangle, we assume that the user has already verified +% that the coordinates of the focus fall inside the triangle. +% We are not going to check this feature in place of the user; +% after all, if the user draws the triangle within a |picture| image, +% together with the chosen focus, is suffices a glance to verify that +% such focus lays within the triangle perimeter. +% +% The geometrical construction is quite complicated, but it is +% described in a paper by Estevão V.~Candia on \TB~2019 \textbf{40}(3); +% it consists of the following steps. +%\begin{enumerate}[noitemsep] +%^^A +%\item Suppose you have specified a triangle by means of its three +% vertices, and a point inside it to play the role of a focus; it +% is necessary to find the other focus and the main axis length in +% order to have a full description of the ellipse. +%^^A +%\item To do so, it is necessary to find the focus three symmetrical +% points with respect to the three sides. +%^^A +%\item The center of the three point circle through these symmetrical +% points is the second focus. +%^^A +%\item The lines that join the second focus to the three symmetrical +% points of the first focus, intersect the triangle sides in three +% points that result to be the tangency points of the ellipse to the +% triangle. +%^^A +%\item Chosen one of these tangency points and computing the sum of its +% distances from both foci, the total length of the ellipsis main axis +% is found. +%^^A +%\item Knowing both foci, the total inter focal distance is found, +% therefore equation~\eqref{equ:axes-foci} allows to find the other +% axis length. +%^^A +%\item The inclination of the focal segment gives us the the rotation +% to which the ellipse is subject, and the middle point of such +% segment gives the ellipse center. +%^^A +%\item At this point we have all the necessary elements to draw +% the ellipse. +%^^A +%\end{enumerate} +% +% We need another little macro to find the symmetrical points; +% if the focus $F$ and its symmetrical point $P$ with respect +% to a side/segment, the intersection of such segment $F-P$ with +% the side is the segment middle point $M$; from this property +% we derive the formula $P= 2M -F$. Now $M$ is also the +% intersection of the line passing through $F$ and perpendicular +% to the side. Therefore it is particularly simple to compute, +% but its better to have available a macro that does the whole +% work; here it is, but it assumes the the center of symmetry is +% already known: +% \begin{macrocode} + +\def\SymmetricalPointOf#1respect#2to#3{\ScaleVect#2by2to\Segm +\SubVect#1from\Segm to#3\ignorespaces} +% \end{macrocode} +% And its syntax is the following: +%\begin{ttsyntax} +%\cs{SymmetricalPointOf}\meta{focus} respect\meta{symmetry center} +%\qquad to\meta{symmetrical point} +%\end{ttsyntax} +% where the argument names are self explanatory. +% +% The overall macro that executes all the passages described in +% the above enumeration follows; the reader can easily recognise +% the various steps, since the names of the macros are self +% explanatory; the $G_i$ point names are the symmetrical ones +% to the first focus $F$; the $M_i$ points are the centers of +% symmetry; the $F'$ point is the second focus; the $T_i$ points +% are the tangency points. The macro |\EllipseWithFOcus| has the +% following syntax: +%\begin{ttsyntax} +%\cs{EllipseWithFocus}\meta{$\star$}\parg{P1}\parg{P2}\parg{P3}\parg{focus} +%\end{ttsyntax} +% where \meta{P1}, \meta{P2}, \meta{P3} are the triangle vertices +% and \meta{focus} contains the first focus coordinates; the +% optional asterisk, as usual, selects the construction steps +% versus the final result: no asterisk, no construction steps. +% \begin{macrocode} + +\NewDocumentCommand\EllipseWithFocus{s d() d() d() d()}{\bgroup% +\CopyVect#2to\Pu +\CopyVect#3to\Pd +\CopyVect#4to\Pt +\CopyVect#5to\F +\polygon(\Pu)(\Pd)(\Pt) +\Pbox(\Pu)[r]{P_1}[1.5pt]\Pbox(\Pd)[t]{P_2}[1.5pt] +\Pbox(\Pt)[b]{P_3}[1.5pt]\Pbox(\F)[b]{F}[1.5pt] +\SegmentArg(\Pu)(\Pt)to\At +\SegmentArg(\Pu)(\Pd)to\Ad +\SegmentArg(\Pd)(\Pt)to\Au +\IntersectionOfLines(\Pu)(\At:1)and(\F)(\fpeval{\At+90}:1)to\Mt +\IntersectionOfLines(\Pd)(\Ad:1)and(\F)(\fpeval{\Ad+90}:1)to\Md +\IntersectionOfLines(\Pd)(\Au:1)and(\F)(\fpeval{\Au+90}:1)to\Mu +\IfBooleanTF{#1}{\Pbox(\Mt)[br]{M_3}[1.5pt]\Pbox(\Md)[t]{M_2}[1.5pt] + \Pbox(\Mu)[b]{M_1}[1.5pt]}{} +\SymmetricalPointOf\F respect\Mu to\Gu +\IfBooleanTF{#1}{\Pbox(\Gu)[l]{G_1}[1.5pt]}{} +\SymmetricalPointOf\F respect \Md to\Gd +\IfBooleanTF{#1}{\Pbox(\Gd)[t]{G_2}[1.5pt]}{} +\SymmetricalPointOf\F respect \Mt to\Gt +\IfBooleanTF{#1}{\Pbox(\Gt)[r]{G_3}[1.5pt]}{} +\IfBooleanTF{#1}{\ThreePointCircle*(\Gu)(\Gd)(\Gt)}% + {\ThreePointCircle(\Gu)(\Gd)(\Gt)} +\CopyVect\C to\Fp \Pbox(\Fp)[l]{F'}[1.5pt] +\IfBooleanTF{#1}{% +\Dotline(\F)(\Gt){2}[1.5pt] +\Dotline(\F)(\Gd){2}[1.5pt] +\Dotline(\F)(\Gu){2}[1.5pt]}{} +\IntersectionOfSegments(\Pu)(\Pt)and(\Fp)(\Gt)to\Tt +\IntersectionOfSegments(\Pu)(\Pd)and(\Fp)(\Gd)to\Td +\IntersectionOfSegments(\Pd)(\Pt)and(\Fp)(\Gu)to\Tu +\IfBooleanTF{#1}{\Pbox(\Tu)[l]{T_1}[1.5pt] +\Pbox(\Td)[b]{T_2}[1.5pt] +\Pbox(\Tt)[tl]{T_3}[1.5pt] +\Dashline(\Fp)(\Gu){1}\Dashline(\Fp)(\Gd){1}\Dashline(\Fp)(\Gt){1}}{} +\DistanceAndDirOfVect\Fp minus\Tt to\DFp and\AFu +\DistanceAndDirOfVect\F minus\Tt to\DF and\AF +\SegmentCenter(\F)(\Fp)to\CE \Pbox(\CE)[b]{C}[1.5pt] +\edef\a{\fpeval{(\DFp+\DF)/2}} +\SegmentArg(\F)(\Fp)to\AngFocalAxis +\SegmentLength(\F)(\CE)to\c +\AxisFromAxisAndFocus\a and\c to\b +\Xellisse(\CE)[\AngFocalAxis]{\a}{\b}[\thicklines] +\VECTOR(-30,0)(120,0)\Pbox(120,0)[t]{x}[0] +\VECTOR(0,-20)(0,130)\Pbox(0,130)[r]{y}[0]\Pbox(0,0)[tr]{O}[1.5pt] +\egroup\ignorespaces} +\let\EllisseConFuoco\EllipseWithFocus +% \end{macrocode} +% +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{Comments on this package} +%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% In general we found very comfortable to draw ellipses and +% to define macros to draw not only such shapes or filled elliptical +% areas, but also to create “legends” with coloured backgrounds and +% borders; such applications found their way in other works. +% But here we dealt with other geometrical problems. The accompanying +% document |euclideangeometry-man.pdf| describes much clearly with +% examples what you can do with the macros described in this package. +% In facts, this file just describes the package macros, and it gives +% some ideas on how to extend the ability of |curve2e| to draw geometrical +% diagrams. +% The users who would like to modify or to add some functionalities +% are invited to do so; I will certainly acknowledge their contributions +% and even add their names to the list of authors. +% +% As long as I can, I enjoy playing with \LaTeX and its wonderful +% facilities; but, taking into consideration my age, I would invite +% the users to consider the possibility of assuming the maintenance +% of this package. +% +%\iffalse +% +%\fi +% +%\iffalse +%<*readme> +%^^A\fi +% \section{The \texttt{README.txt} file} +% The following is the text that forms the contents of the |README.txt| +% file that accompanies the package. We found it handy to have it in +% the documented source, because in this way certain pieces of +% information don't need to be repeated again and again in different +% files. +% \begin{macrocode} +The package bundle euclideangeometry is composed of the following files + +euclideangeometry.dtx +euclideangeometry.pdf +euclideangeometry-man.tex +euclideangeometry-man.pdf +README.txt + +euclideangeometry.dtx is the documented TeX source file of package +euclideangeometry.sty; you get euclideangeometry.sty, +euclideangeometry.pdf by running pdflatex on euclideangeometry.dtx. + +README.txt, this file, contains general information. + +euclideangeometry-man.tex and euclideangeometry-man.pdf are +the source file and the readable document containing the end +user manual. +In other words euclideangeometry.pdf is oriented towards the +developers and euclideangeometry-man.pdf to the end users. + + +Claudio Beccari + +claudio dot beccari at gmail dot com +% \end{macrocode} +%^^A\iffalse +% +%\fi +% \Finale +%^^A \endinput -- cgit v1.2.3