% \iffalse meta-comment % % Copyright (C) 2003-2020 % Rolf Niepraschk, Rolf.Niepraschk@gmx.de % Hubert Gaesslein, hubertjg@gmx.de % Josef Tkadlec, j.tkadlec@email.cz % % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3 or later is part of all distributions of LaTeX % version 2003/12/01 or later. % % This work has the LPPL maintenance status "author-maintained". % % This work consists of all files listed in manifest.txt. % % %<*package> \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{pict2e}[2020/09/30 v0.4b Improved picture commands (HjG,RN,JT)] % % %<*driver> \listfiles \setcounter{errorcontextlines}{5} \documentclass{ltxdoc} \usepackage{pict2e} % [pstarrows] %%\usepackage[debug]{pict2e} \IfFileExists{ebezier.sty}{\usepackage{ebezier}}{% } % \providecommand*\cbezier{} \usepackage{color} \usepackage{graphicx} \usepackage{array} \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{longtable} \IfFileExists{geometry.sty}{% \usepackage[left=\marginparwidth,textwidth=1.15\textwidth,% top=20mm,bottom=30mm]{geometry}}{} \IfFileExists{url.sty}{\usepackage{url}} {\newcommand*\url[1]{\texttt{#1}}} \usepackage{hypdoc} %\OnlyDescription \AlsoImplementation \EnableCrossrefs \CodelineIndex \RecordChanges \begin{document} %%\tracingmacros\maxdimen %%\tracingall \tracingonline0 %%\loggingall \setlength\emergencystretch{3em} \DocInput{pict2e.dtx} \end{document} % % \fi % % \GetFileInfo{pict2e.sty} % \def\docdate{2020/09/30} % % \CheckSum{2350} % % ^^A ======== % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % % ^^A ======== % % \makeatletter % \@ifundefined{ifdeveloping}{\newif\ifdeveloping}{} ^^A false by default % \makeatother % % ^^A ======== % % \ifdeveloping ^^A Should be further refined % % \changes{v0.1a}{2003/07/18}{First version. New code for \cmd{\@sline}. (RN)} % \changes{v0.1b}{2003/07/20}{New code for \cmd{\@circle} and \cmd{\@dot} % added. (RN)} % \changes{v0.1c}{2003/07/21}{More flexibility with sampling the graphic % operators in token register (\cmd{\pIIe@GRAPH}). (RN)} % \changes{v0.1c}{2003/07/21}{Code for \cmd{\@bezier} added. (RN)} % \changes{v0.1d}{2003/07/22}{New code for \cmd{\cbezier} % (package `ebezier'). (RN)} % \changes{v0.1e}{2003/07/24}{New option ``debug''} % \changes{v0.1f}{2003/08/17}{Changed mode numbers. (RN)} % \changes{v0.1f}{2003/08/17}{\cmd{\pIIe@add@rcurveto} added. (RN)} % \changes{v0.1f}{2003/08/17}{\cmd{\pIIe@add@XY} added. (RN)} % \changes{v0.1g}{2003/08/23}{Changed code for \cmd{\pIIe@add@qcircle}. % (HjG,RN)} % \changes{v0.1g}{2003/08/23}{New code for \cmd{\@oval}. (HjG,RN)} % \changes{v0.1i}{2003/08/28}{Translation, scaling, rotation added. (HjG,RN)} % \changes{v0.1j}{2003/08/29}{Loads now `color.cfg' instead of `graphics.cfg' % for system default driver (no more trouble with commands like % \cmd{\DeclareGraphicsRule}) (RN)} % \changes{v0.1j}{2003/08/29}{Driver specific code now in new files % ``p2e-DRIVER.def''. (RN)} % \changes{v0.1k}{2003/08/30}{\cmd{\pIIe@PTtoBP} removed. Scaling with % PS/PDF code instead. (RN)} % \changes{v0.1l}{2003/09/24}{First implementation of \cmd{\vector}. (RN,HjG)} % \changes{v0.1m}{2003/09/26}{\cmd{\vector} complete (arctan version). (RN,HjG)} % \changes{v0.1n}{2003/10/01}{Loads now the own configuration file `pict2e.cfg' % instead of `color.cfg' (RN,HjG)} % \changes{v0.1n}{2003/10/01}{New Option `hide' suppresses the ps or pdf output (RN)} % \changes{v0.1o}{2003/10/17}{New implementation of opt. arg. to \cmd{\oval} (HjG,RN)} % \changes{v0.1p}{2003/10/29}{Improve \cmd{\@sline} (HjG,RN)} % \changes{v0.1p}{2003/10/29}{Some cleaning (HjG,RN)} % \changes{v0.1p}{2003/10/29}{Rudimentary Documentation, translated to English (HjG,RN)} % \changes{v0.1q}{2003/11/02}{Small fixes in documentation (HjG)} % \changes{v0.1r}{2003/11/12}{Cleaning and revamping (RN,HjG)} % \changes{v0.1r}{2003/11/12}{Rename commands: operators get `@op' suffix, % drawing commands loose `@add' (RN,HjG)} % \changes{v0.1s}{2003/11/13}{Avoid use of dimen registers % \cmd{\@tempdima} and \cmd{\@tempdimb} in all but low level auxillary % macros -- avoid potential pitfall (RN,HjG)} % \changes{v0.1t}{2003/11/13}{Some code and documentation cleaning (RN)} % \changes{v0.1u}{2003/11/18}{M-x delete-trailing-whitespace (HjG)} % \changes{v0.1u}{2003/11/19}{Some cleaning and revamping (HjG)} % \changes{v0.1u}{2003/11/20}{Finally, bring code snippets in a more % meaningful order (HjG)} % \changes{v0.1u}{2003/11/21}{Save many tokens by introducing ancillary macros (HjG)} % \changes{v0.1v}{2003/11/21}{More cleaning and revamping (HjG)} % \changes{v0.1v}{2003/11/22}{Return of ``cleaning and revamping'' (HjG)} % \changes{v0.1w}{2003/11/25}{Son of ``cleaning and revamping'' (HjG)} % \changes{v0.1w}{2003/11/25}{More documentation about usage (HjG)} % \changes{v0.1w}{2003/11/27}{Small fixes (RN,HjG)} % \changes{v0.1x}{2003/11/27}{Improve PSTricks-like arrows. (RN,HjG)} % \changes{v0.1y}{2003/11/27}{Implement LaTeX-like arrows. (RN,HjG)} % \changes{v0.1z}{2003/12/04}{Change \cmd{\cbezier}. (RN,HjG)} % \changes{v0.2a}{2003/12/04}{Return of the son of ``cleaning and revamping'' (HjG)} % \changes{v0.2a}{2003/12/05}{M-x delete-trailing-whitespace (HjG)} % \changes{v0.2}{2003/12/11}{Minor changes. (RN,HjG)} % \changes{v0.2b}{2003/12/13}{Merge v0.2a and v0.2 (HjG)} % \changes{v0.2c}{2003/12/13}{Grandson of ``cleaning and revamping'' (HjG)} % \changes{v0.2c}{2003/12/13}{Try new driver for \textsf{xdvi}---to no avail (HjG)} % \changes{v0.2*}{2003/12/17}{Improve LaTeX-like arrows. (RN,HjG)} % \changes{v0.2d}{2003/12/18}{Merge v0.2c and v0.2*. (HjG)} % \changes{v0.2e}{2003/12/18}{Merge new figures created by RN. (HjG)} % \changes{v0.2e}{2003/12/19}{Return of the grandson of ``cleaning and revamping'' (HjG)} % \changes{v0.2f}{2003/12/19}{Cousin of ``cleaning and revamping'' (HjG)} % \changes{v0.2f}{2003/12/20}{Return of the cousin of ``cleaning and revamping'' (HjG)} % \changes{v0.2g}{2003/12/21}{Nephew of ``cleaning and revamping'' (HjG)} % \changes{v0.2h}{2004/01/07}{Documentation and small code improvements (RN,HjG)} % \changes{v0.2i}{2004/01/29}{Slope arguments for \cmd{\vector} restricted % to values $\vert s \vert \le 1000$ (RN,HjG)} % \changes{v0.2i*}{2004/02/11}{Final touches for release (RN)} % \changes{v0.2j}{2004/02/19}{Final touches for release (HjG)} % \changes{v0.2k}{2004/03/24}{Return of the nephew of ``cleaning and revamping'' (HjG)} % \changes{v0.2k}{2004/03/26}{Better control for history entries % while debugging (HjG)} % \changes{v0.2l}{2004/04/08}{Added redefinition of \cmd{\line} (RN,HjG)} % \changes{v0.2m}{2004/04/10}{Minor touches (HjG)} % \changes{v0.2n}{2004/04/22}{Added lppl (RN,HjG)} % \changes{v0.2o}{2004/06/25}{Fix two bugs (HjG)} % \changes{v0.2o}{2004/06/25}{Numerous small fixes in documentation (HjG)} % \changes{v0.2p}{2004/07/06}{Small fixes in documentation (HjG)} % \changes{v0.2s}{2006/03/05}{Wrong PSTricks-like arrows corrected (RN)} % \changes{v0.2t}{2008/05/11}{All lines by \cmd{\@sline}, % added \cmd{\arc}, \cmd{\Line}, \cmd{\polyline}, \cmd{\polygon}, % types of lines and their connections, path commands (JT)} % \changes{v0.2u}{2008/06/29}{Also real slopes for lines and vectors. (JT)} % \changes{v0.2v}{2008/07/19}{Improved internal division macro. (JT)} % \changes{v0.2w}{2008/07/22}{Number of points in \cmd{\qbezier} not ignored. (JT)} % \changes{v0.2x}{2009/08/05}{Support for xetex. (JT)} % \changes{v0.2y}{2011/04/05}{Support for dvipdfmx. (JT)} % \changes{v0.2z}{2014/01/12}{Conflict wit epic, eepic solved. (JT)} % \changes{v0.3a}{2016/01/09}{Local line types, documentation fixes. (JT)} % \changes{v0.3d}{2020/06/13}{\cmd{\@sline} renamed \cmd{\pIIe@sline} (RN)} % \changes{v0.3e}{2020/06/20}{Added \cmd{\Vector}, \cmd{\polyvector} % suggested by FMi (RN)} % \changes{v0.4a}{2020/08/16}{Default lengths to match extended \LaTeX\ version} % \fi % % \changes{v0.1a}{2003/07/18}{First version. (RN)} % \changes{v0.2j}{2004/02/27}{First release to CTAN % (2004/02/19 v0.2j). (LaTeX Team)} % \changes{v0.2n}{2004/05/27}{Second release to CTAN % (2004/04/22 v0.2n). (RN/HjG)} % \changes{v0.2o}{2004/06/25}{Third release to CTAN % (2004/06/25 v0.2o). (RN/HjG)} % \changes{v0.2p}{2004/07/28}{Fourth release to CTAN % (2004/07/28 v0.2p). (RN)} % \changes{v0.2q}{2004/08/06}{Fourth release to CTAN % (2004/08/06 v0.2q). (RN/HjG)} % \changes{v0.2u}{2008/06/29}{Fifth release to CTAN % (2008/06/29 v0.2u). (JT)} % \changes{v0.2v}{2008/07/19}{Sixth release to CTAN % (2008/07/19 v0.2v). (JT)} % \changes{v0.2w}{2008/07/22}{Seventh release to CTAN % (2008/07/19 v0.2w). (JT)} % \changes{v0.2x}{2009/08/08}{Eigth release to CTAN % (2009/08/08 v0.2x). (JT)} % \changes{v0.2y}{2011/04/05}{Nineth release to CTAN % (2011/04/05 v0.2y). (JT)} % \changes{v0.2z}{2014/01/12}{10th release to CTAN % (2011/04/05 v0.2z). (JT)} % \changes{v0.3a}{2016/01/09}{11th release to CTAN % (2016/01/09 v0.3a). (JT)} % \changes{v0.3b}{2016/02/05}{12th release to CTAN % (2016/02/05 v0.3b). (RN)} % % \DoNotIndex{\newcommand,\renewcommand,\newenvironment,\renewenvironment} % \DoNotIndex{\providecommand,\def,\edef,\let,\gdef,\xdef,\global,\newtoks} % \DoNotIndex{\RequirePackage,\DeclareOption,\ProcessOptions,\ExecuteOptions} % \DoNotIndex{\input,\InputIfFileExists} % \DoNotIndex{\@ifdefinable,\@ifundefined,\@percentchar} % \DoNotIndex{\AtBeginDocument,\AtEndOfPackage} % \DoNotIndex{\PackageError,\PackageWarning,\PackageWarningNoLine,\PackageInfo} % \DoNotIndex{\MessageBreak,\typeout} % % \DoNotIndex{\z@,\z@skip,\p@,\@ne,\tw@,\thr@@,\@iv,\two@fourteen,\strip@pt} % \DoNotIndex{\the,\if,\else,\or,\fi,\ifnum,\ifdim,\ifcase,\ifodd} % \DoNotIndex{\advance,\multiply,\divide} % \DoNotIndex{\@tfor,\do} % \DoNotIndex{\csname,\endcsname,\begingroup,\endgroup} % \DoNotIndex{\expandafter,\afterassignment,\noexpand} % % \changes{v0.1w}{2003/11/25}{Index use of temporary registers % while debugging (HjG)} % \changes{v0.2k}{2004/03/26}{Better control for indexing temporary % registers while debugging (HjG)} %^^A \ifdim0pt<\overfullrule\else % \ifdeveloping\else % \DoNotIndex{\@tempdima,\@tempdimb,\@tempdimc,\@tempcnta,\@tempcntb} % \DoNotIndex{\@halfwidth,\@wholewidth,\unitlength} % \DoNotIndex{\@clnwd,\@clnht,\@ovdx,\@ovdy,\@ovro,\@ovri,\@ovxx,\@ovyy} % \DoNotIndex{\@xarg,\@xdim,\@yarg,\@ydim,\@linelen,\@dashdim,\dimen@} % \fi % % \DoNotIndex{\reserved@a,\relax,\protect,\space} % \DoNotIndex{\if@tempswa,\@tempswatrue,\@tempswafalse} % \DoNotIndex{\if@ovt,\if@ovb,\if@ovl,\if@ovr} % \DoNotIndex{\@ovttrue,\@ovbtrue,\@ovltrue,\@ovrtrue} % \DoNotIndex{\@ovtfalse,\@ovbfalse,\@ovlfalse,\@ovrfalse} % % \DoNotIndex{\pdfcompresslevel} % % \DoNotIndex{\x,\y} % ^^A \DoNotIndex{} % % \newcommand*\BigIndent{\hspace{.2\linewidth}} % \renewcommand*\floatpagefraction{0.8} % % \newcommand*\PS{PostScript} % \newcommand*\PSTricks{PSTricks} % \newcommand*\PDF{PDF} % \newcommand*\SL{Standard \LaTeX} % ^^A stolen from pictex.tex % \newcommand*\PiC{P\kern-.12em\lower.5ex\hbox{I}\kern-.075emC} % \newcommand*\PiCTeX{\PiC\kern-.11em\TeX} % \newcommand*\teTeX{te\kern-.11em\TeX} % \newcommand*\TeXlive{\TeX live} % % \newenvironment*{ltxquote}{\quote\slshape}{\endquote} % % \changes{v0.2k}{2004/03/26}{Better control over funny pagestyle % while debugging (HjG)} % \changes{v0.2l}{2004/04/08}{Even better control over funny pagestyle % while debugging (RN)} % \ifdeveloping % \makeatletter % % \newcommand*\isodattim{} % \begingroup % \count@\time % \divide\count@ 60 % \count2=-\count@ % \multiply\count2 60 % \advance\count2 \time % \xdef\isodattim{^^A % \the\year-\two@digits{\the\month}-\two@digits{\the\day}^^A % ~\two@digits{\the\count@}:\two@digits{\the\count2}} % \endgroup % % \newcommand*\ps@myfootings{^^A cf. \ps@plain % \let\@mkboth\@gobbletwo % \let\@oddhead\@empty % \let\@evenhead\@empty % \def\@oddfoot{\reset@font % \rlap{\textsf{\filename}~\fileversion~\filedate}^^A % \hfil\thepage\hfil % \llap{\TeX ed \texttt{\isodattim}}}^^A % \def\@evenfoot{\reset@font % \rlap{\TeX ed \texttt{\isodattim}}^^A % \hfil\thepage\hfil % \llap{\filedate~\fileversion~\textsf{\filename}}}^^A % } % \pagestyle{myfootings} % \let\pagestyle\@gobble % \let\thispagestyle\@gobble % % \makeatother % \else % \makeatletter % ^^A \ifdim\overfullrule>\z@\else\let\ps@myfootings\ps@plain\fi % \makeatother % \fi % % \DeleteShortVerb{\|} % \newcommand*\abs[1]{\ensuremath{|#1|}} % \MakeShortVerb{\|} % % ^^A ======== % % \newcommand*\OPOINT{^^A % \begingroup % \setlength\unitlength{.8pt}^^A % \circle{5}^^A % \endgroup % } % \newcommand*\FPOINT{^^A % \begingroup % \setlength\unitlength{.8pt}^^A % \circle*{5}^^A % \endgroup % } % \newcommand*\THICKLINES{\linethickness{1.4pt}} % \newcommand*\CBEZIER[4]{^^A % \cbezier(#1)(#2)(#3)(#4)^^A % \put(#2){\FPOINT}\put(#3){\FPOINT}} % % \newcommand*\LINETEST[1][1]{^^A % \setlength\unitlength{.007\linewidth}^^A % \begin{minipage}{100\unitlength} % \ifnum #1>0 \else\OriginalPictureCmds\fi^^A % \begin{picture}(100,100)^^A (-50,-50)^^A % \put(0,0){\framebox(100,100){}}^^A % \linethickness{2.6\unitlength} % \put(0,0){\line(1,0){50}}^^A % \put(0,0){\line(2,1){50}}^^A % \put(0,0){\line(1,1){50}}^^A % \put(0,0){\line(1,2){50}}^^A % \put(0,0){\line(0,1){50}}^^A % \ifnum #1>0 % \color{red}^^A % \linethickness{3.8\unitlength}^^A % \put(50,0){\line(966,259){25}}^^A 15 degrees % \put(50,0){\line(866,500){25}}^^A 30 degrees % \put(50,0){\line(707,707){25}}^^A 45 degrees % \put(50,0){\line(500,866){25}}^^A 60 degrees % \put(50,0){\line(259,966){25}}^^A 75 degrees % \normalcolor^^A % \fi % \color{blue}^^A % \thicklines % \put(50,0){\line(4,2){50}} % \put(50,0){\line(2,4){50}} % ^^A \put(50,0){\line(5,5){50}} % \end{picture}^^A % \end{minipage} % } % % \newcommand*\VECTORTEST[1][1]{^^A % \setlength\unitlength{.007\linewidth}^^A % \begin{minipage}{100\unitlength} % \ifnum #1>0 \else\OriginalPictureCmds\fi^^A % \begin{picture}(100,100)(-50,-50)^^A % \put(-50,-50){\framebox(100,100){}}^^A % \thinlines % \put(0,0){\vector(1,0){50}}^^A % \thicklines % \put(0,0){\vector(2,1){50}}^^A % \linethickness{1.4pt}^^A % \put(0,0){\vector(1,1){50}}^^A % \linethickness{2.0pt}^^A % \put(0,0){\vector(1,2){25}}^^A % \ifnum #1>0 % \color{red}^^A % \linethickness{2.6pt}^^A % \put(0,0){\vector(259,966){13}}^^A 75 degrees % \linethickness{3.8pt}^^A % \put(0,0){\vector(-259,966){13}}^^A % \normalcolor^^A % \fi % \linethickness{3.2pt}^^A % \put(0,0){\vector(0,1){50}}^^A % \linethickness{4.4pt}^^A % \put(0,0){\vector(-1,1){50}}^^A % \linethickness{5.0pt}^^A % \put(0,0){\vector(-1,-1){50}}^^A % \linethickness{8.0pt}^^A % \put(0,0){\vector(1,-1){50}}^^A % \thicklines^^A % \thinlines^^A % \put(1,-30){\line(1,0){10}}^^A % \put(-1,-30){\line(-1,0){10}}^^A % \put(0,-30){\vector(0,-1){0}}^^A % \put(0,-30){\vector(1,1){0}}^^A % \put(0,-30){\vector(-1,1){0}}^^A % ^^A \put(0,15){\psline[linecolor=green,linewidth=8.0pt,unit=\unitlength]{->}(50,-50)}^^A % \end{picture}^^A % \end{minipage} % } % % \newcommand*\CIRCLETEST[1][1]{^^A % \setlength\unitlength{.007\linewidth}^^A % \setlength\fboxsep{0pt} % \fbox{^^A % \begin{minipage}{118\unitlength} % \ifnum #1>0 \else\OriginalPictureCmds\fi^^A % \begin{picture}(118,60)(-45,-30)^^A % \linethickness{1.6pt}^^A % \put(-30,0){\circle{15}}^^A % \put(-20,0){\circle{20}}^^A % \put(-10,0){\circle{25}}^^A % \put(0,0){\circle{30}}^^A % \put(10,0){\circle{35}}^^A % \put(20,0){\circle{40}}^^A % \put(30,0){\circle{45}}^^A % \put(40,0){\circle{50}}^^A % \end{picture}^^A % \par % \begin{picture}(118,35)(-45,-20)^^A % \put(-20,0){\circle*{30}}^^A % \put(-10,0){\circle*{25}}^^A % \put(0,0){\circle*{20}}^^A % \put(10,0){\circle*{15}}^^A % \put(20,0){\circle*{12}}^^A % \put(30,0){\circle*{9}}^^A % \put(40,0){\circle*{6}}^^A % \put(50,0){\circle*{3}}^^A % \end{picture}^^A % \end{minipage}} % } % % \newcommand*\OVALTESTi[1][1]{^^A % \setlength\unitlength{.007\linewidth}^^A % \begin{minipage}{100\unitlength} % \ifnum #1>0 \else\OriginalPictureCmds\fi^^A % \begin{picture}(100,80)^^A % \put(0,0){\framebox(100,80){}} % ^^A \linethickness{1\unitlength} % \thicklines % ^^A \color{blue}^^A % \put(55,40){\oval[2](80,70)[r]}^^A % \put(55,40){\oval[2](65,40)[r]}^^A % \put(55,40){\oval[2](60,20)[r]}^^A % \put(55,40){\oval[2](55,15)[r]}^^A % \put(55,40){\oval[2](50,10)[r]}^^A % \put(55,40){\oval[2](45,5)[r]}^^A % \put(55,40){\oval[2](40,2)[r]}^^A % ^^A \color{black}^^A % \put(45,40){\oval(80,70)[l]}^^A % \put(45,40){\oval(65,40)[l]}^^A % \put(45,40){\oval(60,20)[l]}^^A % \put(45,40){\oval(55,15)[l]}^^A % \put(45,40){\oval(50,10)[l]}^^A % \put(45,40){\oval(45,5)[l]}^^A % \put(45,40){\oval(40,2)[l]}^^A % \end{picture}^^A % \end{minipage} % } % % \newcommand*\OVALTESTii[1]{^^A % \renewcommand*\maxovalrad{#1}^^A % \setlength\unitlength{.0060\linewidth}^^A % \noindent % \begin{minipage}{155\unitlength} % \begin{picture}(155,50)^^A % \put(0,0){\framebox(155,50){}}^^A % \put(0,0){^^A NE % \setlength\unitlength{.5\unitlength}^^A % \begin{picture}(100,100)(-50,-50)^^A % \put(-50,-50){\framebox(100,100){}}^^A % \put(0,0){\oval(80,80)}% % \put(0,0){\makebox(0,0){2.5}}% % \end{picture}^^A % }^^A % \put(55,0){^^A NW % \setlength\unitlength{.4\unitlength}^^A % \begin{picture}(100,100)(-50,-50)^^A % \put(-50,-50){\framebox(100,100){}}^^A % \put(0,0){\oval(80,80)}% % \put(0,0){\makebox(0,0){2}}% % \end{picture}^^A % }^^A % \put(100,0){^^A SW % \setlength\unitlength{.3\unitlength}^^A % \begin{picture}(100,100)(-50,-50)^^A % \put(-50,-50){\framebox(100,100){}}^^A % \put(0,0){\oval(80,80)}% % \put(0,0){\makebox(0,0){1.5}}% % \end{picture}^^A % }^^A % \put(135,0){^^A SE % \setlength\unitlength{.2\unitlength}^^A % \begin{picture}(100,100)(-50,-50)^^A % \put(-50,-50){\framebox(100,100){}}^^A % \put(0,0){\oval(80,80)}% % \put(0,0){\makebox(0,0){1}}% % \end{picture}^^A % }^^A % \end{picture}^^A % \end{minipage} % } % % \newcommand*\QBEZIERTEST[1][1]{^^A % \setlength\unitlength{.007\linewidth}^^A % \begin{minipage}{120\unitlength} % \ifnum #1>0 \else\OriginalPictureCmds\fi^^A % \begin{picture}(120,100)^^A % \put(0,0){\framebox(120,100){}} % \qbezier[0](10,10)(40,90)(110,90) % \put(10,10){\FPOINT}\put(40,90){\OPOINT}\put(110,90){\FPOINT} % \color{green}^^A % \qbezier[0](10,10)(20,90)(30,10) % \put(10,10){\FPOINT}\put(20,90){\OPOINT}\put(30,10){\FPOINT} % \end{picture}^^A % \end{minipage} % } % % \newcommand*\CBEZIERTEST[1][1]{^^A % \setlength\unitlength{.01\linewidth}^^A % \begin{minipage}{80\unitlength} % \ifnum #1>0 \else\OriginalPictureCmds\fi^^A % \begin{picture}(80,80)(-40,-40)^^A % \put(-40,-40){\framebox(80,80){}} % \cbezier(-10,-10)(-30,30)(30,30)(30,-5) % \cbezier(30,-5)(30,-30)(0,-35)(-20,-20) % \put(-10,-10){\FPOINT} % \put(-30,30){\OPOINT}\put(30,30){\OPOINT} % \put(30,-5){\FPOINT} % \put(30,-30){\OPOINT}\put(0,-35){\OPOINT} % \put(-20,-20){\FPOINT} % \color{green}^^A % \cbezier(0,36)(24,36)(24,24)(0,0) % \cbezier(0,0)(-24,-24)(-24,-36)(0,-36) % \put(0,36){\FPOINT} % \put(24,36){\OPOINT}\put(24,24){\OPOINT} % \put(0,0){\FPOINT} % \put(-24,-24){\OPOINT}\put(-24,-36){\OPOINT} % \put(0,-36){\FPOINT} % \end{picture}^^A % \end{minipage} % } % % \newcommand*\QCBEZIERTEST[1][1]{^^A % \setlength\unitlength{.007\linewidth}^^A % \begin{minipage}{100\unitlength} % \ifnum #1>0 \else\OriginalPictureCmds\fi^^A % \begin{picture}(100,120)(-50,-60)^^A % \put(-50,-60){\framebox(100,120){}} % \color{green}^^A % \qbezier[0](-40,-30)(-30,10)(0,10) % \qbezier[0](0,10)(30,10)(40,50) % \put(-40,-30){\FPOINT}\put(-30,10){\OPOINT} % \put(0,10){\FPOINT} % \put(30,10){\OPOINT}\put(40,50){\FPOINT} % \color{black}^^A % \cbezier[0](-40,-50)(-20,30)(20,-50)(40,30) % \put(-40,-50){\FPOINT}\put(-20,30){\OPOINT} % \put(20,-50){\OPOINT}\put(40,30){\FPOINT} % \end{picture}^^A % \end{minipage} % } % % ^^A ======== % % \newcommand*\Acknowledgements{% % \section*{Acknowledgements} % We would like to thank Michael Wichura for granting us permission to % use his implementation of the algorithm for ``pythagorean addition'' % from his \PiCTeX\ package. % Thanks go to Michael Vulis (MicroPress) for hints regarding a driver % for the \textsf{V\TeX} system. % Walter Schmidt has reviewed the documentation and code, and has % tested the V\TeX\ driver. % The members of the ``\TeX-Stamm\-tisch'' in Berlin, Germany, have % been involved in the development of this package as our guinea pigs, % i.e., alpha-testers; % Jens-Uwe Morawski and Herbert Voss have also been helpful with many % suggestions and discussions. % Thanks to Claudio Beccari (\texttt{curve2e}) for some macros and testing. % Thanks to Petr Ol\v{s}\'ak for some macros. % \par % Finally we thank the members of The \LaTeX\ Team for taking the time % to evaluate our new implementation of the picture mode commands, and % eventually accepting it as the ``official'' \textsf{pict2e} package, % as well as providing the \texttt{README} file. % \par % } % % ^^A ======== % % \title{The \textsf{pict2e} package\thanks{This document % corresponds to \textsf{\filename} \fileversion, % dated \filedate, documentation dated \docdate.}} % \author{% % Hubert G\"a{\ss}lein, % Rolf Niepraschk\thanks{\texttt{Rolf.Niepraschk@gmx.de}} % \,and % Josef Tkadlec\thanks{\texttt{j.tkadlec@email.cz}}} % % \date{\filedate} % % \maketitle % % \begin{abstract} % This package was described in the 2nd edition of ``\LaTeX{}: A % Document Preparation System'', but the \LaTeX{} project team % declined to produce the package. % For a long time, \LaTeX{} has included a ``pict2e package'' % that merely produced an apologetic error message. % % The new package extends the existing \LaTeX{} \texttt{picture} % environment, using the familiar technique (cf.\ the % \textsf{graphics} and \textsf{color} packages) of driver % files. % In the user-level part of this documentation there is a fair % number of examples of use, showing where things are improved by % comparison with the \SL\ \texttt{picture} environment. % \end{abstract} % % \tableofcontents % % \listoffigures % % \section{Introduction} % % Here's a quote from the obsolete original official version of the % \textsf{pict2e} package (1993--2003): % \begin{ltxquote} % The package \textsf{pict2e} that is mentioned in the 2nd edition of % ``\LaTeX: A Document Preparation System'' has not yet been produced. % It is unlikely that the \LaTeX3 Project Team will ever produce this % package thus we would be very happy if someone else creates it. % \end{ltxquote} % Finally, % \marginpar[\hfill\texttt{:-)}]{\texttt{:-)}} % someone has produced a working implementation of the % \textsf{pict2e} package. % % This package redefines some of the drawing commands of the \LaTeX\ % % \textsf{picture} environment. % Like the \textsf{graphics} and \textsf{color} packages, it uses % driver files. % % ^^A Depending on the output format, we use \PS\ or \PDF\ Operators. % Currently there are only back-ends for \PS\ and \PDF. % (Other output formats may be added in the future.) % % \bigskip ^^A \pagebreak[2] % \noindent % Note/Warning: % \begin{itemize} % \item Documentation has been written somewhat ``hastily'' and may be % inaccurate. % \item % The status of this package is currently somewhere between ``beta'' % and ``release'' \dots\ % Users and package programmers should \emph{not} rely on % \emph{any} feature sported by the internal commands. % (Especially, the internal control sequence names may change without % notice in future versions of this package.) % \end{itemize} % % \section{Usage} % % To use the \textsf{pict2e} package, you put a % |\usepackage|\linebreak[0]\oarg{optionlist}\linebreak[0]|{pict2e}| % instruction in the preamble of your document. % Likewise, class or package writers just say % |\RequirePackage|\linebreak[0]\oarg{optionlist}\linebreak[0]|{pict2e}| % in an appropriate place in their class or package file. % (Nothing unusual here.) % % \noindent % Like the \textsf{graphics} and \textsf{color} packages, the % \textsf{pict2e} package supports a % configuration file (see Section~\ref{sec:cfg-file}). % % \subsection{Package options} % % \subsubsection{Driver options} % % \begin{minipage}{.55\textwidth} % \begin{tabular}{@{}lc@{\qquad\qquad}lc@{}} % driver & notes & driver & notes\\ \hline % dvips & x & oztex & (x) \\ % xdvi & x & dvipsone & x? \\ % pdftex & x & dviwindo & x? \\ % vtex & x & dvipdf & x? \\ % dvipdfm & x & textures & x? \\ % dvipdfmx& x & pctexps & x? \\ % xetex & x & pctex32 & x? \\ % luatex ($>0.85$) & x & ~ & ~ \\ \hline % ^^A emtex & -- % \end{tabular} % % \smallskip % \noindent x\,=\,supported; (x)\,=\,supported but untested; \par % \noindent x?\,=\,not yet implemented % ^^A --\,=\,unlikely to be ever supported % \end{minipage} % % \smallskip % The driver options are (mostly) implemented by means of definition % files (|p2e-|\meta{driver}\linebreak[0]|.def|). % For details, see file \texttt{p2e-drivers.dtx}. % % \begin{em} % Note: % You should specify the same driver for \textsf{pict2e} you use with % the \textsf{graphics/x} and \textsf{color} packages. % Otherwise, things may go haywire. % \par % \end{em} % % \subsubsection{Other options} % % Currently, there are two options that allow you to choose between % variants of the arrows-heads generated by the \cmd{\vector} % command. % See Figure~\ref{fig:vector:comparison} % in Section~\ref{sec:usage:vector} for the difference. % % \noindent % \begin{tabular}{@{}lp{.7\textwidth}@{}} % option & meaning \\ % \hline % ltxarrows & Draw \LaTeX\ style vectors (default). \\ % pstarrows & Draw \PSTricks\ style vectors. \\ % \hline % \end{tabular} % % \subsubsection{Debugging options} % % These options are (mainly) for development and testing purposes. % % \noindent % \begin{tabular}{@{}lp{.7\textwidth}@{}} % option & meaning \\ % \hline % original & Suppresses the new definitions. \\ % debug & Suppresses the compressing of pdf\TeX\ output; % marks the \textsf{pict2e} generated code in the output % files. \\ % hide & Suppresses all graphics output from \textsf{pict2e}. \\ % \hline % \end{tabular} % % \subsection{Configuration file} % \label{sec:cfg-file} % % Similar to the \textsf{graphics} and \textsf{color} packages, % in most cases it is not necessary to give a driver option explicitly % with the \cmd{\usepackage} (or \cmd{\RequirePackage}) command, % if a suitable configuration file \texttt{pict2e.cfg} is present on your % system (see the example file \texttt{pict2e-example.cfg}). % On many systems it may be sufficient to copy % \texttt{pict2e-example.cfg} to \texttt{pict2e.cfg}; % on others you might need to modify your copy to suit your system. % % \subsection{Details: Changes to user-level commands} % % This section describes the improvements of the new implementation of % (some of) the \texttt{picture} commands. % For details, look up ``\texttt{pict2e} package'' in the index of the % \LaTeX\ manual~\cite{LAMPORT}. % % Here's a collection of quotes relevant to the \textsf{pict2e} package % from the \LaTeX\ manual~\cite{LAMPORT}. % % ^^A Indicate Chapter/Section with these quotes ??? % % From \cite[p.~118]{LAMPORT}: % \begin{ltxquote} % However, the \texttt{pict2e} package uses device-driver support to % provide enhanced versions of these commands that remove some of % their restrictions. % The enhanced commands can draw straight lines and arrows of any % slope, circles of any size, and lines (straight and curved) of any % thickness. % \end{ltxquote} % % From \cite[p.~179]{LAMPORT}: % \begin{ltxquote} % \begin{description} % \item[\texttt{pict2e}] % Defines enhanced versions of the \texttt{picture} environment % commands that remove restrictions on the line slope, circle % radius, and line thickness. % \end{description} % \end{ltxquote} % % From \cite[pp.~221--223]{LAMPORT}: % \begin{ltxquote} % \begin{description} % \item[\cmd{\qbezier}]\mbox{}\\ % (With the \texttt{pict2e} package, there is no limit to the % number of points plotted.) % \item[\cmd{\line}\textrm{ and }\cmd{\vector}] % Slopes $\abs x,\abs y \le 6 \mbox{ or } 4$, with no common % divisor except $\pm1$:\\ % (These restrictions are eliminated by the \texttt{pict2e} % package.) % \item[\cmd{\line}\textrm{ and }\cmd{\vector}] % Smallest horizontal extent of sloped lines and vectors that can % be drawn:\\ % (This does not apply when the \texttt{pict2e} package is % loaded.) % \item[\cmd{\circle}\textrm{ and }\cmd{\circle*}] % Largest circles and disks that can be drawn:\\ % (With the \texttt{pict2e} package, any size circle or disk can % be drawn.) % \item[\cmd{\oval}] % \oarg{rad}:\\ % An explicit \emph{rad} argument can be used only with the % \texttt{pict2e} package; the default value is the radius of the % largest quarter-circle \LaTeX\ can draw without the % \texttt{pict2e} package. % \end{description} % \end{ltxquote} % % \subsubsection{Line} % \label{sec:usage:line} % % \DescribeMacro\line % |\line|\parg{X,Y}\marg{LEN}\\ % In the \SL\ implementation the slope arguments \parg{X,Y} are % restricted to integers in the range $-6 \le X,Y \le +6$, with no % common divisors except $\pm 1$. % (I.e., $X$ and $Y$ must be relatively prime.) % Furthermore, only horizontal and vertical lines can assume arbitrary % thickness; % sloped lines are restricted to the widths given by % the |\thinlines| and |\thicklines| declarations % (i.e., 0.4pt and 0.8pt, respectively). % % From \cite[p.~222]{LAMPORT}: % \begin{ltxquote} % These restrictions are eliminated by the \texttt{pict2e} package. % \end{ltxquote} % % However, to avoid overflow of \TeX's dimens, the slope arguments are real % numbers in the range $-16383 \le X,Y \le +16383$. It is usually not a good % idea to use slope arguments with the absolute value less then $10^{-4}$ % (the best accuracy is obtained if you use multiples of arguments such that % you eliminate as much decimal parts as possible). The slope greater then % 16384 cannot be obtained. % ^^A ??? % % Furthermore, unlike the \SL\ implementation, which silently converts % the ``impossible'' slope to a vertical line extending in the upward % direction ($(0,0) \mapsto (0,1)$), the \textsf{pict2e} package now % treats this as an error. % ^^A ??? % % In the \SL\ implementation the horizontal extent of sloped lines % must be at least 10\,pt. % ^^A exactly or approximately ??? % % From \cite[p.~222]{LAMPORT}: % \begin{ltxquote} % This does not apply when the \texttt{pict2e} package is loaded. % \end{ltxquote} % % Figure~\ref{fig:line} shows the difference between the old and new % implementations: % The black lines in the left half of each picture all have slopes % that conform to the restrictions of \SL. % However, with the new implementation of \textsf{pict2e} sloped lines % may assume any arbitrary width given by the |\linethickness| % declaration. % The right half demonstrates that now arbitrary slopes are possible. % % The blue lines represent ``illegal'' slopes specifications, % i.e., with common divisors. % Note the funny effect \SL\ produces in such cases. % (In \LaTeX\ releases prior to 2003/12/01, % some such ``illegal'' slopes might even lead to infinite loops! % Cf.\ problem report latex/3570.) % % The new implementation imposes no restriction with respect to line % thickness, minimal horizontal extent, and slope. % % The red lines correspond to angles of \(15^\circ\), \(30^\circ\), % \(45^\circ\), \(60^\circ\), and \(75^\circ\), respectively. % This was achieved by multiplying the sine and cosine of each angle % by 1000 and rounding to the nearest integer, like this: %\begin{verbatim} % \put(50,0){\line(966,259){25}} % \put(50,0){\line(866,500){25}} % \put(50,0){\line(707,707){25}} % \put(50,0){\line(500,866){25}} % \put(50,0){\line(259,966){25}} %\end{verbatim} % % \begin{figure} % \noindent % \begin{tabular} % {@{}>{\centering}p{.5\textwidth}@{} % >{\centering}p{.5\textwidth}@{}} % \textbf{Original Commands} & \textbf{New Commands} \tabularnewline[1ex] % \LINETEST[0] & \LINETEST % \end{tabular} % \caption{Line} % \label{fig:line} % \end{figure} % % \subsubsection{Vector} % \label{sec:usage:vector} % % \DescribeMacro\vector % |\vector|\parg{X,Y}\marg{LEN}\\ % In the \SL\ implementation the slope arguments \parg{X,Y} are % restricted to integers in the range $-4 \le X,Y \le +4$, with no % common divisors except $\pm 1$. % (I.e., $X$ and $Y$ must be relatively prime.) % Furthermore, arrow heads come only in two shapes, corresponding to % the |\thinlines| and |\thicklines| declarations. % (There's also a flaw: the lines will be printed over the arrow % heads. % ^^A pr/??? % See vertical vector in Figure~\ref{fig:vector}.) % % From \cite[p.~222]{LAMPORT}: % \begin{ltxquote} % These restrictions are eliminated by the \texttt{pict2e} package. % \end{ltxquote} % % However, to avoid overflow of \TeX's dimen arithmetic, the current % implementation restricts the slope arguments to real numbers in the range % $-1000 \le X,Y \le +1000$, which should be enough. It is usually not a good % idea to use slope arguments with the absolute value less then $10^{-4}$ (the % best accuracy is obtained if you use multiples of arguments such that you % eliminate as much decimal parts as possible). The slope greater then 16384 % cannot be obtained. % ^^A ??? % % Furthermore, unlike the \SL\ implementation, which silently converts % the ``impossible'' slope to a vertical vector extending in the upward % direction ($(0,0) \mapsto (0,1)$), the \textsf{pict2e} package now % treats this as an error. % ^^A ??? % % In the \SL\ implementation the horizontal extent of sloped vectors % must be at least 10\,pt. % ^^A exactly or approximately ??? % % From \cite[p.~222]{LAMPORT}: % \begin{ltxquote} % This does not apply when the \texttt{pict2e} package is loaded. % \end{ltxquote} % % Figure~\ref{fig:vector} shows the difference between the old and new % implementations: % The black arrows all have ``legal'' slopes. % The red arrows have slope arguments out of the range permitted by \SL. % Slope arguments that are ``illegal'' in \SL\ produce results similar % to those with the \cmd{\line} command (this has not been % demonstrated here). % % The new implementation imposes no restriction with respect to line % thickness, minimal horizontal extent, and slope. % % As with \SL, the arrow head will always be drawn. % In particular, only the arrow head will be drawn, if the total length % of the arrow is less than the length of the arrow head. % ^^A \SL: only if =0 ??? % See right hand side of Figure~\ref{fig:vector:comparison}. % % \begin{figure} % \noindent % \begin{tabular} % {@{}>{\centering}p{.5\textwidth}@{} % >{\centering}p{.5\textwidth}@{}} % \textbf{Original Commands} & \textbf{New Commands} \tabularnewline[1ex] % \VECTORTEST[0] & \VECTORTEST[1] % \end{tabular} % \caption{Vector} % \label{fig:vector} % \end{figure} % % The current version of the \textsf{pict2e} package offers two % variants for the shape of the arrow heads, controlled by package % options. % One variant tries to mimic the fonts used in the \SL\ % implementation (package option \textsf{ltxarrows}, the default; % see Figure~\ref{fig:vector:comparison}, top row), % though it is difficult to extrapolate from just two design sizes. % The other one is implemented like the arrows of the \PSTricks\ % package~\cite{PSTRICKS} (package option \textsf{pstarrows}; % see Figure~\ref{fig:vector:comparison}, bottom row). % ^^A See Figure~\ref{fig:vector:comparison}. % % \begin{figure} % \setlength\unitlength{.004\linewidth}^^A % \centering % \begin{picture}(200,100) % \put(0,0){\framebox(200,100){}} % \linethickness{12\unitlength} % \makeatletter \let\pIIe@vector=\pIIe@vector@pst \makeatother % \put(15,25){\vector(1,0){100}} % \put(185,25){\vector(1,0){0}} % \makeatletter \let\pIIe@vector=\pIIe@vector@ltx \makeatother % \put(15,75){\vector(1,0){100}} % \put(185,75){\vector(1,0){0}} % \end{picture} % \caption[Vector: shape variants of the arrow-heads]% % {Vector: shape variants of the arrow-heads. % Top: \LaTeX\ style vectors. % Bottom: \PSTricks\ style vectors.} % \label{fig:vector:comparison} % \end{figure} % % \subsubsection{Circle and Dot} % \label{sec:usage:circle+dot} % % \DescribeMacro\circle % \DescribeMacro{\circle*} % |\circle|\marg{DIAM}\\ % |\circle*|\marg{DIAM}\\ % The (hollow) circles and disks (filled circles) of the \SL\ ^^A % implementation had severe restrictions on the number of different % diameters and maximum diameters available. % % From \cite[p.~222]{LAMPORT}: % \begin{ltxquote} % With the \texttt{pict2e} package, any size circle or disk can be % drawn. % \end{ltxquote} % % \noindent % With the new implementation there are no more restrictions to the % diameter argument. % (However, negative % ^^A or zero % diameters are now trapped as an error.) % % Furthermore, hollow circles (like sloped lines) can now be drawn % with any line thickness. % Figure~\ref{fig:circle-dot} shows the difference. % % \begin{figure} % \noindent % \begin{tabular} % {@{}>{\centering}p{.5\textwidth}@{} % >{\centering}p{.5\textwidth}@{}} % \textbf{Original Commands} & \textbf{New Commands} \tabularnewline[1ex] % \CIRCLETEST[0] & \CIRCLETEST % \end{tabular} % \caption{Circle and Dot} % \label{fig:circle-dot} % \end{figure} % % \subsubsection{Oval} % \label{sec:usage:oval} % % \DescribeMacro\oval % |\oval|\oarg{rad}\parg{X,Y}\oarg{POS}\\ % In the \SL\ implementation, the user has no control over the shape % of an oval besides its size, since its corners would always consist % of the ``quarter circles of the largest possible radius less than or % equal to \emph{rad}''~\cite[p.~223]{LAMPORT}. % % From \cite[p.~223]{LAMPORT}: % \begin{ltxquote} % An explicit \emph{rad} argument can be used only with the % \texttt{pict2e} package; the default value is the radius of the % largest quarter-circle \LaTeX\ can draw without the \texttt{pict2e} % package. % \end{ltxquote} % % This default value is 20\,pt, a length. % However, in an early reimplementation of the picture % commands~\cite{PSPICTURE}, there is such an optional argument too, % but it is given as a mere number, to be multiplied by |\unitlength|. % % Since both alternatives may make sense, we left the choice to the % user. % \ (See Figure~\ref{fig:oval:rad:2} for the differences.) \ ^^A % I.e., this implementation of \cmd{\oval} will ``auto-detect'' % whether its \oarg{rad} argument is a length or a number. % \DescribeMacro\maxovalrad % Furthermore, the default value is not hard-wired either; % the user may access it under the moniker \cmd{\maxovalrad}, % by the means of \cmd{\renewcommand*}. % (Names or values of length and counter registers may be given as % well, both as an explicit \oarg{rad} argument and when redefining % \cmd{\maxovalrad}.) % % (Both \oarg{rad} and the default value \cmd{\maxovalrad} are ignored % in ``standard \LaTeX\ mode''). % % The behaviour of |\oval| in the absence of the \oarg{rad} argument % is shown in Figure~\ref{fig:oval:rad:1}, left half of each picture. % Note that in the \SL\ implementation there is a minimum radius as % well (innermost ``salami'' is ``broken''). % In the right half of each picture, a \oarg{rad} argument has been % used: it has no effect with the original |\oval| command. % % \begin{figure} % \noindent % \begin{tabular} % {@{}>{\centering}p{.5\textwidth}@{} % >{\centering}p{.5\textwidth}@{}} % \textbf{Original Commands} & \textbf{New Commands}\tabularnewline[1ex] % \OVALTESTi[0] & \OVALTESTi % \end{tabular} % \caption{Oval: Radius argument for \cmd{\oval} vs.\ \cmd{\maxovalrad}} % \label{fig:oval:rad:1} % \end{figure} % % Both \oarg{rad} and \cmd{\maxovalrad} may be given as an explicit % (rigid) length (i.e., with unit) or as a number. % In the latter case the value is used as a factor to multiply by % \cmd{\unitlength}. % \ (A length or counter register will do as well, of course.) % % If a number is given, the rounded corners of an oval will scale % according to the current value of \cmd{\unitlength}. % (See Figure~\ref{fig:oval:rad:2}, first row.) % % If a length is specified, the rounded corners of an oval will be the % same regardless of the current value of \cmd{\unitlength}. % (See Figure~\ref{fig:oval:rad:2}, second row.) % % The default value is 20\,pt as specified for the \oarg{rad} % argument of \cmd{\oval} by the \LaTeX\ manual \cite[p.~223]{LAMPORT}. % (See Figure~\ref{fig:oval:rad:2}, third row.) % % \bigskip % % \begin{figure} % \centering % \noindent % \begin{tabular}{@{}c@{}} % \textbf{Original Commands}, % \oarg{rad} or \cmd{\maxovalrad} ignored\\[1ex] % \OriginalPictureCmds\OVALTESTii{0}\tabularnewline[1ex]\tabularnewline % \textbf{New Commands}, % \oarg{rad} or \cmd{\maxovalrad} depends on \cmd{\unitlength}\\[1ex] % \OVALTESTii{20}\tabularnewline[1ex]\tabularnewline % \textbf{New Commands}, % \oarg{rad} or \cmd{\maxovalrad} a fixed length\\[1ex] % \OVALTESTii{10.44pt} % \end{tabular} % \caption[Oval: Radius argument for \cmd{\oval}: length vs.\ number]% % {Oval: Radius argument for \cmd{\oval}: length vs.\ number. % The number at the centre of each oval gives the relative value of % \texttt{\char`\\unitlength}.} % \label{fig:oval:rad:2} % \end{figure} % % \subsubsection{Bezier Curves} % \label{sec:usage:bezier-curves} % % \DescribeMacro\bezier % \DescribeMacro\qbezier % \DescribeMacro\cbezier % \DescribeMacro\qbeziermax % |\bezier|\marg{N}\parg{AX,AY}\parg{BX,BY}\parg{CX,CY}\\ % |\qbezier|\oarg{N}\parg{AX,AY}\parg{BX,BY}\parg{CX,CY}\\ % |\cbezier|\oarg{N}\parg{AX,AY}\parg{BX,BY}\parg{CX,CY}\parg{DX,DY}\\ % In \SL, the \emph{N} argument specifies the number of points to % plot: $N+1$ for a positive integer $N$, appropriate number % (at most \cmd{\qbeziermax}) for $N=0$ or if % the optional argument is missing. % With \LaTeX\ versions prior to 2003/12/01, the quadratic Bezier % curves plotted by this package will not match those of the \SL\ % implementation exactly, due to a bug in positioning the dots used to % produce a curve (cf.~latex/3566). % % \cmd{\bezier} is the obsolescent variant from the old % \textsf{bezier} package of vintage \LaTeX2.09. % % The |\cbezier| command draws a cubic Bezier curve; % see~\cite{EBEZIER}. % (This is not mentioned in \cite{LAMPORT} and has been added to the % package deliberately.) % % From \cite[p.~221--223]{LAMPORT}: % \begin{ltxquote} % With the \texttt{pict2e} package, there is no limit to the number % of points plotted. % \end{ltxquote} % % \noindent % More accurately, if the optional argument is absent or is 0, % the \textsf{pict2e} package uses primitive operators of the % output (back-end) format to draw a full curve. % % \begin{figure} % \noindent % \begin{tabular} % {@{}>{\centering}p{.5\textwidth}@{} % >{\centering}p{.5\textwidth}@{}} % \textbf{Original Commands} & \textbf{New Commands} \tabularnewline[1ex] % \QBEZIERTEST[0] & \QBEZIERTEST % \end{tabular} % \caption{Quadratic Bezier curves} % \label{fig:qbezier2} % \end{figure} % % \begin{figure} % \noindent % \begin{tabular} % {@{}>{\centering}p{.5\textwidth}@{} % >{\centering}p{.5\textwidth}@{}} % \textbf{Original Commands} & \textbf{New Commands} \tabularnewline[1ex] % \IfFileExists{ebezier.sty}{\CBEZIERTEST[0]}{% % \begin{slshape}^^A % Note: % Since the \textsf{ebezier} package is not installed on your system, % the `original' \cmd{\cbezier} command can't be used here.\par % \end{slshape}} & \CBEZIERTEST % \end{tabular} % \caption{Cubic Bezier curves} % \label{fig:cbezier} % \end{figure} % % \begin{figure} % \noindent % \begin{tabular} % {@{}>{\centering}p{.5\textwidth}@{} % >{\centering}p{.5\textwidth}@{}} % \textbf{Original Commands} & \textbf{New Commands} \tabularnewline[1ex] % \IfFileExists{ebezier.sty}{\QCBEZIERTEST[0]}{% % \begin{slshape}^^A % Note: % Since the \textsf{ebezier} package is not installed on your system, % the `original' \cmd{\cbezier} command can't be used here.\par % \end{slshape}} & \QCBEZIERTEST % \end{tabular} % \caption{Quadratic (green) and Cubic Bezier curves} % \label{fig:qcbezier} % \end{figure} % % \subsection{Extensions} % % This section desribe new commands that extend the possibilities of the % \texttt{picture} environment. It is not our aim to create a powerful % collection of macros (like \texttt{pstricks} or \texttt{tikz}). The main goal % of this package is to eliminate the limitations of the standard % \texttt{picture} commands. But this is done by \PS\ and \PDF\ operators % that might be easily used for user-level commands and hence significantly % improve the drawing possibilities. % % \subsubsection{Circle arcs} % \label{sec:usage:circle-arcs} % % \DescribeMacro\arc % \DescribeMacro{\arc*} % |\arc|\oarg{ANGLE1,ANGLE2}\marg{RAD}\\ % |\arc*|\oarg{ANGLE1,ANGLE2}\marg{RAD}\\ % These commands are generalizations of \cmd{\circle} and \cmd{\circle*} % commands except that the radius instead of the diameter is given. The % optional argument is a comma separated pair of angles given in degrees % (implicit value is $[0,360]$). The arc starts at the point given by % $ANGLE1$. If $ANGLE2$ is greater than $ANGLE1$ the arc is drawn in the % positive orientation (anticlockwise), if the $ANGLE2$ is smaller than % $ANGLE1$ the arc is drawn in the negative orientation (clockwise). The angle % of the arc is the absolute value the difference of $ANGLE1$ and $ANGLE2$. % Hence the pair $[-10,80]$ gives the same arc as $[80,-10]$ (a quarter of a % circle) while the pairs $[80,350]$ and $[350,80]$ give the complementary % arc. % % In fact, the arc is approximated by cubic Bezier curves with an inaccuracy % smaller than 0.0003 (it seems to be sufficiently good). % % If \cmd{\squarecap} is active then \cmd{\arc\marg{RAD}} produces a circle % with a square. % % An equivalent \cmd{\pIIearc} to \cmd{\arc} is defined to solve possible % conflicts with other packages. % % \subsubsection{Line, Vector, polyline, polyvector, and polygon} % \label{sec:usage:lines+polygons} % % \DescribeMacro\Line % \DescribeMacro\polyline % \DescribeMacro\Vector % \DescribeMacro\polyvector % \DescribeMacro\polygon % \DescribeMacro{\polygon*} % |\Line|\parg{X1,Y1}\parg{X2,Y2}\\ % |\polyline|\parg{X1,Y1}\parg{X2,Y2}\dots\parg{Xn,Yn}\\ % |\Vector|\parg{X1,Y1}\parg{X2,Y2}\\ % |\polyvector|\parg{X1,Y1}\parg{X2,Y2}\dots\parg{Xn,Yn}\\ % |\polygon|\parg{X1,Y1}\parg{X2,Y2}\dots\parg{Xn,Yn}\\ % |\polygon*|\parg{X1,Y1}\parg{X2,Y2}\dots\parg{Xn,Yn}\\ % A natural way how to describe a line segment is to give the coordinates of % the endpoints. The syntax of the \cmd{\line}/\cmd{\vector} is different % because % the lines in the standard \texttt{picture} environment are made from small % line segments of a limited number of slopes given in a font. However, this % package changes the \cmd{\line} command computing the coordinates of the % endpoints and using an internal macro for drawing a line segment with given % endpoints. Hence it would be crazy do not use this possibility directly. % This is done by the commands \cmd{\Line} and \cmd{\Vector}. The commands % \cmd{\polyline} and \cmd{\polyvector} draws a % stroken line/vector connecting points with given coordinates. The command % \cmd{\polygon} draws a polygon with given vertices, the star variant gives % filled polygon. At least two points should be given. % % These command need not be used within a \cmd{\put} command (if the % coordinates are absolute). % % \subsubsection{Path commands} % \label{sec:usage:path-commands} % % \DescribeMacro\moveto % \DescribeMacro\lineto % \DescribeMacro\curveto % \DescribeMacro\circlearc % |\moveto|\parg{X,Y}\\ % |\lineto|\parg{X,Y}\\ % |\curveto|\parg{X2,Y2}\parg{X3,Y3}\parg{X4,Y4}\\ % |\circlearc|\oarg{N}\marg{X}\marg{Y}\marg{RAD}\marg{ANGLE1}\marg{ANGLE2}\\ % These commands directly correspond to the \PS\ and \PDF\ path operators. You % start defining a path giving its initial point by \cmd{\moveto}. Then you % can consecutively add a line segment to a given point by \cmd{\lineto}, a % cubic Bezier curve by \cmd{\curveto} (two control points and the endpoint % are given) or an arc by \cmd{\circlearc} (mandatory parameters are % coordinates of the center, radius, initial and final angle). % % Drawing arcs is a bit more complicated. There is a special operator only in % \PS\ (not in \PDF) but also in \PS\ it is approximated by cubic Bezier % curves. Here we use common definition for \PS\ and \PDF. The arc is drawn % such that the initial point given by the initial angle is rotated by % $ANGLE2-ANGLE1$ (anticlockwise for positive value and clockwise for negative % value) after reducing this difference to the interval $[-720, 720]$. % Implicitely (the optional parameter $N=0$) before drawing an arc a % \cmd{\lineto} to the initial point of the arc is added. For $N=1$ % \cmd{\moveto} instead of \cmd{\lineto} is executed---it is useful if you % start the path by an arc and do not want to compute and set the initial % point. For $N=2$ the \cmd{\lineto} before drawing the arc is omitted---it % leads to a bit shorter code for the path but you should be sure that the % already defined part of the path ends precisely at the initial point of the % arc. % % \DescribeMacro\closepath % \DescribeMacro\strokepath % \DescribeMacro\fillpath % The command \cmd{\closepath} is equivalent to \cmd{\lineto} to the initial % point of the path. After defining paths you might use either % \cmd{\strokepath} to draw them or, for closed paths, \cmd{\fillpath} to draw % an area bounded by them. % % The path construction need not be used within a \cmd{\put} command (if the % coordinates are absolute). % % \subsubsection{Ends of paths, joins of subpaths} % \label{sec:usage:ends-joins} % % \DescribeMacro\buttcap % \DescribeMacro\roundcap % \DescribeMacro\squarecap % The shape of ends of paths is controlled by the following commands: % \cmd{\buttcap} (implicit) define the end as a line segment, \cmd{\roundcap} % adds a halfdisc, \cmd{\squarecap} adds a halfsquare. While \cmd{\squarecap} % is ignored for the path with zero length, \cmd{\roundcap} places a disc to % the given point. These commands do not apply to \cmd{\vector} and to % closed paths (\cmd{\circle}, full \cmd{\oval}, % parameter, path constructions ended by \cmd{\closepath}). % % \DescribeMacro\miterjoin % \DescribeMacro\roundjoin % \DescribeMacro\beveljoin % The shape of joins of subpaths is controlled by the following commands: % \cmd{\miterjoin} (implicit) might be defined in such a way that % ``boundaries'' of subpaths are prolonged until they intersect (it might be a % rather long distance for lines with a small angle between them); % \cmd{\roundjoin} corresponds to \cmd{\roundcap} for both subpaths; % \cmd{\beveljoin} adds a convex hull of terminal line segments of both % subpaths. % % \StopEventually{^^A % \Acknowledgements % ^^A \typeout{!!! % ^^A \ifx\Finale\relax \string\OnlyDescription % ^^A \else \string\AlsoImplementation \fi}^^A % ^^A Dirty Hack: % \ifx\Finale\relax ^^A \OnlyDescription % \begin{thebibliography}{9} % \raggedright % % \bibitem{LAMPORT} Leslie Lamport: \textit{\LaTeX\ -- A Document % Preparation System}, 2nd ed., 1994 % % \bibitem{PSTRICKS} Timothy Van Zandt: \textit{The pstricks bundle.} % \texttt{CTAN:~graphics/pstricks/}, 1993, 1994, 2000 % % \bibitem{PSPICTURE} David Carlisle: \textit{The pspicture package.} % \texttt{CTAN:~macros/latex/contrib/carlisle/}, 1992 % % \bibitem{EBEZIER} Gerhard A. Bachmaier: \textit{The ebezier package.} % \texttt{CTAN:~macros/latex/contrib/ebezier/}, 2002 % % \end{thebibliography}^^A %\else ^^A \AlsoImplementation % \begin{thebibliography}{9} % \raggedright % % \bibitem{LAMPORT} Leslie Lamport: \textit{\LaTeX\ -- A Document % Preparation System}, 2nd ed., 1994 % % \bibitem{COMPANION} Michel Goossens, Frank Mittelbach, Alexander % Samarin: \textit{The \LaTeX\ Companion}, 1993 % % \bibitem{EBEZIER} Gerhard A. Bachmaier: \textit{The ebezier package.} % \texttt{CTAN:~macros/latex/contrib/ebezier/}, 2002 % % \bibitem{PICTEX} Michael Wichura: \textit{The PiC\TeX\ package.} % \texttt{CTAN:~graphics/pictex}, 1987 % % \bibitem{PSPICTURE} David Carlisle: \textit{The pspicture package.} % \texttt{CTAN:~macros/latex/contrib/carlisle/}, 1992 % % \bibitem{TRIG} David Carlisle: \textit{The trig package.} % \texttt{CTAN:~macros/latex/required/graphics/}, 1999 % % \bibitem{PSPIC} Kresten Krab Thorup: \textit{The pspic package.} % \texttt{CTAN:~macros/latex209/contrib/misc/}, 1991 % % \bibitem{PSTRICKS} Timothy Van Zandt: \textit{The pstricks bundle.} % \texttt{CTAN:~graphics/pstricks/}, 1993, 1994, 2000 % % ^^A Wichura@Galton.Uchicago.EDU % % \end{thebibliography} % % \PrintChanges % \PrintIndex % %\fi % } ^^A \StopEventually % % ^^A % \clearpage % % \section{Implementation} % % ^^A cite some of these packages !!! ??? % Unlike other packages that have reimplemented or extended some of % the commands from \SL's \texttt{picture} environment, % we do not use special fonts, % nor draw arbitrary shapes by the means of myriads of small (point) % characters, % nor do we use sophisticated programming in some back-end % programming language. % % In its present state, this implementation supports just \PS\ and % \PDF\ as back-end formats. % It just calculates the necessary control points and uses primitive % path drawing operators. % % \begin{macrocode} %<*package> % \end{macrocode} % % \subsection{Initialisation} % % \begin{macro}{\Gin@codes} % First we save the catcodes of some characters, and set them to % fixed values whilst this file is being read. % \changes{v0.2o}{2004/06/25} % {Save and restore catcodes (HjG)} % (This is done in almost the same manner as in the \textsf{graphics} % and \textsf{color} packages. Alas, we don't need nor want to have % |*| as part of control sequence names, so we omit it here.) % \begin{macrocode} \edef\Gin@codes{% \catcode`\noexpand\^^A\the\catcode`\^^A\relax \catcode`\noexpand\"\the\catcode`\"\relax % \catcode`\noexpand\*\the\catcode`\*\relax \catcode`\noexpand\!\the\catcode`\!\relax \catcode`\noexpand\:\the\catcode`\:\relax} % \end{macrocode} % % \begin{macrocode} \catcode`\^^A=\catcode`\% \@makeother\"% % \catcode`\*=11 \@makeother\!% \@makeother\:% % \end{macrocode} % \end{macro} % % \subsection{Preliminaries} % % \begin{macro}{\@defaultunitsset} % Command to accept a number or length expression. % Added to \LaTeX\ 2020-10-01 release but provided here for older releases. % % Set a length register, |#1|, % accepting number or an etex length expression, |#2|, % with default unit, |#3|. % % |#3| can be a literal unit such as |cm| or a length register such % as |\unitlength|. % % This is used in all |picture| commands that take picture coordinates. % So |\put(2,2)| as previously but now |\put(\textwidth-5cm,0.4\texteight)| % Note that you can only use expressions with lengths, |\put(1+2,0)| is not % supported. % \begin{macrocode} \def\@defaultunitsset#1#2#3{% \@defaultunits#1\dimexpr#2#3\relax\relax\@nnil} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@mode} % \begin{macro}{\pIIe@code} % \begin{macro}{\Gin@driver} % The first two of these commands determine how the \textsf{pict2e} % package works internally; % they should be defined properly by the % |p2e-|\meta{driver}\linebreak[0]|.def| % files. % (See file \texttt{p2e-drivers.dtx} for details and sample % implementations.) % % The latter command is well known from the \textsf{graphics} and % \textsf{color} packages from the \SL\ graphics bundle; % it should be set by a package option---most likely in a (system % dependent) configuration file \texttt{pict2e.cfg}. % (File \texttt{p2e-drivers.dtx} contains an example configuration % file suitable for the \teTeX\ and \TeXlive\ distributions; % it will be extracted as \texttt{pict2e-example.cfg}.) % \begin{macrocode} \newcommand*\pIIe@mode{-1} \newcommand*\pIIe@code[1]{} \providecommand*\Gin@driver{} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\pIIe@tempa} % \begin{macro}{\pIIe@tempb} % \begin{macro}{\pIIe@tempc} % At times, we need some temporary storage bins. % However, we only use some macros and do not allocate any new % registers; the ``superfluous'' ones from the picture module of the % kernel (|ltpictur.dtx|) and the general scratch registers should % suffice. % ^^A (This leads to somewhat vulnerable code below!) % \begin{macrocode} \newcommand*\pIIe@tempa{} \newcommand*\pIIe@tempb{} \newcommand*\pIIe@tempc{} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \subsection{Option processing} % % The driver options are not much of a surprise: % they are similar to those of the \textsf{graphics} and % \textsf{color} packages. % \changes{v0.3b}{2016/02/05}{New option `luatex' (RN)} % \begin{macrocode} \DeclareOption{dvips}{\def\Gin@driver{dvips.def}} \DeclareOption{xdvi}{\ExecuteOptions{dvips}} \DeclareOption{dvipdf}{\def\Gin@driver{dvipdf.def}} \DeclareOption{dvipdfm}{\def\Gin@driver{dvipdfm.def}} \DeclareOption{dvipdfmx}{\def\Gin@driver{dvipdfmx.def}} \DeclareOption{pdftex}{\def\Gin@driver{pdftex.def}} \DeclareOption{luatex}{\def\Gin@driver{luatex.def}} \DeclareOption{xetex}{\def\Gin@driver{xetex.def}} \DeclareOption{dvipsone}{\def\Gin@driver{dvipsone.def}} \DeclareOption{dviwindo}{\ExecuteOptions{dvipsone}} \DeclareOption{oztex}{\ExecuteOptions{dvips}} \DeclareOption{textures}{\def\Gin@driver{textures.def}} \DeclareOption{pctexps}{\def\Gin@driver{pctexps.def}} \DeclareOption{pctex32}{\def\Gin@driver{pctex32.def}} \DeclareOption{vtex}{\def\Gin@driver{vtex.def}} % \end{macrocode} % Request ``original'' \LaTeX\ mode. % ^^A Emulation. To be implemented yet. % \begin{macrocode} \DeclareOption{original}{\def\pIIe@mode{0}} % \end{macrocode} % % \begin{macro}{\ifpIIe@pdfliteral@ok} % \begin{macro}{\pIIe@pdfliteral} % Check, whether if \cmd{\pIIe@pdfliteral} is given in the driver file or % \cmd{\pdfliteral} available directly. % \begin{macrocode} \newif\ifpIIe@pdfliteral@ok \pIIe@pdfliteral@oktrue \ifx\pIIe@pdfliteral\@undefined \ifx\pdfliteral\@undefined \pIIe@pdfliteral@okfalse \def\pIIe@pdfliteral#1{% \PackageWarning{pict2e}{pdfliteral not supported}% }% \else \let\pIIe@pdfliteral\pdfliteral \fi \fi % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\pIIe@buttcap} % Do \cmd{\buttcap} only if available. % \begin{macrocode} \def\pIIe@buttcap{% \ifpIIe@pdfliteral@ok \buttcap \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\pIIe@FAL} % \begin{macro}{\pIIe@FAW} % \begin{macro}{\pIIe@CAW} % \begin{macro}{\pIIe@FAI} % Some macros to parametrize the shape of the vector outline. % The following values are “hand optimized” with the aim of emulating % \LaTeX-style arrows. They also seem suitable for our \PSTricks-style arrows. % See Figures~\ref{fig:vector:ltx} and~\ref{fig:vector:pst}. % \changes{v0.1x}{2003/11/27}{Introduce ``inset''. (RN,HjG)} % \begin{macrocode} \newcommand*\pIIe@FAL{1.52}% \newcommand*\pIIe@FAW{3.2}% \newcommand*\pIIe@CAW{1.5pt}% \newcommand*\pIIe@FAI{0.25}% % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \begin{macro}{\ltxarrows} % \begin{macro}{\pstarrows} % The following user-level macros can be used to change the arrow style % (\LaTeX-style is the default). % \changes{v0.3d}{2020/06/13}{New user-level macros \cmd{\ltxarrows} % and \cmd{\pstarrows}. (RN)} % \begin{macrocode} \newcommand*\ltxarrows{% \let\pIIe@vector=\pIIe@vector@ltx } \newcommand*\pstarrows{% \let\pIIe@vector=\pIIe@vector@pst } % \end{macrocode} % \end{macro} % \end{macro} % \begin{macrocode} \DeclareOption{ltxarrows}{\AtEndOfPackage{\ltxarrows}} \DeclareOption{pstarrows}{\AtEndOfPackage{\pstarrows}} % \end{macrocode} % % \begin{macro}{\pIIe@debug@comment} % This makes debugging easier. % \begin{macrocode} \newcommand*\pIIe@debug@comment{} \DeclareOption{debug}{% \def\pIIe@debug@comment{^^J^^J\@percentchar\space >>> pict2e <<<^^J}% \begingroup \@ifundefined{pdfcompresslevel}{}{\global\pdfcompresslevel\z@}% \endgroup} % \end{macrocode} % \end{macro} % A special variant of debugging. (Obsolescent? Once used for % performance measurements: arctan vs.\ pyth-add versions of % \cmd{\vector}.) % \begin{macrocode} \DeclareOption{hide}{\AtEndOfPackage{% % \def\pIIe@code#1{}% \let\pIIe@code\@gobble }} % \end{macrocode} % Unknown options default to mode ``original.'' % \begin{macrocode} \DeclareOption*{\ExecuteOptions{original}} % \end{macrocode} % By default, arrows are in the \LaTeX\ style. % \begin{macrocode} \ExecuteOptions{ltxarrows} % \end{macrocode} % Like the \textsf{graphics} and \textsf{color} packages, we support a % configuration file. (See file \texttt{p2e-drivers.dtx} for details % and an example.) % \begin{macrocode} \InputIfFileExists{pict2e.cfg}{}{} % \end{macrocode} % This now should make clear which ``mode'' and ``code'' we should use. % \begin{macrocode} \ProcessOptions\relax % \end{macrocode} % % \subsection{Output driver check} % % \begin{macrocode} \ifnum\pIIe@mode=\z@ \PackageInfo{pict2e}{Package option `original' requested} \else % \end{macrocode} % This code fragment is more or less cloned from the % \textsf{graphics} and \textsf{color} packages. % \begin{macrocode} \if!\Gin@driver! \PackageError{pict2e} {No driver specified at all} {You should make a default driver option in a file\MessageBreak pict2e.cfg\MessageBreak eg: \protect\ExecuteOptions{dvips}}% \else \PackageInfo{pict2e}{Driver file: \Gin@driver} \@ifundefined{ver@\Gin@driver}{\input{\Gin@driver}}{} \PackageInfo{pict2e}{Driver file for pict2e: p2e-\Gin@driver} \InputIfFileExists{p2e-\Gin@driver}{}{% \PackageError{pict2e}% {Driver file ``p2e-\Gin@driver'' not found}% {Q: Is the file properly installed? A: No!}} \fi \fi % \end{macrocode} % % \subsection{Mode check} % % For \PS\ and \PDF\ modes. % \begin{macrocode} \ifnum\pIIe@mode>\z@ \ifnum\pIIe@mode<\thr@@ \RequirePackage{trig} % \end{macrocode} % % \begin{macro}{\pIIe@oldline} % \begin{macro}{\pIIe@old@sline} % \begin{macro}{\pIIe@oldvector} % \begin{macro}{\pIIe@old@circle} % \begin{macro}{\pIIe@old@dot} % \begin{macro}{\pIIe@old@bezier} % \begin{macro}{\pIIe@old@cbezier} % \begin{macro}{\pIIe@oldoval} % \begin{macro}{\pIIe@old@oval} % Saved versions of some macros. (Or dummy definitions.) % \begin{macrocode} \let\pIIe@oldline\line \let\pIIe@old@sline\@sline \let\pIIe@oldvector\vector \let\pIIe@old@circle\@circle \let\pIIe@old@dot\@dot \let\pIIe@old@bezier\@bezier \AtBeginDocument{% \@ifundefined{@cbezier}{% \def\pIIe@old@cbezier[#1](#2,#3)(#4,#5)(#6,#7)(#8,#9){}% }{\let\pIIe@old@cbezier\@cbezier}} \let\pIIe@oldoval\oval \let\pIIe@old@oval\@oval % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\OriginalPictureCmds} % Switches back to the original definitions; % for testing and demonstration purposes only. % \begin{macrocode} \newcommand*\OriginalPictureCmds{% \let\@sline\pIIe@old@sline \let\line\pIIe@oldline \let\vector\pIIe@oldvector \let\@circle\pIIe@old@circle \let\@dot\pIIe@old@dot \let\@bezier\pIIe@old@bezier \let\@cbezier\pIIe@old@cbezier \renewcommand*\oval[1][]{\pIIe@oldoval}% \let\@oval\pIIe@old@oval } % \end{macrocode} % \end{macro} % Overambitious drivers. % \begin{macrocode} \else \PackageError{pict2e} {Unsupported mode (\pIIe@mode) specified} {The driver you specified requested a mode\MessageBreak not supported by this version of this package} \fi % \end{macrocode} % Incapable drivers. % \begin{macrocode} \else \ifnum\pIIe@mode<\z@ \PackageError{pict2e} {No suitable driver specified} {You should make a default driver option in a file\MessageBreak pict2e.cfg\MessageBreak eg: \protect\ExecuteOptions{dvips}} \fi \fi % \end{macrocode} % Big switch,\label{big-switch-begin} % completed near the end of the package % (see page~\pageref{big-switch-end}). % \begin{macrocode} \ifnum\pIIe@mode>\z@ % \end{macrocode} % % \subsection{Graphics operators} % % The following definitions allow the \PS\ and \PDF\ operations below % to share some of the code. % \begin{macrocode} \ifcase\pIIe@mode\relax % \end{macrocode} % % \begin{macro}{\pIIe@moveto@op} % \begin{macro}{\pIIe@lineto@op} % \begin{macro}{\pIIe@setlinewidth@op} % \begin{macro}{\pIIe@stroke@op} % \begin{macro}{\pIIe@fill@op} % \begin{macro}{\pIIe@curveto@op} % \begin{macro}{\pIIe@concat@op} % \begin{macro}{\pIIe@closepath@op} % \PS % \begin{macrocode} \or \newcommand*\pIIe@moveto@op{moveto} \newcommand*\pIIe@lineto@op{lineto} \newcommand*\pIIe@setlinewidth@op{setlinewidth} \newcommand*\pIIe@stroke@op{stroke} \newcommand*\pIIe@fill@op{fill} \newcommand*\pIIe@curveto@op{curveto} \newcommand*\pIIe@concat@op{concat} \newcommand*\pIIe@closepath@op{closepath} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\pIIe@moveto@op} % \begin{macro}{\pIIe@lineto@op} % \begin{macro}{\pIIe@setlinewidth@op} % \begin{macro}{\pIIe@stroke@op} % \begin{macro}{\pIIe@fill@op} % \begin{macro}{\pIIe@curveto@op} % \begin{macro}{\pIIe@concat@op} % \begin{macro}{\pIIe@closepath@op} % \PDF % \begin{macrocode} \or \newcommand*\pIIe@moveto@op{m} \newcommand*\pIIe@lineto@op{l} \newcommand*\pIIe@setlinewidth@op{w} \newcommand*\pIIe@stroke@op{S} \newcommand*\pIIe@fill@op{f} \newcommand*\pIIe@curveto@op{c} \newcommand*\pIIe@concat@op{cm} \newcommand*\pIIe@closepath@op{h} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \noindent % (Currently, there are no other modes.) % \begin{macrocode} \fi % \end{macrocode} % % \subsection{Low-level operations} % % \subsubsection{Collecting the graphics instructions and handling the output} % % \begin{macro}{\pIIe@GRAPH} % \begin{macro}{\pIIe@addtoGraph} % \changes{v0.1h}{2003/08/27}{Added newline code (to be improved eventually). % (RN,HjG)} % We collect all \PS\slash\PDF\ output code for a single picture % object in a token register. % \begin{macrocode} \@ifdefinable\pIIe@GRAPH{\newtoks\pIIe@GRAPH} \newcommand*\pIIe@addtoGraph[1]{% \begingroup \edef\x{\the\pIIe@GRAPH\space#1}% \global\pIIe@GRAPH\expandafter{\x}% \endgroup} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\pIIe@fillGraph} % The path will either be filled \dots % \begin{macrocode} \newcommand*\pIIe@fillGraph{\begingroup \@tempswatrue\pIIe@drawGraph} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@strokeGraph} % \dots\ or stroked. % \begin{macrocode} \newcommand*\pIIe@strokeGraph{\begingroup \@tempswafalse\pIIe@drawGraph} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@drawGraph} % Common code. % When we are done with collecting the path of the picture object, we % output the contents of the token register. % % \changes{v0.1d}{2003/07/22}{``gsave/grestore'' added. (RN)} % \changes{v0.1g}{2003/08/23}{``gsave/grestore'' removed. (RN)} % \changes{v0.1i}{2003/08/28}{``gsave/grestore'' restored for PDF % (see `p2e-drivers.dtx'). (RN)} % \begin{macrocode} \newcommand*\pIIe@drawGraph{% \edef\x{\pIIe@debug@comment\space % \end{macrocode} % Instead of scaling individual coordinates, we scale the graph as a whole % (pt$\rightarrow$bp); % see Section~\ref{sec:implementation:transformations}. % \begin{macrocode} \pIIe@scale@PTtoBP}% \if@tempswa \edef\y{\pIIe@fill@op}% \else \edef\x{\x\space \strip@pt\@wholewidth\space\pIIe@setlinewidth@op \pIIe@linecap\pIIe@linejoin\space}% \edef\y{\pIIe@stroke@op}% \fi \expandafter\pIIe@code\expandafter{% \expandafter\x\the\pIIe@GRAPH\space\y}% % \end{macrocode} % \changes{v0.1u}{2003/11/19}{Clear current point after output (HjG)} % Clear the graph and the current point after output. % \begin{macrocode} \global\pIIe@GRAPH{}\xdef\pIIe@CPx{}\xdef\pIIe@CPy{}% \endgroup} % \end{macrocode} % \end{macro} % % \subsubsection{Auxilliary macros} % % The following macros save us a plethora of tokens in subsequent code. % % Note that since we are using \cmd{\@tempdima} and \cmd{\@tempdimb} % both here and in medium-level macros below, we must be careful not % to spoil their values. % % \begin{macro}{\pIIe@CPx} % \begin{macro}{\pIIe@CPy} % \begin{macro}{\pIIe@add@CP} % \changes{v0.1u}{2003/11/21}{% % Rename \cmd{\pIIe@add@XY} to \cmd{\pIIe@add@CP} (HjG)} % The lengths (coordinates) given as arguments will be stored as % ``real'' numbers using the common trick; i.e., they are put in % `dimen' registers, scaled by $2^{16}$. % At the same time, we remember the ``current point.'' % (Not strictly necessary for \PS, but for some operations in \PDF, % e.g., \textsl{rcurveto} emulation.) % \begin{macrocode} \newcommand*\pIIe@CPx{} \newcommand*\pIIe@CPy{} \newcommand*\pIIe@add@CP[2]{% \begingroup \@tempdima#1\xdef\pIIe@CPx{\the\@tempdima}% \@tempdimb#2\xdef\pIIe@CPy{\the\@tempdimb}% \pIIe@addtoGraph{\strip@pt\@tempdima\space\strip@pt\@tempdimb}% \endgroup} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\pIIe@add@nums} % Similar, but does not set the ``current point.'' % Values need not be coordinates (e.g., may be scaling factors, etc.). % \begin{macrocode} \newcommand*\pIIe@add@nums[2]{% \begingroup \@tempdima#1\relax \@tempdimb#2\relax \pIIe@addtoGraph{\strip@pt\@tempdima\space\strip@pt\@tempdimb}% \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@add@num} % Likewise, for a single argument. % \begin{macrocode} \newcommand*\pIIe@add@num[1]{% \begingroup \@tempdima#1\relax \pIIe@addtoGraph{\strip@pt\@tempdima}% \endgroup} % \end{macrocode} % \end{macro} % % \subsection{Medium-level operations} % % \subsubsection{Transformations} % \label{sec:implementation:transformations} % % Transformation operators; not all are currently used. % (Hence, some are untested.) % % \begin{macro}{\pIIe@PTtoBP} % Scaling factor, used below. % ``pt$\rightarrow$bp'' ($72 / 72.27 \approx 0.99626401$). % Note the trailing space! % (Don't delete it, it saves us some tokens.) % \begin{macrocode} \newcommand*\pIIe@PTtoBP{0.99626401 } % \end{macrocode} % \end{macro} % % \begin{macrocode} \ifcase\pIIe@mode\relax % \end{macrocode} % % \begin{macro}{\pIIe@concat} % \begin{macro}{\pIIe@translate} % \begin{macro}{\pIIe@rotate} % \begin{macro}{\pIIe@scale} % \begin{macro}{\pIIe@scale@PTtoBP} % \PS: Use some operators directly. % \begin{macrocode} \or \newcommand*\pIIe@concat[6]{% \begingroup \pIIe@addtoGraph{[}% \@tempdima#1\relax \@tempdimb#2\relax \pIIe@add@nums\@tempdima\@tempdimb \@tempdima#3\relax \@tempdimb#4\relax \pIIe@add@nums\@tempdima\@tempdimb \@tempdima#5\relax \@tempdimb#6\relax \pIIe@add@nums\@tempdima\@tempdimb \pIIe@addtoGraph{] \pIIe@concat@op}% \endgroup} \newcommand*\pIIe@translate[2]{\pIIe@add@nums{#1}{#2}\pIIe@addtoGraph{translate}} \newcommand*\pIIe@rotate[1]{\pIIe@add@num{#1}\pIIe@addtoGraph{rotate}} \newcommand*\pIIe@scale[2]{\pIIe@add@nums{#1}{#2}\pIIe@addtoGraph{scale}} \newcommand*\pIIe@scale@PTtoBP{\pIIe@PTtoBP \pIIe@PTtoBP scale} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\pIIe@concat} % \begin{macro}{\pIIe@translate} % \begin{macro}{\pIIe@rotate} % \begin{macro}{\pIIe@scale} % \begin{macro}{\pIIe@scale@PTtoBP} % \PDF: Emulate. \mbox{\texttt{:-(}} % \begin{macrocode} \or \newcommand*\pIIe@concat[6]{% \begingroup \@tempdima#1\relax \@tempdimb#2\relax \pIIe@add@nums\@tempdima\@tempdimb \@tempdima#3\relax \@tempdimb#4\relax \pIIe@add@nums\@tempdima\@tempdimb \@tempdima#5\relax \@tempdimb#6\relax \pIIe@add@nums\@tempdima\@tempdimb \pIIe@addtoGraph\pIIe@concat@op \endgroup} \newcommand*\pIIe@translate[2]{\pIIe@concat\p@\z@\z@\p@{#1}{#2}} \newcommand*\pIIe@rotate[1]{% \begingroup \@tempdima#1\relax \edef\pIIe@tempa{\strip@pt\@tempdima}% \CalculateSin\pIIe@tempa \CalculateCos\pIIe@tempa \edef\pIIe@tempb{\UseSin\pIIe@tempa}% \edef\pIIe@tempc{\UseCos\pIIe@tempa}% \pIIe@concat{\pIIe@tempc\p@}{\pIIe@tempb\p@}% {-\pIIe@tempb\p@}{\pIIe@tempc\p@}\z@\z@ \endgroup} \newcommand*\pIIe@scale[2]{\pIIe@concat{#1}\z@\z@{#2}\z@\z@} \newcommand*\pIIe@scale@PTtoBP{\pIIe@PTtoBP 0 0 \pIIe@PTtoBP 0 0 \pIIe@concat@op} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \noindent % (Currently, there are no other modes.) % \begin{macrocode} \fi % \end{macrocode} % % \subsubsection{Path definitions} % \label{sec:implementation:path-definitions} % % \begin{macro}{\pIIe@moveto} % Simple things \dots % \begin{macrocode} \newcommand*\pIIe@moveto[2]{% \pIIe@add@CP{#1}{#2}\pIIe@addtoGraph\pIIe@moveto@op} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@lineto} % \dots\ have to be defined, too. % \begin{macrocode} \newcommand*\pIIe@lineto[2]{% \pIIe@add@CP{#1}{#2}\pIIe@addtoGraph\pIIe@lineto@op} % \end{macrocode} % \end{macro} % % \noindent % We'll use \cmd{\pIIe@rcurveto} to draw quarter circles. % (\cmd{\circle} and \cmd{\oval}). % \begin{macrocode} \ifcase\pIIe@mode\relax % \end{macrocode} % % \begin{macro}{\pIIe@rcurveto} % \PS: % Use the ``rcurveto'' operator directly. % \begin{macrocode} \or \newcommand*\pIIe@rcurveto[6]{% \begingroup \@tempdima#1\relax \@tempdimb#2\relax \pIIe@add@nums\@tempdima\@tempdimb \@tempdima#3\relax \@tempdimb#4\relax \pIIe@add@nums\@tempdima\@tempdimb \@tempdima#5\relax \@tempdimb#6\relax \pIIe@add@CP\@tempdima\@tempdimb \pIIe@addtoGraph{rcurveto}% \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@rcurveto} % \PDF: % It's necessary to emulate the \PS\ operator ``rcurveto''. % For this, the ``current point'' must be known, i.e., all macros which % change the ``current point'' must set \cmd{\pIIe@CPx} and % \cmd{\pIIe@CPy}. % \begin{macrocode} \or \newcommand*\pIIe@rcurveto[6]{% \begingroup \@tempdima#1\advance\@tempdima\pIIe@CPx\relax \@tempdimb#2\advance\@tempdimb\pIIe@CPy\relax \pIIe@add@nums\@tempdima\@tempdimb \@tempdima#3\advance\@tempdima\pIIe@CPx\relax \@tempdimb#4\advance\@tempdimb\pIIe@CPy\relax \pIIe@add@nums\@tempdima\@tempdimb \@tempdima#5\advance\@tempdima\pIIe@CPx\relax \@tempdimb#6\advance\@tempdimb\pIIe@CPy\relax \pIIe@add@CP\@tempdima\@tempdimb \pIIe@addtoGraph\pIIe@curveto@op \endgroup} % \end{macrocode} % \end{macro} % % \noindent % (Currently, there are no other modes.) % \begin{macrocode} \fi % \end{macrocode} % % \begin{macro}{\pIIe@curveto} % This is currently only used for Bezier curves and for drawing the % heads of \LaTeX-like arrows. % Note: It's the same for \PS\ and \PDF. % \begin{macrocode} \newcommand*\pIIe@curveto[6]{% \begingroup \@tempdima#1\relax \@tempdimb#2\relax \pIIe@add@nums\@tempdima\@tempdimb \@tempdima#3\relax \@tempdimb#4\relax \pIIe@add@nums\@tempdima\@tempdimb \@tempdima#5\relax \@tempdimb#6\relax \pIIe@add@CP\@tempdima\@tempdimb \pIIe@addtoGraph\pIIe@curveto@op \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@closepath} % \begin{macrocode} \newcommand*\pIIe@closepath{\pIIe@addtoGraph\pIIe@closepath@op} % \end{macrocode} % \end{macro} % % \subsection{``Pythagorean Addition'' and Division} % % \begin{macro}{\pIIe@pyth} % This algorithm is copied from the \PiCTeX\ package % \cite{PICTEX} by Michael Wichura, with his permission % ^^A (cite Email!?). % % Here is his description: % \begin{quote} % Suppose $x>0$, $y>0$. % Put $s = x+y$. Let $z = (x^2+y^2)^{1/2}$. % Then $z = s\times f$, where % \[ % f = (t^2 + (1-t)^2)^{1/2} = ((1+\tau^2)/2)^{1/2} % \] % and $t = x/s$ and $\tau = 2(t-1/2)$. % \end{quote} % \changes{v0.2r}{2005/07/15}{Two wrong global assignments changed. (RN)} % \begin{macrocode} \newcommand*\pIIe@pyth[3]{% \begingroup \@tempdima=#1\relax % \end{macrocode} % $\cmd{\@tempdima}=\mathrm{abs}(x)$ % \begin{macrocode} \ifnum\@tempdima<\z@\@tempdima=-\@tempdima\fi \@tempdimb=#2\relax % \end{macrocode} % $\cmd{\@tempdimb}=\mathrm{abs}(y)$ % \begin{macrocode} \ifnum\@tempdimb<\z@\@tempdimb=-\@tempdimb\fi % \end{macrocode} % $\cmd{\@tempdimb} = s = \mathrm{abs}(x)+\mathrm{abs}(y)$ % \begin{macrocode} \advance\@tempdimb\@tempdima \ifnum\@tempdimb=\z@ % \end{macrocode} % $\cmd{\@tempdimc} = z = \sqrt{(x^2+y^2)}$ % \begin{macrocode} \@tempdimc=\z@ \else % \end{macrocode} % $\cmd{\@tempdima} = 8 \times\mathrm{abs}(x)$ % \begin{macrocode} \multiply\@tempdima 8\relax % \end{macrocode} % $\cmd{\@tempdimc} = 8\,t = 8 \times\mathrm{abs}(x) / s$ % \begin{macrocode} \pIIe@divide\@tempdima\@tempdimb\@tempdimc % \end{macrocode} % $\cmd{\@tempdimc} = 4\tau = (8\,t-4)$ % \begin{macrocode} \advance\@tempdimc -4pt \multiply\@tempdimc 2 \edef\pIIe@tempa{\strip@pt\@tempdimc}% % \end{macrocode} % $\cmd{\@tempdima} = (8\,\tau)^2$ % \begin{macrocode} \@tempdima=\pIIe@tempa\@tempdimc % \end{macrocode} % $\cmd{\@tempdima} = [64+(8\,\tau)^2]/2 =(8\,f)^2$ % \begin{macrocode} \advance\@tempdima 64pt \divide\@tempdima 2\relax % \end{macrocode} % initial guess at $\sqrt{(u)}$ % \begin{macrocode} \@dashdim=7pt % \end{macrocode} % $\cmd{\@dashdim} = \sqrt{(u)}$ % \begin{macrocode} \pIIe@@pyth\pIIe@@pyth\pIIe@@pyth \edef\pIIe@tempa{\strip@pt\@dashdim}% \@tempdimc=\pIIe@tempa\@tempdimb % \end{macrocode} % $\cmd{\@tempdimc} = z = (8\,f)\times s / 8$ % \begin{macrocode} \global\divide\@tempdimc 8 \fi \edef\x{\endgroup#3=\the\@tempdimc}% \x} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@@pyth} % $\cmd{\@dashdim} = g \leftarrow (g + u/g)/2$ % \begin{macrocode} \newcommand*\pIIe@@pyth{% \pIIe@divide\@tempdima\@dashdim\@tempdimc \advance\@dashdim\@tempdimc \divide\@dashdim\tw@} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@divide} % The following macro for division is a slight modification of the macro from % \texttt{curve2e} by Claudio Beccari with his permission. % Real numbers are represented as dimens in \texttt{pt}. % \begin{macrocode} \newcommand*\pIIe@divide[3]{% % \end{macrocode} % All definitions inside a group. % \begin{macrocode} \begingroup \dimendef\Numer=254\relax \dimendef\Denom=252\relax \countdef\Num=254\relax \countdef\Den=252\relax \countdef\I=250\relax \countdef\Numb=248\relax \Numer #1\relax \Denom #2\relax % \end{macrocode} % Make numerator and denominator nonnegative, save sign. % \begin{macrocode} \ifdim\Denom<\z@ \Denom -\Denom \Numer=-\Numer \fi \ifdim\Numer<\z@ \def\sign{-}\Numer=-\Numer \else \def\sign{}\fi % \end{macrocode} % Use \cmd{\maxdimen} for $x/0$ (this should not appear). % \begin{macrocode} \ifdim\Denom=\z@ \edef\Q{\strip@pt\maxdimen}% \PackageWarning{pict2e}% {Division by 0, \sign\strip@pt\maxdimen\space used}{}% \else % \end{macrocode} % Converse to integers and find integer part of the ratio. If it is too % large (dimension overflow), use \cmd{\maxdimen} otherwise find the % remainder and start the iteration process to find 6 digits of the decimal % expression. % \begin{macrocode} \Num=\Numer \Den=\Denom \Numb=\Num \divide\Numb\Den \ifnum\Numb>16383 \edef\Q{\strip@pt\maxdimen}% \PackageWarning{pict2e}% {Division overflow, \sign\strip@pt\maxdimen\space used}{}% \else \edef\Q{\number\Numb.}% \multiply \Numb\Den \advance\Num -\Numb \I=6\relax \@whilenum \I>\z@ \do{\pIIe@@divide\advance\I\m@ne}% \fi \fi % \end{macrocode} % A useful trick to define \#3 outside the group without using \cmd{\global} % (if the macro is used inside another group.) % \begin{macrocode} \edef\tempend{\noexpand\endgroup\noexpand#3=\sign\Q\p@}% \tempend} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@@divide} % Iteration macro for finding decimal expression of the ratio. \cmd{\Num} is % the remainder of the previous division, \cmd{\Den} is the denominator (both % are integers). % \begin{macrocode} \def\pIIe@@divide{% % \end{macrocode} % Reduce both numerator and denominator if necessary to avoid overflow in % the next step. % \begin{macrocode} \@whilenum \Num>214748364 \do{\divide\Num\tw@ \divide\Den\tw@}% % \end{macrocode} % Find the next digit of the decimal expression. % \begin{macrocode} \multiply \Num 10 \Numb=\Num \divide\Numb\Den \edef\Q{\Q\number\Numb}% % \end{macrocode} % Find the remainder. % \begin{macrocode} \multiply \Numb\Den \advance \Num -\Numb % \end{macrocode} % Stop the iteration if the remainder is zero. % \begin{macrocode} \ifnum\Num>\z@\else\I=0\fi} % \end{macrocode} % \end{macro} % % \subsection{High-level operations} % % \begin{macro}{\pIIe@checkslopeargs} % \changes{v0.3c}{2019/08/20}{\cmd{\edef} for parameters stored in macros -- % suggested by Phelype Oleinik (RN)} % Common code for \cmd{\line} and \cmd{\vector}. % \begin{macrocode} \newcommand*\pIIe@checkslopeargsline[2]{% \pIIe@checkslopeargs{#1}{#2}{16383}} \newcommand*\pIIe@checkslopeargsvector[2]{% \pIIe@checkslopeargs{#1}{#2}{1000}} \newcommand*\pIIe@checkslopeargs[3]{% \edef\@tempa{#1}\expandafter\pIIe@checkslopearg\@tempa.:{#3}% \edef\@tempa{#2}\expandafter\pIIe@checkslopearg\@tempa.:{#3}% % \end{macrocode} % A bit incompatible with \SL: slope \((0,0)\) raises an error. % \begin{macrocode} \ifdim #1\p@=\z@ \ifdim #2\p@=\z@ \@badlinearg \fi\fi} \def\pIIe@checkslopearg #1.#2:#3{% \def\@tempa{#1}% \ifx\@tempa\empty\def\@tempa{0}\fi \ifx\@tempa\space\def\@tempa{0}\fi \ifnum\ifnum\@tempa<\z@-\fi\@tempa>#3 \@badlinearg \fi} \def\@badlinearg{\PackageError {pict2e}{Bad \protect\line\space or \protect\vector\space argument}{}} % \end{macrocode} % \end{macro} % % \subsubsection{Line} % \label{sec:implementation:line} % % \begin{macro}{\line} % \changes{v0.2l}{2004/04/08}{Macro added (RN/HjG)} % \cmd{\line}\parg{x,y}\marg{$l_x$}: % \changes{v0.2o}{2004/06/25}{Use \cmd{\pIIe@checkslopeargs} (HjG)} % \changes{v0.2t}{2008/05/11}{All lines by \cmd{\@sline} (JT)} % \begin{macrocode} \def\line(#1,#2)#3{% \begingroup \pIIe@checkslopeargsline{#1}{#2}% \@tempdima=#1pt\relax \@tempdimb=#2pt\relax \@defaultunitsset\@linelen{#3}\unitlength \ifdim\@linelen<\z@ \@badlinearg \else \pIIe@sline \pIIe@moveto\z@\z@ \pIIe@lineto\@xdim\@ydim \pIIe@strokeGraph % \end{macrocode} % Simulated bounding box % \begin{macrocode} \box\@tempboxa \fi \endgroup} % \end{macrocode} % \end{macro} % \begin{macro}{\pIIe@sline} % Common code for \cmd{\line} and \cmd{\vector}. % \changes{v0.3d}{2020/06/13}{Simulated bounding boxes for \cmd{\line} % and \cmd{\vector} suggested by Donald Arseneau (RN)} % \begin{macrocode} \newcommand*\pIIe@sline{% % \end{macrocode} % Calculation of the endpoints \cmd{\@xdim}, \cmd{\@ydim} % (used for \cmd{\line} only). % \begin{macrocode} \ifdim\@tempdima=\z@ \ifdim\@tempdimb<\z@\@linelen-\@linelen\fi \@ydim=\@linelen \@xdim=\z@ \else \ifdim\@tempdima<\z@\@linelen-\@linelen\fi \ifdim\@tempdimb=\z@ \@xdim=\@linelen \@ydim=\z@ \else \pIIe@divide\@tempdimb\@tempdima\dimen@ \@ydim=\strip@pt\dimen@\@linelen \@xdim=\@linelen \fi \fi % \end{macrocode} % Prepare a box that can be used as a bounding box for \cmd{\line} and % \cmd{\vector} to achieve the same behavior as standard \LaTeX\ outside % of a picture environment. % \begin{macrocode} \@ovxx=\ifnum\@xdim=\z@ \z@\else\@linelen\fi \@ovyy=\ifnum\@ydim<\z@ \z@\else\@ydim\fi \@ovdy=\ifnum\@ydim<\z@ -\@ydim\else\z@\fi \setbox\@tempboxa\hbox{% \vrule\@height \@ovyy \@depth \@ovdy \@width \z@ \vrule\@height \z@ \@depth \z@ \@width \@ovxx}} % \end{macrocode} % \end{macro} % \subsubsection{Vector} % \label{sec:implementation:vector} % % \begin{macro}{\vector} % Unlike \cmd{\line}, \cmd{\vector} must be redefined, because % the kernel version checks for illegal slope arguments. % % \cmd{\vector}\parg{x,y}\marg{$l_x$}: % Instead of calculating \(\theta = \arctan \frac{y}{x}\), we use % ``pythagorean addition''~\cite{PICTEX} % to determine \(s=\sqrt{x^2+y^2}\) and to obtain the length % of the vector \(l = l_x \cdot \frac{s}{x}\) % and the values of \(\sin \theta = \frac{y}{s}\) and % \(\cos \theta = \frac{x}{s}\) for the rotation of the coordinate system. % ^^A (This is faster; is it more accurate?) % \changes{v0.2o}{2004/06/25}{Use \cmd{\pIIe@checkslopeargs} (HjG)} % \begin{macrocode} \def\vector(#1,#2)#3{% \begingroup \pIIe@checkslopeargsvector{#1}{#2}% \@tempdima=#1pt\relax \@tempdimb=#2pt\relax \@defaultunitsset\@linelen{#3}\unitlength \ifdim\@linelen<\z@ \@badlinearg \else \pIIe@sline \@defaultunitsset\@linelen{#3}\unitlength \pIIe@pyth{\@tempdima}{\@tempdimb}\dimen@ \ifdim\@tempdima=\z@ \else \ifdim\@tempdimb=\z@ \else % \end{macrocode} % This calculation is only necessary, if the vector is actually % sloped. % \begin{macrocode} \pIIe@divide\dimen@{\@tempdima}\@xdim \@linelen\strip@pt\@xdim\@linelen \ifdim\@linelen<\z@\@linelen-\@linelen\fi \fi \fi % \end{macrocode} % \BigIndent $\sin\theta$ and $\cos\theta$ % \begin{macrocode} \pIIe@divide{\@tempdimb}\dimen@\@ydim \pIIe@divide{\@tempdima}\dimen@\@xdim % \end{macrocode} % Rotate the following vector\slash arrow outlines by angle $\theta$:\par % \BigIndent % $\cos{\theta}$\quad$\sin{\theta}$\quad$-\sin{\theta}$\quad$\cos{\theta}$\quad $0\quad 0$ % \begin{macrocode} \pIIe@concat\@xdim\@ydim{-\@ydim}\@xdim\z@\z@ % \end{macrocode} % Internal command to draw the outline of the vector\slash arrow. % \begin{macrocode} \pIIe@vector \pIIe@fillGraph % \end{macrocode} % Simulated bounding box % \begin{macrocode} \box\@tempboxa \fi \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@vector} % \changes{v0.1u}{2003/11/21}{New ancillary macro (HjG)} % This command should be \cmd{\def}'ed or \cmd{\let} to a macro % that generates the vector's outline path. % Now initialized by package options, via |\AtEndOfPackage|. % \begin{macrocode} \newcommand*\pIIe@vector{} % \end{macrocode} % \end{macro} % % % \paragraph{\LaTeX\ version} % % The arrows drawn by the variant generated by the \textsf{ltxarrows} % package option are % modeled after those in the fonts used by the \SL\ version of the % picture commands (|ltpictur.dtx|). % ^^A line10 linew10 % See Figure~\ref{fig:vector:ltx}. % % \begin{figure} % \setlength\unitlength{.0067\linewidth}\hfill % \makebox[0pt][r]{^^A % \begin{minipage}[c]{17em}^^A % \unboldmath\small % \setlength\arraycolsep{.5\arraycolsep}^^A % \begin{eqnarray*} % L & = & \cmd{\@linelen} \\ % W & = & \cmd{\@wholewidth} = 2\times\cmd{\@halfwidth} \\ % AW & = & \cmd{\pIIe@FAW}\times W + \cmd{\pIIe@CAW} \\ % AL & = & \cmd{\pIIe@FAL}\times AW \\ % IN & = & \cmd{\pIIe@FAI}\times AW / 2 % \end{eqnarray*} % \end{minipage}}^^A % \hspace{\marginparsep} % \begin{minipage}[c]{105\unitlength}^^A % \rule{\linewidth}{0pt} % \begin{picture}(105,55)(0,-25) % \boldmath\bfseries % \THICKLINES % \put(100,0){\FPOINT} \put(101,-1){$P_1$} % ^^A \makeatletter % ^^A \pIIe@addtoGraph{^^J^^J\@percentchar\space >>> HUGO <<<^^J}^^A % ^^A \makeatother % \CBEZIER{100,0}{86.67,-1.67}{73.33,-8.33}{60,-20}^^A P1--P2 % \put(60,-20){\FPOINT} \put(61,-23){$P_2$} % \put(60,-20){\line(0,1){10}}^^A P2--P3 % \put(60,-10){\FPOINT} \put(61,-9){$P_3$} % \put(60,-10){\line(-1,0){60}}^^A P3--P4 % \put(0,-10){\FPOINT} \put(1,-8){$P_4$} % \put(0,-10){\line(0,1){20}}^^A P4--P5 % \put(0,10){\FPOINT} \put(1,6){$P_5$} % \put(0,10){\line(1,0){60}}^^A P5--P6 % \put(60,10){\FPOINT} \put(61,7){$P_6$} % \put(60,10){\line(0,1){10}}^^A P6--P7 % \put(60,20){\FPOINT} \put(61,21){$P_7$} % ^^A \makeatletter % ^^A \pIIe@addtoGraph{^^J^^J\@percentchar\space >>> HUGO <<<^^J}^^A % ^^A \makeatother % \CBEZIER{60,20}{73.33,8.33}{86.67,1.67}{100,0}^^A P7--P1 % \thinlines % \put(100,0){\line(-2,-1){40}}^^A P1--P2 % \put(60,20){\line(2,-1){40}}^^A P7--P1 % ^^A % \put(93,-8){$P_a$} % \put(93,-6){\line(-3,2){6}}^^A % \put(80,-5){\OPOINT} % \put(73,-5){$P_m$} % \put(67,-8){$P_b$} % ^^A % \put(93,6){$P_d$} % \put(93,6){\line(-3,-2){6}}^^A % \put(80,5){\OPOINT} % \put(73,3){$P_n$} % \put(67,6){$P_c$} % ^^A % \put(-2,0){\line(1,0){4}} % \put(10,-7){\vector(-10,7){10}}\put(10,-8){$\,(0,0)$} % ^^A % \put(60,-20){\line(0,-1){5}}\put(100,0){\line(0,-1){25}} % \put(60,-25){\vector(1,0){40}}\put(100,-25){\vector(-1,0){40}} % \put(77,-24){$AL$} % ^^A % \put(0,10){\line(0,1){15}}\put(100,0){\line(0,1){25}} % \put(0,25){\vector(1,0){100}}\put(100,25){\vector(-1,0){100}} % \put(48,26){$L$} % ^^A % \put(60,-20){\line(-1,0){5}} \put(60,20){\line(-1,0){5}} % \put(55,-20){\vector(0,1){40}} \put(55,20){\vector(0,-1){40}} % \put(47,-2){$AW$} % ^^A % \put(25,-10){\vector(0,1){20}}\put(25,10){\vector(0,-1){20}} % \put(20,-2){$W$} % \put(80,-10){\line(1,0){5}} \put(80,-5){\line(1,0){5}} % \put(85,-7.5){\vector(0,-1){2.5}} \put(85,-7.5){\vector(0,1){2.5}} % \put(86,-10){$IN$} % \end{picture} % \end{minipage} % \caption[\LaTeX-like implementation of \cmd{\vector}]^^A % {Sketch of the path drawn by the \LaTeX-like implementation % of \cmd{\vector}. (Note: We are using the redefined macros of % \textsf{pict2e}!)} % \label{fig:vector:ltx} % \end{figure} % % \begin{macro}{\pIIe@vector@ltx} % \changes{v0.1u}{2003/11/21}{New ancillary macro (HjG)} % \changes{v0.1y}{2003/11/27}{First implementation. (RN,HjG)} % The arrow outline. % (Not yet quite the same as with \LaTeX's fonts.) % % Problem: Extrapolation. % There are only two design sizes (thicknesses) for \LaTeX's line % drawing fonts. % Where can we go from there? % % Note that only the arrow head will be drawn, if the length argument % of the \cmd{\vector} command is smaller than the calculated length % of the arrow head. % ^^A (Orig.\ \LaTeX: only, if length =~0!?) % \begin{macrocode} \newcommand*\pIIe@vector@ltx{% \@ydim\pIIe@FAW\@wholewidth \advance\@ydim\pIIe@CAW\relax \@ovxx\pIIe@FAL\@ydim \@xdim\@linelen \advance\@xdim-\@ovxx \divide\@ydim\tw@ \divide\@ovxx\tw@ \advance\@ovxx\@xdim \@ovyy\@ydim \divide\@ovyy\tw@ \advance\@ovyy-\pIIe@FAI\@ydim % \end{macrocode} % \noindent % \BigIndent $P_d = P_1 + 1/3 (P_n - P_1)$ % \begin{macrocode} \pIIe@bezier@QtoC\@linelen\@ovxx\@ovro \pIIe@bezier@QtoC\z@\@ovyy\@ovri % \end{macrocode} % \BigIndent $P_c = P_7 + 1/3 (P_n - P_7)$ % \begin{macrocode} \pIIe@bezier@QtoC\@xdim\@ovxx\@clnwd \pIIe@bezier@QtoC\@ydim\@ovyy\@clnht % \end{macrocode} % \BigIndent $P_1$ % \begin{macrocode} \pIIe@moveto\@linelen\z@ % \end{macrocode} % \BigIndent $P_a \quad P_b \quad P_2$ % \begin{macrocode} \pIIe@curveto\@ovro{-\@ovri}\@clnwd{-\@clnht}\@xdim{-\@ydim}% \ifdim\@xdim>\z@ % \end{macrocode} % \BigIndent $P_3$ % \begin{macrocode} \pIIe@lineto\@xdim{-\@halfwidth}% % \end{macrocode} % \BigIndent $P_4$ % \begin{macrocode} \pIIe@lineto\z@{-\@halfwidth}% % \end{macrocode} % \BigIndent $P_5$ % \begin{macrocode} \pIIe@lineto\z@{\@halfwidth}% % \end{macrocode} % \BigIndent $P_6$ % \begin{macrocode} \pIIe@lineto\@xdim{\@halfwidth}% \fi % \end{macrocode} % \BigIndent $P_7$ % \begin{macrocode} \pIIe@lineto\@xdim\@ydim % \end{macrocode} % \BigIndent $P_c \quad P_d \quad P_1$ % \begin{macrocode} \pIIe@curveto\@clnwd\@clnht\@ovro\@ovri\@linelen\z@} % \end{macrocode} % \end{macro} % % \paragraph{\PSTricks\ version} % % The arrows drawn by the variant generated by the \textsf{pstarrows} % package option are % modeled after those in the \textsf{pstricks} package~\cite{PSTRICKS}. % See Figure~\ref{fig:vector:pst}. % % \begin{figure} % \setlength\unitlength{.0067\linewidth}\hfill % \makebox[0pt][r]{^^A % \begin{minipage}[c]{17em}^^A % \unboldmath\small % \setlength\arraycolsep{.5\arraycolsep}^^A % \begin{eqnarray*} % L & = & \cmd{\@linelen} \\ % W & = & \cmd{\@wholewidth} = 2\times\cmd{\@halfwidth} \\ % AW & = & \cmd{\pIIe@FAW}\times W + \cmd{\pIIe@CAW} \\ % AL & = & \cmd{\pIIe@FAL}\times AW \\ % IN & = & \cmd{\pIIe@FAI}\times AL % \end{eqnarray*} % \end{minipage}}^^A % \hspace{\marginparsep} % \begin{minipage}[c]{105\unitlength}^^A % \rule{\linewidth}{0pt} % \begin{picture}(105,55)(0,-25) % \boldmath\bfseries % \THICKLINES % \put(100,0){\FPOINT} \put(101,-1){$P_1$} % \put(100,0){\line(-2,-1){40}}^^A P1--P2 % \put(60,-20){\FPOINT} \put(61,-23){$P_2$} % \put(60,-20){\line(4,5){8}}^^A P2--P3 % \put(68,-10){\FPOINT} \put(70,-11){$P_3$} % \put(68,-10){\line(-1,0){68}}^^A P3--P4 % \put(0,-10){\FPOINT} \put(1,-8){$P_4$} % \put(0,-10){\line(0,1){20}}^^A P4--P5 % \put(0,10){\FPOINT} \put(1,6){$P_5$} % \put(0,10){\line(1,0){68}}^^A P5--P6 % \put(68,10){\FPOINT} \put(70,9){$P_6$} % \put(68,10){\line(-4,5){8}}^^A P6--P7 % \put(60,20){\FPOINT} \put(61,21){$P_7$} % \put(60,20){\line(2,-1){40}}^^A P7--P1 % \thinlines % \put(76,0){\FPOINT} \put(78,-1){$P_i$} % \put(68,-10){\line(4,5){8}}^^A P3--Pi % \put(68,10){\line(4,-5){8}}^^A P6--Pi % ^^A % \put(-2,0){\line(1,0){4}} % \put(10,-7){\vector(-10,7){10}}\put(10,-8){$\,(0,0)$} % ^^A % \put(60,-20){\line(0,-1){5}}\put(100,0){\line(0,-1){25}} % \put(60,-25){\vector(1,0){40}}\put(100,-25){\vector(-1,0){40}} % \put(77,-24){$AL$} % ^^A % \put(0,10){\line(0,1){15}}\put(100,0){\line(0,1){25}} % \put(0,25){\vector(1,0){100}}\put(100,25){\vector(-1,0){100}} % \put(48,26){$L$} % ^^A % \put(60,-20){\line(-1,0){5}} \put(60,20){\line(-1,0){5}} % \put(55,-20){\vector(0,1){40}} \put(55,20){\vector(0,-1){40}} % \put(47,-2){$AW$} % ^^A % \put(60,-20){\line(0,1){40}} % \put(60,0){\vector(1,0){15}} % \put(76,0){\vector(-1,0){16}} % \put(65,1){$IN$} % ^^A % \put(25,-10){\vector(0,1){20}}\put(25,10){\vector(0,-1){20}} % \put(20,-2){$W$} % \end{picture} % \end{minipage} % \caption[\PSTricks-like implementation of \cmd{\vector}]^^A % {Sketch of the path drawn by the \PSTricks-like implementation % of \cmd{\vector}. (Note: We are using the redefined macros of % \textsf{pict2e}!)} % \label{fig:vector:pst} % \end{figure} % % \begin{macro}{\pIIe@vector@pst} % \changes{v0.1u}{2003/11/21}{New ancillary macro (HjG)} % The arrow outline. % Note that only the arrowhead will be drawn, if the length argument % of the \cmd{\vector} command is smaller than the calculated length % of the arrow head. % ^^A (Orig.\ \LaTeX: only, if length =~0!?) % \begin{macrocode} \newcommand*\pIIe@vector@pst{% \@ydim\pIIe@FAW\@wholewidth \advance\@ydim\pIIe@CAW\relax \@ovxx\pIIe@FAL\@ydim \@xdim\@linelen \advance\@xdim-\@ovxx \divide\@ydim\tw@ \@ovyy\@ydim \advance\@ovyy-\@halfwidth \@ovdx\pIIe@FAI\@ovxx \pIIe@divide\@ovdx\@ydim\@tempdimc \@ovxx\strip@pt\@ovyy\@tempdimc \advance\@ovxx\@xdim \advance\@ovdx\@xdim % \end{macrocode} % \BigIndent $P_1$ % \begin{macrocode} \pIIe@moveto\@linelen\z@ % \end{macrocode} % \BigIndent $P_2$ % \begin{macrocode} \pIIe@lineto\@xdim{-\@ydim}% \ifdim\@xdim>\z@ % \end{macrocode} % \BigIndent $P_3$ % \begin{macrocode} \pIIe@lineto\@ovxx{-\@halfwidth}% % \end{macrocode} % \BigIndent $P_4$ % \begin{macrocode} \pIIe@lineto\z@{-\@halfwidth}% % \end{macrocode} % \BigIndent $P_5$ % \begin{macrocode} \pIIe@lineto\z@{\@halfwidth}% % \end{macrocode} % \BigIndent $P_6$ % \begin{macrocode} \pIIe@lineto\@ovxx{\@halfwidth}% \else % \end{macrocode} % \BigIndent $P_i$ % \begin{macrocode} \pIIe@lineto\@ovdx\z@ \fi % \end{macrocode} % \BigIndent $P_7$ % \begin{macrocode} \pIIe@lineto\@xdim\@ydim % \end{macrocode} % \BigIndent $P_1$ % \begin{macrocode} \pIIe@lineto\@linelen\z@} % \end{macrocode} % \end{macro} % % \subsubsection{Circle and Dot} % \label{sec:implementation:circle+dot} % % \begin{macro}{\@circle} % The circle will either be stroked \dots % \begin{macrocode} \def\@circle#1{\begingroup \@tempswafalse\pIIe@circ{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\@dot} % \dots\ or filled. % \begin{macrocode} \def\@dot#1{\begingroup \@tempswatrue\pIIe@circ{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@circ} % Common code. % ^^A (Could\slash should be named \cmd{\@circ}!?) % \begin{macrocode} \newcommand*\pIIe@circ[1]{% % \end{macrocode} % We need the radius instead of the diameter. % Unlike \SL, we check for negative or zero diameter argument. % ^^A Useful: error check when calculating coordinates. % \changes{v0.2h}{2004/01/07}{Check for negative or zero diameter % argument (RN,HjG)} % \changes{v0.2n}{2004/04/22}{Allow zero diameter (RN/HjG)} % \begin{macrocode} \@defaultunitsset\pIIe@tempdima{#1}\unitlength \ifdim\pIIe@tempdima<\z@ \pIIe@badcircarg \fi \divide\pIIe@tempdima\tw@ \pIIe@circle\pIIe@tempdima % \end{macrocode} % With the current state of affairs, we could use % \cmd{\pIIe@drawGraph} directly; but that would possibly be a case of % premature optimisation. % (Note to ourselves: % Use of the |@tempswa| switch both here and inside quarter-circle! % Hence a group is necessary there.) % \begin{macrocode} \if@tempswa \pIIe@fillGraph \else \buttcap \pIIe@strokeGraph \fi \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@circle} % Approximate a full circle by four quarter circles, use the standard shape % of ends. % \changes{v0.1g}{2003/08/23}{Changed code (using% % \cmd{\pIIe@add@qcircle}). (HjG,RN)} % \changes{v0.3a}{2016/01/09}{Changed code, closepath seems to be necessary.} % \begin{macrocode} \newcommand*\pIIe@circle[1]{% \pIIe@qcircle[1]\z@{#1}\pIIe@qcircle \@ne{#1}% \pIIe@qcircle \tw@{#1}\pIIe@qcircle\thr@@{#1}\pIIe@closepath} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@qcircle} % \changes{v0.1u}{2003/11/21}{% % Change coding of quadrant number to match bit number in % \cmd{\pIIe@get@quadrants} (HjG)} % \changes{v0.1v}{2003/11/22}{Exchange \cmd{\@xdim} and \cmd{\@ydim} to % \cmd{\@ovri} and \cmd{\@ovro} (HjG)} % Approximate a quarter circle, using cubic Bezier splines. % % \begin{figure} % \setlength\unitlength{.0033\linewidth}\hfill % \begin{minipage}{125\unitlength} % \begin{picture}(125,122)(-13,-3) % \boldmath\bfseries % \thinlines % ^^A\put(-13,-3){\framebox(125,122){}} % \put(0,0){\OPOINT}\put(2,4){$(0,0)$} % \put(2,0){\vector(1,0){96}}\put(98,0){\vector(-1,0){96}} % \put(40,2){$radius$} % \put(0,2){\vector(0,1){96}}\put(0,98){\vector(0,-1){96}} % \put(-7,40){\rotatebox{90}{$radius$}} % \put(100,0){\FPOINT}\put(89,4){$P_0$} % \put(100,55){\OPOINT}\put(95,59){$P_1$} % \put(100,0){\line(1,0){10}}\put(102,55){\line(1,0){8}} % \put(110,0){\vector(0,1){55}}\put(110,55){\vector(0,-1){55}} % \put(104,2){{\footnotesize\rotatebox{90}{$0.5523\times radius$}}} % ^^A % \put(0,100){\line(0,1){10}}\put(55,102){\line(0,1){8}} % \put(0,110){\vector(1,0){55}}\put(55,110){\vector(-1,0){55}} % \put(2,112){{\footnotesize $0.5523\times radius$}} % ^^A % \put(55, 100){\OPOINT}\put(57,98){$P_2$} % \put(0,100){\FPOINT}\put(-12,98){$P_3$} % \THICKLINES % \cbezier(100,0)(100,55)(55,100)(0,100) % \end{picture} % \end{minipage}\hspace*{\fill} % \caption[Auxillary macro \cmd{\pIIe@qcircle}---draw a quarter circle]^^A % {Sketch of the quarter circle path drawn by \cmd{\pIIe@qcircle} (NE~quarter)} % \label{fig:qcircle} % \end{figure} % % \#1=Switch (0=no `moveto', 1=`moveto'), % \#2=Quadrant No., \#3=Radius. % % \begin{tabular}{l@{\qquad}l} % 0 = 1st Quadrant (NE) & 1 = 2nd Quadrant (NW) \\ % 2 = 3rd Quadrant (SW) & 3 = 4th Quadrant (SE) % \end{tabular} % % \noindent % (\PS: We could use the \texttt{arc} operator!) % % $ 0.55228474983 = $``magic\ number'' (see~\cite{EBEZIER}). % % Sacrifice a save level (otherwise a private ``switch'' macro were % necessary!) % \begin{macrocode} \newcommand*\pIIe@qcircle[3][0]{% \begingroup \@ovro#3\relax \@ovri0.55228474983\@ovro \@tempdimc\@ovri \advance\@tempdimc-\@ovro \ifnum#1>\z@ \@tempswatrue \else \@tempswafalse \fi \ifcase#2\relax % \end{macrocode} % \BigIndent NE % \begin{macrocode} \pIIe@@qcircle\@ovro\z@\z@\@ovri\@tempdimc\@ovro{-\@ovro}\@ovro \or % \end{macrocode} % \BigIndent NW % \begin{macrocode} \pIIe@@qcircle\z@\@ovro{-\@ovri}\z@{-\@ovro}\@tempdimc{-\@ovro}{-\@ovro}% \or % \end{macrocode} % \BigIndent SW % \begin{macrocode} \pIIe@@qcircle{-\@ovro}\z@\z@{-\@ovri}{-\@tempdimc}{-\@ovro}\@ovro{-\@ovro}% \or % \end{macrocode} % \BigIndent SE % \begin{macrocode} \pIIe@@qcircle\z@{-\@ovro}\@ovri\z@\@ovro{-\@tempdimc}\@ovro\@ovro \fi \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@@qcircle} % \changes{v0.1u}{2003/11/21}{New ancillary macro (HjG)} % Ancillary macro; saves us some tokens above. % % Note: % Use of |rcurveto| instead of |curveto| makes it possible (or at % least much easier) to re-use this macro for the rounded corners of % ovals. % \begin{macrocode} \newcommand*\pIIe@@qcircle[8]{% \if@tempswa\pIIe@moveto{#1}{#2}\fi \pIIe@rcurveto{#3}{#4}{#5}{#6}{#7}{#8}} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@badcircarg} % \changes{v0.2h}{2004/01/07}{New error message. (RN,HjG)} % Obvious cousin to |\@badlinearg| from the \LaTeX\ kernel. % \begin{macrocode} \newcommand*\pIIe@badcircarg{% \PackageError{pict2e}% {Illegal argument in \protect\circle(*), \protect\oval, \protect\arc(*) or \protect\circlearc.}% {The radius of a circle, dot, arc or oval corner must be greater than zero.}}% % \end{macrocode} % \end{macro} % % \subsubsection{Oval} % \label{sec:implementation:oval} % % \begin{macro}{\maxovalrad} % User level command, may be redefined by \cmd{\renewcommand*}. % It may be given as an explicit (rigid) length (i.e., with unit) % or as a number. % In the latter case it is used as a factor to be multiplied by % \cmd{\unitlength}. % \ (|dimen| and |count| registers should work, too.) \ ^^A % The default value is 20\,pt as specified for the \oarg{rad} % argument of \cmd{\oval} by the \LaTeX\ manual % \cite[p.~223]{LAMPORT}. % \begin{macrocode} \newcommand*\maxovalrad{20pt} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@defaultUL} % \begin{macro}{\pIIe@def@UL} % The aforementioned behaviour seems necessary, since % \cite[p.~223]{LAMPORT} does not specify explicitly whether the % \oarg{rad} argument should be given in terms of \cmd{\unitlength} or % as an absolute length. % This is now re-implemented in terms of \cmd{@defaultunitsset}. % \begin{macrocode} \newcommand*\pIIe@defaultUL[2]{% \@defaultunitsset\pIIe@tempdima{#2}\unitlength \edef#1{\the\pIIe@tempdima}} % \end{macrocode} % Hence, we could\slash should omit the unnecessary argument!?) % \changes{v0.2h}{2004/01/07}{Check for negative or zero radius % argument (RN,HjG)} % \changes{v0.2n}{2004/04/22}{Moved radius test to \cmd{\oval}, % where it belongs (RN/HjG)} % \begin{macrocode} \newcommand*\pIIe@def@UL{} \def\pIIe@def@UL#1\relax#2#3{% % \if!#1!% % \def#2{#3}% \edef ? % \else % \edef#2{\strip@pt\dimen@}% % \fi \edef#2{\the\dimen@}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\oval} % \begin{macro}{\pIIe@maxovalrad} % \begin{macro}{\pIIe@oval} % The variant of \cmd{\oval} defined here takes an additional optional % argument, which specifies the maximum radius of the rounded corners % (default = 20\,pt, as given above). % ^^A [Test: length or counter register as optional argument?] % Unlike \SL, we check for negative or zero radius argument. % \cmd{\pIIe@maxovalrad} is the internal variant of \cmd{\maxovalrad}. % \changes{v0.2n}{2004/04/22}{Moved radius test from \cmd{\pIIe@def@UL} % (RN/HjG)} % \changes{v0.2n}{2004/04/22}{Allow zero diameter (RN/HjG)} % \changes{v0.3d}{2020/06/13}{Allow spaces after the first optional Argument % suggested by FMi (RN)} % \begin{macrocode} \newcommand*\pIIe@maxovalrad{} \newcommand*\pIIe@oval{} \def\pIIe@oval#1(#2,#3){\@ifnextchar[{\@oval(#2,#3)}{\@oval(#2,#3)[]}} \renewcommand*\oval[1][\maxovalrad]{% \begingroup \pIIe@defaultUL\pIIe@maxovalrad{#1}% \ifdim\pIIe@maxovalrad<\z@ \pIIe@badcircarg \fi % \end{macrocode} % Can't close the group here, since arguments must be parsed. % \begin{macrocode} \pIIe@oval} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\@oval} % (This is called in turn by the saved original.) % \begin{macrocode} \def\@oval(#1,#2)[#3]{% % \end{macrocode} % In analogy to circles, we need only half of the size value. % \begin{macrocode} \@defaultunitsset\pIIe@tempdima{#1}\unitlength \divide\pIIe@tempdima\tw@ \@defaultunitsset\pIIe@tempdimb{#2}\unitlength \divide\pIIe@tempdimb\tw@ \pIIe@tempdimc \ifdim\pIIe@tempdimb>\pIIe@tempdima \pIIe@tempdima \else \pIIe@tempdimb \fi \ifdim\pIIe@maxovalrad<\pIIe@tempdimc \pIIe@tempdimc\pIIe@maxovalrad\relax \fi % \end{macrocode} % Subtract the radius of the corners to get coordinates for the % straight line segments. % \begin{macrocode} \pIIe@tempdimd\pIIe@tempdima \advance\pIIe@tempdimd-\pIIe@tempdimc \pIIe@tempdime\pIIe@tempdimb \advance\pIIe@tempdime-\pIIe@tempdimc % \end{macrocode} % Determine which parts of the oval we have to draw. % \begin{macrocode} \pIIe@get@quadrants{#3}% % \end{macrocode} % For the whole oval remove use the standard shape of ends. % \begin{macrocode} \ifnum15=\@tempcnta \pIIe@buttcap \fi % \end{macrocode} % ``\verb+@tempswa+ = false'' means, that we have to suppress the `moveto' % in the following quadrant. % \begin{macrocode} \@tempswatrue % \end{macrocode} % The following isn't strictly necessary, but yields a single (unfragmented) % path even for \verb+[r]+ (right half of oval only). % Useful for future extensions. % % \noindent % Bits 3 and 0 set? (SE/NE) % \begin{macrocode} \ifnum9=\@tempcnta \pIIe@qoval\z@{-\pIIe@tempdimb}{\pIIe@tempdimd}{-\pIIe@tempdimb}% \thr@@\pIIe@tempdimc\pIIe@tempdima\z@ % \end{macrocode} % Bit 0 set! (NE) % \begin{macrocode} \@tempcnta\@ne \fi % \end{macrocode} % Bit 0 set? (NE) % \begin{macrocode} \pIIe@qoval\pIIe@tempdima\z@\pIIe@tempdima\pIIe@tempdime% \z@\pIIe@tempdimc\z@\pIIe@tempdimb % \end{macrocode} % Bit 1 set? (NW) % \begin{macrocode} \pIIe@qoval\z@\pIIe@tempdimb{-\pIIe@tempdimd}\pIIe@tempdimb% \@ne\pIIe@tempdimc{-\pIIe@tempdima}\z@ % \end{macrocode} % Bit 2 set? (SW) % \begin{macrocode} \pIIe@qoval{-\pIIe@tempdima}\z@{-\pIIe@tempdima}{-\pIIe@tempdime}% \tw@\pIIe@tempdimc\z@{-\pIIe@tempdimb}% % \end{macrocode} % Bit 3 set? (SE) % \begin{macrocode} \pIIe@qoval\z@{-\pIIe@tempdimb}{\pIIe@tempdimd}{-\pIIe@tempdimb}% \thr@@\pIIe@tempdimc\pIIe@tempdima\z@ % \end{macrocode} % Now we've finished, draw the oval and finally close the group opened % by \cmd{\oval} above. % \begin{macrocode} \pIIe@strokeGraph \endgroup} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@qoval} % \changes{v0.1u}{2003/11/21}{New ancillary macro (HjG)} % \changes{v0.1w}{2003/11/25}{Rename \cmd{\pIIe@oval} % to \cmd{\pIIe@qoval} (HjG)} % Ancillary macro; saves us some tokens above. % % \noindent % (\PS: We could use the \texttt{arc} or \texttt{arcto} operator!) % \begin{macrocode} \newcommand*\pIIe@qoval[8]{% % \end{macrocode} % Bit set? % \begin{macrocode} \ifodd\@tempcnta \if@tempswa\pIIe@moveto{#1}{#2}\fi \pIIe@lineto{#3}{#4}\pIIe@qcircle{#5}{#6}\pIIe@lineto{#7}{#8}% \@tempswafalse \else \@tempswatrue \fi % \end{macrocode} % Shift by one bit. % \begin{macrocode} \divide\@tempcnta\tw@} % \end{macrocode} % \end{macro} % % \begin{macro}{\pIIe@get@quadrants} % \changes{v0.1t}{2003/11/13}{Rename \cmd{\pIIe@get@ovalquadrants} to % \cmd{\pIIe@get@quadrants} (RN)} % According to the parameter (\texttt{tlbr}) bits are set in % \cmd{\@tempcnta}:\par % \begin{tabular}{l@{\qquad}l} % 0 = 1st Quadrant (NE) & 1 = 2nd Quadrant (NW) \\ % 2 = 3rd Quadrant (SW) & 3 = 4th Quadrant (SE) % \end{tabular}\par\noindent % (Cf.\ \cmd{\@oval} and \cmd{\@ovvert} in the \LaTeX\ kernel.) % We abuse \cmd{\@setfpsbit} from the float processing modules of the % kernel. % ^^A (Should this go to section low-level?) % \begin{macrocode} \newcommand*\pIIe@get@quadrants[1]{% \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue \@tempcnta\z@ \@tfor\reserved@a:=#1\do{\csname @ov\reserved@a false\endcsname}% \if@ovr \if@ovb\@setfpsbit2\fi \if@ovt\@setfpsbit4\fi \fi \if@ovl \if@ovb\@setfpsbit1\fi \if@ovt\@setfpsbit8\fi \fi} % \end{macrocode} % \end{macro} % \subsubsection{Quadratic Bezier Curve} % \label{sec:implementation:bezier-curves} % % \begin{macro}{\@bezier} % \changes{v0.1u}{2003/11/21}{Change calculation of cubic bezier parameters % to use less tokens (HjG)} % \changes{v0.2o}{2004/06/25} % {Supply \cmd{\ignorespaces} to match kernel version (HjG)} % \changes{v0.2p}{2004/07/27}{\cmd{\@killglue} added. (RN)} % % If \#1=0 the primitive operators ot the (back-end) format are used. % The kernel version of \cmd{\@bezier} uses \cmd{\put} internally, % which features \cmd{\@killglue} and \cmd{\ignorespaces} commands % in turn (at the beginning and end, respectively). % Since we don't use \cmd{\put}, we have to add the latter commands % by hand. % \begin{macrocode} \def\@bezier#1(#2,#3)(#4,#5)(#6,#7){% \ifnum #1=\z@ % \end{macrocode} % \BigIndent $P_0=(\#2,\#3)$\quad$P_m=(\#4,\#5)$\quad$P_3=(\#6,\#7)$ % \begin{macrocode} \@killglue \begingroup \@defaultunitsset\pIIe@tempdima{#2}\unitlength \@defaultunitsset\pIIe@tempdimb{#3}\unitlength \@defaultunitsset\pIIe@tempdimc{#4}\unitlength \@defaultunitsset\pIIe@tempdimd{#5}\unitlength \@defaultunitsset\pIIe@tempdime{#6}\unitlength \@defaultunitsset\pIIe@tempdimf{#7}\unitlength % \end{macrocode} % \noindent % \BigIndent $P_1 = P_m + 1/3 (P_0 - P_m)$ % \begin{macrocode} \pIIe@bezier@QtoC\pIIe@tempdima\pIIe@tempdimc\@ovro \pIIe@bezier@QtoC\pIIe@tempdimb\pIIe@tempdimd\@ovri % \end{macrocode} % \BigIndent $P_2 = P_m + 1/3 (P_3 - P_m)$ % \begin{macrocode} \pIIe@bezier@QtoC\pIIe@tempdime\pIIe@tempdimc\@clnwd \pIIe@bezier@QtoC\pIIe@tempdimf\pIIe@tempdimd\@clnht % \end{macrocode} % \BigIndent $(P_{0x},P_{0y})$ % \begin{macrocode} \pIIe@moveto\pIIe@tempdima\pIIe@tempdimb % \end{macrocode} % \BigIndent $(P_{1x},P_{1y})$\quad$(P_{2x},P_{2y})$\quad$(P_{3x},P_{3y})$ % \begin{macrocode} \pIIe@curveto\@ovro\@ovri\@clnwd\@clnht\pIIe@tempdime\pIIe@tempdimf \pIIe@strokeGraph \endgroup \ignorespaces \else \pIIe@old@bezier{#1}(#2,#3)(#4,#5)(#6,#7) \fi} % \end{macrocode} % \end{macro} % \begin{macro}{\pIIe@bezier@QtoC} % \changes{v0.1u}{2003/11/21}{New ancillary macro (HjG)} % Ancillary macro; saves us some tokens above. % % \noindent % Transformation: % quadratic bezier parameters $\rightarrow$ cubic bezier parameters. % % \noindent % (Missing: Reference for mathematical formula. Or is this trivial?) % \begin{macrocode} \newcommand*\pIIe@bezier@QtoC[3]{% \@tempdimc#1\relax \advance\@tempdimc-#2\relax \divide\@tempdimc\thr@@ \advance\@tempdimc #2\relax #3\@tempdimc} % \end{macrocode} % \end{macro} % % \subsubsection{Circle arcs} % \label{sec:implementation:circle-arcs} % % We need some auxiliary dimensions. % \changes{v0.4b}{2020/09/30}{More auxiliary dimensions} % \changes{v0.4b}{2020/09/30}{Use of fewer system dimension registers} % \begin{macrocode} \ifx\undefined\@arclen \newdimen\@arclen \fi \ifx\undefined\@arcrad \newdimen\@arcrad \fi \ifx\undefined\pIIe@tempdima \newdimen\pIIe@tempdima \fi \ifx\undefined\pIIe@tempdimb \newdimen\pIIe@tempdimb \fi \ifx\undefined\pIIe@tempdimc \newdimen\pIIe@tempdimc \fi \ifx\undefined\pIIe@tempdimd \newdimen\pIIe@tempdimd \fi \ifx\undefined\pIIe@tempdime \newdimen\pIIe@tempdime \fi \ifx\undefined\pIIe@tempdimf \newdimen\pIIe@tempdimf \fi % \end{macrocode} % \begin{macro}{\pIIe@arc} % \#1: 0 (implicit) if we connect arc with a current point, 1 if we start % drawing by this arc, 2 if we continue drawing. Other parameters: % coordinates of the center (dimensions), radius (dimension), initial and % final angle. If the final angle is greater then the initial angle, we % ``draw'' in the positive sense (anticlockwise) otherwise in the negative % sense (clockwise). First we check whether the radius is not negative and % reduce the rotation to the interval $[-720,720]$. % \begin{macrocode} \newcommand*\pIIe@arc[6][0]{% \@arcrad #4\relax \ifdim \@arcrad<\z@ \pIIe@badcircarg \else \@arclen #6\p@ \advance\@arclen -#5\p@ \ifdim \@arclen<\z@ \def\sign{-}\else\def\sign{}\fi \ifdim \sign\@arclen>720\p@ \PackageWarning {pict2e}{The arc angle is reduced to -720..720}% \@whiledim \sign\@arclen>720\p@ \do {\advance\@arclen-\sign360\p@}% \@tempdima #5\p@ \advance\@tempdima \@arclen \edef\@angleend{\strip@pt\@tempdima}% \pIIe@@arc{#1}{#2}{#3}{#4}{#5}{\@angleend}% \else \pIIe@@arc{#1}{#2}{#3}{#4}{#5}{#6}% \fi \fi} % \end{macrocode} % If the angle (its absolute value) is too large, the arc is recursively % divided into 2 parts until the angle is at most 90~degrees. % \begin{macrocode} \newcommand*\pIIe@@arc[6]{% \begingroup \ifdim \sign\@arclen>90\p@ \divide\@arclen 2 \@tempdima #5\p@ \advance\@tempdima \@arclen \edef\@anglemid{\strip@pt\@tempdima}% \def\@temp{\pIIe@@arc{#1}{#2}{#3}{#4}{#5}}% \expandafter\@temp\expandafter{\@anglemid}% \def\@temp{\pIIe@@arc{2}{#2}{#3}{#4}}% \expandafter\@temp\expandafter{\@anglemid}{#6}% \else % \end{macrocode} % We approximate the arc by a Bezier curve. First we calculate the % coordinates of the initial point: % \begin{macrocode} \CalculateSin{#5}\CalculateCos{#5}% \@tempdima\UseCos{#5}\@arcrad \advance\@tempdima #2\relax \@tempdimb\UseSin{#5}\@arcrad \advance\@tempdimb #3\relax % \end{macrocode} % The coordinates are added to the path if and how necessary: % \begin{macrocode} \ifcase #1\relax \pIIe@lineto\@tempdima\@tempdimb \or \pIIe@moveto\@tempdima\@tempdimb \or \else \PackageWarning {pict2e}% {Illegal obligatory argument in \protect\circlearc.}% \fi % \end{macrocode} % The distance of control points from the endpoints is $\frac 43 r \tan \frac % \varphi4$ ($\varphi$ is the angle and $r$ is the radius of the arc). % \begin{macrocode} \@tempdimc\@arclen \divide\@tempdimc\@iv \edef\@angle{\strip@pt\@tempdimc}\CalculateTan{\@angle}% \@linelen\UseTan{\@angle}\@arcrad \@linelen4\@linelen \divide\@linelen\thr@@ % \end{macrocode} % Coordinates of the first control point, added to the path: % \begin{macrocode} \advance\@tempdima-\UseSin{#5}\@linelen \advance\@tempdimb \UseCos{#5}\@linelen \pIIe@add@nums\@tempdima\@tempdimb % \end{macrocode} % Coordinates of the endpoint: % \begin{macrocode} \CalculateSin{#6}\CalculateCos{#6}% \@tempdima \UseCos{#6}\@arcrad \advance\@tempdima #2\relax \@tempdimb \UseSin{#6}\@arcrad \advance\@tempdimb #3\relax % \end{macrocode} % Coordinates of the second control point: % \begin{macrocode} \@tempdimc \UseSin{#6}\@linelen \advance\@tempdimc \@tempdima \pIIe@tempdimd-\UseCos{#6}\@linelen \advance\pIIe@tempdimd \@tempdimb % \end{macrocode} % Adding the second control point and the endpoint to the path % \begin{macrocode} \pIIe@add@nums\@tempdimc\pIIe@tempdimd \pIIe@add@CP\@tempdima\@tempdimb \pIIe@addtoGraph\pIIe@curveto@op \fi \endgroup} % \end{macrocode} % \end{macro} % \begin{macro}{\arc} % The \cmd{\arc} command generalizes (except that the radius instead of the % diameter is used) the standard \cmd{\circle} adding as an % obligatory first parameter comma separated pair of angles (initial and % final). We start with \cmd{\pIIearc} to avoid conflicts with other % packages. % \begin{macrocode} \newcommand*\pIIearc {\@ifstar{\@tempswatrue\pIIe@arc@}{\@tempswafalse\pIIe@arc@}} \newcommand*\pIIe@arc@[2][0,360]{\pIIe@arc@@(#1){#2}} \def\pIIe@arc@@(#1,#2)#3{% \@defaultunitsset\pIIe@tempdima{#3}\unitlength \if@tempswa \pIIe@moveto\z@\z@ \pIIe@arc{\z@}{\z@}{\pIIe@tempdima}{#1}{#2}% \pIIe@closepath\pIIe@fillGraph \else \pIIe@arc[1]{\z@}{\z@}{\pIIe@tempdima}{#1}{#2}% \pIIe@strokeGraph \fi} \ifx\undefined\arc \else \PackageWarning{pict2e}{\protect\arc\space redefined}% \fi \let\arc\pIIearc % \end{macrocode} % \end{macro} % % \subsubsection{Line, Vector, polyline, polyvector, and polygon} % \label{sec:implementation:polyline-polyvector} % % \changes{v0.3e}{2020/06/20}{Added \cmd{\Vector} and \cmd{\polyvector} % suggested by FMi. (RN)} % \begin{macro}{\Line} % \begin{macro}{\polyline} % \begin{macro}{\Vector} % \begin{macro}{\polyvector} % \begin{macro}{\polygon} % We use recursive macros for \cmd{\polyline}, \cmd{\polyvector}, and \cmd{\polygon}. % \begin{macrocode} \let\lp@r( \let\rp@r) \def\Line(#1,#2)(#3,#4){\polyline(#1,#2)(#3,#4)} \def\polyline(#1,#2){% \@killglue \@defaultunitsset\pIIe@tempdima{#1}\unitlength \@defaultunitsset\pIIe@tempdimb{#2}\unitlength \pIIe@moveto{\pIIe@tempdima}{\pIIe@tempdimb}% \@ifnextchar\lp@r{\@polyline}{\PackageWarning{pict2e}% {Polygonal lines require at least two vertices!}% \ignorespaces}} \def\@polyline(#1,#2){% \@defaultunitsset\pIIe@tempdima{#1}\unitlength \@defaultunitsset\pIIe@tempdimb{#2}\unitlength \pIIe@lineto{\pIIe@tempdima}{\pIIe@tempdimb}% \@ifnextchar\lp@r{\@polyline}{\pIIe@strokeGraph\ignorespaces}} \def\Vector(#1,#2)(#3,#4){\polyvector(#1,#2)(#3,#4)} \def\polyvector(#1,#2){% \@killglue \@ifnextchar\lp@r{\begingroup\@polyvector(#1,#2)}{% \PackageWarning{pict2e}% {Polygonal vectors require at least two vertices!}\ignorespaces}} \def\@polyvector(#1,#2)(#3,#4){% % \end{macrocode} % See the similar definition for \cmd{\vector} (\ref{sec:implementation:vector}) % \begin{macrocode} \@defaultunitsset\pIIe@tempdima{#1}\unitlength \@defaultunitsset\pIIe@tempdimb{#2}\unitlength \@defaultunitsset\pIIe@tempdimc{#3}\unitlength \@defaultunitsset\pIIe@tempdimd{#4}\unitlength \advance\pIIe@tempdimc-\pIIe@tempdima \advance\pIIe@tempdimd-\pIIe@tempdimb \ifdim\pIIe@tempdimc=\z@ \@linelen\pIIe@tempdimd \else \ifdim\pIIe@tempdimd=\z@ \@linelen\pIIe@tempdimc \else \pIIe@pyth\pIIe@tempdimc\pIIe@tempdimd\@linelen \fi \fi \ifdim\@linelen<\z@ \@linelen-\@linelen\fi \pIIe@divide{\pIIe@tempdimc}\@linelen\pIIe@tempdime \pIIe@divide{\pIIe@tempdimd}\@linelen\pIIe@tempdimf % \end{macrocode} % Note the shift to the previous point in addition to the rotation. % \begin{macrocode} \pIIe@concat\pIIe@tempdime\pIIe@tempdimf{-\pIIe@tempdimf}\pIIe@tempdime\pIIe@tempdima\pIIe@tempdimb \pIIe@vector \pIIe@fillGraph \@ifnextchar\lp@r{\@polyvector(#3,#4)}{\endgroup\ignorespaces}} \def\polygon{% \@killglue \@ifstar{\begingroup\@tempswatrue\@polygon}% {\begingroup\@tempswafalse\@polygon}} \def\@polygon(#1,#2){% \@defaultunitsset\pIIe@tempdima{#1}\unitlength \@defaultunitsset\pIIe@tempdimb{#2}\unitlength \pIIe@moveto{\pIIe@tempdima}{\pIIe@tempdimb}% \@ifnextchar\lp@r{\@@polygon}{\PackageWarning{pict2e}% {Polygons require at least two vertices!}% \ignorespaces}} \def\@@polygon(#1,#2){% \@defaultunitsset\pIIe@tempdima{#1}\unitlength \@defaultunitsset\pIIe@tempdimb{#2}\unitlength \pIIe@lineto{\pIIe@tempdima}{\pIIe@tempdimb}% \@ifnextchar\lp@r{\@@polygon}{\pIIe@closepath \if@tempswa\pIIe@fillGraph\else\pIIe@strokeGraph\fi \endgroup \ignorespaces}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \subsubsection{Path commands} % \label{sec:implementation:path-commands} % % \begin{macro}{\moveto} % \begin{macro}{\lineto} % \begin{macro}{\curveto} % \begin{macro}{\circlearc} % \begin{macro}{\closepath} % \begin{macro}{\strokepath} % \begin{macro}{\fillpath} % Direct access to path constructions in \PS\ and \PDF. % \begin{macrocode} \def\moveto(#1,#2){% \@killglue \@defaultunitsset\pIIe@tempdima{#1}\unitlength \@defaultunitsset\pIIe@tempdimb{#2}\unitlength \pIIe@moveto{\pIIe@tempdima}{\pIIe@tempdimb}% \ignorespaces} \def\lineto(#1,#2){% \@killglue \@defaultunitsset\pIIe@tempdima{#1}\unitlength \@defaultunitsset\pIIe@tempdimb{#2}\unitlength \pIIe@lineto{\pIIe@tempdima}{\pIIe@tempdimb}% \ignorespaces} \def\curveto(#1,#2)(#3,#4)(#5,#6){% \@killglue \@defaultunitsset\pIIe@tempdima{#1}\unitlength \@defaultunitsset\pIIe@tempdimb{#2}\unitlength \@defaultunitsset\pIIe@tempdimc{#3}\unitlength \@defaultunitsset\pIIe@tempdimd{#4}\unitlength \@defaultunitsset\pIIe@tempdime{#5}\unitlength \@defaultunitsset\pIIe@tempdimf{#6}\unitlength \pIIe@curveto{\pIIe@tempdima}{\pIIe@tempdimb}{\pIIe@tempdimc}% {\pIIe@tempdimd}{\pIIe@tempdime}{\pIIe@tempdimf}% \ignorespaces} \newcommand*\circlearc[6][0]{% \@killglue \@defaultunitsset\pIIe@tempdima{#2}\unitlength \@defaultunitsset\pIIe@tempdimb{#3}\unitlength \@defaultunitsset\pIIe@tempdimc{#4}\unitlength \pIIe@arc[#1]{\pIIe@tempdima}{\pIIe@tempdimb}{\pIIe@tempdimc}{#5}{#6}% \ignorespaces} \def\closepath{\pIIe@closepath} \def\strokepath{\pIIe@strokeGraph} \def\fillpath{\pIIe@fillGraph} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \subsubsection{Ends of paths, joins of subpaths} % \label{sec:implementation:ends-joins} % % \begin{macro}{\buttcap} % \begin{macro}{\roundcap} % \begin{macro}{\squarecap} % \begin{macro}{\miterjoin} % \begin{macro}{\roundjoin} % \begin{macro}{\beveljoin} % Ends of paths and joins of subpaths in \PS\ and \PDF. % \begin{macrocode} \ifcase\pIIe@mode\relax \or \newcommand*\pIIe@linecap@op{setlinecap} \newcommand*\pIIe@linejoin@op{setlinejoin} \or \newcommand*\pIIe@linecap@op{J} \newcommand*\pIIe@linejoin@op{j} \fi \def\pIIe@linecap{} \def\pIIe@linejoin{} \def\buttcap{\edef\pIIe@linecap{ 0 \pIIe@linecap@op}} \def\roundcap{\edef\pIIe@linecap{ 1 \pIIe@linecap@op}} \def\squarecap{\edef\pIIe@linecap{ 2 \pIIe@linecap@op}} \def\miterjoin{\edef\pIIe@linejoin{ 0 \pIIe@linejoin@op}} \def\roundjoin{\edef\pIIe@linejoin{ 1 \pIIe@linejoin@op}} \def\beveljoin{\edef\pIIe@linejoin{ 2 \pIIe@linejoin@op}} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \subsection{Commands from other packages} % % \subsubsection{Package \textsf{ebezier}} % \label{sec:implementation:ebezier} % % One feature from~\cite{EBEZIER}. % % \begin{macro}{\cbezier} % \begin{macro}{\@cbezier} % \changes{v0.2o}{2004/06/25} % {Supply \cmd{\ignorespaces} to match kernel version (HjG)} % \changes{v0.2p}{2004/07/27}{\cmd{\@killglue} added. (RN)} % \begin{macro}{\pIIe@@cbezier} % \#1, the maximum number of points to use, is simply ignored, % as well as \cmd{\qbeziermax}. % % Like the kernel version of \cmd{\@bezier}, % the original version of \cmd{\@cbezier} uses \cmd{\put} internally, % which features \cmd{\@killglue} and \cmd{\ignorespaces} commands % in turn (at the beginning and end, respectively). % Since we don't use \cmd{\put}, we have to add the latter commands % by hand. % % ^^A (What about |\lbezier|?) % % \noindent % Original head of the macro:\par % \verb|\def\cbezier{\@ifnextchar [{\@cbezier}{\@cbezier[0]}}|\par % \noindent Changed analogous to the \LaTeX\ kernel's \cmd{\qbezier} and % \cmd{\bezier}: % \begin{macrocode} \AtBeginDocument{\@ifundefined{cbezier}{\newcommand}{\renewcommand}*% \cbezier[2][0]{\pIIe@@cbezier[#1]#2}% \@ifdefinable\pIIe@@cbezier{}% \def\pIIe@@cbezier#1)#2(#3)#4(#5)#6({\@cbezier#1)(#3)(#5)(}% \def\@cbezier[#1](#2,#3)(#4,#5)(#6,#7)(#8,#9){% \@killglue \@defaultunitsset\pIIe@tempdima{#2}\unitlength \@defaultunitsset\pIIe@tempdimb{#3}\unitlength \pIIe@moveto{\pIIe@tempdima}{\pIIe@tempdimb}% \@defaultunitsset\pIIe@tempdima{#4}\unitlength \@defaultunitsset\pIIe@tempdimb{#5}\unitlength \@defaultunitsset\pIIe@tempdimc{#6}\unitlength \@defaultunitsset\pIIe@tempdimd{#7}\unitlength \@defaultunitsset\pIIe@tempdime{#8}\unitlength \@defaultunitsset\pIIe@tempdimf{#9}\unitlength \pIIe@curveto{\pIIe@tempdima}{\pIIe@tempdimb}{\pIIe@tempdimc}% {\pIIe@tempdimd}{\pIIe@tempdime}{\pIIe@tempdimf}% \pIIe@strokeGraph \ignorespaces}% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \subsubsection{Other packages} % \label{sec:implementation:others} % % Other macros from various packages may be included in future % versions of this package. % ^^A (Or in a sibling package \textsf{pict2x} or \textsf{pict2ext}.) % % \subsection{Mode `original'} % % ^^A Necessary? Useful? % ^^A \bigskip % % \noindent % Other branch of the big switch,\label{big-switch-end} % started near the beginning of the code % (see page~\pageref{big-switch-begin}). % \begin{macrocode} \else % \end{macrocode} % % \begin{macro}{\oval} % \begin{macro}{\maxovalrad} % \begin{macro}{\OriginalPictureCmds} % Gobble the new optional argument and continue with saved version. % \cmd{\maxovalrad} is there to avoid error messages in case the % user's document redefines it with \cmd{\renewcommand*}. % Likewise, \cmd{\OriginalPictureCmds} is only needed for test % documents. % \begin{macrocode} \renewcommand*\oval[1][]{\pIIe@oldoval} \newcommand*\maxovalrad{20pt} \newcommand*\OriginalPictureCmds{} \fi % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \subsection{Final clean-up} % % Restore Catcodes. % \begin{macrocode} \Gin@codes \let\Gin@codes\relax % \end{macrocode} % % \begin{macrocode} % % \end{macrocode} % % % \ifdeveloping % % \section{Bugs} % % Das muss hier besser werden! Wie? longtable!? % % \bigskip % \noindent % \begin{tabular}{@{}rlccclp{30mm}@{}} % \hline % No. & Submitted by & Reported & V.no. & Fixed & Fixed by % & Remark \\ % \hline % \hline % 1 & Volker Kiefel & 2004/05/29 & v0.2o & 2004/06/25 & HjG % & Trouble with language support; e.g., \texttt{german.sty}. % ($\mapsto$ Save and restore catcodes.) \\ % \hline % 2 & Dwight Aplevich & 2004/06/04 & v0.2o & 2004/06/25 & HjG % & Cannot connect two |\cbezier| curves (second one displaced). % ($\mapsto$ Supply |\ignorespaces| in definition of bezier % commands.) \\ % \hline % 3 & Alan G. Isaac & 2004/06/23 & v0.2o & 2004/06/25 & HjG % & Like \#2. \\ % \hline % \end{tabular} % % \iffalse % \newenvironment{erratalist} % {\begin{longtable}{r>{\raggedright}p{2cm}l>{\raggedright}p{10cm}l}} % {\endgobble\end{longtable}} % \fi % % \bigskip % \noindent % \begin{longtable}{@{}r^^A No. % >{\raggedright}p{2cm}^^A Submitted % >{\raggedright}p{2cm}^^A Fixed % >{\raggedright}p{8.5cm}^^A Remark % @{}} % \hline % No. & Submitted & Fixed & Remark (Synopsis and Fix) % \tabularnewline \hline \hline % 1 & v0.2n? 2004/05/29 Volker Kiefel % & v0.2o 2004/06/25 HjG % & Trouble with language support; e.g., \texttt{german.sty}. % \\ ($\mapsto$ Save and restore catcodes.) % \tabularnewline \hline % 2 & v0.2n? 2004/06/04 Dwight Aplevich % & v0.2o 2004/06/25 HjG % & Cannot connect two |\cbezier| curves (second one displaced). % \\ ($\mapsto$ Supply |\ignorespaces| in definition of bezier % commands.) % \tabularnewline \hline % 3 & v0.2n? 2004/06/23 Alan G. Isaac % & v0.2o 2004/06/25 HjG % & Like \#2. % \tabularnewline \hline % \end{longtable} % % \bigskip % \noindent % \begin{tabular}{@{}r>{\raggedright}p{.6\textwidth}@{}}^^A tabularx? RN % \hline % \begin{tabular}[t]{@{}>{\bfseries}rl@{}} % No. & 1 \\ % Submitted by & Volker Kiefel \\ % Reported & 2004/05/29 \\ % Version & v0.2o \\ % Fixed & 2004/06/25 \\ % Fixed by & HjG % \end{tabular} & % Trouble with language support; e.g., \texttt{german.sty}. % ($\mapsto$\,Save and restore catcodes.) % \tabularnewline \hline % \begin{tabular}[t]{@{}>{\bfseries}rl@{}} % No. & 2 \\ % Submitted by & Dwight Aplevich \\ % Reported & 2004/06/04 \\ % Version & v0.2o \\ % Fixed & 2004/06/25 \\ % Fixed by & HjG % \end{tabular} & % Cannot connect two |\cbezier| curves (second one displaced). % ($\mapsto$ Supply |\ignorespaces| in definition of bezier % commands.) % \tabularnewline \hline % \begin{tabular}[t]{@{}>{\bfseries}rl@{}} % No. & 3 \\ % Submitted by & Alan G. Isaac \\ % Reported & 2004/06/23 \\ % Version & v0.2o \\ % Fixed & 2004/06/25 \\ % Fixed by & HjG % \end{tabular} & % Like \#2. % \tabularnewline \hline % \end{tabular} % % \bigskip % \noindent % \begin{longtable}{@{}rp{.6\textwidth}@{}} % \hline % \begin{tabular}[t]{@{}>{\bfseries}rl@{}} % No. & 1 \\ % Submitted by & Volker Kiefel \\ % Reported & 2004/05/29 \\ % Version & v0.2o \\ % Fixed & 2004/06/25 \\ % Fixed by & HjG % \end{tabular} & % Trouble with language support; e.g., \texttt{german.sty}. % ($\mapsto$\,Save and restore catcodes.) % \tabularnewline \hline % \begin{tabular}[t]{@{}>{\bfseries}rl@{}} % No. & 2 \\ % Submitted by & Dwight Aplevich \\ % Reported & 2004/06/04 \\ % Version & v0.2o \\ % Fixed & 2004/06/25 \\ % Fixed by & HjG % \end{tabular} & % Cannot connect two |\cbezier| curves (second one displaced). % ($\mapsto$ Supply |\ignorespaces| in definition of bezier % commands.) % \tabularnewline \hline % \begin{tabular}[t]{@{}>{\bfseries}rl@{}} % No. & 3 \\ % Submitted by & Alan G. Isaac \\ % Reported & 2004/06/23 \\ % Version & v0.2o \\ % Fixed & 2004/06/25 \\ % Fixed by & HjG % \end{tabular} & % Like \#2. % \tabularnewline \hline % \end{longtable} % % \fi % % % \Finale \endinput