\documentclass[pagesize=auto, parskip=half]{scrartcl}

\usepackage{fixltx2e}
\usepackage{etex}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{amstext}
\usepackage[utf8]{inputenc}
\usepackage[svgnames]{xcolor}
\usepackage{listings}
\usepackage{microtype}
\usepackage{hyperref}

\newcommand*{\mail}[1]{\href{mailto:#1}{\texttt{#1}}}
\newcommand*{\pkg}[1]{\textsf{#1}}
\newcommand*{\cs}[1]{\texttt{\textbackslash#1}}
\makeatletter
\newcommand*{\cmd}[1]{\cs{\expandafter\@gobble\string#1}}
\makeatother
\newcommand*{\meta}[1]{\text{\textlangle\textsl{#1}\textrangle}}
\newcommand*{\marg}[1]{\texttt{\{}\meta{#1}\texttt{\}}}

\addtokomafont{title}{\rmfamily}

\lstset{%
  language=[LaTeX]TeX,%
  columns=flexible,%
  upquote=true,%
  numbers=left,%
  basicstyle=\ttfamily,%
  keywordstyle=\color{Navy},%
  commentstyle=\color{DimGray},%
  stringstyle=\color{SeaGreen},%
  numberstyle=\scriptsize\color{SlateGray}%
}

\title{The \pkg{sfg} package\thanks{This manual corresponds to \pkg{sfg}~v0.91, dated~22.\,08.\,2007.}}
\author{Hanspeter Schmid\thanks{\mail{schmid@isi.ee.ethz.ch}, \url{http://www.isi.ee.ethz.ch/\~schmid/}}\and Herbert Voß}
\date{22.\,08.\,2007}


\begin{document}

\maketitle


\section{Documentation}

This style file defines some commands to draw signal flow graphs using
\LaTeXe\@.  Signal flow graphs (\textsc{sfg}) are used by electrical and
electronics engineers and graph theorists.  If you haven't heard of
\textsc{sfg}s before, then \pkg{sfg.sty} is probably not useful for you.

If you really want to know what a signal flow graph is, you might read
one of the references given below.

The package sfg requires the packages `\pkg{pstricks}' and `\pkg{fp}'.  It
therefore requires \LaTeXe\ and a reasonably fast machine.

To draw a signal flow graph, you should proceed as follows:
%
\begin{enumerate}
\item Insert \verb|\usepackage{pstricks,sfg}| in your \LaTeXe-file.
\item Draw your \textsc{sfg} on graph paper\footnote{I mean the paper with a 4\,mm, 5\,mm or 1/8\,in grid on it\dots} and determine the size of the 
  picture in units (squares).
\item Set the unitlength using \cmd{\sfgsetunit}.
\item Set the arrowlength, node radius and label offsets using \cmd{\sfgsetsize}.
\item In a \LaTeX\ picture environment of the size you determined above,
  \begin{itemize}
  \item first draw all paths using \cmd{\sfgbranch} and \cmd{\sfgcurve},
  \item then draw all nodes using \cmd{\sfgnode} and \cmd{\sfgtermnode}.
  \end{itemize}
\end{enumerate}


\section{Setting the Controlling Parameters}

\begin{description}
\item[\cmd{\sfgsetunit}\marg{length}]
  sets \cmd{\unitlength} and the PS unit to \meta{length}, and
  defines the default \pkg{pstricks} linewidth as 0.4\,pt.  This has an
  influence on \emph{all} ps-tricks commands that are used afterwards.

\item[\cmd{\sfgsetsize}\marg{nr}\marg{al}\marg{no}\marg{ao}]
  sets the node radius to \meta{nr} units, the
  arrow\-length to \meta{al} units, the offset of the nodes' labels to
  \meta{no} units and the offset of the arrows' labels to \meta{ao} units.
  All four parameters are numbers.

\item[\cmd{\sfgsetangle}\marg{an}]
  sets the incidence angle of sfgcurves \meta{an} degrees.
  Default value: 60 degrees.

\item[\cmd{\sfgsetarrowloc}\marg{mid}]
  sets the location of the sfgbranch's arrow.  0.5
  means in the middle, 0.1 means 10\,\% of the branch length from
  the first node.
  Default value: 0.5

\item[\cmd{\sfgsetlines}\marg{li\_len}\marg{lii}\marg{liii}]
  sets the line thickness \cmd{\sfg@Li} (used
  for all lines) to \meta{li\_len}, the thickness \cmd{\sfg@Lii} (used for
  terminal nodes) to $\meta{lii} \times \meta{li\_len}$, and the thickness \cmd{\sfg@Liii}
  to $\meta{liii} \times \meta{li\_len}$.  It also resets the default pstricks
  linewidth to the new \cmd{\sfg@Li}.

  Default values:
  \begin{tabular}[t]{l@{~=~}l}
    \cmd{\sfg@Li}   & 0.40\,pt                    \\
    \cmd{\sfg@Lii}  & $1.80 \times \cmd{\sfg@Li}$ \\
    \cmd{\sfg@Liii} & $3 \times \cmd{\sfg@Li}$    \\
  \end{tabular}
\end{description}


\section{Drawing signal flow graph (SFG) branches}

\begin{description}
\item[\cmd{\sfgbranch}\marg{dx}\marg{dy}\marg{pos}\marg{text}]
  draws a straight \textsc{sfg} branch from $(0,0)$
  to $(\meta{dx},\meta{dy})$. An arrow is placed in the middle of the branch,
  and a label \meta{text} is typeset near the arrow. The parameter
  \meta{pos} is explained below (see \cmd{\sfgnode}).

  The distance of the label from the arrow's centre as well as
  the arrow's length can be set using \cmd{\sfgsetsize}.

  The location of the arrow can be changed using
  \cmd{\sfgsetarrowloc}.

\item[\cmd{\sfgcurve}\marg{dx}\marg{dy}\marg{off}\marg{pos}\marg{text}]
  draws a curved \textsc{sfg} path from $(0,0)$
  to $(\meta{dx},\meta{dy})$. The arrow's position is \meta{off} units left of the
  middle of the path (\meta{off} can be negative to put the arrow
  right of the path). The curve leaves the endpoints in an angle
  of 60~degrees (this value can be changed using \cmd{\sfgsetangle})
  if possible. If the arrow is too far away from the straight
  path, the angle is increased to guarantee a ``nice'' curve,
  and a warning message is issued.
\end{description}


\section{Drawing Nodes}

\begin{description}
\item[\cmd{\sfgnode}\marg{pos}\marg{text}]
  draws a node with label \meta{text}. \meta{pos} decides
  where the label is typeset. It is a number between~0 and~7.
  After the command
%
\begin{verbatim}
\sfgsetcompass
\end{verbatim}
%
  eight macros named after compass directions can be used.

  \begin{tabular}{rcl}
    3 & 2 & 1 \\
    4 & . & 0 \\
    5 & 6 & 7
  \end{tabular}
  %
  \quad or\quad
  %
  \begin{tabular}{rcl}
    \cmd{\NW} & \cmd{\N} & \cmd{\NE} \\
    \cmd{\W}  & .        & \cmd{\E}  \\
    \cmd{\SW} & \cmd{\S} & \cmd{\SE}
  \end{tabular}

  The distance of the label from the node's centre as well as the 
  node's radius can be set using \cmd{\sfgsetsize}.

\item[\cmd{\sfgtermnode}\marg{pos}\marg{text}]
  draws a terminal node (black circle filled white).
\end{description}


\section{Example:}

\begin{lstlisting}
\documentclass[11pt,a4paper]{article}
\usepackage{pstricks,sfg}
\pagestyle{empty}
\setlength{\parindent}{0pt}

\begin{document}
\sfgsetunit{0.5cm}
\sfgsetsize{0.12}{0.4}{0.5}{0.3}
\sfgsetcompass
\begin{picture}(27,4)
                                % branches related to node 2
  \put(6,2){\sfgbranch{3}{0}\S{$\frac{1}{R_1}$}}
  \put(9,2){\sfgbranch{3}{0}\N{\boldmath $Z_2$}}
  \put(18,2){\sfgcurve{-9}{0}{2}\S{$\frac{1}{R_2}$}}
  \put(24,2){\sfgcurve{-15}{0}{-2}\N{$sC_1$}}
                                % branches related to node 3
  \put(12,2){\sfgbranch{3}{0}\N{$\frac{1}{R_2}$}}
  \put(15,2){\sfgbranch{3}{0}\N{\boldmath $Z_3$}}
                                % input, voltage gain, output
  \put(0,2){\sfgcurve{6}{0}{2}\N{$1$}}
  \put(18,2){\sfgcurve{6}{0}{-2}\S{$\alpha_{\mathrm{V}}$}}
  \put(24,2){\sfgbranch{3}{0}\S{$1$}}
                                % nodes
  \put(0,2){\sfgtermnode\S{$V_{\mathrm{in}}$}}
  \put(3,2){\sfgnode\S{$I_1$}}
  \put(6,2){\sfgnode\S{$V_1$}}
  \put(9,2){\sfgnode\S{$I_2$}}
  \put(12,2){\sfgnode\S{$V_2$}}
  \put(15,2){\sfgnode\S{$I_3$}}
  \put(18,2){\sfgnode\S{$V_3$}}
  \put(21,2){\sfgnode\S{$I_4$}}
  \put(24,2){\sfgnode\S{$V_4$}}
  \put(27,2){\sfgtermnode\S{$V_{\mathrm{out}}$}}
\end{picture}
\end{document}
\end{lstlisting}


\section{References}

\setlength{\leftmargini}{1em}
\addtokomafont{descriptionlabel}{\normalfont}

\begin{description}
\item[{[Chen, 1995, Chapters 7, 8 and 18]}]\leavevmode\\
  Wai-Kai Chen. The Circuits and Filters Handbook. CRC Press,
  Inc.,\ 1995.
\end{description}
%
or have a look at the original papers by Samuel Mason:
%
\begin{description}
\item[{[119]}]\leavevmode\\
  Samuel J. Mason. Feedback theory --- some properties of signal 
  flow graphs. Proceedings of the Institute of Radio Engineers,  
  41(9):1144--1156, September 1953. 

\item[{[120]}]\leavevmode\\
  Samuel J. Mason. Feedback theory --- further properties of
  signal flow graphs. Proceedings of the Institute of Radio
  Engineers, 44(7):920--926, July 1956.
\end{description}

\end{document}



%@(#) sfg.sty: Signal flow graphs
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% This is the style file sfg.sty for drawing signal flow graphs in LaTeX2e.
%
%               Version 0.9, 1.7.1998, Hanspeter Schmid
%               Version 0.91, 22.08.2007 hv scalebox->\psscalebox
%
% If you find an error, or if you want me to implement some more 
% functions, want me to include more references to books on sfgs,
% or if you just want to say `hello thank you, I find you package
% useful', please don't hesitate and contact me:
%
%   Hanspeter Schmid, schmid@isi.ee.ethz.ch, 
%                     http://www.isi.ee.ethz.ch/~schmid/
%
%% This program can be redistributed and/or modified under the terms
%% of the LaTeX Project Public License Distributed from CTAN
%% archives in directory macros/latex/base/lppl.txt.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% History: (Version numbers are going towards 3/pi.  
%           sfg.sty is not good enough yet to be called v1.0)
%
% created: 26.1.96, hps, (v0)
% modified for submission to CTAN: 1.7.98, hps, (v0.9) 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Plans:   - make a proper dtx-file out of this mess.  I'll do this if
%            and when I find the time to do it.
%          - include an sfg branch which has snake form, e.g. \sfgsnake
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SEE DESCRIPTION AFTER THE \endinput
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%