\documentclass[12pt]{article}
\usepackage[bguq]{frege}
\usepackage{amsmath}

%% For condensed itemize:
\newcommand{\squishlist}{
  \begin{list}{$\bullet$}{
    \setlength{\itemsep}{0pt}
    \setlength{\parsep}{0pt}
    \setlength{\topsep}{0pt}
    \setlength{\partopsep}{0pt}
    \setlength{\leftmargin}{1em}
    \setlength{\labelwidth}{1em}
    \setlength{\parskip}{0pt}
    \setlength{\partopsep}{0pt}
    \setlength{\rightmargin}{0pt}
    \setlength{\labelsep}{0.5em}}}
\newcommand{\squishlistend}{\end{list}}

\title{frege.sty \\ A \LaTeXe Package for Typesetting Begriffsschrift}
\author{Quirin Pamp \\ \texttt{Quirin.Pamp.2009@my.bristol.ac.uk}}

\begin{document}
\maketitle
\section{Background}
\subsection{Motivation for this Package}
  I recently decided to read Frege's \emph{Begriffsschrift} from 1879 and found that 
  the only copy I could find online was a rather poor quality scan of the original. 
  Since the copyright on german publications expires some 70 or so years after the 
  death of their author, I had the bright idea to combine reading the paper with 
  the making of an electronic copy. This required the typesetting of begriffsschrift.
  A quick search on the internet assured me that there was a LaTeX package for just 
  this purpose, and off I went. However I quickly noticed that it would be very 
  difficult to achieve a typesetting I deemed sufficiently close to the original 
  using only the package \emph{begriff} by Josh Parsons. Despite the fact that I 
  have never written a LaTeX package before, a quick look at the source file (only 
  some 300 or so lines with plenty of comments) along with some head scratching 
  convinced me to embark on this further project.

  With the help of the begriff package and the good people on Stack-Exchange, I 
  eventually produced a package that was able to do everything that the original 
  begriff package can, albeit with a few changes I consider an improvement. Further 
  versions largely reflect additional features I added as I continue to type up 
  Frege's original paper, as well as bug fixes and input by members of the LaTeX 
  community. Once I am done I will add the tex file for Fege's paper as the 
  definitive example for the usage of this package.

\subsection{The \emph{begriff} Package}
  This package is based on begriff.sty released under the GNU General Public 
  License. 
  Copyright (C) 2003 by Josh Parsons (josh@coombs.anu.edu.au) with changes made in 
  October 2004 by Richard Heck (heck@fas.harvard.edu) and minor changes by Josh 
  Parsons to fix a problem with linespacing made in May 2005.

  While I could not have done so without the aforementioned work, I have reworked the 
  package from the ground up, to the point where some of the underlying approaches 
  have changed. On the downside this means there is no simple way of converting 
  anything typeset using begriff.sty to use this package instead. I felt this was 
  necessary to achieve an end result I was happy with.

\subsection{The \emph{bguq} Package}
  Since version 1.3 I added the option to use the bguq character for all 
  quantifiers. This character is provided by the bguq package by J.J. Green.

\section{Version History}
\subsection{Changes as Compared to begriff.sty}
  \squishlist
    \item correct (closer to the original typesetting) relative lengths of the 
      content stroke with respect to other strokes attached to it;
    \item content strokes point at the middle of the following symbols, rather 
      than the bottom;
    \item greater width for the assertion stroke as compared to the content stroke;
    \item a more intuitive structure for the conditional (arguments are now given in 
      the same order as they appear on the left of a completed formula);
    \item the command for the conditional with empty arguments now results in a 
      vertical line (conditional stroke) on it's own the other strokes are added as   
      the arguments;
    \item the linewidth is properly accounted for so that things remain properly 
      centered when scaled;
  \squishlistend

\subsection{Changes in Version 1.1}
  \squishlist
    \item added an optional scale factor to all basic strokes;
    \item simplified the code for Fbracket in terms of that for Fbox;
    \item rearranged the code in the style file in a more logical way;
  \squishlistend

\subsection{Changes in Version 1.2}
  \squishlist
    \item added a new command ``Fargument'' for typesetting arguments;
    \item added a new command ``Fstrut'' to be used in conjunction with Fargument;
    \item changed Fbaselength to be equal to the full length of a basic stroke (20pt);
    \item fixed a bug where the scale factor introduced in version 1.1 does not reset 
      after all uses;
  \squishlistend

