% This package implements a version of semi-automatic pronoun switching for writing
% gender-neutral (and possibly annoying) prose.
% The basic code is due to Josef (no last name) and Martin Scharrer on
% http://tex.stackexchange.com/questions/10787/
%
% Modified to handle anaphoric reference to the current gender plus
% all three case forms in both uppercase and lowercase.
% Includes an option to flag to turn off xspace, and a silly option for replacing
% all pronouns with 'they/them/their'.
%
% Copyright 2011, 2013, 2016 by Alan Munn
%
% This package may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or 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 2005/12/01 or later.
%
% This package has the LPPL maintenance status `maintained'.
% 
% The Current Maintainer of this package is Alan Munn.
%
% This package consists of the file he-she.sty and documentation files
% he-she.tex and he-she.pdf
%
% Option noxspace
%
% xspace can cause problems if the macro is e.g. enclosed in other markup such
% as \emph{}.  The noxspace option turns off the xspace and forces users to 
% insert a following space using "\ " explicitly.  Default is to enable xspace.
%
% With the default option, the \xspace can be suppressed with the \xspacefalse
% command as needed.
%
% Option they
%
% When you get tired of of alternating genders, you can switch to
% this option, which will replace all of the relevant pronouns with the third
% person plural pronoun form ('they/them/their/theirs').  Note that for the nominative
% this will cause your document to produce ungrammatical text, since there is 
% no way to fix the subject/verb agreement.
%
% As a result, this is probably not intended to be a robust alternative!
% You have been warned! (And you will be if you use it too.)
%
% Version history
% Version 1.0 2011/02/13 Initial release.
% Version 1.1 2013/03/04 Added [para] option and reflexive forms.
% Version 1.1b 2013/06/11 Fixed bug with [para] option (thanks to Enrico Gregorio)
% Version 1.2 2016/05/25 Added \hishers, \hers and  \hiss commands 
% (thanks to Mike Sabin for the feature request)
% Version 1.3 2016/06/06 Added a \setgender command to make choosing the gender more user friendly.
% Documentation rewritten to reflect this change. All internal macros have now been prefixed with HS@
% User level access to the booleans is now through \setgender although the old booleans are emulated
% for backwards compatibility.
% (thanks to Sefarin James for the feature request)
%
\ProvidesPackage{he-she}[2016/06/06 Semi-automatic pronoun switching with anaphora v1.3]
\RequirePackage{xspace}
\newif\ifxspace\xspacetrue
\newif\ifHS@they\HS@theyfalse
\newif\ifHS@para
\DeclareOption{noxspace}{\xspacefalse}
\DeclareOption{they}{%
  \HS@theytrue
  \PackageWarning{he-she}{*** WARNING: Use of option `\CurrentOption` will screw up subject/verb agreement for most nominative pronouns. It is only present for for its comic value! USE AT YOUR OWN RISK! ***}
}
%
\DeclareOption{para}{
  \HS@paratrue
  \PackageWarning{he-she}{*** WARNING: Use the `\CurrentOption` at your own risk. With this option you should use *only* the anaphoric versions of the pronouns in your text. ***}}
%
\DeclareOption*{%
 \PackageWarning{he-she}{Unknown option `\CurrentOption`}%
}
\ProcessOptions
% toggle for changing the gender
\newif\ifHS@he\HS@hetrue

% macro to get first character of a token
\def\HS@getfirst#1{\HS@fstx#1\empty\empty}
\def\HS@fstx#1#2\empty{%
 \edef\HS@fst{#1}}

% macros for comparison 
\def\HS@Masc{M}
\def\HS@masc{m}
\def\HS@Fem{F}
\def\HS@fem{f}

% command to set gender (takes Male/M Female/F etc. or lowercase version of each)
% expands argument first to allow it to be a macro
\newcommand\setgender[1]{%
\edef\next{\noexpand\HS@setgender{#1}}\next}
\newcommand\HS@setgender[1]{%
\HS@getfirst{#1}
\ifx\HS@fst\HS@Masc \global\HS@hefalse
	\else
	\ifx\HS@fst\HS@masc \global\HS@hefalse
		\else
		\ifx\HS@fst\HS@Fem \global\HS@hetrue
			\else
			\ifx\HS@fst\HS@fem \global\HS@hetrue
				\else
				\global\HS@hetrue 
				\PackageWarning{he-she}{Invalid value for gender. Using Masculine}
				\fi
			\fi
		\fi
	\fi
}

%
%
\ifHS@para%
  \RequirePackage{everyhook}
  \PushPreHook{par}{\makebox[0pt][0pt]{\xspacefalse\heshe}}
\fi
\ifHS@they
% Implement the (somewhat useless) 'they' option
%
\newcommand*{\heshe}{they\ifxspace\xspace\fi}
\newcommand*{\Heshe}{They\ifxspace\xspace\fi}
\newcommand*{\himher}{them\ifxspace\xspace\fi}
\newcommand*{\himherself}{themselves\ifxspace\xspace\fi}
\newcommand*{\Himher}{Them\ifxspace\xspace\fi}
\newcommand*{\Himherself}{Themselves\ifxspace\xspace\fi}
\newcommand*{\hisher}{their\ifxspace\xspace\fi}
\newcommand*{\hishers}{theirs\ifxspace\xspace\fi}
\newcommand*{\Hisher}{Their\ifxspace\xspace\fi}
\newcommand*{\Hishers}{Theirs\ifxspace\xspace\fi}
\newcommand*{\he}{they\ifxspace\xspace\fi}
\newcommand*{\He}{They\ifxspace\xspace\fi}
\newcommand*{\him}{them\ifxspace\xspace\fi}
\newcommand*{\himself}{themselves\ifxspace\xspace\fi}
\newcommand*{\Him}{Them\ifxspace\xspace\fi}
\newcommand*{\Himself}{Themselves\ifxspace\xspace\fi}
\newcommand*{\his}{their\ifxspace\xspace\fi}
\newcommand*{\hiss}{theirs\ifxspace\xspace\fi}
\newcommand*{\His}{Their\ifxspace\xspace\fi}
\newcommand*{\Hiss}{Theirs\ifxspace\xspace\fi}
%
\else
%
% Lowercase versions:
%
% Nominative lowercase switching form \heshe
\newcommand*{\heshe}{%
  \leavevmode
  \ifHS@he
    he%
    \global\HS@hefalse%
  \else
    she%
    \global\HS@hetrue%
  \fi
  \ifxspace\xspace\fi
}
%
% Nominative lowercase anaphoric form \he
\newcommand*\he{%
  \leavevmode
  \ifHS@he
	  she%
  \else
  	he%
  \fi
  \ifxspace\xspace\fi
}
%
% Accusative lowercase switching form \himher
\newcommand*\himher{%
  \leavevmode
  \ifHS@he
  	him%
    \global\HS@hefalse%
  \else
  	her%
    \global\HS@hetrue%
  \fi
  \ifxspace\xspace\fi
}%
% Lowercase switching reflexive form \himherself
%
\newcommand*\himherself{%
  \leavevmode
  \ifHS@he
	  herself%
  \else
  	himself%
  \fi
  \ifxspace\xspace\fi
}
%
% Accusative lowercase anaphoric form \him
\newcommand*\him{%
  \leavevmode
  \ifHS@he
	  her%
  \else
  	him%
  \fi
  \ifxspace\xspace\fi
}
% Lowercase anaphoric reflexive form \himself
%
\newcommand*\himself{%
  \leavevmode
  \ifHS@he
	  herself%
  \else
  	himself%
  \fi
  \ifxspace\xspace\fi
}
%
% Genitive lowercase switching form \hisher
\newcommand*\hisher{%
  \leavevmode
  \ifHS@he
  	his%
    \global\HS@hefalse%
  \else
  	her%
    \global\HS@hetrue%
  \fi
  \ifxspace\xspace\fi
}
%
% Genitive lowercase anaphoric form \his
\newcommand*\his{%
  \leavevmode
  \ifHS@he
	  her%
  \else
  	his%
  \fi
  \ifxspace\xspace\fi
}
%
% Genitive null NP form ('The car is his/hers')
% Genitive lowercase switching form \hishers
\newcommand*\hishers{%
  \leavevmode
  \ifHS@he
  	his%
    \global\HS@hefalse%
  \else
  	hers%
    \global\HS@hetrue%
  \fi
  \ifxspace\xspace\fi
}
%
% Genitive lowercase anaphoric form \hiss
\newcommand*\hiss{%
  \leavevmode
  \ifHS@he
	  hers%
  \else
  	his%
  \fi
  \ifxspace\xspace\fi
}
%
% Uppercase versions:
%
% Nominative uppercase switching form \Heshe
\newcommand*{\Heshe}{%
  \leavevmode
  \ifHS@he
    He%
    \global\HS@hefalse%
  \else
    She%
    \global\HS@hetrue%
  \fi
  \ifxspace\xspace\fi
}
%
% Nominative uppercase anaphoric form \He
\newcommand*\He{%
  \leavevmode
  \ifHS@he
	  She%
  \else
  	He%
  \fi
  \ifxspace\xspace\fi
}
%
% Accusative uppercase switching form \Himher
\newcommand*\Himher{%
  \leavevmode
  \ifHS@he
  	Him%
    \global\HS@hefalse%
  \else
  	Her%
    \global\HS@hetrue%
  \fi
  \ifxspace\xspace\fi
}%

% Uppercase switching reflexive form \Himherself
%
\newcommand*\Himherself{%
  \leavevmode
  \ifHS@he
	  Herself%
  \else
    Himself%
  \fi
  \ifxspace\xspace\fi
}
%
% Accusative uppercase anaphoric form \Him
\newcommand*\Him{%
  \leavevmode
  \ifHS@he
	  Her%
  \else
  	Him%
  \fi
  \ifxspace\xspace\fi
}
%
% Uppercase anaphoric reflexive form \Himself
%
\newcommand*\Himself{%
  \leavevmode
  \ifHS@he
	  Herself%
  \else
  	Himself%
  \fi
  \ifxspace\xspace\fi
}
%
% Genitive uppercase switching form \Hisher
\newcommand*\Hisher{%
  \leavevmode
  \ifHS@he
  	His%
    \global\HS@hefalse%
  \else
  	Her%
    \global\HS@hetrue%
  \fi
  \ifxspace\xspace\fi
}
%
% Genitive uppercase anaphoric form \His
\newcommand*\His{%
  \leavevmode
  \ifHS@he
	  Her%
  \else
  	His%
  \fi
  \ifxspace\xspace\fi
}
% Genitive null NP form ('The car is his/hers')
% Genitive uppercase switching form \Hishers
\newcommand*\Hishers{%
  \leavevmode
  \ifHS@he
  	His%
    \global\HS@hefalse%
  \else
  	Hers%
    \global\HS@hetrue%
  \fi
  \ifxspace\xspace\fi
}
%
% Genitive uppercase anaphoric form \Hiss
\newcommand*\Hiss{%
  \leavevmode
  \ifHS@he
	  Hers%
  \else
  	His%
  \fi
  \ifxspace\xspace\fi
}
\fi
% Define synonyms
\let\she\he
\let\She\He
\let\her\him
\let\herself\himself
\let\Her\Him
\let\Herself\Himself
\let\hir\his
\let\Hir\His
\let\hers\hiss
\let\Hers\Hiss
% These for backward compatibility to previous versions
\newcommand*\hetrue{\setgender{F}}
\newcommand*\hefalse{\setgender{M}}
\endinput