summaryrefslogtreecommitdiff
path: root/macros/plain/contrib/newsletr/quote.tex
blob: 79aa2a54300628005d78af69b137e5cbcccd06f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
%
%  File:	QUOTE.TEX
%
%  Author:	Hunter Goatley
%		goathunter@goatley.com
%
%  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
	}