\subsection{Changes in Version 1.3}
  \squishlist
    \item made the ``():'' used in the Fargument command introduced in version 1.2 
      user defined so as to make the option properly optional;
    \item added a strut to Fargument so as to produce visually correct centering;
    \item added optional shorthands for all commands for a better flow of usage;
    \item added the option ``bguq'' to the package which uses the bguq font by J.J. 
      Green for all quantifiers;
  \squishlistend

\subsection{Changes and Features yet to come}
  \squishlist
    \item a way to display nested arguments;
    \item the fregean conjunction (it exists);
    \item a vertical shorthand stroke such as used by Frege for typesetting arguments 
      in his original paper;
    \item scaling symbols automatically with changes in font size;
    \item scaling of the bguq character with changes in Flinewidth;
  \squishlistend

\section{Features and Usage}
\subsection{Commands}
\subsubsection{Basic Commands}
  The following is a list of the basic commands provided by this package along with 
  accompanying output and the optional shorthand for the command.
  \begin{flalign*}
    &\mbox{Command:} & &\mbox{Output:} & &\mbox{Shorthand:}\\
    &\mbox{\textbackslash Fcontent[1]} & &\Fcontent 
    & &\mbox{\textbackslash F[1]}\\
    &\mbox{\textbackslash Fncontent[1]} & &\Fncontent 
    & &\mbox{\textbackslash Fn[1]}\\
    &\mbox{\textbackslash Fnncontent[1]} & &\Fnncontent
    & &\mbox{\textbackslash Fnn[1]}\\
    &\mbox{\textbackslash Facontent[1]} & &\Facontent
    & &\mbox{\textbackslash Fa[1]}\\
    &\mbox{\textbackslash Fancontent[1]} & &\Fancontent
    & &\mbox{\textbackslash Fan[1]}\\
    &\mbox{\textbackslash Fanncontent[1]} & &\Fanncontent
    & &\mbox{\textbackslash Fann[1]}\\
    &\mbox{\textbackslash Fquant[1]\{a\}} & &\Fquant{a}
    & &\mbox{\textbackslash Fq[1]}\\
    &\mbox{\textbackslash Fnquant[1]\{a\}} & &\Fnquant{a}
    & &\mbox{\textbackslash Fnq[1]\{a\}}\\
    &\mbox{\textbackslash Fnnquant[1]\{a\}} & &\Fnnquant{a}
    & &\mbox{\textbackslash Fnnq[1]\{a\}}\\
    &\mbox{\textbackslash Fquantn[1]\{a\}} & &\Fquantn{a}
    & &\mbox{\textbackslash Fqn[1]\{a\}}\\
    &\mbox{\textbackslash Fquantnn[1]\{a\}} & &\Fquantnn{a}
    & &\mbox{\textbackslash Fqnn[1]\{a\}}\\
    &\mbox{\textbackslash Fnquantn[1]\{a\}} & &\Fnquantn{a}
    & &\mbox{\textbackslash Fnqn[1]\{a\}}\\
    &\mbox{\textbackslash Fnquantnn[1]\{a\}} & &\Fnquantnn{a}
    & &\mbox{\textbackslash Fnqnn[1]\{a\}}\\
    &\mbox{\textbackslash Fnnquantn[1]\{a\}} & &\Fnnquantn{a}
    & &\mbox{\textbackslash Fnnqn[1]\{a\}}\\
    &\mbox{\textbackslash Fnnquantnn[1]\{a\}} & &\Fnnquantnn{a}
    & &\mbox{\textbackslash Fnnqnn[1]\{a\}}\\
    &\mbox{\textbackslash Faquant[1]\{a\}} & &\Faquant{a}
    & &\mbox{\textbackslash Faq[1]\{a\}}\\
    &\mbox{\textbackslash Fanquant[1]\{a\}} & &\Fanquant{a}
    & &\mbox{\textbackslash Fanq[1]\{a\}}\\
    &\mbox{\textbackslash Fannquant[1]\{a\}} & &\Fannquant{a}
    & &\mbox{\textbackslash Fannq[1]\{a\}}\\
    &\mbox{\textbackslash Faquantn[1]\{a\}} & &\Faquantn{a}
    & &\mbox{\textbackslash Faqn[1]\{a\}}\\
    &\mbox{\textbackslash Faquantnn[1]\{a\}} & &\Faquantnn{a}
    & &\mbox{\textbackslash Faqnn[1]\{a\}}\\
    &\mbox{\textbackslash Fanquantn[1]\{a\}} & &\Fanquantn{a}
    & &\mbox{\textbackslash Fanqn[1]\{a\}}\\
    &\mbox{\textbackslash Fanquantnn[1]\{a\}} & &\Fanquantnn{a}
    & &\mbox{\textbackslash Fanqnn[1]\{a\}}\\
    &\mbox{\textbackslash Fannquantn[1]\{a\}} & &\Fannquantn{a}
    & &\mbox{\textbackslash Fannqn[1]\{a\}}\\
    &\mbox{\textbackslash Fannquantnn[1]\{a\}} & &\Fannquantnn{a}
    & &\mbox{\textbackslash Fannqnn[1]\{a\}}\\
  \end{flalign*}
  This may seem like a daunting list, but there is an exceedingly simple way to think 
  about it. In a sense there are only two commands \textbackslash Fcontent[1] and 
  \textbackslash Fquant[1]\{\}. These two commands can be augmented with a 
  combination of as and ns so as to add assertion and negation strokes respectively. 
  Any stroke that is asserted (has a fat vertical line at the start) starts with 
  `\textbackslash Fa'. This may be followed by either one or two or no `n' to add one 
  or two or no negation strokes (the small vertical lines below the content 
  stroke). Next comes the name of the main command, either `quant' or `content'. 
  Finally the quantifiers may be followed by either one or two `n' to add one or two 
  negation strokes to the content stroke after the quantifier's depression.

  Consider also that many of these commands are only really present for completeness 
  sake. It is difficult to imagine a situation where a twice negated quantifier with 
  twice negated content would ever be needed.

  Since version 1.1 all basic strokes also have an optional scaling factor. A command 
  followed by [.5], for example would produce a stroke exactly half the default 
  length while [2] produces a stroke twice the default length. (The default length 
  is given by \textbackslash Fbaselength which is set to 20pt. Scaling allows for 
  greater control in the total length of formula as well as for a shorter syntax. 
  (We can replace expressions like \textbackslash Facontent \textbackslash Fcontent 
  with \textbackslash Facontent[2].) Care must be taken not to set a length that is 
  shorter than what is needed to fit all the parts of some basic stroke. This will 
  lead to negative lengths and hence unpredictable output.

  All quantifiers also have a mandatory argument that specifies the variable 
  associated with the quantifier. (Mandatory arguments are contained in a set of 
  curly brackets \{ and \}). This argument should be a single small letter and 
  will be typeset above the semi circular depression in the assertion stroke in 
  mathfrak font which is provided by tha amssymb package. This font can be used in 
  maths mode by using the command `\textbackslash mathfrak\{\}'. Note that all the 
  commands provided by this package may be used in both math and text mode. (Though 
  math mode usually results in better formatting.)

  Finally one may combine the above commands in arbitrary combinations which will 
  result in gapless longer strokes. (Eg.: $\Faquant[0.6]{a}\Fnquantn[1.4]{b}A$) 
  which may be roughly translated into english as ``for all $\mathfrak{a}$ there 
  exists a $\mathfrak{b}$ such that $A$''. (The commands I used for this expression 
  are \$\textbackslash Faquant\{a\}\textbackslash Fnquantn\{b\}A\$).

