120 lines
4.5 KiB
TeX
120 lines
4.5 KiB
TeX
% Save file as: QUOTE.TEX Source: FILESERV@SHSU.BITNET
|
|
%
|
|
% File: QUOTE.TEX
|
|
%
|
|
% Author: Hunter Goatley
|
|
% goathunter@WKUVX1.BITNET
|
|
%
|
|
% Date: August 14, 1991
|
|
%
|
|
% Abstract:
|
|
%
|
|
% This file defines the macros \begindoublequotes and \enddoublequotes,
|
|
% which let TeX replace the double-quote character (") with TeX's
|
|
% left double-quote and right double-quote. For example:
|
|
%
|
|
% "This is a test." ---> ``This is a test.''
|
|
%
|
|
% The double-quote character is still available via \dq. (\" is still
|
|
% treated as the umlaut accent.)
|
|
%
|
|
% This macro makes a couple of assumptions about the double-quotes:
|
|
%
|
|
% 1. Double-quotes are assumed to come in pairs. When replacing
|
|
% double-quotes, the macro alternates between `` and ''. The only
|
|
% exception to this is noted in (2) below.
|
|
% 2. A double-quote at the beginning of a paragraph is always treated
|
|
% as ``. This correctly handles the case where a quotation is
|
|
% continued into a second paragraph:
|
|
%
|
|
% "This is the first paragraph.\par
|
|
% "This is the second paragraph of the same quote."
|
|
%
|
|
% Normal TeX spacing after `` and '' is maintained by saving and
|
|
% restoring the \spacefactor.
|
|
%
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%
|
|
% HOW IT WORKS:
|
|
%
|
|
% The double-quote character (") is made active by \begindoublequotes.
|
|
% The " macro keeps track of left-quote/right-quote pairs and inserts
|
|
% the appropriate `` and '' in its place.
|
|
%
|
|
% Each character has a \spacefactor associated with it, which specifies
|
|
% the amount of stretch or shrink that a space following the character
|
|
% can have. Most characters have a factor of 1000, but some punctuation
|
|
% marks have higher spacefactors, most notably the period, which has a
|
|
% \spacefactor of 3000. This means the space following a period can
|
|
% stretch up to 3 times more than the space after a regular character,
|
|
% accounting for the increased space at the end of sentences.
|
|
%
|
|
% The `` and '' ligatures are assigned \spacefactor's of 0, so that the
|
|
% \spacefactor that is applied to the next character is the same as that
|
|
% of the character preceding the quotes. Because " has been redefined as
|
|
% a macro, any spaces following " are swallowed by TeX. It was necessary
|
|
% to have this macro re-insert any needed space so that the following
|
|
% cases worked correctly:
|
|
%
|
|
% "This is a test," she said. --> ``This is a test,'' she said.
|
|
% "This is in a list"; etc. --> ``This is in a list''; etc.
|
|
%
|
|
% Without the added space, the first example becomes:
|
|
%
|
|
% ``This is a test,''she said.
|
|
%
|
|
% The solution was to save the current \spacefactor before inserting a
|
|
% right double-quote, then resetting the \spacefactor after the
|
|
% insertion. The net effect was that the " macro has a \spacefactor
|
|
% of 0, which matches the way TeX treats `` and ''.
|
|
%
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
{% % Begin a group for which " is active
|
|
\catcode`\"=\active % Make " an active character
|
|
\catcode`\@=11 % Make @ an active character
|
|
%
|
|
% \begindoublequotes
|
|
%
|
|
% This macro makes " an active character, resets the control sequence
|
|
% \dblqu@te to L (left), and defines \dq as a replacement for ".
|
|
%
|
|
\gdef\begindoublequotes{% % \begindoublequotes enables "
|
|
\global\catcode`\"=\active % Make " an active character
|
|
\global\chardef\dq=`\" % Double-quote char. via \dq
|
|
\global\let\dblqu@te=L % Always start with a left double-quote
|
|
} % End of macro
|
|
%
|
|
% Define the macro that will be executed whenever " is encountered.
|
|
%
|
|
\gdef"{%
|
|
% If the double-quote is the first character in a new paragraph,
|
|
% make sure it becomes a left double-quote. This case can be
|
|
% detected by checking to see if TeX is currently in vertical mode.
|
|
% If so, the double-quote is at the beginning of the paragraph
|
|
% (since " hasn't actually generated any horizontal mode tokens
|
|
% yet, TeX is still in vertical mode). If the mode is vertical,
|
|
% set \dblqu@te equal to L.
|
|
%
|
|
\ifinner\else\ifvmode\let\dblqu@te=L\fi\fi
|
|
%
|
|
% Now insert the appropriate left or right double-quote.
|
|
%
|
|
% If \dblqu@te is L, insert a `` and set \dblqu@te to R.
|
|
%
|
|
\if L\dblqu@te``\global\let\dblqu@te=R%
|
|
%
|
|
% Otherwise, save the current \spacefactor, insert '', set \dblqu@te
|
|
% to L, and reset the original \spacefactor.
|
|
%
|
|
\else
|
|
\let\xxx=\spacefactor % Save the \spacefactor
|
|
''\global\let\dblqu@te=L% % Insert '' and reset \dblqu@te
|
|
\spacefactor\xxx % Reset the \spacefactor
|
|
\fi % End of \if L\dblqu@te...
|
|
} % End of " macro
|
|
} % End of group
|
|
|
|
\gdef\enddoublequotes{%
|
|
\catcode`\"=12 %Set " back to other
|
|
}
|