diff options
author | Karl Berry <karl@freefriends.org> | 2020-10-24 20:28:26 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-10-24 20:28:26 +0000 |
commit | 685646877008a8e38cd220bede5f53cf994baa76 (patch) | |
tree | a7108ac5b0ef9d6e7d21593d282978bff2a4118a /Master/texmf-dist/source | |
parent | 8d132bd21f6b766eddaf605a00c4ef5b4e0fcc19 (diff) |
graphpaper (24oct20)
git-svn-id: svn://tug.org/texlive/trunk@56750 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source')
-rw-r--r-- | Master/texmf-dist/source/latex/graphpaper/graphpaper.dtx | 1048 |
1 files changed, 1048 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/graphpaper/graphpaper.dtx b/Master/texmf-dist/source/latex/graphpaper/graphpaper.dtx new file mode 100644 index 00000000000..071f40b1de2 --- /dev/null +++ b/Master/texmf-dist/source/latex/graphpaper/graphpaper.dtx @@ -0,0 +1,1048 @@ +%\iffalse +% !TEX encoding = UTF-8 Unicode +% !TEX TS-program = pdflatex +%<*internal> +\begingroup +%^^A Load the docstrip package (DO NOT USE \input{...}) +\input docstrip.tex +\keepsilent +%^^A\usedir{tex/latex/graphpaper} +%^^A insert this text at the beginning of the generated file +\preamble + ________________________________________ + The graphpaper class for generating several types of graph paper + Copyright (C) 2020 C. Beccari & F. Biccari + All rights reserved + + License information appended + +\endpreamble +%^^A insert this text at the end of the generated file +\postamble +Copyright (C) 2020 Claudio Beccari & Francesco Biccari + +Distributable under the LaTeX Project Public License, +version 1.3c or higher (your choice). The latest version of +this license is at: http://www.latex-project.org/lppl.txt + +This work is "author-maintained". + +This work consists of this file graphpaper.dtx, +and the derived files graphpaper.cls and graphpaper.pdf. + +\endpostamble +%^^A +%^^A DocStrip can silently overwrite an already existing cls file +\askforoverwritefalse +%^^A +%^^A Generates the cls file from the dtx file, stripping out all +%^^A the documentation. The option "class" tells to DocStrip to +%^^A extract only the code marked with the "class" tag. +\generate{\file{graphpaper.cls}{\from{graphpaper.dtx}{class}}} +% +\def\tmpa{plain} +\ifx\tmpa\fmtname\endgroup\expandafter\bye\fi +\endgroup +%</internal> +%\fi +%^^A % +%^^A ---------------------------------------------------------------------- +%^^A Here starts the second part +%^^A ProvidesFile must be (more or less) the first command for a class dtx. +%^^A It populates the variables \filename, \filedate, and \fileversion +%^^A +% \iffalse +%<*driver> +\ProvidesFile{graphpaper.dtx} +%</driver> +%<class>\NeedsTeXFormat{LaTeX2e}[2018-01-01] +%<class>\ProvidesClass{graphpaper}% +%<*class> + [2020-10-10 1.0 A LaTeX class to generate several types of graph papers] +%</class> +%<*driver> +\documentclass[11pt,a4paper]{ltxdoc} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{lmodern,textcomp} +\usepackage[a4paper,lines=50]{geometry} +\usepackage{multicol} +\hfuzz 10pt +\let\originalmeta\meta +\renewcommand\meta[1]{{\normalfont\originalmeta{#1}}} +\renewcommand\marg[1]{\texttt{\{\meta{#1}\}}} +\newcommand\Marg[1]{\texttt{\{#1\}}} +\newcommand\opz[1]{\texttt{[\meta{#1}]}} +\newcommand\Opz[1]{\texttt{[#1]}} +\newcommand\amb[1]{\texttt{\slshape#1}}\let\env\amb +\renewcommand\cs[1]{{\normalfont\ttfamily\char92#1}} +\newcommand\Benv[1]{\texttt{\char92begin\{#1\}}} +\newcommand\Eenv[1]{\texttt{\char92end\{#1\}}} +\newcommand\eTeX{$\varepsilon$-\TeX} +\providecommand\prog{} +\renewcommand\prog[1]{\textsf{#1}} +\newcommand\pack[1]{\texttt{\itshape#1}} +\newcommand\class[1]{\texttt{#1}} +% +\newenvironment{ttsintassi}{\begin{lrbox}{0} +\minipage{\dimexpr\linewidth-2\fboxrule-2\fboxsep}\ttfamily\obeylines}% +{\endminipage\end{lrbox}\center\fbox{\box0}\endcenter} +\let\ttsyntax\ttsintassi \let\endttsyntax\endttsintassi +% +\usepackage{color} +\definecolor{sfondoblu}{rgb}{0.94,0.97,1} +\usepackage{listings} +\lstset{language=[LaTeX]TeX, + basicstyle=\footnotesize\ttfamily, + keywordstyle=\color{blue}\bfseries, + commentstyle=\color{gray}, + backgroundcolor=\color{sfondoblu}, + frameround=tttt, + frame=tlrb, + escapechar=|, + morekeywords={bilinear, semilogx, semilogy, loglog, polar, logpolar, smith, setgridcolor, setmajorlinethickness, setmediumlinethickness, setminorlinethickness, setminimumdistance, setxside, setyside, customcode}, + columns=flexible +} +\begin{document} +\GetFileInfo{graphpaper.dtx} +\title{Documentation of the \class{graphpaper} \LaTeX\ class} +\author{Claudio Beccari \and Francesco Biccari\thanks{Corresponding author: biccari@gmail.com}} +\date{Version number \fileversion; last revised on \filedate.} +\maketitle +\setcounter{tocdepth}{2} +\renewcommand{\columnseprule}{0.4pt} +\setlength{\columnsep}{1.5cm} + +\addtocontents{toc}{\protect\begin{multicols}{2}} +{\small +\tableofcontents} + +\DocInput{graphpaper.dtx} +\addtocontents{toc}{\protect\end{multicols}} +\end{document} +%</driver> +% \fi +%^^A \CheckSum{100} +%\begin{abstract} +% This document describes how to use the \LaTeX\ document class \class{graphpaper}. +% It allows to print several types of graph papers: bilinear, +% semilogarithmic, bilogarithmic, polar, Smith charts. +%\end{abstract} +% +%\section{Legal terms} +% This file is part of the |graphpaper| bundle. +% +% This work may be distributed and/or modified under the +% conditions of the \LaTeX\ Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is at: +% http://www.latex-project.org/lppl.txt +% +% This work has the LPPL maintenance status ``maintained''. +% +% This work consists of this file graphpaper.dtx, +% and the derived files graphpaper.cls and graphpaper.pdf. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by the LPPL is contained in the README file. +% +%\section{Installation} +% The simplest way to install \class{graphpaper} is by the package manager of your \TeX\ +% distribution (\TeX\ Live or MiK\TeX). For manual installation see the README file. +% +% +% \newpage +% \section{How to use graphpaper} +% \label{sec:howto} +% +% \class{Graphpaper} is a \LaTeX\ class and it is loaded as usual: +% +% \iffalse +%<*example> +% \fi +\begin{lstlisting} +\documentclass|\opz{options}|{graphpaper} +\end{lstlisting} +% \iffalse +%</example> +% \fi +% +% It has three class options to specify the paper format: +% \texttt{a4paper}, \texttt{a3paper}, \texttt{letterpaper}. +% The paper orientation cannot be changed and it is always set +% to landscape. +% +% \class{Graphpaper} provides the following commands (to be used +% inside the body of the document) in order to compose graph papers. +% At the end of the execution of these commands, a new page +% is always started. +% +% \iffalse +%<*example> +% \fi +\begin{lstlisting} +\bilinear + +\semilogx|\marg{decades along x}| + +\semilogy|\marg{decades along y}| + +\loglog|\opz{0/1}||\marg{decades along x}||\marg{decades along y}| + +\polar + +\logpolar|\marg{decades along radius}| + +\smith +\end{lstlisting} +% \iffalse +%</example> +% \fi +% The commands \cs{bilinear}, \cs{semilogx}, and \cs{semilogy} are self +% explanatory. +% The optional parameter in the \cs{loglog} command chooses wether the +% decade length along the abscissa and ordinate axes must have the same +% dimension. It can assume the value 0 (free dimensions) or 1 (same +% dimensions), 0 being the default. +% The commadns \cs{polar}, \cs{logpolar}, \cs{smith} are used to plot +% polar, logpolar, and Smith chart graph papers. The mandatory argument +% of \cs{logpolar} specifies the number of decades. +% +% There are several commands to change the appearance of the graph papers. +% They must be inserted before the graph paper command which we want they +% affect. +% +% The following ones are specific to bilinear, semilog and loglog papers +% only: +% \iffalse +%<*example> +% \fi +\begin{lstlisting} +\setxside|\marg{length}| + +\setyside|\marg{length}| + +\setminimumdistance|\marg{length}| +\end{lstlisting} +% \iffalse +%</example> +% \fi +% \cs{setxside} and \cs{setyside} allow to specify the dimensions of the +% rectangle of the grid. The default values are (260\,mm, 180\,mm) for +% A4 paper, (250\,mm, 190\,mm) for letter paper, and (380\,mm, 280\,mm) +% for A3 paper. +% +% \cs{setminimumdistance} specifies the minimal optical distance +% between two lines. Default is 1\,mm. In this way, the number of +% subdivision is automatically composed. +% +% The following commands are instead general settings for all graph +% papers: +% \iffalse +%<*example> +% \fi +\begin{lstlisting} +\setgridcolor|\marg{color}| + +\setmajorlinethickness|\marg{length}| + +\setmediumlinethickness|\marg{length}| + +\setminorlinethickness|\marg{length}| + +\customcode|\opz{0/1}\marg{picture environment commands}| +\end{lstlisting} +% \iffalse +%</example> +% \fi +% +% \cs{setgridcolor} sets the color of the grid. The argument must be a +% color defined or predefined by the color or |xcolor| package. The +% default color is the typical red-orange color used in many graph papers, +% Pantone 2011 U corresponding to RGB (250,153,89). +% +% \cs{setmajorlinethickness}, \cs{setmediumlinethickness}, +% \cs{setminorlinethickness} can be used to change the thickness of the +% lines. The default values are 1\,pt, 0.6\,pt, 0.25\,pt, respectively. +% +% \cs{customcode} accepts all the commands accepted by the picture +% environment. This snippet of code is inserted inside the picture +% environment used to draw the subsequent graph paper. +% The origin of the coordinate system in the case of rectangular graph +% papers is the lower left vertex. The \cs{unitlength} is set to 1\,mm. +% For circular plots (both polar and Smith) the origin is in the center +% of the circle and the \cs{unitlength} is set to 1/140 of the paper height +% currently in use. +% +% The \cs{customcode} command can be used, for example, to add a logo +% or to draw on the graph paper. +% Its optional argument is by default set to 0. If it is set to 1, the +% content of the \cs{customcode} is erased after its usage in a +% graphpaper. +% +% +%\StopEventually{} +% +%\iffalse +%<*class> +%\fi +%\clearpage +%\section{The implementation} +% This class file has been already identified by the commands extracted +% by the |DocStrip| package, during the |.dtx| file compilation. +% Therefore the commands \cs{NeedsTeXFormat} and \cs{ProvidesClass} are +% already present in the |.cls| file. +% +% \subsection{Loaded packages, class options, and initial settings} +% The |xkeyvalue| package is used in order to define the class options: +% \begin{macrocode} +\RequirePackage{xkeyval} +% \end{macrocode} +% Three class options are implemented and they allows only to change the +% paper format (A4, A3, letter). The orientation of the paper is fixed +% to landscape. +% +% \begin{macrocode} +\def\GP@paper{1} +\define@key[GRP]{}{a4paper}[]{\PassOptionsToPackage{a4paper}{geometry}} +\define@key[GRP]{}{letterpaper}[]{\PassOptionsToPackage{letterpaper}{geometry}% + \def\GP@paper{2}} +\define@key[GRP]{}{a3paper}[]{\PassOptionsToPackage{a3paper}{geometry}% + \def\GP@paper{3}} +\DeclareOptionX*{\ClassError{graphpaper}{Option '\CurrentOption'% + \MessageBreak is not valid}{Remove '\CurrentOption' % + from class options}} +\ProcessOptionsX[GRP]<> +% \end{macrocode} +% +% The class is based on the \class{article} class. The default paper +% is A4. +% \begin{macrocode} +\LoadClass[a4paper,11pt]{article} +% \end{macrocode} +% +% Some packages are loaded. \pack{euclideangeometry} loads \pack{curve2e} +% which in turns loads \pack{pict2e}; all of them are \env{picture} +% environment extensions. +% \begin{macrocode} +\RequirePackage[landscape]{geometry} +\RequirePackage{euclideangeometry,graphicx,xcolor} +% \end{macrocode} +% +% Default line color (Pantone 2011~U). +% \begin{macrocode} +\definecolor{gridcolor}{RGB}{250,153,89} +% \end{macrocode} +% +% Default thickness of the lines used for main divisions and subdivisions. +% The ISO-UNI standards prescribe a geometric progression with $\sqrt{2}$ +% ratio, but it is not respected here. +% It must be keep in mind also that a safe minimum thickness for an offset +% monochromatic printer is about 0.25\,pt, whereas a safe minimum +% thickness for a laser printer is about 0.5\,pt. +% \begin{macrocode} +\newlength\lwa +\setlength{\lwa}{1pt} +\newlength\lwb +\setlength{\lwb}{0.6pt} +\newlength\lwc +\setlength{\lwc}{0.25pt} +% \end{macrocode} +% +% Minimum distance between two subdivision lines. A necessary parameter +% for automatic choice of number of subdivisions. Default 1\,mm. +% \begin{macrocode} +\newlength\mindistanceunit +\setlength{\mindistanceunit}{1mm} +% \end{macrocode} +% +% Definition of the width and height of the main rectangle within which +% the bilinear, semilog and loglog grid is composed. +% \begin{macrocode} +\newlength\xsideunit +\newlength\ysideunit +\if\GP@paper1 + \setlength{\xsideunit}{260mm} + \setlength{\ysideunit}{180mm} +\fi +\if\GP@paper2 + \setlength{\xsideunit}{250mm} + \setlength{\ysideunit}{190mm} +\fi +\if\GP@paper3 + \setlength{\xsideunit}{380mm} + \setlength{\ysideunit}{280mm} +\fi +% \end{macrocode} +% +%\subsection{Rectangular graph papers} +% +% As we will see below, the commands to compose the bilinear, semilog +% and loglog graph papers are just proper calls of the low-level command +% \cs{carta}. +% +%\subsubsection{Service macros for rectangular graph papers} +% +% First of all, four macros are defined. They are used by the +% \cs{carta} service command only. +% +% Two of them are simply two identical classical |whiledo| commands: +% the first cycles on the counter \cs{J} while the second one on the +% counter \cs{K}. +% They are two because in this way two nested |whiledo| commands can be +% implemented. +% These \cs{WhileDo} commands have four parameters: +% 1. the incremental step of the counter between cycles (default 1); +% 2. the initial value of the counter; +% 3. the final value of the counter; +% 4. the code to execute at each cycle. +% \begin{macrocode} +\newcount\J +\newcount\K + +\newcommand\WhileDoOne[4][1]{% + \J=#2 \fpdowhile{\J=<#3 }{#4\advance\J by #1\relax}} + +\newcommand\WhileDoTwo[4][1]{% + \K=#2 \fpdowhile{\K=<#3 }{#4\advance\K by #1\relax}} +% \end{macrocode} +% +% +% The other two commands are used to draw a periodic set of equidistant +% lines in log scale. +% These two commands are practically identical, the only difference is +% that they act on different axes. +% These commands have six parameters: +% 1. number of lines to draw (distance between these lines is the fifth +% parameter); +% 2. value at which the first line must be drawn (x-value for vertical +% lines, y-value for horizontal lines); +% 3. thickness; +% 4. tick length; +% 5. distance between two lines (typically the length of a decade: +% y-decade for horizontal lines, x-decade for vertical lines); +% 6. line length (typically the length of the graph paper sides: +% x-side for horizontal lines and y-side for vertical lines). +% +% \begin{macrocode} +\newcommand\hlines[6]{% +\multiput(-#4,\fpeval{ln(#2) * #5 / ln(10)})(0,#5){#1}% +{\linethickness{#3}\line(1,0){\fpeval{#6 + 2*#4}}}% +} + +\newcommand\vlines[6]{% +\multiput(\fpeval{ln(#2) * #5 / ln(10)},-#4)(#5,0){#1}% +{\linethickness{#3}\line(0,1){\fpeval{#6 + 2*#4}}}% +} +% \end{macrocode} +% +%\subsubsection{Command for rectangular graph papers} +% +% Here starts the definition of the \cs{carta} command. Its syntax is +%\begin{ttsyntax} +%\cs{carta}\opz{0 or1}\marg{no. x decades}\marg{no. of y decades} +%\end{ttsyntax} +% If an axis has zero decades, the scale is linear. +% For example, \cs{carta}\Marg{0}\Marg{0} composes a bilinear graph +% paper, \cs{carta}\Marg{2}\Marg{0} composes a semilog graph paper with +% linear y-axis and two decades along x-axis, and so on. +% Its optional argument can be 0 or 1. If it is set to 0, and both the +% numbers of decades are greater than zero (which means the resulting +% graph paper is loglog), then the length of x-axis and y-axis decades +% are set to be equal. +% +% Declaration of the command and its arguments. +% \begin{macrocode} +\NewDocumentCommand{\carta}{O{0} m m}{% +% \end{macrocode} +% +% Typographical settings and definition of the main features of the +% graphpaper. \cs{xlength} and \cs{ylength} represent the lengths, +% expressed in mm, of the rectangle dimensions. \cs{minimumdistance} +% is the minimum distance at which two subdivision lines can be drawn. +% \begin{macrocode} +\newpage +\parindent=0pt +\pagestyle{empty}% +\color{gridcolor}% +\setlength{\unitlength}{1mm}% +\def\ticklength{2} +\def\minorticklength{1.2} +\def\minimumdistance{\fpeval{(\mindistanceunit/1mm)}} +\def\xlength{\fpeval{round(round(\xsideunit/1cm) * 10)}} +\def\ylength{\fpeval{round(round(\ysideunit/1cm) * 10)}} +% \end{macrocode} +% +% \cs{xlinsq} and \cs{ylinsq} represent the number of big divisions +% (cm) on horizontal and vertical axes for linear scales, respectively. +% \begin{macrocode} +\def\xlinsq{\inteval{\xlength/10}} +\def\ylinsq{\inteval{\ylength/10}} +% \end{macrocode} +% +% Implementation of the same decade length between x-axis and y-axis +% for loglog graph paper. This is obtained properly changing the +% values of \cs{xlength} and \cs{ylength}, making them equal. +% \begin{macrocode} +\edef\decx{#2}% decades along x +\edef\decy{#3}% decades along y +\unless\ifnum#2=0 \unless\ifnum#3=0 \ifnum#1=1% +\fptest{\decx/\decy < \xlength/\ylength}% +{\def\xlength{\fpeval{\ylength*\decx/\decy}}} +{\def\ylength{\fpeval{\xlength*\decy/\decx}}} +\fi\fi\fi +% \end{macrocode} +% +% Using the values of the paper width and height together with the +% length of the graph paper rectangle sides, the margins are calculated +% and passed to the geometry package in order to center the grid with +% respect to the page. +% \begin{macrocode} +\ifcsname ml\endcsname\relax\else\newlength\ml\fi +\ifcsname mr\endcsname\relax\else\newlength\mr\fi +\ifcsname mt\endcsname\relax\else\newlength\mt\fi +\ifcsname mb\endcsname\relax\else\newlength\mb\fi +\unless\ifcsname mr\endcsname\newlength\mr\fi +\unless\ifcsname mt\endcsname\newlength\mt\fi +\unless\ifcsname mb\endcsname\newlength\mb\fi +\setlength{\ml}{\fpeval{(\paperwidth/1mm - \xlength)/2}mm} +\setlength{\mr}{\fpeval{(\paperwidth/1mm - \xlength)/2}mm} +\setlength{\mt}{\fpeval{(\paperheight/1mm - \ylength)/2}mm} +\setlength{\mb}{\fpeval{(\paperheight/1mm - \ylength)/2}mm} +\newgeometry{left=\ml,right=\mr,top=\mt,bottom=\mb} +% \end{macrocode} +% +% Here starts the drawing of the graph paper by the |picture| environment. +% \begin{macrocode} +\begin{picture}(\xlength,\ylength) +% \end{macrocode} +% +% If the horizontal axis is linear, vertical lines are drawn by +% simple \cs{multiput} commands. Otherwise, if the scale is logarithmic, +% the vertical lines are drawn by the \cs{vlines} command defined above. +% \begin{macrocode} +\ifnum#2=0\relax +% vertical lines on linear abscissa. Main lines every 10 mm. +% Second level lines every 5 mm, Third level lines every 1 mm, +% according to the \minimumdistance value + \multiput(0,0)(10,0){\inteval{\xlinsq + 1}}{% + \linethickness{\lwa}\squarecap\line(0,1){\ylength}} + \ifnum\fpeval{\minimumdistance <= 5}=1 + \multiput(5,0)(10,0){\xlinsq}{% + \linethickness{\lwb}\line(0,1){\ylength}}\fi + \ifnum\fpeval{\minimumdistance <= 1}=1 + \multiput(0,0)(1,0){\xlength}{% + \linethickness{\lwc}\line(0,1){\ylength}}\fi +\else + % vertical lines on log abscissa + \edef\decxx{\fpeval{\decx + 1}}% + \edef\xstep{\fpeval{\xlength / \decx}} + % main lines: one for each decade (10) plus one at the end + \vlines{\decxx}{1}{\lwa}{\ticklength}{\xstep}{\ylength} + % second-level lines: one every unit (1), for each decade + \WhileDoOne{2}{9}{\vlines{\decx}{\J}{\lwb}{% + \minorticklength}{\xstep}{\ylength}} + % third-level lines: for each decade (10) and for each unit (1): + % 20, 10, 5, 2 are progressively tested and adopted if the distance + % between two subsequent nearest lines is less to \minimumdistance + \WhileDoTwo{1}{9}{% + \edef\xmindivfloat{% + \fpeval{(\K+1)*(1-10^-(\minimumdistance/\xstep))}} + % xmindiv corresponds to 1/20 of unit + \def\xmindiv{20} + % xmindivfloat corresponds to the distance of two + % subdivision with respect to the unit + \ifnum\fpeval{\xmindivfloat <= 0.5}=1 \def\xmindiv{10}\fi + \ifnum\fpeval{\xmindivfloat <= 0.2}=1 \def\xmindiv{4}\fi + \ifnum\fpeval{\xmindivfloat <= 0.1}=1 \def\xmindiv{2}\fi + \ifnum\fpeval{\xmindivfloat <= 0.05}=1 \def\xmindiv{1}\fi + \ifnum\fpeval{\xmindiv == 20}=1\relax + \else\WhileDoOne[\xmindiv]{\xmindiv}{19}{% + \vlines{\decx}{(\K+\J/20)}{\lwc}{0}{\xstep}{\ylength}}\fi} +\fi +% \end{macrocode} +% +% If the vertical axis is linear, horizontal lines are drawn by +% simple \cs{multiput} commands. Otherwise, if the scale is logarithmic, +% the horizontal lines are drawn by the \cs{hlines} command defined above. +% \begin{macrocode} +\ifnum#3=0\relax +% horizontal lines on linear ordinates. Main lines every 10 mm. +% Second level lines every 5 mm, Third level lines every 1 mm, +% according to the \minimumdistance value + \multiput(0,0)(0,10){\inteval{\ylinsq + 1}}{% + \linethickness{\lwa}\squarecap\line(1,0){\xlength}} + \ifnum\fpeval{\minimumdistance <= 5}=1 + \multiput(0,5)(0,10){\ylinsq}{% + \linethickness{\lwb}\line(1,0){\xlength}}\fi + \ifnum\fpeval{\minimumdistance <= 1}=1 + \multiput(0,0)(0,1){\ylength}{% + \linethickness{\lwc}\line(1,0){\xlength}}\fi +\else + % horizontal lines on log ordinates + \edef\decyy{\fpeval{\decy + 1}}% + \edef\ystep{\fpeval{\ylength / \decy}} + % main lines: one for each decade (10) plus one at the end + \hlines{\decyy}{1}{\lwa}{\ticklength}{\ystep}{\xlength} + % second-level lines: one every unit (1), for each decade + \WhileDoOne{2}{9}{\hlines{\decy}{\J}{\lwb}{% + \minorticklength}{\ystep}{\xlength}} + % third-level lines: for each decade (10) and for each unit (1): + % 20, 10, 5, 2 are progressively tested and adopted if the distance + % between two subsequent nearest lines is less to \minimumdistance + \WhileDoTwo{1}{9}{\edef\ymindivfloat{% + \fpeval{(\K+1)*(1-10^-(\minimumdistance/\ystep))}} + % ymindiv corresponds to 1/20 of unit + \def\ymindiv{20} + % ymindivfloat corresponds to the distance of two subdivisions + % with respect to the unit + \ifnum\fpeval{\ymindivfloat <= 0.5}=1 \def\ymindiv{10}\fi + \ifnum\fpeval{\ymindivfloat <= 0.2}=1 \def\ymindiv{4}\fi + \ifnum\fpeval{\ymindivfloat <= 0.1}=1 \def\ymindiv{2}\fi + \ifnum\fpeval{\ymindivfloat <= 0.05}=1 \def\ymindiv{1}\fi + \ifnum\fpeval{\ymindiv == 20}=1\relax + \else\WhileDoOne[\ymindiv]{\ymindiv}{19}{% + \hlines{\decy}{(\K+\J/20)}{\lwc}{0}{\ystep}{\xlength}}\fi} +\fi +% \end{macrocode} +% +% Custom code provided by the user. After executing the code to compose +% the rectangular graph paper and the user custom code, the latter is +% reset if the \cs{GP@customcodereset} is true. +% \begin{macrocode} +\GP@custom +\end{picture} +\ifGP@customcodereset\def\GP@custom{}\fi} +% \end{macrocode} +% +% +% +%\subsection{Circular graph papers} +% +% The \class{Graphpaper} class provides commands to draw three different +% circular graph papers: linear polar chart, log polar chart, Smith chart. +% +%\subsubsection{Service macros for Smith charts} +% +% Here follows a list of service macros used by circular graph papers. +% +% Definition of the counter \cs{I}, used both in polar paper and Smith chart. +% \begin{macrocode} +\newcount\I +% \end{macrocode} +% +% |Rbox| composes a tick and a label in a rotated box. It is used to +% compose the ticks and labels along the external circle of circular +% graph papers. It accepts three arguments: The first one is +% optional and represents +% the angle of rotation (default 0); the second one is optional too, +% it is inserted by round parentheses, and it represents the position of the +% box which can be given in cartesian $(x,y)$ or polar coordinates $(\theta:\rho)$ +% (default 0:0); the third one is mandatory and +% contains the label. +% \begin{macrocode} +\NewDocumentCommand\Rbox{O{0} D(){0:0} m}{% + \fptest{#1>=0}{\edef\RotLab{\fpeval{#1-90}}}{\edef\RotLab{\fpeval{#1+90}}}% + \put(#2){\color{black}\segment(0,0)(#1:1)\put(#1:1){% + \rotatebox{\RotLab}{\makebox(0,0)[c]{% + \fptest{#1>=0}{\Pbox[b]}{\Pbox[t]}{\scriptstyle#3}[0]}}% + }% + }\ignorespaces} +% \end{macrocode} +% +% |\Xcircle| macro (used only for Smith charts) assumes that the scale +% factor |\Scala| ($s$) has already been defined and it takes only one +% mandatory parameter ($x$). It draws a circle with +% center $(sx/(x+1),0)$ and radius $s/(x+1)$. ($x$ represents the real +% part (resistance) of the normalised impedance.) +% \begin{macrocode} +\NewDocumentCommand\Xcircle{m}{% + \edef\Czero{0,0}\edef\Rzero{\Scala}% + \edef\Rdue{\fpeval{1/(#1+1)*\Scala}}% + \edef\Cdue{\fpeval{\Rzero-\Rdue},0}% + \Circlewithcenter\Cdue radius\Rdue\ignorespaces} +% \end{macrocode} +% +% |\Ycircle| macro (used only for Smith charts) assumes that the scale +% factor |\Scala| ($s$) has already been defined. +% It assumes that the circle diameter is 100|\unitlength|s long and it +% takes only one +% mandatory parameter ($y$). It draws an arc of a circle with +% center $(s,s/y)$, starting point at $(s,0)$ (and therefore radius +% $s/y$) and with an angle calculated in order to have the end point on +% the external circle. ($y$ represents the imaginary part (reactance) +% of the normalised impedance.) +% \begin{macrocode} +\NewDocumentCommand\Ycircle{m s}{% + \edef\Czero{0,0}\edef\Rzero{\Scala}% external circle center and radius + \edef\Rdue{\fpeval{\Scala/abs(#1)}}% Small circle radius + \edef\Cdue{\Rzero,\fpeval{\Scala/#1}}% Small circle center + \edef\Cuno{\Rzero,0}% First intersection point + \ModAndAngleOfVect\Cdue to\Mod and\Alfa % Small circle center polar coordinates + \IntersectionOfLines(\Czero)(\Cdue)and(\Cuno)(\fpeval{\Alfa+90}:1)to\Inter + \SymmetricalPointOf\Cuno respect\Inter to\Idue + \ModAndAngleOfVect\Idue to\Mdue and\Adue + \SubVect\Cdue from\Idue to\IIdue + \ModAndAngleOfVect\IIdue to\Mod and\Alfa + \fptest{#1>0}{\edef\Alfa{\fpeval{270-\Alfa}}\Arc(\Cdue)(\Idue){\Alfa}}% + {\edef\Alfa{\fpeval{270+\Alfa}}\Arc(\Cdue)(\Cuno){\Alfa}}% + \IfBooleanT{#2}{\Rbox[\Adue](\Idue){\color{black}#1}}\relax + \ignorespaces} +% \end{macrocode} +% +% The following two macros are used to compose the resistance axis +% below the Smith chart. +% +% |CalcRxx| macro (used only for Smith charts) assumes that the scale +% factor |Scala| ($s$) has already been defined. +% First, it calculates the reflection coefficient +% $\Gamma = s \frac{x-1}{x+1}$ from resistance $x$. +% A tick and a label are inserted for this value of $x$. +% \begin{macrocode} +\newcommand\CalcRxx[1]{% + \edef\Rxx{\fpeval{\Scala*(#1 - 1)/(#1 + 1)}}% + \segment(\Rxx,\LowResZero)(\Rxx,\LowResUno)\relax + \Pbox(\Rxx,\LowResUno)[t]{$\color{black}\scriptsize#1$}[0]\ignorespaces} +% \end{macrocode} +% +% |GradResist| macro (used only for Smith charts) +% draws the graduated axis for resistance and executes the |CalcRxx| +% for several values of resistance in order to compose the ticks and +% the labels. +% \begin{macrocode} +\newcommand\GradResist[1]{% + \color{black} + \edef\LowResZero{-#1}\edef\LowResUno{\fpeval{\LowResZero-1}}% + \I=0\edef\Auxx{0}\relax + \fpdowhile{\I<=10}{\CalcRxx{\Auxx}% + \advance\I by1\edef\Auxx{\fpeval{\Auxx+0.1}}\ignorespaces} + \CalcRxx{1.5}\I=2\edef\Auxx{2}\relax + \fpdowhile{\I<=9}{\CalcRxx{\Auxx}% + \advance\I by1\edef\Auxx{\fpeval{\Auxx+1}}\ignorespaces} + \CalcRxx{15}\CalcRxx{30}% + \edef\Rxx{\Scala}% + {\segment(-\Rxx,\LowResZero)(\Rxx,\LowResZero)% + \segment(\Rxx,\LowResZero)(\Rxx,\LowResUno)% + \Pbox(\Rxx,\LowResUno)[t]{\infty}[0]}} +% \end{macrocode} +% +% |GradPolar| macro (used only for polar charts) +% draws the graduated axis for log polar charts. +% \begin{macrocode} +\newcommand{\GradPolar}[1]{% + \color{black} + \edef\yline{\fpeval{-1.2 * \Scala}} + \linethickness{\lwa} + \segment(-\Scala,\yline)(\Scala,\yline) + \edef\ytickstart{\yline} + \edef\ytickstop{\fpeval{\yline-2}} + \edef\yytickstop{\fpeval{\yline-1}} + \segment(\Scala,\ytickstart)(\Scala,\ytickstop) + \segment(-\Scala,\ytickstart)(-\Scala,\ytickstop) + \fptest{#1=0}{% + \segment(0,\ytickstart)(0,\ytickstop) + \edef\plstep{\fpeval{\Scala/10}} + \linethickness{\lwb} + \multiput(\plstep,\yline)(\plstep,0){9}{\line(0,-1){1}} + \multiput(-\plstep,\yline)(-\plstep,0){9}{\line(0,-1){1}}% + }{% + \I=0 + \fpwhiledo{\I<#1}{% + \linethickness{\lwa} + \edef\xtick{\fpeval{\I*\Scala/#1}} + \segment(\xtick,\ytickstart)(\xtick,\ytickstop) + \segment(-\xtick,\ytickstart)(-\xtick,\ytickstop) + \J=2 + \fpwhiledo{\J<=9}{% + \linethickness{\lwb} + \edef\xtick{\fpeval{\Scala/#1 * (\I + ln(\J)/ln(10))}} + \segment(\xtick,\ytickstart)(\xtick,\yytickstop) + \segment(-\xtick,\ytickstart)(-\xtick,\yytickstop) + \advance\J by1\relax} + \advance\I by1\relax}} +} +% \end{macrocode} +% +% +%\subsubsection{Polar graph papers} +% +% The polar graph papers are composed by the command \cs{PolarChart}. +% The syntax is +%\begin{ttsyntax} +% \cs{PolarChart}\opz{diameter}\marg{decades} +%\end{ttsyntax} +% where \meta{diameter} is the dimension (plus some extra space for +% labels and margins) of the polar chart. Its default value +% corresponds to the \cs{paperheight} (the minimum dimension of the +% paper). +% The mandatory parameter \meta{decades} must be an integer number. +% Its value corresponds to the number of decades of the radial +% coordinate for the log polar graph paper. +% If its value is zero, the chart is linear. +% The maximum number of allowed decades is set by the macro \cs{NDecMax}: +% its default value is~2. +% +% Declaration of the command and its arguments. +% \begin{macrocode} +\NewDocumentCommand\PolarChart{O{\paperheight} m}{% +% \end{macrocode} +% +% Typographical settings and definition of the main features of the graphpaper. +% \cs{xlength} and \cs{ylength} represent the lengths of the rectangle +% dimensions in which the polar graph is plot. +% The origin of the coordinate system is in the center of the page. +% \begin{macrocode} + \newpage + \parindent=0pt + \pagestyle{empty}% + \ifcsname pmargin\endcsname\relax\else\newlength\pmargin\fi + \setlength{\pmargin}{20pt} + \newgeometry{left=\pmargin,right=\pmargin,top=\pmargin,bottom=\pmargin} + \def\factor{140} + \unitlength=\fpeval{#1/\factor}pt + \def\xlength{\fpeval{(\textwidth-0.01pt)/\unitlength}} + \def\ylength{\fpeval{(\textheight-0.01pt)/\unitlength}} + \begin{picture}(\xlength,\ylength)% + (\fpeval{-\xlength/2},\fpeval{-\ylength/2})% + \color{gridcolor}% + \edef\Scala{50}% The scale factor +% \end{macrocode} +% +% +% Circle stroking. In linear scale 10 radial units are present, +% therefore, 10 circles are drawn with tick lines, +% medium lines circles every 0.5 unit and thin lines circles every +% 0.1 unit. +% \begin{macrocode} + \fptest{#2=0}{% start circle linear radius sequence. + \I=1 + \fpdowhile{\I=<100}{\edef\R{\fpeval{0.01*\Scala*\I}}% + {\fptest{\fpeval{\I-10(round(\I/10,0))}=0}{\linethickness{\lwa}% + }% + {\fptest{\fpeval{\I-5(round(\I/5,0))}=0}{\linethickness{\lwb}}% + {\linethickness{\lwc}}% + }\Circlewithcenter0,0radius\R + }\advance\I by1\relax}% + }% end circle linear radius sequence + {% + \edef\LnDieci{\fpeval{ln(10)}}% + \edef\ScalaDecade{\fpeval{\Scala/#2}}% + \fptest{#2<3}{% + \newcount\Dec \Dec=1\relax + \fpdowhile{\Dec=<#2}{% + \linethickness{\lwa}% + \edef\R{\fpeval{\Dec*\ScalaDecade}}% + \Circlewithcenter0,0radius\R% Thick circles + % First band from 1 to 4 (excluded) + \edef\LPLA{1}% + \fpdowhile{\LPLA<4}{ + \edef\Logaritmo{\fpeval{\Dec-1+(ln(\LPLA))/\LnDieci}}% + \edef\R{\fpeval{\ScalaDecade*\Logaritmo}}% + \fptest{\R>0}{\fptest{\LPLA=round(\LPLA,0)}% + {\linethickness{\lwb}}{\linethickness{\lwc}}% + \Circlewithcenter0,0radius\R}{}% + \edef\LPLA{\fpeval{\LPLA+0.2}}}% + % Second band from 4 to 10 included + \edef\LPLA{4}% + \fpdowhile{\LPLA=<10}{% + \edef\Logaritmo{\fpeval{\Dec-1+(ln(\LPLA))/\LnDieci}}% + \edef\R{\fpeval{\ScalaDecade*\Logaritmo}}% + \fptest{\R>0}{\fptest{\LPLA=round(\LPLA,0)}% + {\linethickness{\lwb}}{\linethickness{\lwc}}% + \Circlewithcenter0,0radius\R}{}% + \edef\LPLA{\fpeval{\LPLA+0.5}}}% + \advance\Dec by1\relax}% + }{% + \ClassWarning{GraphPaper}{Logarithmic polar graph paper:\MessageBreak + too many decades: \number#2\space\MessageBreak + Reduce their number}% + }}% End logarithmic circle radius sequence + \ignorespaces + % +% \end{macrocode} +% +% Radial lines. \cs{I} represents the angle in degrees and it runs +% from 0 to 359. Tick lines every 10$^\circ$; medium lines every 5$^\circ$ +% for units 2, 7, 8, 9, 10; thin lines every 2$^\circ$ for units 3, 4, 5, 6; +% thin lines every 1$^\circ$ for units 7, 8, 9, 10. +% \begin{macrocode} + \I=0\edef\R{\Scala}% + \fpdowhile{\I<360}{\edef\A{\fpeval{\I}}% + \fptest{\fpeval{\I-10(round(\I/10,0))}=0}% + {\linethickness{\lwa}\segment(0,0)(\A:\R) + \Rbox[\A](\A:\R){\color{black}\A}}% multiple of 10 + {\fptest{\fpeval{\I-5(round(\I/5,0))}=0}% + {\linethickness{\lwb}% + \segment(\A:5)(\A:10) + \segment(\A:30)(\A:\R)}% multiple of 5 + {\linethickness{\lwc}% + \fptest{\fpeval{\I-2(round(\I/2,0))}=0}% + {\segment(\A:10)(\A:\R)}% multiple of 2 + {\segment(\A:30)(\A:\R)}% multiple of 1 + }% + }% + \advance\I by 1\relax + }\ignorespaces +% \end{macrocode} +% +% Graduated axis. +% \begin{macrocode} + \GradPolar{#2} +% \end{macrocode} +% +% Custom code provided by the user. After executing the code to compose +% the rectangular graph paper and the user custom code, the latter is +% reset if the \cs{GP@customcodereset} is true. +% \begin{macrocode} + \GP@custom + \end{picture} +\ifGP@customcodereset\def\GP@custom{}\fi} +% \end{macrocode} +% +% +%\subsubsection{Smith chart graph paper} +% +% The Smith chart graph paper is composed by the command \cs{SmithChart}: +%\begin{ttsyntax} +% \cs{SmithChart}\oarg{diameter} +%\end{ttsyntax} +% where +% \meta{diameter} is the dimension (plus some extra space for labels and +% margins) of the Smith chart. Its default value corresponds to the +% \cs{paperheight} (the minimum dimension of the paper). +% +% \begin{macrocode} +\NewDocumentCommand\SmithChart{O{\paperheight}}{% + \newpage + \parindent=0pt + \pagestyle{empty}% + \ifcsname pmargin\endcsname\relax\else\newlength\pmargin\fi + \setlength{\pmargin}{20pt} + \newgeometry{left=\pmargin,right=\pmargin,top=\pmargin,bottom=\pmargin} + \def\factor{140} + \unitlength=\fpeval{#1/\factor}pt\relax + \def\xlength{\fpeval{(\textwidth-0.01pt)/\unitlength}} + \def\ylength{\fpeval{(\textheight-0.01pt)/\unitlength}} + \begin{picture}(\xlength,\ylength)% + (\fpeval{-\xlength/2},\fpeval{-\ylength/2})% + \color{gridcolor}% + \edef\Scala{50}% scale factor based on the main circle but valid + % for everything inside the graph paper. + {\color{black}\Pbox(0,0){}[4]}% Black dot in the origin + % images of the vertical cartesian lines + \I=0\relax + \fpdowhile{\I=<6}{\edef\Aux{\fpeval{\I/20}}{% + \fptest{\I=0}{\color{black}}{\color{gridcolor}}\thicklines\Xcircle{\Aux}}% + \advance\I by1\edef\Aux{\fpeval{\I/20}}\Xcircle{\Aux}% + \advance\I by1\ignorespaces}%fino a 0.4 + \fpdowhile{\I=<16}{\edef\Aux{\fpeval{\I/20}}\relax + {\thicklines\Xcircle{\Aux}}\advance\I by2\edef\Aux{\fpeval{\I/20}}\relax + \Xcircle{\Aux}\advance\I by2\ignorespaces}% fino a 1 + \fpdowhile{\I=<36}{\edef\Aux{\fpeval{\I/20}}\relax + {\thicklines\Xcircle{\Aux}}\advance\I by4\edef\Aux{\fpeval{\I/20}}\relax + \Xcircle{\Aux}\advance\I by4\ignorespaces}% fino a 2 + \fpdowhile{\I=<96}{\edef\Aux{\fpeval{\I/20}}\relax + {\thicklines\Xcircle{\Aux}}\advance\I by8\edef\Aux{\fpeval{\I/20}}\relax + \Xcircle{\Aux}\advance\I by8\ignorespaces}%fino a 5 + \fpdowhile{\I=<296}{\edef\Aux{\fpeval{\I/20}}\relax + {\thicklines\Xcircle{\Aux}}\advance\I by16\edef\Aux{\fpeval{\I/20}}\relax + \Xcircle{\Aux}\advance\I by16\ignorespaces}% up to 15 +% Images of the horizontal cartesian semi-lines + \Ycircle{1}% + {\thicklines\segment(-\Rzero,0)(\Rzero,0)}% diameter + \Rbox[180](-\Rzero,0){0}\Rbox[0](\Rzero,0){\infty} + \Ycircle{0.05}\Ycircle{-0.05}\I=2% \I=2 is to avoid a division by 0 + \fpdowhile{\I=<18}{\edef\Aux{\fpeval{\I/20}}\relax + {\thicklines\Ycircle{\Aux}*\Ycircle{-\Aux}*}% + \advance\I by1\edef\Aux{\fpeval{\I/20}}\relax + \Ycircle{\Aux}\Ycircle{-\Aux}\advance\I by 1\ignorespaces}% restarts from 1 + \fpdowhile{\I<40}{\edef\Aux{\fpeval{\I/20}}\relax + {\thicklines\Ycircle{\Aux}*\Ycircle{-\Aux}*}% + \advance\I by 2\edef\Aux{\fpeval{\I/20}}\relax + \Ycircle{\Aux}\Ycircle{-\Aux}\advance\I by 2\ignorespaces}% restarts from 2 + \fpdowhile{\I<80}{\edef\Aux{\fpeval{\I/20}}\relax + {\thicklines\Ycircle{\Aux}*\Ycircle{-\Aux}*}% + \advance\I by 4\edef\Aux{\fpeval{\I/20}}\relax + \Ycircle{\Aux}\Ycircle{-\Aux}\advance\I by 4\ignorespaces}% restarts from 4 + \fpdowhile{\I=<140}{\edef\Aux{\fpeval{\I/20}}\relax + {\thicklines\Ycircle{\Aux}*\Ycircle{-\Aux}*}% + \advance\I by 10\edef\Aux{\fpeval{\I/20}}\relax + \Ycircle{\Aux}\Ycircle{-\Aux}\advance\I by 10\ignorespaces}% stops at 7.5 + {\thicklines\Ycircle{8}*\Ycircle{-8}*}% + % non linear graduation for the abscissas + \GradResist{62}% + % Polar graduation in normalised wave length percentages + \edef\Rout{\fpeval{1.09*\Rzero}}% + \edef\RoutCifre{\fpeval{\Rout+2}}% + \edef\RoutTak{\fpeval{\Rout+1}}% + {\color{black}% + \Circlewithcenter 0,0radius\Rout + \I=0\fpdowhile{\I<10}% + {\edef\LAng{\fpeval{180-\I*36}}\edef\Cifre{\fpeval{\I*5}}% + \put(\LAng:\RoutCifre){% + \rotatebox{\fpeval{\LAng-90}}{\makebox(0,0)[b]{\scriptsize\Cifre}}}% + \advance\I by 1\ignorespaces} + \I=0\fpdowhile{\I<50}{% + \edef\LAng{\fpeval{180-\I*7.2}}\segment(\LAng:\Rout)(\LAng:\RoutTak)% + \advance\I by1\ignorespaces} + % + % Outside circle encloses everything except the abscissa graduation. + % Everything lays inside a square + \Circlewithcenter0,0radius{\fpeval{\Scala+9}}}% + % Now the user supplied code is executed + \GP@custom + \end{picture} +\ifGP@customcodereset\def\GP@custom{}\fi}% +% \end{macrocode} +% +% +%\subsection{User interface} +% +% Here follows the user commands to draw the graph papers, as described in +% section~\ref{sec:howto}: +% \begin{macrocode} +\NewDocumentCommand{\bilinear}{}{\carta{0}{0}} +\NewDocumentCommand{\semilogx}{m}{\carta{#1}{0}} +\NewDocumentCommand{\semilogy}{m}{\carta{0}{#1}} +\NewDocumentCommand{\loglog}{O{0}mm}{\carta[#1]{#2}{#3}} +\NewDocumentCommand{\polar}{}{\PolarChart{0}} +\NewDocumentCommand{\logpolar}{m}{\PolarChart{#1}} +\NewDocumentCommand{\smith}{}{\SmithChart} +% \end{macrocode} +% +% The user commands to customise the appearance of the graph +% papers is defined. Their syntax was previously described in +% sectio~\ref{sec:howto}: +% \begin{macrocode} +\NewDocumentCommand{\setgridcolor}{m}{\colorlet{gridcolor}{#1}} +\NewDocumentCommand{\setmajorlinethickness}{m}{\setlength{\lwa}{#1}} +\NewDocumentCommand{\setmediumlinethickness}{m}{\setlength{\lwa}{#1}} +\NewDocumentCommand{\setminorlinethickness}{m}{\setlength{\lwa}{#1}} +\NewDocumentCommand{\setminimumdistance}{m}{\setlength{\mindistanceunit}{#1}} +\NewDocumentCommand{\setxside}{m}{% + \ifnum\fpeval{#1 > \paperwidth}=1 \ClassError{graphpaper}{X side too wide!} \fi + \setlength{\xsideunit}{#1}} +\NewDocumentCommand{\setyside}{m}{% + \ifnum\fpeval{#1 > \paperheight}=1 \ClassError{graphpaper}{Y side too wide!} \fi + \setlength{\ysideunit}{#1}} +\def\GP@custom{} +\newif\ifGP@customcodereset \GP@customcoderesettrue +\NewDocumentCommand{\customcode}{O{1} m}{% + \ifnum#1=\z@ \GP@customcoderesetfalse \fi% + \def\GP@custom{#2}} +% \end{macrocode} +% +% +%\subsection{Class code end} +% +% \begin{macrocode} +% +\endinput +% \end{macrocode} +% +%\iffalse +%</class> +%\fi +% +% \Finale +%^^A
\ No newline at end of file |