\subsubsection{Conditional}
  The conditional is the most important command in this package since it gives 
  Frege's Begriffsschrift it's two dimensional structure.\\
  The syntax for the Fconditional command is as follows:
  
  \textbackslash Fconditional[\textless option\textgreater]
  \{\textless consequent\textgreater\}\{\textless antecedent\textgreater\}\\
  The shorthand version (since version 1.3) is given by ``\textbackslash Fcdt''.

  The arguments may in principle be anything, but you will only get a begriffschrift 
  formula if the arguments are themselves given by appropriate commands from the list 
  of basic commands given earlier. As an example, an asserted conjunction between $A$ 
  and $B$ would be given as follows:

  \$\textbackslash Fconditional[\textbackslash Fancontent]\{\textbackslash Fncontent 
  A\}\{\textbackslash Fcontent B\}\$ \\
  and produce the following output: 
  \begin{align*}
    \Fbox{\Fconditional[\Fancontent]{\Fncontent A}{\Fcontent B}}
  \end{align*}
  In addition Fconditional may be nested as it's own argument to arbitrary depth. 
  Nesting in the option is not recommended. \\
  A conditional with nested consequent may be given as follows:

  \$\textbackslash Fconditional[\textbackslash Facontent]\{\textbackslash 
  Fcontent\textbackslash Fconditional\{\textbackslash Fcontent A\}\{\textbackslash 
  Fcontent B\}\}\{\textbackslash Fcontent\textbackslash Fcontent C\}\$\\
  and produces the following output:
  \begin{align*}
    \Fbox{\Fconditional[\Facontent]{\Fcontent\Fconditional{\Fcontent A}
    {\Fcontent B}}{\Fcontent[2] C}}
  \end{align*}
  A conditional with nested antecedent may be given as follows:

  \$\textbackslash Fconditional[\textbackslash Facontent]\{\textbackslash Fcontent 
  \textbackslash Fcontent A\}\{\textbackslash Fcontent\textbackslash Fconditional 
  \{\textbackslash Fcontent B\}\{\textbackslash Fcontent C\}\}\$\\
  and produces the following output:
  \begin{align*}
    \Fbox{\Fconditional[\Facontent]{\Fcontent[2] A}{\Fcontent\Fconditional%
    {\Fcontent B}{\Fcontent C}}}
  \end{align*}
  Each section of a content stroke may thus be replaced with any of the strokes given 
  by the list of basic commands. Note that it is up to the user to place the 
  appropriate number of strokes in each argument to ensure that the content strokes 
  all line up on the right hand side.

\subsubsection{Brackets and Boxes}
  There are two more commands to be considered: 

  \textbackslash Fbox\{\textless complex expression\textgreater\}\\
  The shorthand version (since version 1.3) is given by \textbackslash Fb\{\}

  \textbackslash Fbracket\{\textless complex expression\textgreater\}\\
  The shorthand version (since version 1.3) is given by \textbackslash Fbb\{\}

  Both Fbox and Fbracket take what I have called a `complex expression' for their 
  argument. A `complex expression' is any formula in begriffsschrift that has at 
  least one conditional in it. It is generally a good idea to put all complex 
  expressions into either a Fbox or a Fbracket. It is never necessary to place a 
  complex expressions into both an Fbox and an Fbracket since an Fbox simply is a 
  Fbracket without the actual brackets. Fbracket exists only for convenience with 
  the same effect being achieved by \textbackslash left(\textbackslash Fbox\{\} 
  \textbackslash right).

  The reason why the Fbox is a good idea, is that the baseline is very near the top of
  a complex expression of Begriffsschrift, which can make for some odd formatting 
  effects. In addition to placing the baseline at the middle of a complex expression 
  an Fbox ensures the expression is treated by LaTeX as a single object and given 
  enough space.

  Finally a complex expression may not format correctly in some environments (like 
  the align* environment for example) unless it is placed in an Fbox. In short, 
  always use an Fbox (or Fbracket).

\subsubsection{Arguments and Struts}
  Since version 1.2 two commands have been added that allow for the typesetting of 
  arguments. The syntax for the argument command is as follows:

  \textbackslash Fargument[\textless premise 0\textgreater]\{\textless premise 
  1\textgreater\}\{\textless premise 2\textgreater\}\{\textless conclusion
  \textgreater\}\\
  The shorthand version (since version 1.3) is given by \textbackslash Farg

  In the following esample the optional argument for premise 0 (an absent premise 
  takes the value `$(X):$' the premises are the two formulas above the therfore line 
  and the conclusion is the formula below the therefore line. The Begriffschrift 
  expressions in the arguments of the Fargument command do not need to be placed in 
  an Fbox, since the Fargument command works by boxing it's arguments allready.
  \begin{align*}
    \Fargument[(X):]
      {\Fconditional[\Facontent]
        {\Fcontent[2] A}
        {\Fcontent\Fconditional{\Fcontent B}{\Fcontent C}}}
      {\Fstrut[2]\Facontent C}
      {\Fstrut[2]\Facontent A}
  \end{align*}
  where $X=\Facontent B$; (this is typeset seperately from the Fargument command);

  The three begriffsschrift formulas above are in fact aligned leftbound. To make 
  them appear rightbound no matter what the relative lengths of $A$, $B$, and $C$, 
  the command ``Fstrut'' has been used in front of $\Facontent C$ and $\Facontent A$. 
  The command ``\textbackslash Fstrut[1]'' works exactly like an invisible content 
  stroke, that is it inserts space of length Fbaselength. Like all basic strokes it 
  can be scaled via an optional scale factor. Since version 1.3 it may be called by 
  the optional shorthand ``\textbackslash Fs''

\subsection{Lengths}
  In theory all the dimensions in this package can be changed with the command 
  \textbackslash setlength\{\textless name of length\textgreater\}\{\textless new 
  value\textgreater\}, though I have not done a great deal of testing and recommend 
  sticking to the default values. The following then is a table of all lengths: \\
  \begin{tabular}{|l|l|l|}
    \hline
    name & default value & description \\
    \hline
    \textbackslash Fbaselength & 20pt & the length of the basic strokes \\
    \textbackslash Flinewidth & 0.5pt & the line width \\
    \textbackslash Fspace & 2pt & seperation between lines and text/formula \\
    \textbackslash Fassertwidth & 3\textbackslash Flinewidth & width of assert 
    stroke \\
    \textbackslash Fraiseheight & 1ex-\textbackslash Flinewidth & height of content 
    lines above baseline \\
    \textbackslash Fnegsep & 3\textbackslash Flinewidth & seperation between a 
    double negation \\
    \textbackslash Fnegshort & 2\textbackslash Flinewidth & space between negation 
    stroke and baseline \\
    \textbackslash Fquantwidth & 6pt & width of the semi-circular quantifier 
    depression \\
    \hline
  \end{tabular}
  the height of the conditional stroke is determined by the size of the contents of 
  the conditionals argument, as well as the baselineskip of the surrounding text. It 
  cannot be changed manually.

\subsection{The \emph{bguq} Option}
  Since version 1.3 this package may be called with the option ``bguq'' as follows: \\
  \textbackslash usepackage[bguq]\{frege\}\\
  If the option is enabled all quantifiers will be typeset using the bguq font 
  provided by the bguq package by J.J. Green. (This document is typeset using the 
  option). This means that the bguq package must be installed if the option is 
  enabled. (It can be found on ctan).

  Warning: At present the bguq character scales with font size while the rest of the 
  symbols provided by this package do not. Also the bguq character does not respond 
  to a change in Flinewidth.

\subsection{Final Example}
  The Geach-Kaplan sentance (with thanks to Marcus Rossberg):
  \begin{align*}
    \Fbox%
    {%
      \Fconditional[{\Facontent[.2]\Fnquant{F}\Fcontent[.2]}]%
      {%
        \Fcontent%
        \Fconditional%
        {%
          \Fcontent[3]%
          \Fbox%
          {%
            f\Fbracket%
            {%
              \Fconditional[\Faquant{a}]%
                {\Fcontent C\mathfrak{(a)}}%
                {\Fcontent \mathfrak{F(a)}}%
            }%
          }%
        }%
        {\Fcontent\Fnquantn{b}\Fcontent\mathfrak{F(b)}}%
      }%
      {%
        \Fcontent[0.4]%
        \Fquant[0.6]{c}%
        \Fquant[0.6]{d}%
        \Fcontent[0.4]%
        \Fconditional%
        {%
          \Fncontent%
          \Fconditional{\Fcontent\mathfrak{c=d}}{\Fcontent\mathfrak{F(d)}}%
        }%
        {%
          \Fncontent%
          \Fconditional{\Fncontent\mathfrak{F(c)}}{\Fcontent A\mathfrak{(c,d)}}%
        }%
      }%
    }%
  \end{align*}
  And that is all. \\ 
  For comments, suggestions, identified errors, email me at \\
  \textless Q.Pamp.2009@my.bristol.ac.uk\textgreater.
\end{document}

\section{GNU General Public License}
  This package and all accompanying documentation is released under the GNU General 
  Public License. It is free software; you can redistribute it and/or modify it under 
  the terms of the GNU General Public License as published by the Free Software 
  Foundation; either version 2 of the License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful, but WITHOUT ANY 
  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A 
  PARTICULAR PURPOSE. See the GNU General Public License for more details.

  You should have received a copy of the GNU General Public License along with this 
  program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - 
  Suite 330, Boston, MA 02111, USA. (Or just search for it online.)
